protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); if (sample == null) { return; } var width = Width; var height = Height; using (var bitmap = new Bitmap(width, height, PixelFormat.Format32bppPArgb)) { var data = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, bitmap.PixelFormat); using (var surface = SKSurface.Create(width, height, SKImageInfo.PlatformColorType, SKAlphaType.Premul, data.Scan0, width * 4)) { var skcanvas = surface.Canvas; sample.Method(skcanvas, width, height); } bitmap.UnlockBits(data); e.Graphics.DrawImage(bitmap, new Rectangle(0, 0, Width, Height)); } }
protected override void OnRender(DrawingContext drawingContext) { base.OnRender(drawingContext); if (sample == null) { return; } var m = PresentationSource.FromVisual(this).CompositionTarget.TransformToDevice; var dpiX = m.M11; var dpiY = m.M22; int width = (int)(ActualWidth * dpiX); int height = (int)(ActualHeight * dpiY); var bitmap = new WriteableBitmap(width, height, 96, 96, PixelFormats.Pbgra32, null); bitmap.Lock(); using (var surface = SKSurface.Create(width, height, SKImageInfo.PlatformColorType, SKAlphaType.Premul, bitmap.BackBuffer, bitmap.BackBufferStride)) { var skcanvas = surface.Canvas; skcanvas.Scale((float)dpiX, (float)dpiY); using (new SKAutoCanvasRestore(skcanvas, true)) { sample.Method(skcanvas, (int)ActualWidth, (int)ActualHeight); } } bitmap.AddDirtyRect(new Int32Rect(0, 0, width, height)); bitmap.Unlock(); drawingContext.DrawImage(bitmap, new Rect(0, 0, ActualWidth, ActualHeight)); }
public override void DrawRect(CoreGraphics.CGRect dirtyRect) { base.DrawRect(dirtyRect); if (grContext != null) { var sampleCount = grContext.GetRecommendedSampleCount(GRPixelConfig.Rgba8888, 96.0f); var desc = new GRBackendRenderTargetDesc { Width = (int)Bounds.Width, Height = (int)Bounds.Height, Config = GRPixelConfig.Rgba8888, Origin = GRSurfaceOrigin.TopLeft, SampleCount = sampleCount, StencilBits = 0, RenderTargetHandle = IntPtr.Zero, }; using (var surface = SKSurface.Create(grContext, desc)) { var skcanvas = surface.Canvas; sample.Method(skcanvas, (int)Bounds.Width, (int)Bounds.Height); skcanvas.Flush(); } GL.Flush(); } }
protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); if (grContext != null) { var desc = new GRBackendRenderTargetDesc { Width = Width, Height = Height, Config = GRPixelConfig.Bgra8888, Origin = GRSurfaceOrigin.TopLeft, SampleCount = 1, StencilBits = 0, RenderTargetHandle = IntPtr.Zero, }; using (var surface = SKSurface.Create(grContext, desc)) { var skcanvas = surface.Canvas; sample.Method(skcanvas, Width, Height); skcanvas.Flush(); } SwapBuffers(); } }
private void UpdateBitmap() { var resolutionScale = DisplayInformation.GetForCurrentView().ResolutionScale; var screenScale = (float)resolutionScale / 100.0f; var width = (int)(ActualWidth * screenScale); var height = (int)(ActualHeight * screenScale); if (width == 0 || height == 0) { return; } IntPtr buff = Marshal.AllocCoTaskMem(width * height * 4); try { using (var surface = SKSurface.Create(width, height, SKImageInfo.PlatformColorType, SKAlphaType.Premul, buff, width * 4)) { var skcanvas = surface.Canvas; skcanvas.Scale(screenScale, screenScale); sample?.Method(skcanvas, (int)ActualWidth, (int)ActualHeight); } var pixels = new byte[width * height * 4]; Marshal.Copy(buff, pixels, 0, pixels.Length); var bitmap = new WriteableBitmap(width, height); var stream = bitmap.PixelBuffer.AsStream(); stream.Seek(0, SeekOrigin.Begin); stream.Write(pixels, 0, pixels.Length); bitmap.Invalidate(); var b = bitmap; Background = new ImageBrush { ImageSource = b, AlignmentX = AlignmentX.Center, AlignmentY = AlignmentY.Center, Stretch = Stretch.Fill }; } finally { if (buff != IntPtr.Zero) { Marshal.FreeCoTaskMem(buff); } } }