diff --git a/samples/Basic/iOS/SkiaSharpSample/ViewController.cs b/samples/Basic/iOS/SkiaSharpSample/ViewController.cs
index 67001005..3b812df2 100644
--- a/samples/Basic/iOS/SkiaSharpSample/ViewController.cs
+++ b/samples/Basic/iOS/SkiaSharpSample/ViewController.cs
@@ -27,7 +27,6 @@ namespace SkiaSharpSample
// get the screen density for scaling
var scale = (float)skiaView.ContentScaleFactor;
- var scaledSize = new SKSize(e.Info.Width / scale, e.Info.Height / scale);
// handle the device screen density
canvas.Scale(scale);
@@ -44,7 +43,7 @@ namespace SkiaSharpSample
TextAlign = SKTextAlign.Center,
TextSize = 24
};
- var coord = new SKPoint(scaledSize.Width / 2, (scaledSize.Height + paint.TextSize) / 2);
+ var coord = new SKPoint((float)skiaView.Bounds.Width / 2, ((float)skiaView.Bounds.Height + paint.TextSize) / 2);
canvas.DrawText("SkiaSharp", coord, paint);
}
}
diff --git a/samples/Basic/macOS/SkiaSharpSample.sln b/samples/Basic/macOS/SkiaSharpSample.sln
new file mode 100644
index 00000000..f1e9dd2f
--- /dev/null
+++ b/samples/Basic/macOS/SkiaSharpSample.sln
@@ -0,0 +1,105 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26430.13
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Binding", "..\..\..\Binding\Binding\Binding.shproj", "{9C502B9A-25D4-473F-89BD-5A13DDE16354}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkiaSharp.OSX", "..\..\..\Binding\SkiaSharp.OSX\SkiaSharp.OSX.csproj", "{4588A759-3853-49B8-8A68-6C7917BE9220}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkiaSharp.Views.Mac", "..\..\..\source\SkiaSharp.Views\SkiaSharp.Views.Mac\SkiaSharp.Views.Mac.csproj", "{809A15DC-E675-4A24-83FA-DF13160F7E4C}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SkiaSharp.Views.Apple", "..\..\..\source\SkiaSharp.Views\SkiaSharp.Views.Apple\SkiaSharp.Views.Apple.shproj", "{CBCA14E7-96C9-4697-909C-19B1EF7298F7}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SkiaSharp.Views.Shared", "..\..\..\source\SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.shproj", "{5A67972C-1C04-4913-9950-06A03BFE9533}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "source", "source", "{C335869B-7CC8-4239-B4A5-8031AA9758D3}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Binding.Shared", "..\..\..\Binding\Binding.Shared\Binding.Shared.shproj", "{6F8349DC-90AC-441D-8B8B-BE623F46BE6D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkiaSharpSample", "SkiaSharpSample\SkiaSharpSample.csproj", "{299A6EF2-E5C0-4290-B9E3-A04F98A5ABF4}"
+EndProject
+Global
+ GlobalSection(SharedMSBuildProjectFiles) = preSolution
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Shared\SkiaSharp.Views.Forms.Shared.projitems*{1555d119-8598-4e4d-91ac-d313f94a1673}*SharedItemsImports = 4
+ ..\binding\HarfBuzzSharp.Shared\HarfBuzzSharp.Shared.projitems*{1aaa8f60-6138-4dfe-b240-5a0f3fb87e0f}*SharedItemsImports = 13
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{2ae5d8c5-eac6-4515-89f2-a4994b41c925}*SharedItemsImports = 4
+ ..\binding\HarfBuzzSharp.Shared\HarfBuzzSharp.Shared.projitems*{2ae5d8c5-eac6-4515-89f2-a4994b41c925}*SharedItemsImports = 4
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Native.Shared\SkiaSharp.Views.Forms.Native.Shared.projitems*{2f94f024-1841-47e8-b521-74aa4e3eba54}*SharedItemsImports = 4
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Shared\SkiaSharp.Views.Forms.Shared.projitems*{2f94f024-1841-47e8-b521-74aa4e3eba54}*SharedItemsImports = 4
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Shared\SkiaSharp.Views.Forms.Shared.projitems*{314fb505-9858-4e03-b799-91b0ba627d05}*SharedItemsImports = 13
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{4588a759-3853-49b8-8a68-6c7917be9220}*SharedItemsImports = 4
+ ..\Binding\Binding\Binding.projitems*{4588a759-3853-49b8-8a68-6c7917be9220}*SharedItemsImports = 4
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Native.Shared\SkiaSharp.Views.Forms.Native.Shared.projitems*{4ac36d63-bf11-445f-81ee-107c0cef4fc9}*SharedItemsImports = 4
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Shared\SkiaSharp.Views.Forms.Shared.projitems*{4ac36d63-bf11-445f-81ee-107c0cef4fc9}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{5180e370-a455-42bb-99f9-97bd269b8a52}*SharedItemsImports = 4
+ ..\Binding\Binding\Binding.projitems*{5180e370-a455-42bb-99f9-97bd269b8a52}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{099A4BAD-6CF7-4898-9D16-266BDD844F95}*SharedItemsImports = 4
+ ..\Binding\Binding\Binding.projitems*{099A4BAD-6CF7-4898-9D16-266BDD844F95}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.projitems*{5a67972c-1c04-4913-9950-06a03bfe9533}*SharedItemsImports = 13
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{6a678cfb-21a7-4e81-8909-fd72abbfd408}*SharedItemsImports = 4
+ ..\Binding\Binding\Binding.projitems*{6a678cfb-21a7-4e81-8909-fd72abbfd408}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{6f8349dc-90ac-441d-8b8b-be623f46be6d}*SharedItemsImports = 13
+ SkiaSharp.Views\SkiaSharp.Views.AppleiOS\SkiaSharp.Views.AppleiOS.projitems*{74c78108-9199-4a7a-928c-fc4dc57d0ae4}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Apple\SkiaSharp.Views.Apple.projitems*{74c78108-9199-4a7a-928c-fc4dc57d0ae4}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.projitems*{74c78108-9199-4a7a-928c-fc4dc57d0ae4}*SharedItemsImports = 4
+ SkiaSharp.HarfBuzz\SkiaSharp.HarfBuzz.Shared\SkiaSharp.HarfBuzz.Shared.projitems*{7cad1912-05a5-42e5-b7ba-81bb051f0566}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Apple\SkiaSharp.Views.Apple.projitems*{809a15dc-e675-4a24-83fa-df13160f7e4c}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.projitems*{809a15dc-e675-4a24-83fa-df13160f7e4c}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{8d646738-458a-441f-b69b-253ef058a812}*SharedItemsImports = 4
+ ..\binding\HarfBuzzSharp.Shared\HarfBuzzSharp.Shared.projitems*{8d646738-458a-441f-b69b-253ef058a812}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{0C940695-4868-4CF7-7D16-266BDD88A812}*SharedItemsImports = 4
+ ..\binding\HarfBuzzSharp.Shared\HarfBuzzSharp.Shared.projitems*{0C940695-4868-4CF7-7D16-266BDD88A812}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.projitems*{926c8d29-e047-4f4e-8b35-852e47bfa9f5}*SharedItemsImports = 4
+ ..\Binding\Binding\Binding.projitems*{9c502b9a-25d4-473f-89bd-5a13dde16354}*SharedItemsImports = 13
+ SkiaSharp.HarfBuzz\SkiaSharp.HarfBuzz.Shared\SkiaSharp.HarfBuzz.Shared.projitems*{c3e63b2d-95d4-4c3f-b10f-7a0aacf94980}*SharedItemsImports = 13
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{c737dc80-5b71-4b26-a2dc-da30421788b0}*SharedItemsImports = 4
+ ..\Binding\Binding\Binding.projitems*{c737dc80-5b71-4b26-a2dc-da30421788b0}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Apple\SkiaSharp.Views.Apple.projitems*{cbca14e7-96c9-4697-909c-19b1ef7298f7}*SharedItemsImports = 13
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Native.Shared\SkiaSharp.Views.Forms.Native.Shared.projitems*{cebd25fd-dd4f-4d5f-b809-d50d02176f41}*SharedItemsImports = 13
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Native.Shared\SkiaSharp.Views.Forms.Native.Shared.projitems*{da5da4d8-4885-4af2-96bb-ae803c344ab0}*SharedItemsImports = 4
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Shared\SkiaSharp.Views.Forms.Shared.projitems*{da5da4d8-4885-4af2-96bb-ae803c344ab0}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.AppleiOS\SkiaSharp.Views.AppleiOS.projitems*{e5973829-6c8b-43e4-b81b-c8492df26c90}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Apple\SkiaSharp.Views.Apple.projitems*{e5973829-6c8b-43e4-b81b-c8492df26c90}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.projitems*{e5973829-6c8b-43e4-b81b-c8492df26c90}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.AppleiOS\SkiaSharp.Views.AppleiOS.projitems*{9E850CCA-54CC-4CEB-B2C2-E32EF4A17D61}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Apple\SkiaSharp.Views.Apple.projitems*{9E850CCA-54CC-4CEB-B2C2-E32EF4A17D61}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.projitems*{9E850CCA-54CC-4CEB-B2C2-E32EF4A17D61}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{e6b786c4-3bf9-4a42-9a4a-08002ae3fdad}*SharedItemsImports = 4
+ ..\binding\HarfBuzzSharp.Shared\HarfBuzzSharp.Shared.projitems*{e6b786c4-3bf9-4a42-9a4a-08002ae3fdad}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{e8192110-fcf9-4972-9472-7408bc2ca56b}*SharedItemsImports = 4
+ ..\binding\HarfBuzzSharp.Shared\HarfBuzzSharp.Shared.projitems*{e8192110-fcf9-4972-9472-7408bc2ca56b}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{eb1bbdcc-fb07-40d5-8b9e-0079e2c2f2df}*SharedItemsImports = 4
+ ..\Binding\Binding\Binding.projitems*{eb1bbdcc-fb07-40d5-8b9e-0079e2c2f2df}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.AppleiOS\SkiaSharp.Views.AppleiOS.projitems*{ff4c9f9f-7a6a-44d1-8338-d30e39e4e9d4}*SharedItemsImports = 13
+ EndGlobalSection
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {809A15DC-E675-4A24-83FA-DF13160F7E4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {809A15DC-E675-4A24-83FA-DF13160F7E4C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {809A15DC-E675-4A24-83FA-DF13160F7E4C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {809A15DC-E675-4A24-83FA-DF13160F7E4C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4588A759-3853-49B8-8A68-6C7917BE9220}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4588A759-3853-49B8-8A68-6C7917BE9220}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4588A759-3853-49B8-8A68-6C7917BE9220}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4588A759-3853-49B8-8A68-6C7917BE9220}.Release|Any CPU.Build.0 = Release|Any CPU
+ {299A6EF2-E5C0-4290-B9E3-A04F98A5ABF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {299A6EF2-E5C0-4290-B9E3-A04F98A5ABF4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {299A6EF2-E5C0-4290-B9E3-A04F98A5ABF4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {299A6EF2-E5C0-4290-B9E3-A04F98A5ABF4}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {809A15DC-E675-4A24-83FA-DF13160F7E4C} = {C335869B-7CC8-4239-B4A5-8031AA9758D3}
+ {CBCA14E7-96C9-4697-909C-19B1EF7298F7} = {C335869B-7CC8-4239-B4A5-8031AA9758D3}
+ {5A67972C-1C04-4913-9950-06A03BFE9533} = {C335869B-7CC8-4239-B4A5-8031AA9758D3}
+ {9C502B9A-25D4-473F-89BD-5A13DDE16354} = {C335869B-7CC8-4239-B4A5-8031AA9758D3}
+ {4588A759-3853-49B8-8A68-6C7917BE9220} = {C335869B-7CC8-4239-B4A5-8031AA9758D3}
+ {6F8349DC-90AC-441D-8B8B-BE623F46BE6D} = {C335869B-7CC8-4239-B4A5-8031AA9758D3}
+ EndGlobalSection
+EndGlobal
diff --git a/samples/Basic/macOS/SkiaSharpSample/AppDelegate.cs b/samples/Basic/macOS/SkiaSharpSample/AppDelegate.cs
new file mode 100644
index 00000000..51240dd9
--- /dev/null
+++ b/samples/Basic/macOS/SkiaSharpSample/AppDelegate.cs
@@ -0,0 +1,19 @@
+using AppKit;
+using Foundation;
+
+namespace SkiaSharpSample
+{
+ [Register(nameof(AppDelegate))]
+ public class AppDelegate : NSApplicationDelegate
+ {
+ public override void DidFinishLaunching(NSNotification notification)
+ {
+ // Insert code here to initialize your application
+ }
+
+ public override void WillTerminate(NSNotification notification)
+ {
+ // Insert code here to tear down your application
+ }
+ }
+}
diff --git a/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-128.png b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-128.png
new file mode 100644
index 00000000..d0b5a809
Binary files /dev/null and b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-128.png differ
diff --git a/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-128@2x.png b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-128@2x.png
new file mode 100644
index 00000000..f4c8d290
Binary files /dev/null and b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-128@2x.png differ
diff --git a/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-16.png b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-16.png
new file mode 100644
index 00000000..ebb5a0fe
Binary files /dev/null and b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-16.png differ
diff --git a/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-16@2x.png b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-16@2x.png
new file mode 100644
index 00000000..0986d31b
Binary files /dev/null and b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-16@2x.png differ
diff --git a/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-256.png b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-256.png
new file mode 100644
index 00000000..f4c8d290
Binary files /dev/null and b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-256.png differ
diff --git a/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-256@2x.png b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-256@2x.png
new file mode 100644
index 00000000..a142c83f
Binary files /dev/null and b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-256@2x.png differ
diff --git a/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-32.png b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-32.png
new file mode 100644
index 00000000..0986d31b
Binary files /dev/null and b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-32.png differ
diff --git a/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-32@2x.png b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-32@2x.png
new file mode 100644
index 00000000..412d6ca9
Binary files /dev/null and b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-32@2x.png differ
diff --git a/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-512.png b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-512.png
new file mode 100644
index 00000000..a142c83f
Binary files /dev/null and b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-512.png differ
diff --git a/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png
new file mode 100644
index 00000000..e99022ae
Binary files /dev/null and b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png differ
diff --git a/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/Contents.json b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000..6b285452
--- /dev/null
+++ b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,68 @@
+{
+ "images": [
+ {
+ "filename": "AppIcon-16.png",
+ "size": "16x16",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "filename": "AppIcon-16@2x.png",
+ "size": "16x16",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "filename": "AppIcon-32.png",
+ "size": "32x32",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "filename": "AppIcon-32@2x.png",
+ "size": "32x32",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "filename": "AppIcon-128.png",
+ "size": "128x128",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "filename": "AppIcon-128@2x.png",
+ "size": "128x128",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "filename": "AppIcon-256.png",
+ "size": "256x256",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "filename": "AppIcon-256@2x.png",
+ "size": "256x256",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "filename": "AppIcon-512.png",
+ "size": "512x512",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "filename": "AppIcon-512@2x.png",
+ "size": "512x512",
+ "scale": "2x",
+ "idiom": "mac"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/Contents.json b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/Contents.json
new file mode 100644
index 00000000..4caf392f
--- /dev/null
+++ b/samples/Basic/macOS/SkiaSharpSample/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/macOS/SkiaSharpSample/Entitlements.plist b/samples/Basic/macOS/SkiaSharpSample/Entitlements.plist
new file mode 100644
index 00000000..9ae59937
--- /dev/null
+++ b/samples/Basic/macOS/SkiaSharpSample/Entitlements.plist
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/samples/Basic/macOS/SkiaSharpSample/Info.plist b/samples/Basic/macOS/SkiaSharpSample/Info.plist
new file mode 100644
index 00000000..d5c9e5cb
--- /dev/null
+++ b/samples/Basic/macOS/SkiaSharpSample/Info.plist
@@ -0,0 +1,33 @@
+
+
+
+
+ CFBundleName
+ SkiaSharpSample
+ CFBundleIdentifier
+ com.companyname.SkiaSharpSample
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+ LSMinimumSystemVersion
+ 10.10
+ CFBundleDevelopmentRegion
+ en
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundlePackageType
+ APPL
+ CFBundleSignature
+ ????
+ NSHumanReadableCopyright
+ (c) Matthew Leibowitz
+ NSPrincipalClass
+ NSApplication
+ NSMainStoryboardFile
+ Main
+ XSAppIconAssets
+ Assets.xcassets/AppIcon.appiconset
+
+
+
diff --git a/samples/Basic/macOS/SkiaSharpSample/Main.cs b/samples/Basic/macOS/SkiaSharpSample/Main.cs
new file mode 100644
index 00000000..bbe843b7
--- /dev/null
+++ b/samples/Basic/macOS/SkiaSharpSample/Main.cs
@@ -0,0 +1,13 @@
+using AppKit;
+
+namespace SkiaSharpSample
+{
+ static class MainClass
+ {
+ static void Main(string[] args)
+ {
+ NSApplication.Init();
+ NSApplication.Main(args);
+ }
+ }
+}
diff --git a/samples/Basic/macOS/SkiaSharpSample/Main.storyboard b/samples/Basic/macOS/SkiaSharpSample/Main.storyboard
new file mode 100644
index 00000000..47517b66
--- /dev/null
+++ b/samples/Basic/macOS/SkiaSharpSample/Main.storyboard
@@ -0,0 +1,695 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/Basic/macOS/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/macOS/SkiaSharpSample/SkiaSharpSample.csproj
new file mode 100644
index 00000000..4076337b
--- /dev/null
+++ b/samples/Basic/macOS/SkiaSharpSample/SkiaSharpSample.csproj
@@ -0,0 +1,100 @@
+
+
+
+ Debug
+ AnyCPU
+ {299A6EF2-E5C0-4290-B9E3-A04F98A5ABF4}
+ {A3F8F2AB-B479-4A4A-A458-A89E7DC349F1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ SkiaSharpSample
+ SkiaSharpSample
+ v2.0
+ Xamarin.Mac
+ Resources
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ Mac Developer
+ false
+ false
+ false
+ true
+ true
+ true
+
+
+
+
+
+ pdbonly
+ true
+ bin\Release
+
+ prompt
+ 4
+ false
+ true
+ false
+ true
+ true
+ true
+ SdkOnly
+
+
+
+
+
+
+
+
+
+
+ {4588A759-3853-49B8-8A68-6C7917BE9220}
+ SkiaSharp.OSX
+
+
+ {809A15DC-E675-4A24-83FA-DF13160F7E4C}
+ SkiaSharp.Views.Mac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ViewController.cs
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/Basic/macOS/SkiaSharpSample/ViewController.cs b/samples/Basic/macOS/SkiaSharpSample/ViewController.cs
new file mode 100644
index 00000000..fa9add2e
--- /dev/null
+++ b/samples/Basic/macOS/SkiaSharpSample/ViewController.cs
@@ -0,0 +1,50 @@
+using System;
+using AppKit;
+
+using SkiaSharp;
+using SkiaSharp.Views.Mac;
+
+namespace SkiaSharpSample
+{
+ public partial class ViewController : NSViewController
+ {
+ public ViewController(IntPtr handle)
+ : base(handle)
+ {
+ }
+
+ public override void ViewDidLoad()
+ {
+ base.ViewDidLoad();
+
+ skiaView.PaintSurface += OnPaintSurface;
+ }
+
+ private void OnPaintSurface(object sender, SKPaintSurfaceEventArgs e)
+ {
+ // the the canvas and properties
+ var canvas = e.Surface.Canvas;
+
+ // get the screen density for scaling
+ var scale = (float)skiaView.Window.BackingScaleFactor;
+
+ // handle the device screen density
+ canvas.Scale(scale);
+
+ // make sure the canvas is blank
+ canvas.Clear(SKColors.White);
+
+ // draw some text
+ var paint = new SKPaint
+ {
+ Color = SKColors.Black,
+ IsAntialias = true,
+ Style = SKPaintStyle.Fill,
+ TextAlign = SKTextAlign.Center,
+ TextSize = 24
+ };
+ var coord = new SKPoint((float)skiaView.Bounds.Width / 2, ((float)skiaView.Bounds.Height + paint.TextSize) / 2);
+ canvas.DrawText("SkiaSharp", coord, paint);
+ }
+ }
+}
diff --git a/samples/Basic/macOS/SkiaSharpSample/ViewController.designer.cs b/samples/Basic/macOS/SkiaSharpSample/ViewController.designer.cs
new file mode 100644
index 00000000..e03f03b6
--- /dev/null
+++ b/samples/Basic/macOS/SkiaSharpSample/ViewController.designer.cs
@@ -0,0 +1,26 @@
+// WARNING
+//
+// This file has been generated automatically by Visual Studio to store outlets and
+// actions made in the UI designer. If it is removed, they will be lost.
+// Manual changes to this file may not be handled correctly.
+//
+using Foundation;
+using System.CodeDom.Compiler;
+
+namespace SkiaSharpSample
+{
+ [Register ("ViewController")]
+ partial class ViewController
+ {
+ [Outlet]
+ SkiaSharp.Views.Mac.SKCanvasView skiaView { get; set; }
+
+ void ReleaseDesignerOutlets ()
+ {
+ if (skiaView != null) {
+ skiaView.Dispose ();
+ skiaView = null;
+ }
+ }
+ }
+}
diff --git a/samples/Basic/tvOS/SkiaSharpSample.sln b/samples/Basic/tvOS/SkiaSharpSample.sln
new file mode 100644
index 00000000..97477c58
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample.sln
@@ -0,0 +1,136 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26430.13
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Binding", "..\..\..\Binding\Binding\Binding.shproj", "{9C502B9A-25D4-473F-89BD-5A13DDE16354}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkiaSharp.tvOS", "..\..\..\Binding\SkiaSharp.tvOS\SkiaSharp.tvOS.csproj", "{5180E370-A455-42BB-99F9-97BD269B8A52}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SkiaSharp.Views.Apple", "..\..\..\source\SkiaSharp.Views\SkiaSharp.Views.Apple\SkiaSharp.Views.Apple.shproj", "{CBCA14E7-96C9-4697-909C-19B1EF7298F7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkiaSharp.Views.tvOS", "..\..\..\source\SkiaSharp.Views\SkiaSharp.Views.tvOS\SkiaSharp.Views.tvOS.csproj", "{E5973829-6C8B-43E4-B81B-C8492DF26C90}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SkiaSharp.Views.AppleiOS", "..\..\..\source\SkiaSharp.Views\SkiaSharp.Views.AppleiOS\SkiaSharp.Views.AppleiOS.shproj", "{FF4C9F9F-7A6A-44D1-8338-D30E39E4E9D4}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SkiaSharp.Views.Shared", "..\..\..\source\SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.shproj", "{5A67972C-1C04-4913-9950-06A03BFE9533}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "source", "source", "{C335869B-7CC8-4239-B4A5-8031AA9758D3}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Binding.Shared", "..\..\..\Binding\Binding.Shared\Binding.Shared.shproj", "{6F8349DC-90AC-441D-8B8B-BE623F46BE6D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkiaSharpSample", "SkiaSharpSample\SkiaSharpSample.csproj", "{66021FA3-47E9-4C76-904C-94A22C31FCBE}"
+EndProject
+Global
+ GlobalSection(SharedMSBuildProjectFiles) = preSolution
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Shared\SkiaSharp.Views.Forms.Shared.projitems*{1555d119-8598-4e4d-91ac-d313f94a1673}*SharedItemsImports = 4
+ ..\binding\HarfBuzzSharp.Shared\HarfBuzzSharp.Shared.projitems*{1aaa8f60-6138-4dfe-b240-5a0f3fb87e0f}*SharedItemsImports = 13
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{2ae5d8c5-eac6-4515-89f2-a4994b41c925}*SharedItemsImports = 4
+ ..\binding\HarfBuzzSharp.Shared\HarfBuzzSharp.Shared.projitems*{2ae5d8c5-eac6-4515-89f2-a4994b41c925}*SharedItemsImports = 4
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Native.Shared\SkiaSharp.Views.Forms.Native.Shared.projitems*{2f94f024-1841-47e8-b521-74aa4e3eba54}*SharedItemsImports = 4
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Shared\SkiaSharp.Views.Forms.Shared.projitems*{2f94f024-1841-47e8-b521-74aa4e3eba54}*SharedItemsImports = 4
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Shared\SkiaSharp.Views.Forms.Shared.projitems*{314fb505-9858-4e03-b799-91b0ba627d05}*SharedItemsImports = 13
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{4588a759-3853-49b8-8a68-6c7917be9220}*SharedItemsImports = 4
+ ..\Binding\Binding\Binding.projitems*{4588a759-3853-49b8-8a68-6c7917be9220}*SharedItemsImports = 4
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Native.Shared\SkiaSharp.Views.Forms.Native.Shared.projitems*{4ac36d63-bf11-445f-81ee-107c0cef4fc9}*SharedItemsImports = 4
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Shared\SkiaSharp.Views.Forms.Shared.projitems*{4ac36d63-bf11-445f-81ee-107c0cef4fc9}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{5180e370-a455-42bb-99f9-97bd269b8a52}*SharedItemsImports = 4
+ ..\Binding\Binding\Binding.projitems*{5180e370-a455-42bb-99f9-97bd269b8a52}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{099A4BAD-6CF7-4898-9D16-266BDD844F95}*SharedItemsImports = 4
+ ..\Binding\Binding\Binding.projitems*{099A4BAD-6CF7-4898-9D16-266BDD844F95}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.projitems*{5a67972c-1c04-4913-9950-06a03bfe9533}*SharedItemsImports = 13
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{6a678cfb-21a7-4e81-8909-fd72abbfd408}*SharedItemsImports = 4
+ ..\Binding\Binding\Binding.projitems*{6a678cfb-21a7-4e81-8909-fd72abbfd408}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{6f8349dc-90ac-441d-8b8b-be623f46be6d}*SharedItemsImports = 13
+ SkiaSharp.Views\SkiaSharp.Views.AppleiOS\SkiaSharp.Views.AppleiOS.projitems*{74c78108-9199-4a7a-928c-fc4dc57d0ae4}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Apple\SkiaSharp.Views.Apple.projitems*{74c78108-9199-4a7a-928c-fc4dc57d0ae4}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.projitems*{74c78108-9199-4a7a-928c-fc4dc57d0ae4}*SharedItemsImports = 4
+ SkiaSharp.HarfBuzz\SkiaSharp.HarfBuzz.Shared\SkiaSharp.HarfBuzz.Shared.projitems*{7cad1912-05a5-42e5-b7ba-81bb051f0566}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Apple\SkiaSharp.Views.Apple.projitems*{809a15dc-e675-4a24-83fa-df13160f7e4c}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.projitems*{809a15dc-e675-4a24-83fa-df13160f7e4c}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{8d646738-458a-441f-b69b-253ef058a812}*SharedItemsImports = 4
+ ..\binding\HarfBuzzSharp.Shared\HarfBuzzSharp.Shared.projitems*{8d646738-458a-441f-b69b-253ef058a812}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{0C940695-4868-4CF7-7D16-266BDD88A812}*SharedItemsImports = 4
+ ..\binding\HarfBuzzSharp.Shared\HarfBuzzSharp.Shared.projitems*{0C940695-4868-4CF7-7D16-266BDD88A812}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.projitems*{926c8d29-e047-4f4e-8b35-852e47bfa9f5}*SharedItemsImports = 4
+ ..\Binding\Binding\Binding.projitems*{9c502b9a-25d4-473f-89bd-5a13dde16354}*SharedItemsImports = 13
+ SkiaSharp.HarfBuzz\SkiaSharp.HarfBuzz.Shared\SkiaSharp.HarfBuzz.Shared.projitems*{c3e63b2d-95d4-4c3f-b10f-7a0aacf94980}*SharedItemsImports = 13
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{c737dc80-5b71-4b26-a2dc-da30421788b0}*SharedItemsImports = 4
+ ..\Binding\Binding\Binding.projitems*{c737dc80-5b71-4b26-a2dc-da30421788b0}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Apple\SkiaSharp.Views.Apple.projitems*{cbca14e7-96c9-4697-909c-19b1ef7298f7}*SharedItemsImports = 13
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Native.Shared\SkiaSharp.Views.Forms.Native.Shared.projitems*{cebd25fd-dd4f-4d5f-b809-d50d02176f41}*SharedItemsImports = 13
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Native.Shared\SkiaSharp.Views.Forms.Native.Shared.projitems*{da5da4d8-4885-4af2-96bb-ae803c344ab0}*SharedItemsImports = 4
+ SkiaSharp.Views.Forms\SkiaSharp.Views.Forms.Shared\SkiaSharp.Views.Forms.Shared.projitems*{da5da4d8-4885-4af2-96bb-ae803c344ab0}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.AppleiOS\SkiaSharp.Views.AppleiOS.projitems*{e5973829-6c8b-43e4-b81b-c8492df26c90}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Apple\SkiaSharp.Views.Apple.projitems*{e5973829-6c8b-43e4-b81b-c8492df26c90}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.projitems*{e5973829-6c8b-43e4-b81b-c8492df26c90}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.AppleiOS\SkiaSharp.Views.AppleiOS.projitems*{9E850CCA-54CC-4CEB-B2C2-E32EF4A17D61}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Apple\SkiaSharp.Views.Apple.projitems*{9E850CCA-54CC-4CEB-B2C2-E32EF4A17D61}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.Shared\SkiaSharp.Views.Shared.projitems*{9E850CCA-54CC-4CEB-B2C2-E32EF4A17D61}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{e6b786c4-3bf9-4a42-9a4a-08002ae3fdad}*SharedItemsImports = 4
+ ..\binding\HarfBuzzSharp.Shared\HarfBuzzSharp.Shared.projitems*{e6b786c4-3bf9-4a42-9a4a-08002ae3fdad}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{e8192110-fcf9-4972-9472-7408bc2ca56b}*SharedItemsImports = 4
+ ..\binding\HarfBuzzSharp.Shared\HarfBuzzSharp.Shared.projitems*{e8192110-fcf9-4972-9472-7408bc2ca56b}*SharedItemsImports = 4
+ ..\Binding\Binding.Shared\Binding.Shared.projitems*{eb1bbdcc-fb07-40d5-8b9e-0079e2c2f2df}*SharedItemsImports = 4
+ ..\Binding\Binding\Binding.projitems*{eb1bbdcc-fb07-40d5-8b9e-0079e2c2f2df}*SharedItemsImports = 4
+ SkiaSharp.Views\SkiaSharp.Views.AppleiOS\SkiaSharp.Views.AppleiOS.projitems*{ff4c9f9f-7a6a-44d1-8338-d30e39e4e9d4}*SharedItemsImports = 13
+ EndGlobalSection
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ Debug|iPhone = Debug|iPhone
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {E5973829-6C8B-43E4-B81B-C8492DF26C90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E5973829-6C8B-43E4-B81B-C8492DF26C90}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E5973829-6C8B-43E4-B81B-C8492DF26C90}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E5973829-6C8B-43E4-B81B-C8492DF26C90}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E5973829-6C8B-43E4-B81B-C8492DF26C90}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {E5973829-6C8B-43E4-B81B-C8492DF26C90}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {E5973829-6C8B-43E4-B81B-C8492DF26C90}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {E5973829-6C8B-43E4-B81B-C8492DF26C90}.Release|iPhone.Build.0 = Release|Any CPU
+ {E5973829-6C8B-43E4-B81B-C8492DF26C90}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {E5973829-6C8B-43E4-B81B-C8492DF26C90}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {E5973829-6C8B-43E4-B81B-C8492DF26C90}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {E5973829-6C8B-43E4-B81B-C8492DF26C90}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {5180E370-A455-42BB-99F9-97BD269B8A52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5180E370-A455-42BB-99F9-97BD269B8A52}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5180E370-A455-42BB-99F9-97BD269B8A52}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5180E370-A455-42BB-99F9-97BD269B8A52}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5180E370-A455-42BB-99F9-97BD269B8A52}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {5180E370-A455-42BB-99F9-97BD269B8A52}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {5180E370-A455-42BB-99F9-97BD269B8A52}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {5180E370-A455-42BB-99F9-97BD269B8A52}.Release|iPhone.Build.0 = Release|Any CPU
+ {5180E370-A455-42BB-99F9-97BD269B8A52}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {5180E370-A455-42BB-99F9-97BD269B8A52}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {5180E370-A455-42BB-99F9-97BD269B8A52}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {5180E370-A455-42BB-99F9-97BD269B8A52}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {66021FA3-47E9-4C76-904C-94A22C31FCBE}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
+ {66021FA3-47E9-4C76-904C-94A22C31FCBE}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
+ {66021FA3-47E9-4C76-904C-94A22C31FCBE}.Release|Any CPU.ActiveCfg = Release|iPhone
+ {66021FA3-47E9-4C76-904C-94A22C31FCBE}.Release|Any CPU.Build.0 = Release|iPhone
+ {66021FA3-47E9-4C76-904C-94A22C31FCBE}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {66021FA3-47E9-4C76-904C-94A22C31FCBE}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {66021FA3-47E9-4C76-904C-94A22C31FCBE}.Release|iPhone.ActiveCfg = Release|iPhone
+ {66021FA3-47E9-4C76-904C-94A22C31FCBE}.Release|iPhone.Build.0 = Release|iPhone
+ {66021FA3-47E9-4C76-904C-94A22C31FCBE}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {66021FA3-47E9-4C76-904C-94A22C31FCBE}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {66021FA3-47E9-4C76-904C-94A22C31FCBE}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {66021FA3-47E9-4C76-904C-94A22C31FCBE}.Debug|iPhone.Build.0 = Debug|iPhone
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {CBCA14E7-96C9-4697-909C-19B1EF7298F7} = {C335869B-7CC8-4239-B4A5-8031AA9758D3}
+ {E5973829-6C8B-43E4-B81B-C8492DF26C90} = {C335869B-7CC8-4239-B4A5-8031AA9758D3}
+ {FF4C9F9F-7A6A-44D1-8338-D30E39E4E9D4} = {C335869B-7CC8-4239-B4A5-8031AA9758D3}
+ {5A67972C-1C04-4913-9950-06A03BFE9533} = {C335869B-7CC8-4239-B4A5-8031AA9758D3}
+ {9C502B9A-25D4-473F-89BD-5A13DDE16354} = {C335869B-7CC8-4239-B4A5-8031AA9758D3}
+ {5180E370-A455-42BB-99F9-97BD269B8A52} = {C335869B-7CC8-4239-B4A5-8031AA9758D3}
+ {6F8349DC-90AC-441D-8B8B-BE623F46BE6D} = {C335869B-7CC8-4239-B4A5-8031AA9758D3}
+ EndGlobalSection
+EndGlobal
diff --git a/samples/Basic/tvOS/SkiaSharpSample/AppDelegate.cs b/samples/Basic/tvOS/SkiaSharpSample/AppDelegate.cs
new file mode 100644
index 00000000..ba640dd9
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/AppDelegate.cs
@@ -0,0 +1,16 @@
+using Foundation;
+using UIKit;
+
+namespace SkiaSharpSample
+{
+ [Register(nameof(AppDelegate))]
+ public class AppDelegate : UIApplicationDelegate
+ {
+ public override UIWindow Window { get; set; }
+
+ public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
+ {
+ return true;
+ }
+ }
+}
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
new file mode 100644
index 00000000..3767d60b
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
@@ -0,0 +1,54 @@
+{
+ "images": [
+ {
+ "idiom": "universal"
+ },
+ {
+ "scale": "1x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "2x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "3x",
+ "idiom": "universal"
+ },
+ {
+ "idiom": "iphone"
+ },
+ {
+ "scale": "1x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "subtype": "retina4",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "idiom": "ipad"
+ },
+ {
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "scale": "2x",
+ "idiom": "ipad"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json
new file mode 100644
index 00000000..4caf392f
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json
new file mode 100644
index 00000000..521695b4
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json
@@ -0,0 +1,17 @@
+{
+ "layers" : [
+ {
+ "filename" : "Front.imagestacklayer"
+ },
+ {
+ "filename" : "Middle.imagestacklayer"
+ },
+ {
+ "filename" : "Back.imagestacklayer"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json
new file mode 100644
index 00000000..3767d60b
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json
@@ -0,0 +1,54 @@
+{
+ "images": [
+ {
+ "idiom": "universal"
+ },
+ {
+ "scale": "1x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "2x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "3x",
+ "idiom": "universal"
+ },
+ {
+ "idiom": "iphone"
+ },
+ {
+ "scale": "1x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "subtype": "retina4",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "idiom": "ipad"
+ },
+ {
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "scale": "2x",
+ "idiom": "ipad"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json
new file mode 100644
index 00000000..4caf392f
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json
new file mode 100644
index 00000000..3767d60b
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json
@@ -0,0 +1,54 @@
+{
+ "images": [
+ {
+ "idiom": "universal"
+ },
+ {
+ "scale": "1x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "2x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "3x",
+ "idiom": "universal"
+ },
+ {
+ "idiom": "iphone"
+ },
+ {
+ "scale": "1x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "subtype": "retina4",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "idiom": "ipad"
+ },
+ {
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "scale": "2x",
+ "idiom": "ipad"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json
new file mode 100644
index 00000000..4caf392f
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
new file mode 100644
index 00000000..3767d60b
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
@@ -0,0 +1,54 @@
+{
+ "images": [
+ {
+ "idiom": "universal"
+ },
+ {
+ "scale": "1x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "2x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "3x",
+ "idiom": "universal"
+ },
+ {
+ "idiom": "iphone"
+ },
+ {
+ "scale": "1x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "subtype": "retina4",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "idiom": "ipad"
+ },
+ {
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "scale": "2x",
+ "idiom": "ipad"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json
new file mode 100644
index 00000000..4caf392f
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json
new file mode 100644
index 00000000..521695b4
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json
@@ -0,0 +1,17 @@
+{
+ "layers" : [
+ {
+ "filename" : "Front.imagestacklayer"
+ },
+ {
+ "filename" : "Middle.imagestacklayer"
+ },
+ {
+ "filename" : "Back.imagestacklayer"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json
new file mode 100644
index 00000000..3767d60b
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json
@@ -0,0 +1,54 @@
+{
+ "images": [
+ {
+ "idiom": "universal"
+ },
+ {
+ "scale": "1x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "2x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "3x",
+ "idiom": "universal"
+ },
+ {
+ "idiom": "iphone"
+ },
+ {
+ "scale": "1x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "subtype": "retina4",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "idiom": "ipad"
+ },
+ {
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "scale": "2x",
+ "idiom": "ipad"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json
new file mode 100644
index 00000000..4caf392f
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json
new file mode 100644
index 00000000..3767d60b
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json
@@ -0,0 +1,54 @@
+{
+ "images": [
+ {
+ "idiom": "universal"
+ },
+ {
+ "scale": "1x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "2x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "3x",
+ "idiom": "universal"
+ },
+ {
+ "idiom": "iphone"
+ },
+ {
+ "scale": "1x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "subtype": "retina4",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "idiom": "ipad"
+ },
+ {
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "scale": "2x",
+ "idiom": "ipad"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json
new file mode 100644
index 00000000..4caf392f
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json
new file mode 100644
index 00000000..df957c0d
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json
@@ -0,0 +1,32 @@
+{
+ "assets" : [
+ {
+ "size" : "1280x768",
+ "idiom" : "tv",
+ "filename" : "App Icon - Large.imagestack",
+ "role" : "primary-app-icon"
+ },
+ {
+ "size" : "400x240",
+ "idiom" : "tv",
+ "filename" : "App Icon - Small.imagestack",
+ "role" : "primary-app-icon"
+ },
+ {
+ "size" : "2320x720",
+ "idiom" : "tv",
+ "filename" : "Top Shelf Image Wide.imageset",
+ "role" : "top-shelf-image-wide"
+ },
+ {
+ "size" : "1920x720",
+ "idiom" : "tv",
+ "filename" : "Top Shelf Image.imageset",
+ "role" : "top-shelf-image"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json
new file mode 100644
index 00000000..3767d60b
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json
@@ -0,0 +1,54 @@
+{
+ "images": [
+ {
+ "idiom": "universal"
+ },
+ {
+ "scale": "1x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "2x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "3x",
+ "idiom": "universal"
+ },
+ {
+ "idiom": "iphone"
+ },
+ {
+ "scale": "1x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "subtype": "retina4",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "idiom": "ipad"
+ },
+ {
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "scale": "2x",
+ "idiom": "ipad"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json
new file mode 100644
index 00000000..3767d60b
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json
@@ -0,0 +1,54 @@
+{
+ "images": [
+ {
+ "idiom": "universal"
+ },
+ {
+ "scale": "1x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "2x",
+ "idiom": "universal"
+ },
+ {
+ "scale": "3x",
+ "idiom": "universal"
+ },
+ {
+ "idiom": "iphone"
+ },
+ {
+ "scale": "1x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "subtype": "retina4",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "idiom": "ipad"
+ },
+ {
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "scale": "2x",
+ "idiom": "ipad"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/Contents.json
new file mode 100644
index 00000000..4caf392f
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/LaunchImages.launchimage/Contents.json b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/LaunchImages.launchimage/Contents.json
new file mode 100644
index 00000000..c3140e97
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Assets.xcassets/LaunchImages.launchimage/Contents.json
@@ -0,0 +1,162 @@
+{
+ "images": [
+ {
+ "minimum-system-version": "8.0",
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "size": "414x736",
+ "subtype": "736h",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "minimum-system-version": "8.0",
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "size": "375x667",
+ "subtype": "667h",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "minimum-system-version": "8.0",
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "size": "736x414",
+ "subtype": "736h",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "minimum-system-version": "7.0",
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "size": "320x480",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "minimum-system-version": "7.0",
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "size": "320x568",
+ "subtype": "retina4",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "minimum-system-version": "7.0",
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "size": "768x1024",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "minimum-system-version": "7.0",
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "size": "768x1024",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "minimum-system-version": "7.0",
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "size": "1024x768",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "minimum-system-version": "7.0",
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "size": "1024x768",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "size": "320x480",
+ "scale": "1x",
+ "idiom": "iphone"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "size": "320x480",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "size": "320x568",
+ "subtype": "retina4",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "size": "768x1024",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "size": "768x1024",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "to-status-bar",
+ "size": "768x1004",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "to-status-bar",
+ "size": "768x1004",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "size": "1024x768",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "size": "1024x768",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "landscape",
+ "extent": "to-status-bar",
+ "size": "1024x748",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "landscape",
+ "extent": "to-status-bar",
+ "size": "1024x748",
+ "scale": "2x",
+ "idiom": "ipad"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Entitlements.plist b/samples/Basic/tvOS/SkiaSharpSample/Entitlements.plist
new file mode 100644
index 00000000..9ae59937
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Entitlements.plist
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Info.plist b/samples/Basic/tvOS/SkiaSharpSample/Info.plist
new file mode 100644
index 00000000..10d4abaa
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ CFBundleDisplayName
+ SkiaSharpSample
+ CFBundleName
+ SkiaSharpSample
+ CFBundleIdentifier
+ com.companyname.SkiaSharpSample
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1.0
+ MinimumOSVersion
+ 10.0
+ UIDeviceFamily
+
+ 3
+
+ UIMainStoryboardFile
+ Main
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ XSAppIconAssets
+ Assets.xcassets/App Icon & Top Shelf Image.brandassets
+ XSLaunchImageAssets
+ Assets.xcassets/LaunchImages.launchimage
+
+
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Main.cs b/samples/Basic/tvOS/SkiaSharpSample/Main.cs
new file mode 100644
index 00000000..af61814a
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Main.cs
@@ -0,0 +1,12 @@
+using UIKit;
+
+namespace SkiaSharpSample
+{
+ public class Application
+ {
+ static void Main(string[] args)
+ {
+ UIApplication.Main(args, null, nameof(AppDelegate));
+ }
+ }
+}
diff --git a/samples/Basic/tvOS/SkiaSharpSample/Main.storyboard b/samples/Basic/tvOS/SkiaSharpSample/Main.storyboard
new file mode 100644
index 00000000..12a3bcdf
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/Main.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/SkiaSharpSample.csproj b/samples/Basic/tvOS/SkiaSharpSample/SkiaSharpSample.csproj
new file mode 100644
index 00000000..532f86d0
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/SkiaSharpSample.csproj
@@ -0,0 +1,142 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ {66021FA3-47E9-4C76-904C-94A22C31FCBE}
+ {06FA79CB-D6CD-4721-BB4B-1BD202089C55};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ SkiaSharpSample
+ SkiaSharpSample
+ Resources
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG;
+ prompt
+ 4
+ iPhone Developer
+ true
+ true
+ true
+ true
+ 19489
+ None
+ x86_64
+ HttpClientHandler
+ false
+
+
+
+ pdbonly
+ true
+ bin\iPhone\Release
+
+ prompt
+ 4
+ iPhone Developer
+ true
+ true
+ true
+ Entitlements.plist
+ SdkOnly
+ ARM64
+ HttpClientHandler
+
+
+
+ pdbonly
+ true
+ bin\iPhoneSimulator\Release
+
+ prompt
+ 4
+ iPhone Developer
+ true
+ None
+ x86_64
+ HttpClientHandler
+
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG;
+ prompt
+ 4
+ iPhone Developer
+ true
+ true
+ true
+ true
+ true
+ true
+ Entitlements.plist
+ 17830
+ SdkOnly
+ ARM64
+ HttpClientHandler
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ViewController.cs
+
+
+
+
+
+
+
+ {5180E370-A455-42BB-99F9-97BD269B8A52}
+ SkiaSharp.tvOS
+
+
+ {E5973829-6C8B-43E4-B81B-C8492DF26C90}
+ SkiaSharp.Views.tvOS
+
+
+
+
\ No newline at end of file
diff --git a/samples/Basic/tvOS/SkiaSharpSample/ViewController.cs b/samples/Basic/tvOS/SkiaSharpSample/ViewController.cs
new file mode 100644
index 00000000..3c4a7a57
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/ViewController.cs
@@ -0,0 +1,50 @@
+using System;
+using UIKit;
+
+using SkiaSharp;
+using SkiaSharp.Views.tvOS;
+
+namespace SkiaSharpSample
+{
+ public partial class ViewController : UIViewController
+ {
+ public ViewController(IntPtr handle)
+ : base(handle)
+ {
+ }
+
+ public override void ViewDidLoad()
+ {
+ base.ViewDidLoad();
+
+ skiaView.PaintSurface += OnPaintSurface;
+ }
+
+ private void OnPaintSurface(object sender, SKPaintSurfaceEventArgs e)
+ {
+ // the the canvas and properties
+ var canvas = e.Surface.Canvas;
+
+ // get the screen density for scaling
+ var scale = (float)skiaView.ContentScaleFactor;
+
+ // handle the device screen density
+ canvas.Scale(scale);
+
+ // make sure the canvas is blank
+ canvas.Clear(SKColors.White);
+
+ // draw some text
+ var paint = new SKPaint
+ {
+ Color = SKColors.Black,
+ IsAntialias = true,
+ Style = SKPaintStyle.Fill,
+ TextAlign = SKTextAlign.Center,
+ TextSize = 48
+ };
+ var coord = new SKPoint((float)skiaView.Bounds.Width / 2, ((float)skiaView.Bounds.Height + paint.TextSize) / 2);
+ canvas.DrawText("SkiaSharp", coord, paint);
+ }
+ }
+}
diff --git a/samples/Basic/tvOS/SkiaSharpSample/ViewController.designer.cs b/samples/Basic/tvOS/SkiaSharpSample/ViewController.designer.cs
new file mode 100644
index 00000000..4b26cdce
--- /dev/null
+++ b/samples/Basic/tvOS/SkiaSharpSample/ViewController.designer.cs
@@ -0,0 +1,28 @@
+// WARNING
+//
+// This file has been generated automatically by Visual Studio from the outlets and
+// actions declared in your storyboard file.
+// Manual changes to this file will not be maintained.
+//
+using Foundation;
+using System;
+using System.CodeDom.Compiler;
+
+namespace SkiaSharpSample
+{
+ [Register ("ViewController")]
+ partial class ViewController
+ {
+ [Outlet]
+ [GeneratedCode ("iOS Designer", "1.0")]
+ SkiaSharp.Views.tvOS.SKCanvasView skiaView { get; set; }
+
+ void ReleaseDesignerOutlets ()
+ {
+ if (skiaView != null) {
+ skiaView.Dispose ();
+ skiaView = null;
+ }
+ }
+ }
+}
\ No newline at end of file