From 486317a7d5a7be505700ab2a17fd91807b1ffd94 Mon Sep 17 00:00:00 2001
From: Matthew Leibowitz <mattleibow@live.com>
Date: Wed, 13 Apr 2022 10:28:03 +0200
Subject: [PATCH] Update MAUI to RC 1 and use a macOS Monterey pool (#1986)

---
 nuget/SkiaSharp.Views.WinUI.nuspec            |  7 ++++++
 .../Basic/Maui/SkiaSharpSample/MauiProgram.cs |  1 +
 .../Platforms/Windows/App.xaml.cs             |  7 ------
 .../SkiaSharpSample/SkiaSharpSample.csproj    | 14 ++---------
 scripts/azure-pipelines-variables.yml         |  6 ++---
 scripts/azure-pipelines.yml                   | 25 +++++++++++++++++--
 scripts/azure-templates-build.yml             |  3 ++-
 scripts/azure-templates-variables.yml         | 18 +++++++------
 scripts/install-vs.ps1                        | 15 +++++++----
 scripts/provisionator.csx                     |  1 +
 source/SkiaSharp.Build.targets                |  2 +-
 .../SKCanvasViewRendererBase.cs               |  6 ++---
 .../SKGLViewRendererBase.cs                   |  4 +--
 .../SKImageSource.cs                          |  2 ++
 .../AppHostBuilderExtensions.cs               |  8 +++---
 .../SKCanvasViewHandler.Android.cs            |  2 +-
 .../SKCanvasViewHandler.Windows.cs            |  2 +-
 .../SKCanvasView/SKCanvasViewHandler.iOS.cs   |  2 +-
 .../SKImageSourceService.Android.cs           | 24 +++++++++++++++++-
 .../SkiaSharp.Views.WinUI.csproj              |  2 +-
 .../SkiaSharp.Views.UWP/UWPExtensions.cs      |  2 +-
 21 files changed, 99 insertions(+), 54 deletions(-)
 create mode 100644 scripts/provisionator.csx

diff --git a/nuget/SkiaSharp.Views.WinUI.nuspec b/nuget/SkiaSharp.Views.WinUI.nuspec
index 1c481ae1ac..84c3654d95 100644
--- a/nuget/SkiaSharp.Views.WinUI.nuspec
+++ b/nuget/SkiaSharp.Views.WinUI.nuspec
@@ -31,6 +31,10 @@ Please visit https://go.microsoft.com/fwlink/?linkid=868517 to view the release
         <dependency id="SkiaSharp" version="1.0.0" />
         <dependency id="Microsoft.WindowsAppSDK" version="1.0.0" />
       </group>
+      <group targetFramework="net6.0-windows10.0.18362">
+        <dependency id="SkiaSharp" version="1.0.0" />
+        <dependency id="Microsoft.WindowsAppSDK" version="1.0.0" />
+      </group>
     </dependencies>
 
   </metadata>
@@ -40,6 +44,9 @@ Please visit https://go.microsoft.com/fwlink/?linkid=868517 to view the release
     <file platform="windows" src="lib/net5.0-windows10.0.18362/SkiaSharp.Views.Windows.dll" />
     <file platform="windows" src="lib/net5.0-windows10.0.18362/SkiaSharp.Views.Windows.pdb" />
     <file platform="windows" src="lib/net5.0-windows10.0.18362/SkiaSharp.Views.Windows.xml" />
+    <file platform="windows" src="lib/net6.0-windows10.0.18362/SkiaSharp.Views.Windows.dll" />
+    <file platform="windows" src="lib/net6.0-windows10.0.18362/SkiaSharp.Views.Windows.pdb" />
+    <file platform="windows" src="lib/net6.0-windows10.0.18362/SkiaSharp.Views.Windows.xml" />
 
     <!-- legal -->
     <file src="LICENSE.txt" />
diff --git a/samples/Basic/Maui/SkiaSharpSample/MauiProgram.cs b/samples/Basic/Maui/SkiaSharpSample/MauiProgram.cs
index a57d7612ae..b83ef70d37 100644
--- a/samples/Basic/Maui/SkiaSharpSample/MauiProgram.cs
+++ b/samples/Basic/Maui/SkiaSharpSample/MauiProgram.cs
@@ -2,6 +2,7 @@
 using Microsoft.Maui.Hosting;
 using Microsoft.Maui.Controls.Hosting;
 using SkiaSharp.Views.Maui.Controls.Hosting;
+using Microsoft.Maui.Controls.Compatibility.Hosting;
 
 namespace SkiaSharpSample
 {
diff --git a/samples/Basic/Maui/SkiaSharpSample/Platforms/Windows/App.xaml.cs b/samples/Basic/Maui/SkiaSharpSample/Platforms/Windows/App.xaml.cs
index 616eb04f66..20098026ce 100644
--- a/samples/Basic/Maui/SkiaSharpSample/Platforms/Windows/App.xaml.cs
+++ b/samples/Basic/Maui/SkiaSharpSample/Platforms/Windows/App.xaml.cs
@@ -12,12 +12,5 @@ public App()
 		}
 
 		protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
-
-		protected override void OnLaunched(LaunchActivatedEventArgs args)
-		{
-			base.OnLaunched(args);
-
-			Microsoft.Maui.Essentials.Platform.OnLaunched(args);
-		}
 	}
 }
