From 39862069aebe8898deb5210913137adb4611697a Mon Sep 17 00:00:00 2001 From: Max Katz Date: Wed, 4 Oct 2023 01:20:18 -0700 Subject: [PATCH] Introduce DrawingContextHelper.RenderAsync method (#13128) --- .../Helpers/DrawingContextHelper.cs | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/Skia/Avalonia.Skia/Helpers/DrawingContextHelper.cs b/src/Skia/Avalonia.Skia/Helpers/DrawingContextHelper.cs index 44caa8ae5a..fb9ccf78e6 100644 --- a/src/Skia/Avalonia.Skia/Helpers/DrawingContextHelper.cs +++ b/src/Skia/Avalonia.Skia/Helpers/DrawingContextHelper.cs @@ -1,20 +1,47 @@ using System.Diagnostics.CodeAnalysis; +using System.Threading.Tasks; using Avalonia.Media; +using Avalonia.Metadata; using Avalonia.Platform; +using Avalonia.Rendering; using SkiaSharp; namespace Avalonia.Skia.Helpers { public static class DrawingContextHelper { + /// . + public static Task RenderAsync(SKCanvas canvas, Visual visual) + { + return RenderAsync(canvas, visual, visual.Bounds, SkiaPlatform.DefaultDpi); + } + + /// + /// Renders Avalonia visual into a SKCanvas instance. + /// This is useful in scenarios where canvas is not controlled by application, but received from another non avalonia api + /// like: SKCanvas canvas = SKDocument.BeginPage(...); + /// + /// Skia canvas to render into. + /// Avalonia visual. + /// Clipping rectangle. + /// Dpi of drawings. + public static Task RenderAsync(SKCanvas canvas, Visual visual, Rect clipRect, Vector dpi) + { + using var drawingContextImpl = WrapSkiaCanvas(canvas, dpi); + using var drawingContext = new PlatformDrawingContext(drawingContextImpl, false); + ImmediateRenderer.Render(drawingContext, visual, clipRect); + return Task.CompletedTask; + } + /// /// Wrap Skia canvas in drawing context so we can use Avalonia api to render to external skia canvas /// this is useful in scenarios where canvas is not controlled by application, but received from another non avalonia api /// like: SKCanvas canvas = SKDocument.BeginPage(...); /// - /// + /// Skia canvas to render into. /// /// DrawingContext + [Unstable("IDrawingContextImpl usage is not supported in Avalonia 11.0.")] public static IDrawingContextImpl WrapSkiaCanvas(SKCanvas canvas, Vector dpi) { var createInfo = new DrawingContextImpl.CreateInfo