public void ReleaseImagePixelsWasInvoked() { bool released = false; var onRelease = new SKImageRasterReleaseDelegate((addr, ctx) => { Marshal.FreeCoTaskMem(addr); released = true; Assert.Equal("RELEASING!", ctx); }); var info = new SKImageInfo(1, 1); var pixels = Marshal.AllocCoTaskMem(info.BytesSize); using (var pixmap = new SKPixmap(info, pixels)) using (var image = SKImage.FromPixels(pixmap, onRelease, "RELEASING!")) { Assert.False(image.IsTextureBacked); using (var raster = image.ToRasterImage()) { Assert.Equal(image, raster); } Assert.False(released, "The SKImageRasterReleaseDelegate was called too soon."); } Assert.True(released, "The SKImageRasterReleaseDelegate was not called."); }
public static SKImage FromPixels(SKPixmap pixmap, SKImageRasterReleaseDelegate releaseProc, object releaseContext) { if (pixmap == null) { throw new ArgumentNullException(nameof(pixmap)); } var del = releaseProc != null && releaseContext != null ? new SKImageRasterReleaseDelegate((addr, _) => releaseProc(addr, releaseContext)) : releaseProc; var proxy = DelegateProxies.Create(del, DelegateProxies.SKImageRasterReleaseDelegateProxy, out _, out var ctx); return(GetObject <SKImage> (SkiaApi.sk_image_new_raster(pixmap.Handle, proxy, (void *)ctx))); }
public static SKImage FromPixels(SKPixmap pixmap, SKImageRasterReleaseDelegate releaseProc, object releaseContext) { if (pixmap == null) { throw new ArgumentNullException(nameof(pixmap)); } if (releaseProc == null) { return(GetObject <SKImage> (SkiaApi.sk_image_new_raster(pixmap.Handle, IntPtr.Zero, IntPtr.Zero))); } else { var ctx = new NativeDelegateContext(releaseContext, releaseProc); return(GetObject <SKImage> (SkiaApi.sk_image_new_raster(pixmap.Handle, rasterReleaseDelegate, ctx.NativeContext))); } }
public static SKImage FromPixels(SKPixmap pixmap, SKImageRasterReleaseDelegate releaseProc) { return(FromPixels(pixmap, releaseProc, null)); }