diff --git a/samples/Basic/Maui/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/Maui/SkiaSharpSample/SkiaSharpSample.csproj
index 9d84a75d7a..eb95a62a69 100644
--- a/samples/Basic/Maui/SkiaSharpSample/SkiaSharpSample.csproj
+++ b/samples/Basic/Maui/SkiaSharpSample/SkiaSharpSample.csproj
@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <TargetFrameworks>net6.0-ios;net6.0-maccatalyst;net6.0-android</TargetFrameworks>
-    <TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows')) and '$(MSBuildRuntimeType)' == 'Full'">$(TargetFrameworks);net6.0-windows10.0.19041</TargetFrameworks>
+    <TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows')) and '$(MSBuildRuntimeType)' == 'Full'">$(TargetFrameworks);net6.0-windows10.0.19041.0</TargetFrameworks>
     <OutputType>Exe</OutputType>
     <UseMaui>true</UseMaui>
     <SingleProject>true</SingleProject>
@@ -18,7 +18,7 @@
     <SupportedOSPlatformVersion Condition="'$(TargetFramework)' == 'net6.0-ios'">14.2</SupportedOSPlatformVersion>
     <SupportedOSPlatformVersion Condition="'$(TargetFramework)' == 'net6.0-maccatalyst'">14.0</SupportedOSPlatformVersion>
     <SupportedOSPlatformVersion Condition="'$(TargetFramework)' == 'net6.0-android'">21.0</SupportedOSPlatformVersion>
-    <SupportedOSPlatformVersion Condition="$(TargetFramework.Contains('-windows'))">10.0.18362.0</SupportedOSPlatformVersion>
+    <SupportedOSPlatformVersion Condition="$(TargetFramework.Contains('-windows'))">10.0.17763.0</SupportedOSPlatformVersion>
   </PropertyGroup>
 
   <ItemGroup>
@@ -37,11 +37,6 @@
     <ProjectReference Include="..\..\..\..\source\SkiaSharp.Views.Maui\SkiaSharp.Views.Maui.Controls\SkiaSharp.Views.Maui.Controls.csproj" />
   </ItemGroup>
 
-  <ItemGroup Condition="$(TargetFramework.Contains('-windows'))">
-    <PackageReference Include="Microsoft.WindowsAppSDK" Version="1.0.0" />
-    <PackageReference Include="Microsoft.Graphics.Win2D" Version="1.0.0.30" />
-  </ItemGroup>
-
   <ItemGroup Condition="$(TargetFramework.Contains('-windows'))">
     <None Include="..\..\..\..\output\native\windows\x64\libSkiaSharp.dll" Condition="Exists('..\..\..\..\output\native\windows\x64\libSkiaSharp.dll')">
       <Link>libSkiaSharp.dll</Link>
@@ -49,11 +44,6 @@
     </None>
   </ItemGroup>
 
-  <PropertyGroup Condition="$(TargetFramework.Contains('-windows'))">
-    <OutputType>WinExe</OutputType>
-    <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
-  </PropertyGroup>
-
   <Import Project="..\..\..\..\output\SkiaSharp\nuget\build\$(TargetFramework)\SkiaSharp.Local.targets" Condition="Exists('..\..\..\..\output\SkiaSharp\nuget\build\$(TargetFramework)\SkiaSharp.Local.targets')" />
 
 </Project>
