From 165400507502cffa8bd9f9641b79bb17e49677be Mon Sep 17 00:00:00 2001 From: David Date: Mon, 12 Jun 2023 10:54:40 -0400 Subject: [PATCH] fix: Fix RenderTragetBitamp to return physical pixels image on skia --- .../UI/Xaml/Media/Imaging/RenderTargetBitmap.cs | 2 +- .../UI/Xaml/Media/Imaging/RenderTargetBitmap.skia.cs | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Uno.UI/UI/Xaml/Media/Imaging/RenderTargetBitmap.cs b/src/Uno.UI/UI/Xaml/Media/Imaging/RenderTargetBitmap.cs index 3ec16118c5..525d55f060 100644 --- a/src/Uno.UI/UI/Xaml/Media/Imaging/RenderTargetBitmap.cs +++ b/src/Uno.UI/UI/Xaml/Media/Imaging/RenderTargetBitmap.cs @@ -152,7 +152,7 @@ namespace Windows.UI.Xaml.Media.Imaging void IDisposable.Dispose() { - if (_buffer is { }) + if (_buffer is not null) { ArrayPool.Shared.Return(_buffer); } diff --git a/src/Uno.UI/UI/Xaml/Media/Imaging/RenderTargetBitmap.skia.cs b/src/Uno.UI/UI/Xaml/Media/Imaging/RenderTargetBitmap.skia.cs index 27f9c36c73..0de69be55d 100644 --- a/src/Uno.UI/UI/Xaml/Media/Imaging/RenderTargetBitmap.skia.cs +++ b/src/Uno.UI/UI/Xaml/Media/Imaging/RenderTargetBitmap.skia.cs @@ -2,6 +2,7 @@ using System; using System.Runtime.InteropServices; using Windows.Foundation; +using Windows.Graphics.Display; using Windows.UI.Composition; using Uno.UI.Xaml.Media; using SkiaSharp; @@ -42,18 +43,21 @@ namespace Windows.UI.Xaml.Media.Imaging var renderSize = element.RenderSize; var visual = element.Visual; - if (element.RenderSize is { IsEmpty: true } - || element.RenderSize is { Width: 0, Height: 0 }) + if (renderSize is { IsEmpty: true } or { Width: 0, Height: 0 }) { return (0, 0, 0); } - var (width, height) = ((int)renderSize.Width, (int)renderSize.Height); + + // Note: RenderTargetBitmap returns images with the current DPI (a 50x50 Border rendered on WinUI will return a 75x75 image) + var dpi = DisplayInformation.GetForCurrentView()?.RawPixelsPerViewPixel ?? 1; + var (width, height) = ((int)(renderSize.Width * dpi), (int)(renderSize.Height * dpi)); var info = new SKImageInfo(width, height, SKColorType.Bgra8888, SKAlphaType.Premul); using var surface = SKSurface.Create(info); //Ensure Clear var canvas = surface.Canvas; canvas.Clear(SKColors.Transparent); - visual.RenderAtOrigin(surface); + canvas.Scale((float)dpi); + visual.Render(surface, ignoreLocation: true); var img = surface.Snapshot(); -- GitLab