From 8da3a807574934352579949650ba2759cf1ceff0 Mon Sep 17 00:00:00 2001 From: Jerome Laban Date: Thu, 17 Sep 2020 22:50:47 -0400 Subject: [PATCH] feat(skia): Add support for WriteableBitmap --- .../Media/Imaging/WriteableBitmap.skia.cs | 30 +++++++++++++++++++ src/Uno.UI/Uno.UI.Skia.csproj | 1 + .../SkiaCompositionSurface.skia.cs | 11 +++++++ src/Uno.UWP/Uno.Skia.csproj | 1 + 4 files changed, 43 insertions(+) create mode 100644 src/Uno.UI/UI/Xaml/Media/Imaging/WriteableBitmap.skia.cs diff --git a/src/Uno.UI/UI/Xaml/Media/Imaging/WriteableBitmap.skia.cs b/src/Uno.UI/UI/Xaml/Media/Imaging/WriteableBitmap.skia.cs new file mode 100644 index 000000000000..8f6d9c68f9be --- /dev/null +++ b/src/Uno.UI/UI/Xaml/Media/Imaging/WriteableBitmap.skia.cs @@ -0,0 +1,30 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; +using Windows.Foundation; +using Windows.Storage.Streams; +using Uno.Foundation; +using Windows.UI.Composition; + +namespace Windows.UI.Xaml.Media.Imaging +{ + partial class WriteableBitmap + { + private SkiaCompositionSurface _surface; + + private protected override bool TryOpenSourceSync(int? targetWidth, int? targetHeight, out ImageData image) + { + var handle = GCHandle.Alloc(_buffer.Data, GCHandleType.Pinned); + + _surface ??= new SkiaCompositionSurface(); + + _surface.SetPixels(PixelWidth, PixelHeight, _buffer.Data); + + image = new ImageData { + Value = _surface + }; + + return true; + } + } +} diff --git a/src/Uno.UI/Uno.UI.Skia.csproj b/src/Uno.UI/Uno.UI.Skia.csproj index 25b7f0d57715..0bfb3e9cf73e 100644 --- a/src/Uno.UI/Uno.UI.Skia.csproj +++ b/src/Uno.UI/Uno.UI.Skia.csproj @@ -7,6 +7,7 @@ false $(NoWarn);NU1701 $(DefineConstants);IS_UNO + true false true diff --git a/src/Uno.UWP/UI/Composition/SkiaCompositionSurface.skia.cs b/src/Uno.UWP/UI/Composition/SkiaCompositionSurface.skia.cs index e705d4696ced..b735a19d6825 100644 --- a/src/Uno.UWP/UI/Composition/SkiaCompositionSurface.skia.cs +++ b/src/Uno.UWP/UI/Composition/SkiaCompositionSurface.skia.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Runtime.CompilerServices; using System.Text; using Uno.Extensions; using Uno.Logging; @@ -56,5 +57,15 @@ internal void LoadFromBytes(byte[] image) } } } + + internal unsafe void SetPixels(int pixelWidth, int pixelHeight, byte[] data) + { + var info = new SKImageInfo(pixelWidth, pixelHeight, SKColorType.Rgba8888, SKAlphaType.Premul); + + fixed (byte* pData = data) + { + _image = SKImage.FromPixels(info, (IntPtr)pData, pixelWidth * 4); + } + } } } diff --git a/src/Uno.UWP/Uno.Skia.csproj b/src/Uno.UWP/Uno.Skia.csproj index 91bff1c7aefb..bee6bb41c914 100644 --- a/src/Uno.UWP/Uno.Skia.csproj +++ b/src/Uno.UWP/Uno.Skia.csproj @@ -2,6 +2,7 @@ netstandard2.0 + true