diff --git a/scripts/azure-pipelines-variables.yml b/scripts/azure-pipelines-variables.yml
index d48255ff44..6901f76779 100644
--- a/scripts/azure-pipelines-variables.yml
+++ b/scripts/azure-pipelines-variables.yml
@@ -13,9 +13,9 @@ variables:
   MONO_VERSION_MACOS: '6_12_13'
   MONO_VERSION_LINUX: ''
   XCODE_VERSION: 13.2.1
-  VISUAL_STUDIO_VERSION: ''
-  DOTNET_VERSION_PREVIEW: '6.0.200-rtm.22107.3'
-  DOTNET_WORKLOAD_SOURCE: 'https://aka.ms/dotnet/maui/6.0.200/preview.14.json'
+  VISUAL_STUDIO_VERSION: '17/pre'
+  DOTNET_VERSION_PREVIEW: '6.0.300-preview.22179.2'
+  DOTNET_WORKLOAD_SOURCE: 'https://aka.ms/dotnet/maui/6.0.300/rc.1.json'
   CONFIGURATION: 'Release'
   DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
   THROW_ON_TEST_FAILURE: true
diff --git a/scripts/azure-pipelines.yml b/scripts/azure-pipelines.yml
index 3588da0dc6..e8c4cbe86e 100644
--- a/scripts/azure-pipelines.yml
+++ b/scripts/azure-pipelines.yml
@@ -19,12 +19,33 @@ parameters:
       pool:
         name: Azure Pipelines
         vmImage: windows-2022
-  - name: VM_IMAGE_MAC
+  - name: VM_IMAGE_MAC_NATIVE
     type: object
     default:
       pool:
         name: Azure Pipelines
         vmImage: macos-11
+  - name: VM_IMAGE_MAC
+    type: object
+    default:
+      pool:
+        name: VSEng-VSMac-Xamarin-Shared
+        vmImage: VSEng-VSMac-Xamarin-Shared
+        demands:
+          - macOS.Name -equals Monterey
+          - macOS.Architecture -equals x64
+          - Agent.HasDevices -equals False
+          - Agent.IsPaired -equals False
+      variables:
+        XCODE_VERSION: 13.3.0
+      provisioningSteps:
+        - task: xamops.azdevex.provisionator-task.provisionator@1
+          displayName: 'Provision Xamarin'
+          inputs:
+            provisioning_script: ./scripts/provisionator.csx
+            provisioning_extra_args: --force
+          env:
+            AUTH_TOKEN_GITHUB_COM: $(github--pat--vs-mobiletools-engineering-service2)
   - name: VM_IMAGE_LINUX
     type: object
     default:
@@ -51,6 +72,6 @@ stages:
       VM_IMAGE_WINDOWS: ${{ parameters.VM_IMAGE_WINDOWS }}
       VM_IMAGE_WINDOWS_NATIVE: ${{ parameters.VM_IMAGE_WINDOWS }}
       VM_IMAGE_MAC: ${{ parameters.VM_IMAGE_MAC }}
-      VM_IMAGE_MAC_NATIVE: ${{ parameters.VM_IMAGE_MAC }}
+      VM_IMAGE_MAC_NATIVE: ${{ parameters.VM_IMAGE_MAC_NATIVE }}
       VM_IMAGE_LINUX: ${{ parameters.VM_IMAGE_LINUX }}
       VM_IMAGE_LINUX_NATIVE: ${{ parameters.VM_IMAGE_LINUX }}
diff --git a/scripts/azure-templates-build.yml b/scripts/azure-templates-build.yml
index 966cf85b61..e949d7bd68 100644
--- a/scripts/azure-templates-build.yml
+++ b/scripts/azure-templates-build.yml
@@ -145,9 +145,10 @@ jobs:
             displayName: Display all the .NET information
           # install VS
           - ${{ if endsWith(parameters.name, '_windows') }}:
-            - ${{ if and(eq(parameters.installPreviewVs, 'true'), ne(variables.VISUAL_STUDIO_VERSION, '')) }}:
+            - ${{ if eq(parameters.installPreviewVs, 'true') }}:
               - pwsh: .\scripts\install-vs.ps1 -Version $(VISUAL_STUDIO_VERSION)
                 displayName: Install Visual Studio
