Skip to content

Commit 4b755b1

Browse files
authored
Merge pull request #22 from MartinZikmund/dev/mazi/macos-support
macOS support
2 parents 7248979 + 405ca2a commit 4b755b1

File tree

2 files changed

+107
-3
lines changed

2 files changed

+107
-3
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
#if __MACOS__
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Runtime.InteropServices;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
using CoreGraphics;
8+
using SkiaSharp;
9+
using SkiaSharp.Views.Mac;
10+
using AppKit;
11+
using Windows.ApplicationModel;
12+
using Windows.Graphics.Display;
13+
using Windows.UI.Core;
14+
using Windows.UI.Xaml;
15+
using Windows.UI.Xaml.Controls;
16+
using Windows.UI.Xaml.Media;
17+
18+
namespace SkiaSharp.Views.UWP
19+
{
20+
public partial class SKXamlCanvas : FrameworkElement
21+
{
22+
private SKCGSurfaceFactory drawable;
23+
24+
public SKXamlCanvas()
25+
{
26+
Loaded += OnLoaded;
27+
Unloaded += OnUnloaded;
28+
SizeChanged += OnSizeChanged;
29+
30+
RegisterPropertyChangedCallback(VisibilityProperty, (s, e) => OnVisibilityChanged(s));
31+
OnVisibilityChanged(this);
32+
Initialize();
33+
}
34+
35+
private SKSize GetCanvasSize() => drawable?.Info.Size ?? SKSize.Empty;
36+
37+
private static bool GetIsInitialized() => true;
38+
39+
private void Initialize()
40+
{
41+
drawable = new SKCGSurfaceFactory();
42+
}
43+
44+
private void OnDpiChanged(DisplayInformation sender, object args = null)
45+
{
46+
Dpi = sender.LogicalDpi / 96.0f;
47+
Invalidate();
48+
}
49+
50+
private void OnLoaded(object sender, RoutedEventArgs e)
51+
{
52+
var display = DisplayInformation.GetForCurrentView();
53+
display.DpiChanged += OnDpiChanged;
54+
55+
OnDpiChanged(display);
56+
Invalidate();
57+
}
58+
59+
private void OnUnloaded(object sender, RoutedEventArgs e)
60+
{
61+
var display = DisplayInformation.GetForCurrentView();
62+
display.DpiChanged -= OnDpiChanged;
63+
}
64+
65+
private void DoInvalidate()
66+
=> NeedsDisplay = true;
67+
68+
public override void DrawRect(CGRect rect)
69+
{
70+
base.DrawRect(rect);
71+
72+
using (var ctx = NSGraphicsContext.CurrentContext.CGContext)
73+
{
74+
// create the skia context
75+
SKImageInfo info;
76+
using (var surface = drawable.CreateSurface(Bounds, IgnorePixelScaling ? 1 : Window.BackingScaleFactor, out info))
77+
{
78+
// draw on the image using SKiaSharp
79+
OnPaintSurface(new SKPaintSurfaceEventArgs(surface, info));
80+
81+
// draw the surface to the context
82+
drawable.DrawSurface(ctx, Bounds, info, surface);
83+
}
84+
}
85+
}
86+
87+
protected override void Dispose(bool disposing)
88+
{
89+
base.Dispose(disposing);
90+
91+
drawable?.Dispose();
92+
}
93+
}
94+
}
95+
#endif

source/SkiaSharp.Views/SkiaSharp.Views.Uno/SkiaSharp.Views.Uno.csproj

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="MSBuild.Sdk.Extras/2.0.54" ToolsVersion="15.0">
22

33
<PropertyGroup>
4-
<TargetFrameworks>netstandard2.0;xamarinios10;monoandroid80;monoandroid90</TargetFrameworks>
4+
<TargetFrameworks>netstandard2.0;xamarinios10;monoandroid80;monoandroid90;xamarinmac20</TargetFrameworks>
55
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
66
<GeneratePackageOnBuild Condition="'$(Configuration)'=='Release'">true</GeneratePackageOnBuild>
77
<NoWarn>$(NoWarm);NU1701</NoWarn>
@@ -63,15 +63,24 @@
6363
<Compile Remove="..\SkiaSharp.Views.AppleiOS\SKGLView.cs" />
6464
<Compile Remove="..\SkiaSharp.Views.AppleiOS\SKGLLayer.cs" />
6565
</ItemGroup>
66-
<ItemGroup Condition="'$(TargetFramework)'!='xamarinios10'">
66+
<ItemGroup Condition="'$(TargetFramework)'=='xamarinmac20'">
67+
<Compile Include="..\SkiaSharp.Views.Mac\**\*.cs" Link="SharedViews\%(RecursiveDir)%(Filename)%(Extension)" />
68+
<Compile Include="..\SkiaSharp.Views.Apple\**\*.cs" Link="SharedViews\%(RecursiveDir)%(Filename)%(Extension)" />
69+
<Compile Remove="..\SkiaSharp.Views.Mac\SKCanvasView.cs" />
70+
<Compile Remove="..\SkiaSharp.Views.Apple\SKCanvasLayer.cs" />
71+
<Compile Remove="..\SkiaSharp.Views.Mac\SKGLView.cs" />
72+
<Compile Remove="..\SkiaSharp.Views.Mac\SKGLLayer.cs" />
73+
</ItemGroup>
74+
<ItemGroup Condition="'$(TargetFramework)'!='xamarinios10' and '$(TargetFramework)'!='xamarinmac20'">
6775
<None Include="..\SkiaSharp.Views.AppleiOS\**\*.cs" Link="SharedViews\%(RecursiveDir)%(Filename)%(Extension)" />
76+
<None Include="..\SkiaSharp.Views.Mac\**\*.cs" Link="SharedViews\%(RecursiveDir)%(Filename)%(Extension)" />
6877
<None Include="..\SkiaSharp.Views.Apple\**\*.cs" Link="SharedViews\%(RecursiveDir)%(Filename)%(Extension)" />
6978
</ItemGroup>
7079

7180
<ItemGroup Condition="'$(TargetFramework)'=='netstandard2.0'">
7281
<ProjectReference Include="..\..\..\binding\SkiaSharp.Wasm\SkiaSharp.Wasm.csproj" />
7382
</ItemGroup>
74-
<ItemGroup Condition="'$(TargetFramework)'=='xamarinios10' or '$(TargetFramework)'=='monoandroid80' or '$(TargetFramework)'=='monoandroid90'">
83+
<ItemGroup Condition="'$(TargetFramework)'=='xamarinios10' or '$(TargetFramework)'=='xamarinmac20' or '$(TargetFramework)'=='monoandroid80' or '$(TargetFramework)'=='monoandroid90'">
7584
<PackageReference Include="SkiaSharp" Version="1.68.0" />
7685
</ItemGroup>
7786

0 commit comments

Comments
 (0)