From b84f667eae55625bda60c4e4c8bef7303f085abc Mon Sep 17 00:00:00 2001 From: Matthew Leibowitz Date: Tue, 21 Jul 2020 03:22:38 +0200 Subject: [PATCH] Add WASM Support for Uno Platform (#1333) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérôme Laban Co-authored-by: Geoffrey Huntley Co-authored-by: Martin Zikmund --- .editorconfig | 2 +- nuget/SkiaSharp.Views.Uno.nuspec | 10 +- samples/Basic/Uno/SkiaSharpSample.Linux.sln | 13 +++ .../Assets/SplashScreen.png | Bin 0 -> 31996 bytes .../Uno/SkiaSharpSample.Wasm/LinkerConfig.xml | 10 ++ .../Basic/Uno/SkiaSharpSample.Wasm/Program.cs | 78 +++++++++++++ .../Properties/launchSettings.json | 27 +++++ .../SkiaSharpSample.Wasm.csproj | 44 ++++++++ .../SkiaSharpSample.Wasm/WasmCSS/Fonts.css | 10 ++ .../WasmScripts/AppManifest.js | 5 + .../WasmScripts/SkiaSharpSample.js | 1 + .../SkiaSharpSample.Wasm/wwwroot/web.config | 78 +++++++++++++ samples/Basic/Uno/SkiaSharpSample.Windows.sln | 45 ++++++++ samples/Basic/Uno/SkiaSharpSample.sln | 61 ++++++++++ .../PlatformShared/SamplesInitializer.cs | 37 ++++++ .../Shared/Samples/BitmapScalerSample.cs | 12 +- samples/Gallery/Uno/SkiaSharpSample.Linux.sln | 13 +++ .../SkiaSharpSample.UWP.csproj | 4 + .../Assets/SplashScreen.png | Bin 0 -> 31996 bytes .../Uno/SkiaSharpSample.Wasm/LinkerConfig.xml | 10 ++ .../Uno/SkiaSharpSample.Wasm/Program.cs | 78 +++++++++++++ .../Properties/launchSettings.json | 27 +++++ .../SkiaSharpSample.Wasm.csproj | 44 ++++++++ .../SkiaSharpSample.Wasm/WasmCSS/Fonts.css | 10 ++ .../WasmScripts/AppManifest.js | 5 + .../WasmScripts/SkiaSharpSample.js | 23 ++++ .../SkiaSharpSample.Wasm/wwwroot/web.config | 78 +++++++++++++ .../Gallery/Uno/SkiaSharpSample.Windows.sln | 45 ++++++++ samples/Gallery/Uno/SkiaSharpSample.sln | 61 ++++++++++ samples/Gallery/Xamarin.Forms/UWP/UWP.csproj | 7 +- .../SKXamlCanvas.Wasm.cs | 106 ++++++++++++++++++ .../SkiaSharp.Views.Uno.Wasm.csproj | 27 +++++ .../SkiaSharp.Views.Uno.targets | 8 ++ source/SkiaSharpSource.Linux.sln | 7 ++ source/SkiaSharpSource.Mac.sln | 7 ++ source/SkiaSharpSource.Windows.sln | 7 ++ source/SkiaSharpSource.sln | 7 ++ .../SkiaSharp.Wasm.Tests.csproj | 4 +- .../wasm/NativeLibraryMiniTest.csproj | 4 +- 39 files changed, 1001 insertions(+), 14 deletions(-) create mode 100644 samples/Basic/Uno/SkiaSharpSample.Wasm/Assets/SplashScreen.png create mode 100644 samples/Basic/Uno/SkiaSharpSample.Wasm/LinkerConfig.xml create mode 100644 samples/Basic/Uno/SkiaSharpSample.Wasm/Program.cs create mode 100644 samples/Basic/Uno/SkiaSharpSample.Wasm/Properties/launchSettings.json create mode 100644 samples/Basic/Uno/SkiaSharpSample.Wasm/SkiaSharpSample.Wasm.csproj create mode 100644 samples/Basic/Uno/SkiaSharpSample.Wasm/WasmCSS/Fonts.css create mode 100644 samples/Basic/Uno/SkiaSharpSample.Wasm/WasmScripts/AppManifest.js create mode 100644 samples/Basic/Uno/SkiaSharpSample.Wasm/WasmScripts/SkiaSharpSample.js create mode 100644 samples/Basic/Uno/SkiaSharpSample.Wasm/wwwroot/web.config create mode 100644 samples/Gallery/Uno/SkiaSharpSample.Wasm/Assets/SplashScreen.png create mode 100644 samples/Gallery/Uno/SkiaSharpSample.Wasm/LinkerConfig.xml create mode 100644 samples/Gallery/Uno/SkiaSharpSample.Wasm/Program.cs create mode 100644 samples/Gallery/Uno/SkiaSharpSample.Wasm/Properties/launchSettings.json create mode 100644 samples/Gallery/Uno/SkiaSharpSample.Wasm/SkiaSharpSample.Wasm.csproj create mode 100644 samples/Gallery/Uno/SkiaSharpSample.Wasm/WasmCSS/Fonts.css create mode 100644 samples/Gallery/Uno/SkiaSharpSample.Wasm/WasmScripts/AppManifest.js create mode 100644 samples/Gallery/Uno/SkiaSharpSample.Wasm/WasmScripts/SkiaSharpSample.js create mode 100644 samples/Gallery/Uno/SkiaSharpSample.Wasm/wwwroot/web.config create mode 100644 source/SkiaSharp.Views.Uno/SkiaSharp.Views.Uno.Wasm/SKXamlCanvas.Wasm.cs create mode 100644 source/SkiaSharp.Views.Uno/SkiaSharp.Views.Uno.Wasm/SkiaSharp.Views.Uno.Wasm.csproj create mode 100644 source/SkiaSharp.Views.Uno/SkiaSharp.Views.Uno.Wasm/nuget/build/netstandard2.0/SkiaSharp.Views.Uno.targets diff --git a/.editorconfig b/.editorconfig index f1f5575fc..12b3df978 100644 --- a/.editorconfig +++ b/.editorconfig @@ -9,7 +9,7 @@ indent_style = space # (Please don't specify an indent_size here; that has too many unintended consequences.) # Code files -[*.{cs,csx,vb,vbx}] +[*.{cs,csx,vb,vbx,ts}] indent_style = tab indent_size = 4 insert_final_newline = true diff --git a/nuget/SkiaSharp.Views.Uno.nuspec b/nuget/SkiaSharp.Views.Uno.nuspec index 0834728f8..ec58fb6db 100644 --- a/nuget/SkiaSharp.Views.Uno.nuspec +++ b/nuget/SkiaSharp.Views.Uno.nuspec @@ -27,6 +27,11 @@ Please visit https://go.microsoft.com/fwlink/?linkid=868517 to view the release © Microsoft Corporation. All rights reserved. + + + + + @@ -50,15 +55,18 @@ Please visit https://go.microsoft.com/fwlink/?linkid=868517 to view the release + + + - + diff --git a/samples/Basic/Uno/SkiaSharpSample.Linux.sln b/samples/Basic/Uno/SkiaSharpSample.Linux.sln index fe9b58080..da2d24725 100644 --- a/samples/Basic/Uno/SkiaSharpSample.Linux.sln +++ b/samples/Basic/Uno/SkiaSharpSample.Linux.sln @@ -5,17 +5,30 @@ VisualStudioVersion = 16.0.30229.9 MinimumVisualStudioVersion = 10.0.40219.1 Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SkiaSharpSample.Shared", "SkiaSharpSample.Shared\SkiaSharpSample.Shared.shproj", "{6279C845-92F8-4333-AB99-3D213163593C}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharpSample.Wasm", "SkiaSharpSample.Wasm\SkiaSharpSample.Wasm.csproj", "{9726301D-8A93-4A06-88DF-92BA01CF80AD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.Uno.Wasm", "..\..\..\source\SkiaSharp.Views.Uno\SkiaSharp.Views.Uno.Wasm\SkiaSharp.Views.Uno.Wasm.csproj", "{1787D9BF-9815-4E1D-BDEB-9994859FE91E}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp", "..\..\..\binding\SkiaSharp\SkiaSharp.csproj", "{409AF271-D8B7-4F79-B293-02F562A51955}" EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{6279c845-92f8-4333-ab99-3d213163593c}*SharedItemsImports = 13 + SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{9726301d-8a93-4a06-88df-92ba01cf80ad}*SharedItemsImports = 5 EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|Any CPU.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|Any CPU.Build.0 = Release|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|Any CPU.Build.0 = Debug|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/samples/Basic/Uno/SkiaSharpSample.Wasm/Assets/SplashScreen.png b/samples/Basic/Uno/SkiaSharpSample.Wasm/Assets/SplashScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..a87b6e2d5d7080afa8c9d0e627874565809b57a5 GIT binary patch literal 31996 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 + + + + + + + + + diff --git a/samples/Basic/Uno/SkiaSharpSample.Wasm/Program.cs b/samples/Basic/Uno/SkiaSharpSample.Wasm/Program.cs new file mode 100644 index 000000000..1742b8fda --- /dev/null +++ b/samples/Basic/Uno/SkiaSharpSample.Wasm/Program.cs @@ -0,0 +1,78 @@ +using Microsoft.Extensions.Logging; +using Uno.Extensions; +using Uno.UI; +using Windows.UI.Xaml; + +namespace SkiaSharpSample +{ + public class Program + { + private static App _app; + + static int Main(string[] args) + { + FeatureConfiguration.UIElement.AssignDOMXamlName = true; + + ConfigureFilters(LogExtensionPoint.AmbientLoggerFactory); + + Application.Start(_ => _app = new App()); + + return 0; + } + + static void ConfigureFilters(ILoggerFactory factory) + { + factory + .WithFilter(new FilterLoggerSettings + { + { "Uno", LogLevel.Warning }, + { "Windows", LogLevel.Warning }, + { "nVentive.Umbrella", LogLevel.Warning }, + { "SkiaSharp", LogLevel.Warning }, + + // View Navigation related messages + // { "nVentive.Umbrella.Views.Navigation", LogLevel.Debug }, + // { "nVentive.Umbrella.Presentation.Light.ViewModelRegistry", LogLevel.Debug }, + + // All presentation related messages + // { "nVentive.Umbrella.Presentation.Light", LogLevel.Debug }, + + // ViewModel related messages + // { "nVentive.Umbrella.Presentation.Light.ViewModelBase", LogLevel.Debug }, + + // Dynamic properties related messages + // { "nVentive.Umbrella.Presentation.Light.DynamicProperties", LogLevel.Debug }, + + // AVVM/AVP Related messages + // { "nVentive.Umbrella.Presentation.Light.Extensions.AsyncValueViewModel", LogLevel.Debug }, + // { "nVentive.Umbrella.Views.Controls.AsyncValuePresenter", LogLevel.Debug }, + // { "nVentive.Umbrella.Views.Controls.IfDataContext", LogLevel.Debug }, + + // Layouter specific messages + // { "Windows.UI.Xaml.Controls", LogLevel.Debug }, + // { "Windows.UI.Xaml.Controls.Layouter", LogLevel.Debug }, + // { "Windows.UI.Xaml.Controls.Panel", LogLevel.Debug }, + + // Binding related messages + // { "Windows.UI.Xaml.Data", LogLevel.Debug }, + // { "Windows.UI.Xaml.Data", LogLevel.Debug }, + + // Binder memory references tracking + // { "ReferenceHolder", LogLevel.Debug }, + + // Web Queries related messages + // gManager.SetLoggerLevel("nVentive.Umbrella.Web", LogLevel.Debug }, + + // Location service messages + // { "nVentive.Umbrella.Services.Location", LogLevel.Debug }, + + // Map Component messages + // { "nVentive.Umbrella.Components.Maps", LogLevel.Debug }, + + // ApplicationViewState + // { "nVentive.Umbrella.Views.Services.ApplicationViewState.ApplicationViewStateService", LogLevel.Debug }, + }) + .AddConsole(LogLevel.Debug); + } + } +} diff --git a/samples/Basic/Uno/SkiaSharpSample.Wasm/Properties/launchSettings.json b/samples/Basic/Uno/SkiaSharpSample.Wasm/Properties/launchSettings.json new file mode 100644 index 000000000..8bcf8ae7a --- /dev/null +++ b/samples/Basic/Uno/SkiaSharpSample.Wasm/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:63559/", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "SkiaSharpSample.Wasm": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/samples/Basic/Uno/SkiaSharpSample.Wasm/SkiaSharpSample.Wasm.csproj b/samples/Basic/Uno/SkiaSharpSample.Wasm/SkiaSharpSample.Wasm.csproj new file mode 100644 index 000000000..f827f718a --- /dev/null +++ b/samples/Basic/Uno/SkiaSharpSample.Wasm/SkiaSharpSample.Wasm.csproj @@ -0,0 +1,44 @@ + + + + + + Exe + netstandard2.0 + true + $(DefineConstants);__WASM__ + 8.0 + true + true + + + true + portable + true + Interpreter + + + FullAOT + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/Basic/Uno/SkiaSharpSample.Wasm/WasmCSS/Fonts.css b/samples/Basic/Uno/SkiaSharpSample.Wasm/WasmCSS/Fonts.css new file mode 100644 index 000000000..f69615d75 --- /dev/null +++ b/samples/Basic/Uno/SkiaSharpSample.Wasm/WasmCSS/Fonts.css @@ -0,0 +1,10 @@ +/** + When adding fonts here, make sure to add them using a base64 data uri, otherwise + fonts loading are delayed, and text may get displayed incorrectly. +*/ + +@font-face { + font-family: "Symbols"; + /* winjs-symbols.woff2: https://github.com/Microsoft/fonts/tree/master/Symbols */ + src: url(data:application/x-font-woff;charset=utf-8;base64,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) format('woff'); +} diff --git a/samples/Basic/Uno/SkiaSharpSample.Wasm/WasmScripts/AppManifest.js b/samples/Basic/Uno/SkiaSharpSample.Wasm/WasmScripts/AppManifest.js new file mode 100644 index 000000000..dc33e7818 --- /dev/null +++ b/samples/Basic/Uno/SkiaSharpSample.Wasm/WasmScripts/AppManifest.js @@ -0,0 +1,5 @@ +var UnoAppManifest = { + splashScreenImage: "Assets/SplashScreen.png", + splashScreenColor: "#F8F8F8", + displayName: "SkiaSharp for WebAssembly" +} diff --git a/samples/Basic/Uno/SkiaSharpSample.Wasm/WasmScripts/SkiaSharpSample.js b/samples/Basic/Uno/SkiaSharpSample.Wasm/WasmScripts/SkiaSharpSample.js new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/samples/Basic/Uno/SkiaSharpSample.Wasm/WasmScripts/SkiaSharpSample.js @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/Basic/Uno/SkiaSharpSample.Wasm/wwwroot/web.config b/samples/Basic/Uno/SkiaSharpSample.Wasm/wwwroot/web.config new file mode 100644 index 000000000..0b041e919 --- /dev/null +++ b/samples/Basic/Uno/SkiaSharpSample.Wasm/wwwroot/web.config @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/Basic/Uno/SkiaSharpSample.Windows.sln b/samples/Basic/Uno/SkiaSharpSample.Windows.sln index ff10d01a3..54d04fe0d 100644 --- a/samples/Basic/Uno/SkiaSharpSample.Windows.sln +++ b/samples/Basic/Uno/SkiaSharpSample.Windows.sln @@ -17,12 +17,17 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.UWP", "..\. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.UWP", "..\..\..\binding\SkiaSharp.UWP\SkiaSharp.UWP.csproj", "{6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharpSample.Wasm", "SkiaSharpSample.Wasm\SkiaSharpSample.Wasm.csproj", "{9726301D-8A93-4A06-88DF-92BA01CF80AD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.Uno.Wasm", "..\..\..\source\SkiaSharp.Views.Uno\SkiaSharp.Views.Uno.Wasm\SkiaSharp.Views.Uno.Wasm.csproj", "{1787D9BF-9815-4E1D-BDEB-9994859FE91E}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp", "..\..\..\binding\SkiaSharp\SkiaSharp.csproj", "{409AF271-D8B7-4F79-B293-02F562A51955}" EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{6279c845-92f8-4333-ab99-3d213163593c}*SharedItemsImports = 13 SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{8b8db39e-c0ff-4edc-83a6-0b6a4ab763ee}*SharedItemsImports = 4 + SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{9726301d-8a93-4a06-88df-92ba01cf80ad}*SharedItemsImports = 5 SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{ae39aa1d-32c8-482b-9395-ad5493c98f7e}*SharedItemsImports = 4 EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -178,6 +183,46 @@ Global {6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}.Release|x64.Build.0 = Release|Any CPU {6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}.Release|x86.ActiveCfg = Release|Any CPU {6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}.Release|x86.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM64.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x64.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x64.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x86.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x86.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|Any CPU.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM64.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM64.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x64.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x64.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x86.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x86.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM64.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x64.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x64.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x86.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x86.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|Any CPU.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM64.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM64.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x64.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x64.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x86.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x86.Build.0 = Release|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|Any CPU.Build.0 = Debug|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|ARM.ActiveCfg = Debug|Any CPU diff --git a/samples/Basic/Uno/SkiaSharpSample.sln b/samples/Basic/Uno/SkiaSharpSample.sln index 91bfe5122..5d6f3c899 100644 --- a/samples/Basic/Uno/SkiaSharpSample.sln +++ b/samples/Basic/Uno/SkiaSharpSample.sln @@ -29,6 +29,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.UWP", "..\. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.UWP", "..\..\..\binding\SkiaSharp.UWP\SkiaSharp.UWP.csproj", "{6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharpSample.Wasm", "SkiaSharpSample.Wasm\SkiaSharpSample.Wasm.csproj", "{9726301D-8A93-4A06-88DF-92BA01CF80AD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.Uno.Wasm", "..\..\..\source\SkiaSharp.Views.Uno\SkiaSharp.Views.Uno.Wasm\SkiaSharp.Views.Uno.Wasm.csproj", "{1787D9BF-9815-4E1D-BDEB-9994859FE91E}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp", "..\..\..\binding\SkiaSharp\SkiaSharp.csproj", "{409AF271-D8B7-4F79-B293-02F562A51955}" EndProject Global @@ -36,6 +40,7 @@ Global SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{2a19c71c-d1ab-4c70-b821-6a7c7c4abe66}*SharedItemsImports = 4 SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{6279c845-92f8-4333-ab99-3d213163593c}*SharedItemsImports = 13 SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{8b8db39e-c0ff-4edc-83a6-0b6a4ab763ee}*SharedItemsImports = 4 + SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{9726301d-8a93-4a06-88df-92ba01cf80ad}*SharedItemsImports = 5 SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{ae39aa1d-32c8-482b-9395-ad5493c98f7e}*SharedItemsImports = 4 SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{b3a30dc3-0e2d-4f46-97c5-fdc6ab8062e6}*SharedItemsImports = 4 EndGlobalSection @@ -429,6 +434,62 @@ Global {6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}.Release|x64.Build.0 = Release|Any CPU {6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}.Release|x86.ActiveCfg = Release|Any CPU {6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}.Release|x86.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM64.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|iPhone.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x64.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x64.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x86.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x86.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|Any CPU.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM64.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM64.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|iPhone.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|iPhone.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x64.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x64.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x86.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x86.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM64.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|iPhone.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x64.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x64.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x86.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x86.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|Any CPU.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM64.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM64.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|iPhone.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|iPhone.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x64.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x64.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x86.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x86.Build.0 = Release|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|Any CPU.Build.0 = Debug|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|ARM.ActiveCfg = Debug|Any CPU diff --git a/samples/Gallery/PlatformShared/SamplesInitializer.cs b/samples/Gallery/PlatformShared/SamplesInitializer.cs index 0e1d7ae44..9ae3f3cfb 100644 --- a/samples/Gallery/PlatformShared/SamplesInitializer.cs +++ b/samples/Gallery/PlatformShared/SamplesInitializer.cs @@ -2,11 +2,20 @@ using System.IO; using System.Linq; using Xamarin.Essentials; +#if __WASM__ +using System.Runtime.InteropServices; +using Windows.ApplicationModel; +using Windows.Storage; +using Windows.System; +using Uno.Foundation; +#endif #if WINDOWS_UWP using Windows.ApplicationModel; using Windows.Storage; using Windows.System; +#if !__WASM__ using Launcher = Xamarin.Essentials.Launcher; +#endif #elif __MACOS__ using AppKit; using Foundation; @@ -55,6 +64,20 @@ namespace SkiaSharpSample var path = Path.Combine(root, "Media", fontName); #elif __TIZEN__ var path = ResourcePath.GetPath(fontName); +#elif __WASM__ + // WASM does not have an app package, so just use the embedded font + string path; + using (var stream = SampleMedia.Fonts.EmbeddedFont) + { + var appData = ApplicationData.Current.LocalFolder.Path; + var temp = Path.Combine(appData, "SkiaSharpSample", "Assets", "Media"); + if (!Directory.Exists(temp)) + Directory.CreateDirectory(temp); + + path = Path.Combine(temp, fontName); + using (var writer = File.OpenWrite(path)) + stream.CopyTo(writer); + } #endif #if WINDOWS_UWP || __IOS__ || __TVOS__ || __ANDROID__ || __TIZEN__ @@ -63,6 +86,8 @@ namespace SkiaSharpSample var localStorage = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments); #elif __DESKTOP__ var localStorage = System.Windows.Forms.Application.LocalUserAppDataPath; +#elif __WASM__ + var localStorage = ApplicationData.Current.LocalFolder.Path; #endif SamplesManager.ContentFontPath = path; @@ -90,6 +115,18 @@ namespace SkiaSharpSample } #elif __DESKTOP__ Process.Start(path); +#elif __WASM__ + var data = File.ReadAllBytes(path); + var gch = GCHandle.Alloc(data, GCHandleType.Pinned); + var pinnedData = gch.AddrOfPinnedObject(); + try + { + WebAssemblyRuntime.InvokeJS($"fileSaveAs('{Path.GetFileName(path)}', {pinnedData}, {data.Length})"); + } + finally + { + gch.Free(); + } #endif } } diff --git a/samples/Gallery/Shared/Samples/BitmapScalerSample.cs b/samples/Gallery/Shared/Samples/BitmapScalerSample.cs index a8b0ed0ee..b3a12ed51 100644 --- a/samples/Gallery/Shared/Samples/BitmapScalerSample.cs +++ b/samples/Gallery/Shared/Samples/BitmapScalerSample.cs @@ -2,7 +2,6 @@ using System.Threading.Tasks; using SkiaSharp; using System.Collections.Generic; -using System.Linq; namespace SkiaSharpSample.Samples { @@ -25,10 +24,17 @@ namespace SkiaSharpSample.Samples protected override Task OnInit() { - methods = Enum.GetValues(typeof(SKBitmapResizeMethod)).Cast().ToList(); + methods = new List + { + SKBitmapResizeMethod.Box, + SKBitmapResizeMethod.Triangle, + SKBitmapResizeMethod.Lanczos3, + SKBitmapResizeMethod.Hamming, + SKBitmapResizeMethod.Mitchell, + }; method = methods[0]; - using (var stream = new SKManagedStream(SampleMedia.Images.AdobeDng)) + using (var stream = new SKManagedStream(SampleMedia.Images.Baboon)) { bitmap = SKBitmap.Decode(stream); } diff --git a/samples/Gallery/Uno/SkiaSharpSample.Linux.sln b/samples/Gallery/Uno/SkiaSharpSample.Linux.sln index fe9b58080..da2d24725 100644 --- a/samples/Gallery/Uno/SkiaSharpSample.Linux.sln +++ b/samples/Gallery/Uno/SkiaSharpSample.Linux.sln @@ -5,17 +5,30 @@ VisualStudioVersion = 16.0.30229.9 MinimumVisualStudioVersion = 10.0.40219.1 Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SkiaSharpSample.Shared", "SkiaSharpSample.Shared\SkiaSharpSample.Shared.shproj", "{6279C845-92F8-4333-AB99-3D213163593C}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharpSample.Wasm", "SkiaSharpSample.Wasm\SkiaSharpSample.Wasm.csproj", "{9726301D-8A93-4A06-88DF-92BA01CF80AD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.Uno.Wasm", "..\..\..\source\SkiaSharp.Views.Uno\SkiaSharp.Views.Uno.Wasm\SkiaSharp.Views.Uno.Wasm.csproj", "{1787D9BF-9815-4E1D-BDEB-9994859FE91E}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp", "..\..\..\binding\SkiaSharp\SkiaSharp.csproj", "{409AF271-D8B7-4F79-B293-02F562A51955}" EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{6279c845-92f8-4333-ab99-3d213163593c}*SharedItemsImports = 13 + SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{9726301d-8a93-4a06-88df-92ba01cf80ad}*SharedItemsImports = 5 EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|Any CPU.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|Any CPU.Build.0 = Release|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|Any CPU.Build.0 = Debug|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/samples/Gallery/Uno/SkiaSharpSample.UWP/SkiaSharpSample.UWP.csproj b/samples/Gallery/Uno/SkiaSharpSample.UWP/SkiaSharpSample.UWP.csproj index 33f45e0c4..776198423 100644 --- a/samples/Gallery/Uno/SkiaSharpSample.UWP/SkiaSharpSample.UWP.csproj +++ b/samples/Gallery/Uno/SkiaSharpSample.UWP/SkiaSharpSample.UWP.csproj @@ -146,6 +146,10 @@ + + Assets\Media\content-font.ttf + PreserveNewest + diff --git a/samples/Gallery/Uno/SkiaSharpSample.Wasm/Assets/SplashScreen.png b/samples/Gallery/Uno/SkiaSharpSample.Wasm/Assets/SplashScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..a87b6e2d5d7080afa8c9d0e627874565809b57a5 GIT binary patch literal 31996 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 + + + + + + + + + diff --git a/samples/Gallery/Uno/SkiaSharpSample.Wasm/Program.cs b/samples/Gallery/Uno/SkiaSharpSample.Wasm/Program.cs new file mode 100644 index 000000000..1742b8fda --- /dev/null +++ b/samples/Gallery/Uno/SkiaSharpSample.Wasm/Program.cs @@ -0,0 +1,78 @@ +using Microsoft.Extensions.Logging; +using Uno.Extensions; +using Uno.UI; +using Windows.UI.Xaml; + +namespace SkiaSharpSample +{ + public class Program + { + private static App _app; + + static int Main(string[] args) + { + FeatureConfiguration.UIElement.AssignDOMXamlName = true; + + ConfigureFilters(LogExtensionPoint.AmbientLoggerFactory); + + Application.Start(_ => _app = new App()); + + return 0; + } + + static void ConfigureFilters(ILoggerFactory factory) + { + factory + .WithFilter(new FilterLoggerSettings + { + { "Uno", LogLevel.Warning }, + { "Windows", LogLevel.Warning }, + { "nVentive.Umbrella", LogLevel.Warning }, + { "SkiaSharp", LogLevel.Warning }, + + // View Navigation related messages + // { "nVentive.Umbrella.Views.Navigation", LogLevel.Debug }, + // { "nVentive.Umbrella.Presentation.Light.ViewModelRegistry", LogLevel.Debug }, + + // All presentation related messages + // { "nVentive.Umbrella.Presentation.Light", LogLevel.Debug }, + + // ViewModel related messages + // { "nVentive.Umbrella.Presentation.Light.ViewModelBase", LogLevel.Debug }, + + // Dynamic properties related messages + // { "nVentive.Umbrella.Presentation.Light.DynamicProperties", LogLevel.Debug }, + + // AVVM/AVP Related messages + // { "nVentive.Umbrella.Presentation.Light.Extensions.AsyncValueViewModel", LogLevel.Debug }, + // { "nVentive.Umbrella.Views.Controls.AsyncValuePresenter", LogLevel.Debug }, + // { "nVentive.Umbrella.Views.Controls.IfDataContext", LogLevel.Debug }, + + // Layouter specific messages + // { "Windows.UI.Xaml.Controls", LogLevel.Debug }, + // { "Windows.UI.Xaml.Controls.Layouter", LogLevel.Debug }, + // { "Windows.UI.Xaml.Controls.Panel", LogLevel.Debug }, + + // Binding related messages + // { "Windows.UI.Xaml.Data", LogLevel.Debug }, + // { "Windows.UI.Xaml.Data", LogLevel.Debug }, + + // Binder memory references tracking + // { "ReferenceHolder", LogLevel.Debug }, + + // Web Queries related messages + // gManager.SetLoggerLevel("nVentive.Umbrella.Web", LogLevel.Debug }, + + // Location service messages + // { "nVentive.Umbrella.Services.Location", LogLevel.Debug }, + + // Map Component messages + // { "nVentive.Umbrella.Components.Maps", LogLevel.Debug }, + + // ApplicationViewState + // { "nVentive.Umbrella.Views.Services.ApplicationViewState.ApplicationViewStateService", LogLevel.Debug }, + }) + .AddConsole(LogLevel.Debug); + } + } +} diff --git a/samples/Gallery/Uno/SkiaSharpSample.Wasm/Properties/launchSettings.json b/samples/Gallery/Uno/SkiaSharpSample.Wasm/Properties/launchSettings.json new file mode 100644 index 000000000..8bcf8ae7a --- /dev/null +++ b/samples/Gallery/Uno/SkiaSharpSample.Wasm/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:63559/", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "SkiaSharpSample.Wasm": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/samples/Gallery/Uno/SkiaSharpSample.Wasm/SkiaSharpSample.Wasm.csproj b/samples/Gallery/Uno/SkiaSharpSample.Wasm/SkiaSharpSample.Wasm.csproj new file mode 100644 index 000000000..f827f718a --- /dev/null +++ b/samples/Gallery/Uno/SkiaSharpSample.Wasm/SkiaSharpSample.Wasm.csproj @@ -0,0 +1,44 @@ + + + + + + Exe + netstandard2.0 + true + $(DefineConstants);__WASM__ + 8.0 + true + true + + + true + portable + true + Interpreter + + + FullAOT + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/Gallery/Uno/SkiaSharpSample.Wasm/WasmCSS/Fonts.css b/samples/Gallery/Uno/SkiaSharpSample.Wasm/WasmCSS/Fonts.css new file mode 100644 index 000000000..f69615d75 --- /dev/null +++ b/samples/Gallery/Uno/SkiaSharpSample.Wasm/WasmCSS/Fonts.css @@ -0,0 +1,10 @@ +/** + When adding fonts here, make sure to add them using a base64 data uri, otherwise + fonts loading are delayed, and text may get displayed incorrectly. +*/ + +@font-face { + font-family: "Symbols"; + /* winjs-symbols.woff2: https://github.com/Microsoft/fonts/tree/master/Symbols */ + src: url(data:application/x-font-woff;charset=utf-8;base64,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) format('woff'); +} diff --git a/samples/Gallery/Uno/SkiaSharpSample.Wasm/WasmScripts/AppManifest.js b/samples/Gallery/Uno/SkiaSharpSample.Wasm/WasmScripts/AppManifest.js new file mode 100644 index 000000000..dc33e7818 --- /dev/null +++ b/samples/Gallery/Uno/SkiaSharpSample.Wasm/WasmScripts/AppManifest.js @@ -0,0 +1,5 @@ +var UnoAppManifest = { + splashScreenImage: "Assets/SplashScreen.png", + splashScreenColor: "#F8F8F8", + displayName: "SkiaSharp for WebAssembly" +} diff --git a/samples/Gallery/Uno/SkiaSharpSample.Wasm/WasmScripts/SkiaSharpSample.js b/samples/Gallery/Uno/SkiaSharpSample.Wasm/WasmScripts/SkiaSharpSample.js new file mode 100644 index 000000000..c3c75a8b6 --- /dev/null +++ b/samples/Gallery/Uno/SkiaSharpSample.Wasm/WasmScripts/SkiaSharpSample.js @@ -0,0 +1,23 @@ + +function fileSaveAs(fileName, dataPtr, size) { + // copy data into buffer + var buffer = new Uint8Array(size); + for (var i = 0; i < size; i++) { + buffer[i] = Module.getValue(dataPtr + i, "i8"); + } + + // create the download anchor + var a = window.document.createElement('a'); + var blob = new Blob([buffer]); + a.href = window.URL.createObjectURL(blob); + a.download = fileName; + + // append anchor to body + document.body.appendChild(a); + + // "click" download + a.click(); + + // remove anchor from body + document.body.removeChild(a); +} diff --git a/samples/Gallery/Uno/SkiaSharpSample.Wasm/wwwroot/web.config b/samples/Gallery/Uno/SkiaSharpSample.Wasm/wwwroot/web.config new file mode 100644 index 000000000..0b041e919 --- /dev/null +++ b/samples/Gallery/Uno/SkiaSharpSample.Wasm/wwwroot/web.config @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/Gallery/Uno/SkiaSharpSample.Windows.sln b/samples/Gallery/Uno/SkiaSharpSample.Windows.sln index ff10d01a3..54d04fe0d 100644 --- a/samples/Gallery/Uno/SkiaSharpSample.Windows.sln +++ b/samples/Gallery/Uno/SkiaSharpSample.Windows.sln @@ -17,12 +17,17 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.UWP", "..\. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.UWP", "..\..\..\binding\SkiaSharp.UWP\SkiaSharp.UWP.csproj", "{6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharpSample.Wasm", "SkiaSharpSample.Wasm\SkiaSharpSample.Wasm.csproj", "{9726301D-8A93-4A06-88DF-92BA01CF80AD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.Uno.Wasm", "..\..\..\source\SkiaSharp.Views.Uno\SkiaSharp.Views.Uno.Wasm\SkiaSharp.Views.Uno.Wasm.csproj", "{1787D9BF-9815-4E1D-BDEB-9994859FE91E}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp", "..\..\..\binding\SkiaSharp\SkiaSharp.csproj", "{409AF271-D8B7-4F79-B293-02F562A51955}" EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{6279c845-92f8-4333-ab99-3d213163593c}*SharedItemsImports = 13 SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{8b8db39e-c0ff-4edc-83a6-0b6a4ab763ee}*SharedItemsImports = 4 + SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{9726301d-8a93-4a06-88df-92ba01cf80ad}*SharedItemsImports = 5 SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{ae39aa1d-32c8-482b-9395-ad5493c98f7e}*SharedItemsImports = 4 EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -178,6 +183,46 @@ Global {6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}.Release|x64.Build.0 = Release|Any CPU {6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}.Release|x86.ActiveCfg = Release|Any CPU {6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}.Release|x86.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM64.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x64.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x64.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x86.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x86.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|Any CPU.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM64.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM64.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x64.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x64.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x86.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x86.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM64.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x64.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x64.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x86.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x86.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|Any CPU.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM64.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM64.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x64.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x64.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x86.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x86.Build.0 = Release|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|Any CPU.Build.0 = Debug|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|ARM.ActiveCfg = Debug|Any CPU diff --git a/samples/Gallery/Uno/SkiaSharpSample.sln b/samples/Gallery/Uno/SkiaSharpSample.sln index 91bfe5122..5d6f3c899 100644 --- a/samples/Gallery/Uno/SkiaSharpSample.sln +++ b/samples/Gallery/Uno/SkiaSharpSample.sln @@ -29,6 +29,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.UWP", "..\. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.UWP", "..\..\..\binding\SkiaSharp.UWP\SkiaSharp.UWP.csproj", "{6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharpSample.Wasm", "SkiaSharpSample.Wasm\SkiaSharpSample.Wasm.csproj", "{9726301D-8A93-4A06-88DF-92BA01CF80AD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.Uno.Wasm", "..\..\..\source\SkiaSharp.Views.Uno\SkiaSharp.Views.Uno.Wasm\SkiaSharp.Views.Uno.Wasm.csproj", "{1787D9BF-9815-4E1D-BDEB-9994859FE91E}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp", "..\..\..\binding\SkiaSharp\SkiaSharp.csproj", "{409AF271-D8B7-4F79-B293-02F562A51955}" EndProject Global @@ -36,6 +40,7 @@ Global SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{2a19c71c-d1ab-4c70-b821-6a7c7c4abe66}*SharedItemsImports = 4 SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{6279c845-92f8-4333-ab99-3d213163593c}*SharedItemsImports = 13 SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{8b8db39e-c0ff-4edc-83a6-0b6a4ab763ee}*SharedItemsImports = 4 + SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{9726301d-8a93-4a06-88df-92ba01cf80ad}*SharedItemsImports = 5 SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{ae39aa1d-32c8-482b-9395-ad5493c98f7e}*SharedItemsImports = 4 SkiaSharpSample.Shared\SkiaSharpSample.Shared.projitems*{b3a30dc3-0e2d-4f46-97c5-fdc6ab8062e6}*SharedItemsImports = 4 EndGlobalSection @@ -429,6 +434,62 @@ Global {6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}.Release|x64.Build.0 = Release|Any CPU {6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}.Release|x86.ActiveCfg = Release|Any CPU {6FF6B08F-0A69-41A4-8F53-8FE9B7FB4A67}.Release|x86.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|ARM64.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|iPhone.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x64.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x64.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x86.ActiveCfg = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Debug|x86.Build.0 = Debug|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|Any CPU.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM64.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|ARM64.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|iPhone.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|iPhone.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x64.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x64.Build.0 = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x86.ActiveCfg = Release|Any CPU + {9726301D-8A93-4A06-88DF-92BA01CF80AD}.Release|x86.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|ARM64.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|iPhone.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x64.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x64.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x86.ActiveCfg = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Debug|x86.Build.0 = Debug|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|Any CPU.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM64.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|ARM64.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|iPhone.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|iPhone.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x64.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x64.Build.0 = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x86.ActiveCfg = Release|Any CPU + {1787D9BF-9815-4E1D-BDEB-9994859FE91E}.Release|x86.Build.0 = Release|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|Any CPU.Build.0 = Debug|Any CPU {409AF271-D8B7-4F79-B293-02F562A51955}.Debug|ARM.ActiveCfg = Debug|Any CPU diff --git a/samples/Gallery/Xamarin.Forms/UWP/UWP.csproj b/samples/Gallery/Xamarin.Forms/UWP/UWP.csproj index fc0b5cd15..4bb920337 100644 --- a/samples/Gallery/Xamarin.Forms/UWP/UWP.csproj +++ b/samples/Gallery/Xamarin.Forms/UWP/UWP.csproj @@ -174,12 +174,9 @@ Assets\Media\content-font.ttf - Always + PreserveNewest - - - - + diff --git a/source/SkiaSharp.Views.Uno/SkiaSharp.Views.Uno.Wasm/SKXamlCanvas.Wasm.cs b/source/SkiaSharp.Views.Uno/SkiaSharp.Views.Uno.Wasm/SKXamlCanvas.Wasm.cs new file mode 100644 index 000000000..647bc372e --- /dev/null +++ b/source/SkiaSharp.Views.Uno/SkiaSharp.Views.Uno.Wasm/SKXamlCanvas.Wasm.cs @@ -0,0 +1,106 @@ +using System; +using System.Runtime.InteropServices; +using Uno.Foundation; +using Windows.UI.Xaml; + +namespace SkiaSharp.Views.UWP +{ + public partial class SKXamlCanvas : FrameworkElement + { + private IntPtr pixels; + private int pixelWidth; + private int pixelHeight; + + static SKXamlCanvas() + { + const string js = @" +(window || global).SkiaSharp_Views_UWP_SKXamlCanvas = class SKXamlCanvas { + static invalidateCanvas(pData, canvasId, width, height) { + var htmlCanvas = document.getElementById(canvasId); + htmlCanvas.width = width; + htmlCanvas.height = height; + + var ctx = htmlCanvas.getContext('2d'); + if (!ctx) + return false; + + var buffer = new Uint8ClampedArray(Module.HEAPU8.buffer, pData, width * height * 4); + var imageData = new ImageData(buffer, width, height); + ctx.putImageData(imageData, 0, 0); + + return true; + } +};"; + WebAssemblyRuntime.InvokeJS(js); + } + + public SKXamlCanvas() + : base("canvas") + { + Initialize(); + } + + partial void DoUnloaded() => + FreeBitmap(); + + private SKSize GetCanvasSize() => + new SKSize(pixelWidth, pixelHeight); + + private void DoInvalidate() + { + if (designMode) + return; + + if (!isVisible) + return; + + if (ActualWidth <= 0 || ActualHeight <= 0) + return; + + int width, height; + if (IgnorePixelScaling) + { + width = (int)ActualWidth; + height = (int)ActualHeight; + } + else + { + width = (int)(ActualWidth * Dpi); + height = (int)(ActualHeight * Dpi); + } + + var info = new SKImageInfo(width, height, SKImageInfo.PlatformColorType, SKAlphaType.Opaque); + CreateBitmap(info); + + using (var surface = SKSurface.Create(info, pixels, info.RowBytes)) + { + OnPaintSurface(new SKPaintSurfaceEventArgs(surface, info)); + } + + WebAssemblyRuntime.InvokeJS($"SkiaSharp_Views_UWP_SKXamlCanvas.invalidateCanvas({pixels}, \"{HtmlId}\", {info.Width}, {pixelHeight});"); + } + + private unsafe void CreateBitmap(SKImageInfo info) + { + if (pixels == IntPtr.Zero || pixelWidth != info.Width || pixelHeight != info.Height) + { + FreeBitmap(); + + var ptr = Marshal.AllocHGlobal(info.BytesSize); + + pixels = ptr; + pixelWidth = info.Width; + pixelHeight = info.Height; + } + } + + private void FreeBitmap() + { + if (pixels != IntPtr.Zero) + { + Marshal.FreeHGlobal(pixels); + pixels = IntPtr.Zero; + } + } + } +} diff --git a/source/SkiaSharp.Views.Uno/SkiaSharp.Views.Uno.Wasm/SkiaSharp.Views.Uno.Wasm.csproj b/source/SkiaSharp.Views.Uno/SkiaSharp.Views.Uno.Wasm/SkiaSharp.Views.Uno.Wasm.csproj new file mode 100644 index 000000000..77dd4172f --- /dev/null +++ b/source/SkiaSharp.Views.Uno/SkiaSharp.Views.Uno.Wasm/SkiaSharp.Views.Uno.Wasm.csproj @@ -0,0 +1,27 @@ + + + netstandard2.0 + SkiaSharp.Views.UWP + SkiaSharp.Views.UWP + false + SkiaSharp.Views.Uno + $(DefineConstants);__WASM__ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/SkiaSharp.Views.Uno/SkiaSharp.Views.Uno.Wasm/nuget/build/netstandard2.0/SkiaSharp.Views.Uno.targets b/source/SkiaSharp.Views.Uno/SkiaSharp.Views.Uno.Wasm/nuget/build/netstandard2.0/SkiaSharp.Views.Uno.targets new file mode 100644 index 000000000..8dd18c709 --- /dev/null +++ b/source/SkiaSharp.Views.Uno/SkiaSharp.Views.Uno.Wasm/nuget/build/netstandard2.0/SkiaSharp.Views.Uno.targets @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/source/SkiaSharpSource.Linux.sln b/source/SkiaSharpSource.Linux.sln index 33ff4167c..4b50ee45d 100644 --- a/source/SkiaSharpSource.Linux.sln +++ b/source/SkiaSharpSource.Linux.sln @@ -47,6 +47,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Vulkan.SharpVk", EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SkiaSharp.Views.Uno", "SkiaSharp.Views.Uno", "{00C9099A-BE4F-40D0-9401-295618368370}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.Uno.Wasm", "SkiaSharp.Views.Uno\SkiaSharp.Views.Uno.Wasm\SkiaSharp.Views.Uno.Wasm.csproj", "{08599A28-FADE-43B5-95A0-BDCB22B97D3A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -109,6 +111,10 @@ Global {4606F63B-F0B1-418E-8B45-844361E17EB1}.Debug|Any CPU.Build.0 = Debug|Any CPU {4606F63B-F0B1-418E-8B45-844361E17EB1}.Release|Any CPU.ActiveCfg = Release|Any CPU {4606F63B-F0B1-418E-8B45-844361E17EB1}.Release|Any CPU.Build.0 = Release|Any CPU + {08599A28-FADE-43B5-95A0-BDCB22B97D3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {08599A28-FADE-43B5-95A0-BDCB22B97D3A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08599A28-FADE-43B5-95A0-BDCB22B97D3A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {08599A28-FADE-43B5-95A0-BDCB22B97D3A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -128,6 +134,7 @@ Global {6FB08346-1A02-4793-B5E1-4F739C6342D5} = {4F5EBFFB-DD81-43B9-8531-156ED3639C91} {857CB6E9-BA27-4E94-A2D7-68BFF1EE193B} = {B3C4E4EC-68C7-4AFB-A6D4-1B2B0EB8C421} {4606F63B-F0B1-418E-8B45-844361E17EB1} = {66A0800A-CA70-4AC2-88B7-8E7C4CA7C914} + {08599A28-FADE-43B5-95A0-BDCB22B97D3A} = {00C9099A-BE4F-40D0-9401-295618368370} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {B4229170-607D-4886-9990-8FD5D86220B9} diff --git a/source/SkiaSharpSource.Mac.sln b/source/SkiaSharpSource.Mac.sln index 341fa5cf7..dd21c1b27 100644 --- a/source/SkiaSharpSource.Mac.sln +++ b/source/SkiaSharpSource.Mac.sln @@ -85,6 +85,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.Uno.iOS", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.Uno.Mac", "SkiaSharp.Views.Uno\SkiaSharp.Views.Uno.Mac\SkiaSharp.Views.Uno.Mac.csproj", "{E0FF9BFF-2253-4486-A8E2-94312D09D056}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.Uno.Wasm", "SkiaSharp.Views.Uno\SkiaSharp.Views.Uno.Wasm\SkiaSharp.Views.Uno.Wasm.csproj", "{242213FA-1F0E-40BB-A9B2-6FEE82B5D216}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -223,6 +225,10 @@ Global {E0FF9BFF-2253-4486-A8E2-94312D09D056}.Debug|Any CPU.Build.0 = Debug|Any CPU {E0FF9BFF-2253-4486-A8E2-94312D09D056}.Release|Any CPU.ActiveCfg = Release|Any CPU {E0FF9BFF-2253-4486-A8E2-94312D09D056}.Release|Any CPU.Build.0 = Release|Any CPU + {242213FA-1F0E-40BB-A9B2-6FEE82B5D216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {242213FA-1F0E-40BB-A9B2-6FEE82B5D216}.Debug|Any CPU.Build.0 = Debug|Any CPU + {242213FA-1F0E-40BB-A9B2-6FEE82B5D216}.Release|Any CPU.ActiveCfg = Release|Any CPU + {242213FA-1F0E-40BB-A9B2-6FEE82B5D216}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -261,6 +267,7 @@ Global {D35B20BC-838A-4C1E-B427-4269F6387CAB} = {E53351EA-FE40-47D2-B388-4A75DA6CCD71} {6F92F6C5-6249-4A42-A028-DE1118D3CF78} = {E53351EA-FE40-47D2-B388-4A75DA6CCD71} {E0FF9BFF-2253-4486-A8E2-94312D09D056} = {E53351EA-FE40-47D2-B388-4A75DA6CCD71} + {242213FA-1F0E-40BB-A9B2-6FEE82B5D216} = {E53351EA-FE40-47D2-B388-4A75DA6CCD71} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4B8BED07-EA83-4BC1-B3BB-6B8EBC54C25F} diff --git a/source/SkiaSharpSource.Windows.sln b/source/SkiaSharpSource.Windows.sln index f29cc032b..462ac5271 100644 --- a/source/SkiaSharpSource.Windows.sln +++ b/source/SkiaSharpSource.Windows.sln @@ -69,6 +69,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SkiaSharp.Views.Uno", "Skia EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.Uno.Android", "SkiaSharp.Views.Uno\SkiaSharp.Views.Uno.Android\SkiaSharp.Views.Uno.Android.csproj", "{D35B20BC-838A-4C1E-B427-4269F6387CAB}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.Uno.Wasm", "SkiaSharp.Views.Uno\SkiaSharp.Views.Uno.Wasm\SkiaSharp.Views.Uno.Wasm.csproj", "{F675A841-ECDB-4571-8AA3-7D4642FD57DB}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -175,6 +177,10 @@ Global {D35B20BC-838A-4C1E-B427-4269F6387CAB}.Debug|Any CPU.Build.0 = Debug|Any CPU {D35B20BC-838A-4C1E-B427-4269F6387CAB}.Release|Any CPU.ActiveCfg = Release|Any CPU {D35B20BC-838A-4C1E-B427-4269F6387CAB}.Release|Any CPU.Build.0 = Release|Any CPU + {F675A841-ECDB-4571-8AA3-7D4642FD57DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F675A841-ECDB-4571-8AA3-7D4642FD57DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F675A841-ECDB-4571-8AA3-7D4642FD57DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F675A841-ECDB-4571-8AA3-7D4642FD57DB}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -205,6 +211,7 @@ Global {F55B16B3-4427-45EA-A93C-E12A7409E37D} = {D40675E1-610D-4BBB-AA2A-BEF020717431} {4606F63B-F0B1-418E-8B45-844361E17EB1} = {66A0800A-CA70-4AC2-88B7-8E7C4CA7C914} {D35B20BC-838A-4C1E-B427-4269F6387CAB} = {E53351EA-FE40-47D2-B388-4A75DA6CCD71} + {F675A841-ECDB-4571-8AA3-7D4642FD57DB} = {E53351EA-FE40-47D2-B388-4A75DA6CCD71} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {63A8C36E-4917-46DB-9AAD-522B8EC00C23} diff --git a/source/SkiaSharpSource.sln b/source/SkiaSharpSource.sln index 3ddfc7d82..d4175315b 100644 --- a/source/SkiaSharpSource.sln +++ b/source/SkiaSharpSource.sln @@ -105,6 +105,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.Uno.iOS", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.Uno.Mac", "SkiaSharp.Views.Uno\SkiaSharp.Views.Uno.Mac\SkiaSharp.Views.Uno.Mac.csproj", "{E0FF9BFF-2253-4486-A8E2-94312D09D056}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SkiaSharp.Views.Uno.Wasm", "SkiaSharp.Views.Uno\SkiaSharp.Views.Uno.Wasm\SkiaSharp.Views.Uno.Wasm.csproj", "{047C460D-7470-418C-AF2C-30620A1AF61C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -283,6 +285,10 @@ Global {E0FF9BFF-2253-4486-A8E2-94312D09D056}.Debug|Any CPU.Build.0 = Debug|Any CPU {E0FF9BFF-2253-4486-A8E2-94312D09D056}.Release|Any CPU.ActiveCfg = Release|Any CPU {E0FF9BFF-2253-4486-A8E2-94312D09D056}.Release|Any CPU.Build.0 = Release|Any CPU + {047C460D-7470-418C-AF2C-30620A1AF61C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {047C460D-7470-418C-AF2C-30620A1AF61C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {047C460D-7470-418C-AF2C-30620A1AF61C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {047C460D-7470-418C-AF2C-30620A1AF61C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -331,6 +337,7 @@ Global {D35B20BC-838A-4C1E-B427-4269F6387CAB} = {E53351EA-FE40-47D2-B388-4A75DA6CCD71} {6F92F6C5-6249-4A42-A028-DE1118D3CF78} = {E53351EA-FE40-47D2-B388-4A75DA6CCD71} {E0FF9BFF-2253-4486-A8E2-94312D09D056} = {E53351EA-FE40-47D2-B388-4A75DA6CCD71} + {047C460D-7470-418C-AF2C-30620A1AF61C} = {E53351EA-FE40-47D2-B388-4A75DA6CCD71} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {67EACD19-0CEA-4127-9842-549AA6FB84C9} diff --git a/tests/SkiaSharp.Wasm.Tests/SkiaSharp.Wasm.Tests.csproj b/tests/SkiaSharp.Wasm.Tests/SkiaSharp.Wasm.Tests.csproj index fc4e6db0d..7e82bce1e 100644 --- a/tests/SkiaSharp.Wasm.Tests/SkiaSharp.Wasm.Tests.csproj +++ b/tests/SkiaSharp.Wasm.Tests/SkiaSharp.Wasm.Tests.csproj @@ -16,8 +16,8 @@ - - + + diff --git a/utils/NativeLibraryMiniTest/wasm/NativeLibraryMiniTest.csproj b/utils/NativeLibraryMiniTest/wasm/NativeLibraryMiniTest.csproj index dba2525e1..938696c1c 100644 --- a/utils/NativeLibraryMiniTest/wasm/NativeLibraryMiniTest.csproj +++ b/utils/NativeLibraryMiniTest/wasm/NativeLibraryMiniTest.csproj @@ -10,8 +10,8 @@ - - + +