+                condition: ne(variables.VISUAL_STUDIO_VERSION, '')
           # install workloads
           - ${{ if not(endsWith(parameters.name, '_linux')) }}:
             - pwsh: .\scripts\install-dotnet-workloads.ps1 -InstallDir "$env:AGENT_TOOLSDIRECTORY/dotnet" -SourceUrl "$env:DOTNET_WORKLOAD_SOURCE" -IsPreview $true
diff --git a/scripts/azure-templates-variables.yml b/scripts/azure-templates-variables.yml
index d2409ef806..1b697ae1d0 100644
--- a/scripts/azure-templates-variables.yml
+++ b/scripts/azure-templates-variables.yml
@@ -51,13 +51,17 @@ steps:
 
   - pwsh: |
       Write-Host "Working with $env:RESOURCES_PIPELINE_SKIASHARP_RUNNAME"
-      $match = [regex]::Match("$env:RESOURCES_PIPELINE_SKIASHARP_RUNNAME", '.*\-(.+)\.(\d+)')
-      $label = $match.Groups[1].Value
-      Write-Host "Preview label: $label"
-      Write-Host "##vso[task.setvariable variable=PREVIEW_LABEL]$label"
-      $buildnumber = $match.Groups[2].Value
-      Write-Host "Build number: $buildnumber"
-      Write-Host "##vso[task.setvariable variable=BUILD_NUMBER]$buildnumber"
+      if ($env:RESOURCES_PIPELINE_SKIASHARP_RUNNAME) {
+        $match = [regex]::Match("$env:RESOURCES_PIPELINE_SKIASHARP_RUNNAME", '.*\-(.+)\.(\d+)')
+        $label = $match.Groups[1].Value
+        Write-Host "Preview label: $label"
+        Write-Host "##vso[task.setvariable variable=PREVIEW_LABEL]$label"
+        $buildnumber = $match.Groups[2].Value
+        Write-Host "Build number: $buildnumber"
+        Write-Host "##vso[task.setvariable variable=BUILD_NUMBER]$buildnumber"
+      } else {
+        Write-Host "Not a secondary build."
+      }
     condition: or(eq(variables['Build.Reason'], 'ResourceTrigger'), eq(variables['Build.Reason'], 'Manual'))
     displayName: Override the preview label and build number if this is a secondary build
 
diff --git a/scripts/install-vs.ps1 b/scripts/install-vs.ps1
index 33612e1718..3985c7d8e8 100644
--- a/scripts/install-vs.ps1
+++ b/scripts/install-vs.ps1
@@ -11,25 +11,30 @@ if (Test-Path $fullPath) {
   exit 0
 }
 
+$temp = "$env:TEMP"
+if ("$env:AGENT_TEMPDIRECTORY") {
+  $temp = "$env:AGENT_TEMPDIRECTORY"
+}
+
 $startTime = Get-Date
 
 Write-Host "Downloading Visual Studio Installer..."
 Invoke-WebRequest -UseBasicParsing `
   -Uri "https://aka.ms/vs/install/latest/vs_setup.exe" `
-  -OutFile "$env:TEMP\dd_vs_setup.exe"
+  -OutFile "$temp\dd_vs_setup.exe"
 
 Write-Host "Updating the Visual Studio Installer..."
-$exitCode = & "$env:TEMP\dd_vs_setup.exe" --update --quiet --wait | Out-Null
+$exitCode = & "$temp\dd_vs_setup.exe" --update --quiet --wait | Out-Null
 
 Write-Host "Exit code: $exitCode"
 
 Write-Host "Downloading Visual Studio ($Version)..."
 Invoke-WebRequest -UseBasicParsing `
   -Uri "https://aka.ms/vs/$Version/vs_community.exe" `
-  -OutFile "$env:TEMP\dd_vs_community.exe"
+  -OutFile "$temp\dd_vs_community.exe"
 
 Write-Host "Installing Visual Studio..."
-$exitCode = & "$env:TEMP\dd_vs_community.exe" --quiet --norestart --wait `
+$exitCode = & "$temp\dd_vs_community.exe" --quiet --norestart --wait `
   --includeRecommended `
   --add Microsoft.VisualStudio.Workload.NetCrossPlat `
   --add Microsoft.VisualStudio.Workload.NetCoreTools `
@@ -41,7 +46,7 @@ Write-Host "Exit code: $exitCode"
 
 $vsLogs = 'output\logs\vs-logs'
 New-Item -ItemType Directory -Force -Path "$vsLogs" | Out-Null
-Get-ChildItem "$env:TEMP\dd_*" |
+Get-ChildItem "$temp\dd_*" |
   Where-Object { $_.CreationTime -gt $startTime } |
   Copy-Item -Destination "$vsLogs"
 
diff --git a/scripts/provisionator.csx b/scripts/provisionator.csx
new file mode 100644
index 0000000000..a1e1975ce8
--- /dev/null
+++ b/scripts/provisionator.csx
@@ -0,0 +1 @@
+XamarinChannel("Stable");
diff --git a/source/SkiaSharp.Build.targets b/source/SkiaSharp.Build.targets
index 1efc4d0c98..1301709c05 100644
--- a/source/SkiaSharp.Build.targets
+++ b/source/SkiaSharp.Build.targets
@@ -23,7 +23,7 @@
     <SupportedOSPlatformVersion Condition="$(TargetFramework.Contains('-macos'))">10.14</SupportedOSPlatformVersion>
     <SupportedOSPlatformVersion Condition="$(TargetFramework.Contains('-maccatalyst'))">13.1</SupportedOSPlatformVersion>
     <SupportedOSPlatformVersion Condition="$(TargetFramework.Contains('-android'))">21.0</SupportedOSPlatformVersion>
-    <SupportedOSPlatformVersion Condition="$(TargetFramework.Contains('-windows'))">10.0.18362.0</SupportedOSPlatformVersion>
+    <SupportedOSPlatformVersion Condition="$(TargetFramework.Contains('-windows'))">10.0.17763.0</SupportedOSPlatformVersion>
 
     <!--
       Suppress version attribute generation in Microsoft.NET.Sdk projects to avoid build failures
diff --git a/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Native.Shared/SKCanvasViewRendererBase.cs b/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Native.Shared/SKCanvasViewRendererBase.cs
index 2fa8ec5a11..e1c6166d0f 100644
--- a/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Native.Shared/SKCanvasViewRendererBase.cs
+++ b/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Native.Shared/SKCanvasViewRendererBase.cs
@@ -13,16 +13,16 @@
 
 #if __ANDROID__
 using Android.Content;
-using Microsoft.Maui.Controls.Compatibility.Platform.Android;
+using Microsoft.Maui.Controls.Handlers.Compatibility;
 using SKNativeView = SkiaSharp.Views.Android.SKCanvasView;
 using SKNativePaintSurfaceEventArgs = SkiaSharp.Views.Android.SKPaintSurfaceEventArgs;
 #elif __IOS__
-using Microsoft.Maui.Controls.Compatibility.Platform.iOS;
+using Microsoft.Maui.Controls.Handlers.Compatibility;
 using SKNativeView = SkiaSharp.Views.iOS.SKCanvasView;
 using SKNativePaintSurfaceEventArgs = SkiaSharp.Views.iOS.SKPaintSurfaceEventArgs;
 #elif WINDOWS
 using Windows.Graphics.Display;
-using Microsoft.Maui.Controls.Compatibility.Platform.UWP;
+using Microsoft.Maui.Controls.Handlers.Compatibility;
 using SKNativeView = SkiaSharp.Views.Windows.SKXamlCanvas;
 using SKNativePaintSurfaceEventArgs = SkiaSharp.Views.Windows.SKPaintSurfaceEventArgs;
 using WVisibility = Microsoft.UI.Xaml.Visibility;
diff --git a/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Native.Shared/SKGLViewRendererBase.cs b/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Native.Shared/SKGLViewRendererBase.cs
index fccf4a45dc..a5aa087014 100644
--- a/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Native.Shared/SKGLViewRendererBase.cs
+++ b/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Native.Shared/SKGLViewRendererBase.cs
@@ -11,11 +11,11 @@
 
 #if __ANDROID__
 using Android.Content;
-using Microsoft.Maui.Controls.Compatibility.Platform.Android;
+using Microsoft.Maui.Controls.Handlers.Compatibility;
 using SKNativeView = SkiaSharp.Views.Android.SKGLTextureView;
 using SKNativePaintGLSurfaceEventArgs = SkiaSharp.Views.Android.SKPaintGLSurfaceEventArgs;
 #elif __IOS__
-using Microsoft.Maui.Controls.Compatibility.Platform.iOS;
+using Microsoft.Maui.Controls.Handlers.Compatibility;
 using SKNativeView = SkiaSharp.Views.iOS.SKGLView;
 using SKNativePaintGLSurfaceEventArgs = SkiaSharp.Views.iOS.SKPaintGLSurfaceEventArgs;
 #endif
diff --git a/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Shared/SKImageSource.cs b/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Shared/SKImageSource.cs
index f4943bef3f..e0eeba492f 100644
--- a/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Shared/SKImageSource.cs
+++ b/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Shared/SKImageSource.cs
@@ -153,6 +153,8 @@ protected override void OnPropertyChanged(string propertyName = null)
 		{
 			if (propertyName == PictureProperty.PropertyName)
 				OnSourceChanged();
+			else if (propertyName == DimensionsProperty.PropertyName)
+				OnSourceChanged();
 			base.OnPropertyChanged(propertyName);
 		}
 	}
diff --git a/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Controls.Compatibility/AppHostBuilderExtensions.cs b/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Controls.Compatibility/AppHostBuilderExtensions.cs
index cf593b97dc..e7b539940b 100644
--- a/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Controls.Compatibility/AppHostBuilderExtensions.cs
+++ b/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Controls.Compatibility/AppHostBuilderExtensions.cs
@@ -1,6 +1,4 @@
 using System;
-using Microsoft.Maui;
-using Microsoft.Maui.Controls.Compatibility;
 using Microsoft.Maui.Hosting;
 using SkiaSharp.Views.Maui.Controls.Compatibility;
 using SkiaSharp.Views.Maui.Controls.Hosting;
@@ -27,12 +25,12 @@ public static MauiAppBuilder UseSkiaSharp(this MauiAppBuilder builder, bool regi
 				{
 #if !NETSTANDARD
 					if (replaceHandlers)
-						handlers.AddCompatibilityRenderer(typeof(SKCanvasView), typeof(SKCanvasViewRenderer));
+						handlers.AddHandler<SKCanvasView, SKCanvasViewRenderer>();
 					else
-						handlers.TryAddCompatibilityRenderer(typeof(SKCanvasView), typeof(SKCanvasViewRenderer));
+						handlers.TryAddHandler<SKCanvasView, SKCanvasViewRenderer>();
 
 #if !WINDOWS && !__MACCATALYST__
-					handlers.AddCompatibilityRenderer(typeof(SKGLView), typeof(SKGLViewRenderer));
+					handlers.AddHandler<SKGLView, SKGLViewRenderer>();
 #endif
 
 					CompatRegistrar.Registered.Register(typeof(SKImageImageSource), typeof(SKImageSourceHandler));
diff --git a/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKCanvasView/SKCanvasViewHandler.Android.cs b/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKCanvasView/SKCanvasViewHandler.Android.cs
index 2a35eeaffe..82bf3bd614 100644
--- a/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKCanvasView/SKCanvasViewHandler.Android.cs
+++ b/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKCanvasView/SKCanvasViewHandler.Android.cs
@@ -65,7 +65,7 @@ private void OnPaintSurface(object? sender, Android.SKPaintSurfaceEventArgs e)
 				VirtualView?.OnCanvasSizeChanged(newCanvasSize);
 			}
 
-			VirtualView?.OnPaintSurface(new SKPaintSurfaceEventArgs(e.Surface, e.Info));
+			VirtualView?.OnPaintSurface(new SKPaintSurfaceEventArgs(e.Surface, e.Info, e.RawInfo));
 		}
 
 		private SKPoint OnGetScaledCoord(double x, double y)
diff --git a/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKCanvasView/SKCanvasViewHandler.Windows.cs b/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKCanvasView/SKCanvasViewHandler.Windows.cs
index 94242ea366..9b6ba30935 100644
--- a/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKCanvasView/SKCanvasViewHandler.Windows.cs
+++ b/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKCanvasView/SKCanvasViewHandler.Windows.cs
@@ -63,7 +63,7 @@ private void OnPaintSurface(object? sender, Windows.SKPaintSurfaceEventArgs e)
 				VirtualView?.OnCanvasSizeChanged(newCanvasSize);
 			}
 
-			VirtualView?.OnPaintSurface(new SKPaintSurfaceEventArgs(e.Surface, e.Info));
+			VirtualView?.OnPaintSurface(new SKPaintSurfaceEventArgs(e.Surface, e.Info, e.RawInfo));
 		}
 
 		private SKPoint OnGetScaledCoord(double x, double y)
diff --git a/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKCanvasView/SKCanvasViewHandler.iOS.cs b/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKCanvasView/SKCanvasViewHandler.iOS.cs
index 4fbf664ffb..33c3025314 100644
--- a/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKCanvasView/SKCanvasViewHandler.iOS.cs
+++ b/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKCanvasView/SKCanvasViewHandler.iOS.cs
@@ -64,7 +64,7 @@ private void OnPaintSurface(object? sender, iOS.SKPaintSurfaceEventArgs e)
 				VirtualView?.OnCanvasSizeChanged(newCanvasSize);
 			}
 
-			VirtualView?.OnPaintSurface(new SKPaintSurfaceEventArgs(e.Surface, e.Info));
+			VirtualView?.OnPaintSurface(new SKPaintSurfaceEventArgs(e.Surface, e.Info, e.RawInfo));
 		}
 
 		private SKPoint OnGetScaledCoord(double x, double y)
diff --git a/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKImageSourceService/SKImageSourceService.Android.cs b/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKImageSourceService/SKImageSourceService.Android.cs
index fb13a162ab..0be186c4ab 100644
--- a/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKImageSourceService/SKImageSourceService.Android.cs
+++ b/source/SkiaSharp.Views.Maui/SkiaSharp.Views.Maui.Core/Handlers/SKImageSourceService/SKImageSourceService.Android.cs
@@ -9,7 +9,29 @@ namespace SkiaSharp.Views.Maui.Handlers
 {
 	public partial class SKImageSourceService
 	{
-		public override Task<IImageSourceServiceResult<Drawable>?> GetDrawableAsync(IImageSource imageSource, Context context, CancellationToken cancellationToken = default)
+		public override async Task<IImageSourceServiceResult?> LoadDrawableAsync(
+			IImageSource imageSource,
+			global::Android.Widget.ImageView imageView,
+			CancellationToken cancellationToken = default)
+		{
+			var realResult = await GetDrawableAsync(imageView.Context!, imageSource, cancellationToken);
+
+			if (realResult is null)
+			{
+				imageView.SetImageDrawable(null);
+				return null;
+			}
+
+			imageView.SetImageDrawable(realResult.Value);
+
+			var result = new ImageSourceServiceLoadResult(
+				realResult.IsResolutionDependent,
+				() => realResult.Dispose());
+
+			return result;
+		}
+
+		public override Task<IImageSourceServiceResult<Drawable>?> GetDrawableAsync(Context context, IImageSource imageSource, CancellationToken cancellationToken = default)
 		{
 			var bitmap = imageSource switch
 			{
diff --git a/source/SkiaSharp.Views.WinUI/SkiaSharp.Views.WinUI/SkiaSharp.Views.WinUI.csproj b/source/SkiaSharp.Views.WinUI/SkiaSharp.Views.WinUI/SkiaSharp.Views.WinUI.csproj
index f447b73e1e..e46a08ce14 100644
--- a/source/SkiaSharp.Views.WinUI/SkiaSharp.Views.WinUI/SkiaSharp.Views.WinUI.csproj
+++ b/source/SkiaSharp.Views.WinUI/SkiaSharp.Views.WinUI/SkiaSharp.Views.WinUI.csproj
@@ -1,6 +1,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
-    <TargetFramework>net5.0-windows10.0.18362</TargetFramework>
+    <TargetFrameworks>net5.0-windows10.0.18362;net6.0-windows10.0.18362</TargetFrameworks>
     <TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
     <RootNamespace>SkiaSharp.Views.Windows</RootNamespace>
     <AssemblyName>SkiaSharp.Views.Windows</AssemblyName>
diff --git a/source/SkiaSharp.Views/SkiaSharp.Views.UWP/UWPExtensions.cs b/source/SkiaSharp.Views/SkiaSharp.Views.UWP/UWPExtensions.cs
index 6518013b32..87c817958d 100644
--- a/source/SkiaSharp.Views/SkiaSharp.Views.UWP/UWPExtensions.cs
+++ b/source/SkiaSharp.Views/SkiaSharp.Views.UWP/UWPExtensions.cs
@@ -75,7 +75,7 @@ public static WriteableBitmap ToWriteableBitmap(this SKPicture picture, SKSizeI
 		{
 			using (var image = SKImage.FromPicture(picture, dimensions))
 			{
-				return image.ToWriteableBitmap();
+				return image?.ToWriteableBitmap();
 			}
 		}