Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
275 commits
Select commit Hold shift + click to select a range
25e8bcc
Remove disallowed nuget.org source from nuget.config
mattleibow Feb 12, 2026
f7de54b
Remove TypeScriptCompileBlocked workaround - test if still needed
mattleibow Feb 12, 2026
64ce8be
Update Microsoft.TypeScript.MSBuild to 5.9.3
mattleibow Feb 12, 2026
0759a4f
Add pre-merge checklist and nuget.org guidance to docs
mattleibow Feb 12, 2026
a7b7026
Reduce float comparison precision for colorspace tests
mattleibow Feb 13, 2026
cdd3eb8
Fix workload install script error handling and remove nuget.org
mattleibow Feb 13, 2026
5f7efb1
Simplify Tizen workload error handling with LASTEXITCODE
mattleibow Feb 13, 2026
7b3ccc2
Use bash -e to force exit on error in Tizen install
mattleibow Feb 13, 2026
5308fdf
fix: pass explicit version band for Tizen workload on .NET 10
mattleibow Feb 13, 2026
5b03dff
fix: simplify Tizen install by extracting manifest directly
mattleibow Feb 13, 2026
1b55907
refactor: simplify workload install script
mattleibow Feb 13, 2026
6fec363
Simplify extraction of Tizen manifest package
mattleibow Feb 13, 2026
19be11a
fix: update sample SupportedOSPlatformVersion minimums
mattleibow Feb 13, 2026
a43eabc
fix: restore TypeScriptCompileBlocked for Blazor build race condition
mattleibow Feb 13, 2026
124ec5a
Try building on macOS 15
mattleibow Feb 13, 2026
e531e78
Try building with the new TFMs
mattleibow Feb 13, 2026
356163d
Just build the latest for device tests
mattleibow Feb 13, 2026
e4940fd
Update xharness to 11.0.0 and iOS simulator to 26.2
mattleibow Feb 13, 2026
bbeb752
Skip Uno sample in CI (needs nuget.org) and fix tvOS MinimumOSVersion
mattleibow Feb 13, 2026
2ed3aef
Re-enable Uno sample and update package versions
mattleibow Feb 13, 2026
064b996
Fix Uno 6.5 migration: SkiaHostBuilder -> UnoPlatformHostBuilder
mattleibow Feb 13, 2026
d82ea9b
Migrate device tests from xharness to DeviceRunners CLI
mattleibow Mar 9, 2026
2dbbbac
Revert "Migrate device tests from xharness to DeviceRunners CLI"
mattleibow Mar 9, 2026
8be1707
Update DeviceRunners to 0.1.0-preview.6 and move Android tests to Linux
mattleibow Mar 9, 2026
3884c40
Add diagnostic logging to Android test build
mattleibow Mar 10, 2026
74fda4e
Add dotnetWorkloads param to override workload install
mattleibow Mar 10, 2026
64e1abf
Exclude iOS/macCatalyst MAUI TFMs on Linux
mattleibow Mar 10, 2026
88c4622
Remove test-device-runners NuGet feed
mattleibow Mar 10, 2026
befa571
Merge remote-tracking branch 'origin/main' into update/dotnet-10
mattleibow Mar 10, 2026
fea7ca8
Update Gtk4 sample to net10.0 TFM
mattleibow Mar 10, 2026
4d96132
Trigger CI rebuild for DeviceRunners package availability
mattleibow Mar 10, 2026
3d867b3
Bump xunit to 2.9.3 in device tests for DeviceRunners compatibility
mattleibow Mar 10, 2026
26ef27c
Add Android to PlatformTargetFrameworks on Linux
mattleibow Mar 10, 2026
16bc6f1
Fix Xcode version mismatch and Linux Android PlatformTargetFrameworks
mattleibow Mar 10, 2026
2399381
Add AVD debug logging for Android emulator issue
mattleibow Mar 10, 2026
375e687
Fix Android emulator AVD path on Linux (XDG mismatch)
mattleibow Mar 10, 2026
94fb6ef
Bump Apple TPVs to 26.2 and free disk for Android emulator
mattleibow Mar 10, 2026
431efbb
Retry CI (transient network failure on Win32 x64)
mattleibow Mar 10, 2026
7be1aa9
Pin workload set version 10.103.0 in global.json
mattleibow Mar 10, 2026
67a8354
Update Blazor sample with revamped pages from PR #3541
mattleibow Mar 6, 2026
f2e55e5
Update Android sample to 4-page multi-view layout
mattleibow Mar 6, 2026
344433f
Update iOS sample to 4-page multi-view layout
mattleibow Mar 6, 2026
c01aa9f
Update macOS sample to 4-page multi-view layout
mattleibow Mar 6, 2026
946f78c
Update tvOS sample to 3-page multi-view layout
mattleibow Mar 6, 2026
4964340
Update MacCatalyst sample to 3-page multi-view layout
mattleibow Mar 6, 2026
065c902
Update MAUI sample to 3-page multi-view layout
mattleibow Mar 6, 2026
e817158
Update WPF sample to 3-page multi-view layout
mattleibow Mar 6, 2026
7b19eb8
Update WinUI sample to 3-page multi-view layout
mattleibow Mar 6, 2026
19df959
Update WindowsForms sample to 3-page multi-view layout
mattleibow Mar 6, 2026
c8a99e9
Update UnoPlatform sample to 3-page multi-view layout
mattleibow Mar 6, 2026
41a6a45
Update Tizen sample to 3-page multi-view layout
mattleibow Mar 6, 2026
35e333a
Update Gtk3 sample to 2-page layout
mattleibow Mar 6, 2026
6e7aab5
Update Gtk4 sample to 2-page layout
mattleibow Mar 6, 2026
c2c1500
Use XML layout files for Android fragments
mattleibow Mar 6, 2026
22f20ea
Use storyboard for tvOS tab bar and view controllers
mattleibow Mar 6, 2026
d4b69ff
Use WinForms designer pattern for SkiaSharp views
mattleibow Mar 6, 2026
4e96ff1
Remove programmatic view recreation workarounds in UnoPlatform
mattleibow Mar 6, 2026
25d2d5b
Use Glade file for Gtk3 layout structure
mattleibow Mar 6, 2026
4b86e9e
Use UI file for Gtk4 layout structure
mattleibow Mar 6, 2026
ebc315a
Use storyboard for iOS split view and view controllers
mattleibow Mar 6, 2026
6896723
Use storyboard for MacCatalyst split view and view controllers
mattleibow Mar 6, 2026
1074395
Use storyboard for macOS split view and view controllers
mattleibow Mar 6, 2026
00966cc
Fix Android package version conflicts for Material design
mattleibow Mar 6, 2026
46ad674
Fix WinUI cross-thread crash and double navigation
mattleibow Mar 6, 2026
2b3ff5d
Fix UnoPlatform cross-thread crash, double navigation, and pointer exit
mattleibow Mar 6, 2026
4388974
Fix Gtk4 invisible canvases by setting Hexpand/Vexpand
mattleibow Mar 6, 2026
9f5862d
Fix MAUI per-frame shader leak and missing touch cancelled handler
mattleibow Mar 6, 2026
979d12d
Fix iOS and macOS SKPath resource leaks in drawing pages
mattleibow Mar 6, 2026
a8c6b46
Fix MacCatalyst render loop lifecycle and tvOS animation stutter
mattleibow Mar 6, 2026
843f0c9
Fix Android GPU shader error handling and navigation highlight
mattleibow Mar 6, 2026
7b99a5c
Fix Gtk3 smooth scrolling direction detection
mattleibow Mar 6, 2026
da87ebc
Fix Tizen path leaks, shader disposal, and hollow tap dots
mattleibow Mar 6, 2026
8ee2f46
Redesign Android sample with Material 3 theme and mobile drawing UI
mattleibow Mar 6, 2026
883adf5
Use Material 3 surface-style toolbar with light status/navigation bars
mattleibow Mar 6, 2026
27fc188
Android: add dark mode support with DayNight theme
mattleibow Mar 6, 2026
b6a0772
Android: use Material Theme Builder exported theme
mattleibow Mar 6, 2026
05abda7
Android: enable edge-to-edge display
mattleibow Mar 6, 2026
43969e1
Android: replace navigation drawer with M3 bottom navigation bar
mattleibow Mar 6, 2026
af2fc16
Android: file-scoped namespaces, floating pill UI overlays
mattleibow Mar 6, 2026
55cea76
Android: Material 3 Slider, circular swatches, polish
mattleibow Mar 6, 2026
ac2ae59
Android: float Clear button to top-right corner
mattleibow Mar 6, 2026
c7f39b2
Android: fix slider visibility and swatch clipping
mattleibow Mar 6, 2026
7950183
Android: upgrade to Material 1.12, remove unused DrawerLayout
mattleibow Mar 6, 2026
5bc55de
Android: use Noto Sans font on CPU page
mattleibow Mar 6, 2026
975b2f9
Android: scale CPU page text to 12% of canvas width
mattleibow Mar 6, 2026
5d47e34
Android: add subtle border to FPS pill and toolbox overlays
mattleibow Mar 6, 2026
1d311c8
Blazor WASM: complete visual redesign matching Android polish
mattleibow Mar 6, 2026
6c1d3ab
Blazor WASM: restore sidebar navigation with modern styling
mattleibow Mar 6, 2026
f6e7e2e
Blazor: migrate to Microsoft Fluent UI 2 design system
mattleibow Mar 6, 2026
4a2ef95
Blazor: replace Fluent UI with MudBlazor for responsive Material Design
mattleibow Mar 6, 2026
c70687e
Blazor: add themed drawer, nav spacing, and theme toggle button
mattleibow Mar 6, 2026
b82bd1e
Blazor Drawing: stack toolbox with colors above slider
mattleibow Mar 6, 2026
77a18b8
Blazor Drawing: dark-aware canvas, color swaps, and brush size label
mattleibow Mar 6, 2026
1f6244d
Blazor Drawing: align dark palette with Android Material 3
mattleibow Mar 6, 2026
9c14545
Add dark mode drawing palette to all platform samples
mattleibow Mar 6, 2026
a082fcd
Fix review issues: palette consistency, memory leaks, MacCatalyst rew…
mattleibow Mar 6, 2026
35637e7
MacCatalyst: create SkiaSharp views programmatically
mattleibow Mar 6, 2026
ae014fd
iOS: convert from storyboard to programmatic view creation
mattleibow Mar 7, 2026
d3bd5c0
MAUI: fix build errors (empty Icon attribute, missing using)
mattleibow Mar 7, 2026
4f62b81
Fix consistency: standard gradient colors and GPU shader across all p…
mattleibow Mar 7, 2026
7a2c9fb
Fix cross-platform consistency issues found in 3-model review
mattleibow Mar 7, 2026
a2234f2
Android: normalize brush slider range to 1-50 (was 1-30) with default 4
mattleibow Mar 7, 2026
0cfe649
MacCatalyst: fix GPU sidebar icon to use valid SF Symbol
mattleibow Mar 7, 2026
6f2dc56
Fix shader builder leak in GPU pages (Android, WinForms, WinUI, Uno)
mattleibow Mar 7, 2026
b6b21ac
Fix PaintSurface event subscription leaks in Apple platform samples
mattleibow Mar 7, 2026
985ee8e
MAUI: fix brush label text to match 4f default (was showing 8px)
mattleibow Mar 7, 2026
a09e566
Consistency fixes: add brush size labels (WinForms, GTK3), standardiz…
mattleibow Mar 7, 2026
83fc9da
Fix shader Uniforms indexer and macOS NeedsDisplay assignment
mattleibow Mar 7, 2026
6b9c017
Rewrite macOS sample to fully programmatic views
mattleibow Mar 7, 2026
4dcc8a6
Update Blazor screenshots with latest styling
mattleibow Mar 7, 2026
3c94c78
Add Android sample README with screenshots
mattleibow Mar 7, 2026
2ccf8d4
Add Blazor WebAssembly sample README with screenshots
mattleibow Mar 7, 2026
d2ad0d2
Add iOS sample README with screenshots
mattleibow Mar 7, 2026
be7df4e
Add Mac Catalyst sample README with screenshots
mattleibow Mar 7, 2026
54996dd
Add macOS sample README
mattleibow Mar 7, 2026
a5bdf34
Add MAUI sample README with screenshots
mattleibow Mar 7, 2026
beda1ff
Add tvOS sample README
mattleibow Mar 7, 2026
a02f9b2
Add GTK 3 sample README with screenshots
mattleibow Mar 7, 2026
c2d916f
Add GTK 4 sample README with screenshots
mattleibow Mar 7, 2026
e36ffe5
Add WPF sample README
mattleibow Mar 7, 2026
94d1a1b
Add WinUI 3 sample README
mattleibow Mar 7, 2026
f701175
Add Windows Forms sample README
mattleibow Mar 7, 2026
2cf43a0
Add Tizen sample README
mattleibow Mar 7, 2026
2d564c8
Add Uno Platform sample README
mattleibow Mar 7, 2026
33d1f92
macOS: restore storyboard as app entry point
mattleibow Mar 7, 2026
b9e8fa0
Fix Tizen README: correct SKRuntimeEffect API name
mattleibow Mar 8, 2026
39fe45d
macOS: fix window creation with programmatic NSWindow
mattleibow Mar 8, 2026
340dd50
Add macOS sample screenshots and update README
mattleibow Mar 8, 2026
95180a9
Fix rendering consistency across all samples
mattleibow Mar 8, 2026
3aba88c
Refactor Android sample: code style and shader uniforms
mattleibow Mar 8, 2026
e5a564d
Extract FpsCounter helper for Android GPU fragments
mattleibow Mar 8, 2026
45dc500
Use SKPoint for touch position in GPU fragments
mattleibow Mar 8, 2026
ebcdd99
Simplify shader builder access in GPU fragments
mattleibow Mar 8, 2026
73b4193
Use bool for touchActive in GPU fragments
mattleibow Mar 8, 2026
dec93fa
Refactor all samples: FpsCounter helper, shader uniforms, code style
mattleibow Mar 8, 2026
af44c06
Add SamplePage enum and DefaultPage property to all samples
mattleibow Mar 8, 2026
6ef8c3b
Fix Blazor font loading: cache typeface statically
mattleibow Mar 8, 2026
a228454
Align all CPU pages to Android reference pattern
mattleibow Mar 8, 2026
03a375a
Improve Gtk3 Drawing toolbar: circular swatches, slider, layout
mattleibow Mar 8, 2026
4204e52
Add Requirements section to all 18 sample READMEs
mattleibow Mar 8, 2026
0fa298d
Floating translucent toolbox for all Drawing pages
mattleibow Mar 8, 2026
6000bce
Use AdaptiveTrigger instead of OnIdiom for MAUI Drawing toolbox
mattleibow Mar 9, 2026
b37a387
Refactor Gtk3 sample into separate page files with Glade layouts
mattleibow Mar 9, 2026
dc324fe
Refactor Gtk4 sample into separate page files with UI layouts
mattleibow Mar 9, 2026
1ac86b2
Update Gtk3/Gtk4 screenshots and fix GTK4 Cairo assertion crash
mattleibow Mar 9, 2026
80af0e5
Refactor iOS sample to UITabBarController with storyboard-driven views
mattleibow Mar 9, 2026
4010709
Use DefaultPage static property instead of launch args for iOS tab se…
mattleibow Mar 9, 2026
c5c0ce0
MacCatalyst: tab bar navigation, 3 pages, light/dark screenshots
mattleibow Mar 9, 2026
650e0ce
Update macOS sample with storyboard tab bar, FPS pills, and dark mode…
mattleibow Mar 9, 2026
43849d6
Fix macOS GPU animation resume and drawing after tab switch
mattleibow Mar 9, 2026
9f488a0
Simplify GPU shader builder to readonly field initializer
mattleibow Mar 9, 2026
88543f2
Format SkSL shader code with proper indentation
mattleibow Mar 10, 2026
ceb8ff1
Update MAUI sample with FPS pill, dark mode swatches, and iOS screens…
mattleibow Mar 10, 2026
eee018f
Fix MAUI GPU render loop lifecycle and FPS pill styling
mattleibow Mar 10, 2026
b9b75e7
MAUI: Drawing toolbox border, selection ring, OnIdiom layout
mattleibow Mar 10, 2026
1622fe4
MAUI: Shell flyout icons, Grid toolbox, GPU lifecycle fixes
mattleibow Mar 10, 2026
d81cd71
Update tvOS sample: formatting, storyboard cleanup, README, screenshots
mattleibow Mar 10, 2026
d8f2b72
Fix Uno Platform sample: build error and README accuracy
mattleibow Mar 10, 2026
74498c4
Uno Platform: upgrade to SDK 5.6, LeftCompact nav, fix drawing colors
mattleibow Mar 10, 2026
217b6c2
Fix .NET 10 build: remove workload pin, tvOS simulator split, Uno pac…
mattleibow Mar 10, 2026
1592fe5
Uno Platform: top tabs for mobile, SkiaSharp app icons
mattleibow Mar 10, 2026
fed0126
Uno Platform: update README, remove unused SamplePage enum
mattleibow Mar 10, 2026
efb0860
Uno Platform: use pencil sharpener icon to match MAUI sample
mattleibow Mar 10, 2026
cde911b
Fix app icons: use foreground image with #F8F8F8 background
mattleibow Mar 10, 2026
f7cafe5
MAUI: scale app icon foreground to 80% for better padding
mattleibow Mar 10, 2026
58e11f2
MAUI: adjust icon foreground scale to 90%
mattleibow Mar 10, 2026
83c2372
MAUI: platform-conditional icon scaling (0.90 Android, 1.30 iOS)
mattleibow Mar 10, 2026
c0ede56
Samples: file-scoped namespaces and consistent formatting
mattleibow Mar 10, 2026
0bf6442
Uno Platform: add iOS screenshots for CPU, GPU, and Drawing pages
mattleibow Mar 11, 2026
f36bcf6
Merge origin/main into samples
mattleibow Mar 13, 2026
7ab6b7e
Fix Tizen build: replace removed Naviframe.TopItem with depth counter
mattleibow Mar 13, 2026
973ab15
Fix tvOS: split device/simulator native builds to match iOS pattern
mattleibow Mar 13, 2026
b1d446b
Fix tvOS GnNinja to use min_tvos_version instead of min_ios_version
mattleibow Mar 13, 2026
ac49d7b
Fix sample build failures: Uno duplicate PackageRef and WinForms dupl…
mattleibow Mar 13, 2026
50afe4b
Fix WinForms GpuPage.Designer.cs: remove non-existent 'effect' field …
mattleibow Mar 14, 2026
300218b
Merge remote-tracking branch 'origin/main' into samples
mattleibow Mar 14, 2026
308ba49
Cleanup: add nuget.org feed, update Uno packages, revert CI and Blazo…
mattleibow Mar 15, 2026
46d11aa
Revert Gallery/Uno samples to main (out of date, not building)
mattleibow Mar 15, 2026
43fbc65
Merge remote-tracking branch 'origin/main' into samples
mattleibow Mar 15, 2026
8b49cf1
Merge remote-tracking branch 'origin/main' into samples
mattleibow Mar 18, 2026
e496d26
Revert source/ Uno.WinUI to 5.2.175 (6.5.153 has breaking API changes)
mattleibow Mar 19, 2026
5500b2f
Update Uno.WinUI to 6.5.153 and remove net*-macos from Uno TFMs
mattleibow Mar 19, 2026
d7be36a
Revert Uno Platform changes (moved to PR #3565)
mattleibow Mar 19, 2026
c8f450e
Remove nuget.org feed (all packages available on dotnet-public)
mattleibow Mar 19, 2026
45330ce
Update WinUI sample: WASDK 1.8, top tabs, Maui parity, screenshots
mattleibow Mar 20, 2026
e7861ef
Update WPF sample: top tabs, Maui parity, screenshots
mattleibow Mar 20, 2026
1f92c96
WPF: Enable Fluent theme with system dark/light mode
mattleibow Mar 20, 2026
3ffdb88
WPF: Fix theme switch input, clean up code, retake screenshots
mattleibow Mar 20, 2026
4fa366b
Update WindowsForms sample: dark mode, tabs, Designer layouts, screen…
mattleibow Mar 20, 2026
b711931
Merge branch 'main' into samples
mattleibow Mar 26, 2026
083ddbd
Update Tizen sample: fix Drawing page routing and README
mattleibow Mar 26, 2026
3d35f16
Update BrowserWebAssembly sample with CPU, GPU, and Drawing pages
mattleibow Mar 26, 2026
a5db3ca
Fix BrowserWebAssembly sample runtime issues
mattleibow Mar 26, 2026
a309351
Simplify BrowserWebAssembly sample and add screenshot
mattleibow Mar 26, 2026
dafef25
Update Web sample to latest ASP.NET Core template
mattleibow Mar 26, 2026
29dca0a
Improve Web sample rendering with gradient + circles
mattleibow Mar 26, 2026
9325f26
Update Console sample with gradient rendering and CLI args
mattleibow Mar 26, 2026
9eca7ac
Move screenshots to screenshots/ folder for consistency
mattleibow Mar 26, 2026
08f9afd
Add DockerConsole sample for Linux and NanoServer containers
mattleibow Mar 26, 2026
3b9fe45
Add RID to Docker publish commands
mattleibow Mar 26, 2026
e29dabc
Fix Linux Dockerfile to use correct RID for host architecture
mattleibow Mar 26, 2026
de9bd1d
Add platform info output to DockerConsole sample
mattleibow Mar 26, 2026
2aef378
Add DockerWebApi sample and --sample filter for cake
mattleibow Mar 26, 2026
8262f01
Restore DockerConsole solution file
mattleibow Mar 26, 2026
7273d25
Remove old Docker sample (replaced by DockerConsole and DockerWebApi)
mattleibow Mar 27, 2026
fe0b6b1
Add /health endpoint to DockerWebApi, simplify run.ps1 polling
mattleibow Mar 27, 2026
813ece1
Improve Docker run.ps1 scripts
mattleibow Mar 27, 2026
cb767da
Fix Docker volume paths for cross-platform support
mattleibow Mar 27, 2026
d3bc5a4
Use current directory for Docker output
mattleibow Mar 27, 2026
8b8b562
Use /tmp for container mount point to avoid conflicting with /app
mattleibow Mar 27, 2026
14409f1
Add local NuGet package support for Docker samples
mattleibow Mar 27, 2026
8ed4ac8
Add TESTING.md guide for testing samples with arbitrary NuGet versions
mattleibow Mar 27, 2026
1c7c276
Remove auto-open from Docker run.ps1 scripts (CI-safe)
mattleibow Mar 27, 2026
13cff05
tweaks
mattleibow Mar 27, 2026
9f3ee6a
Refactor cake samples target and simplify Dockerfiles
mattleibow Mar 27, 2026
30fbcc4
Split samples target into generate, prepare, and run
mattleibow Mar 27, 2026
8ca94c0
cleanup a bit
mattleibow Mar 27, 2026
09efd1f
Skip Docker samples when Docker is not available
mattleibow Mar 27, 2026
42c13f2
Fix sample build warnings
mattleibow Mar 27, 2026
de48afc
Fix remaining nullable warnings in Maui and tvOS samples
mattleibow Mar 27, 2026
847f1ea
Continue past sample build failures, report summary at end
mattleibow Mar 27, 2026
8a6b779
Use SkiaSharp feed for NuGet downloads, -CI feed for natives
mattleibow Mar 27, 2026
8949e3f
Rename --previewFeed to --artifactsFeed, require feedUrl parameter
mattleibow Mar 27, 2026
327a86e
Revert nugets feed split — all downloads use -CI feed
mattleibow Mar 27, 2026
68dca87
Merge remote-tracking branch 'origin/main' into samples
mattleibow Mar 27, 2026
f4b023d
Merge remote-tracking branch 'origin/main' into samples
mattleibow Mar 27, 2026
b4b7944
Merge branch 'samples' of https://github.com/mono/SkiaSharp into samples
mattleibow Mar 27, 2026
0374798
Skip unoplatform for now
mattleibow Mar 27, 2026
a0ca259
Add validate-samples skill and building-samples developer doc
mattleibow Mar 28, 2026
7ba41bc
Fix CI feed version pattern docs: add commit, custom branch, and rele…
mattleibow Mar 28, 2026
6027db0
Fix docs: preview.0 is the preview number, not the Skia increment
mattleibow Mar 28, 2026
682d674
Rewrite docs: clarify two-step CI wrapper vs real NuGet version process
mattleibow Mar 28, 2026
481d7ea
Add Tizen x64 and arm64 native build support, modernize Tizen sample
mattleibow Mar 28, 2026
9036779
Re-enable Linux Tizen native CI build
mattleibow Mar 29, 2026
7104b4c
Fix Tizen sample: restore net10.0-tizen TFM
mattleibow Mar 29, 2026
f199546
Fix Tizen Studio install on CI: clean existing dir, install Python 3.8
mattleibow Mar 29, 2026
5922580
Trigger CI re-run for Tizen Linux fix
mattleibow Mar 29, 2026
d4ad5ff
Add libtinfo5 to Tizen Linux CI packages
mattleibow Mar 29, 2026
a5765db
Fix Tizen CI: add libtinfo5, dynamic profile for 64-bit builds
mattleibow Mar 29, 2026
2c569e2
Re-disable Linux Tizen native build (#2933)
mattleibow Mar 29, 2026
7904c70
Merge remote-tracking branch 'origin/main' into pr-3553
mattleibow Mar 30, 2026
5c00d2a
Revert scripts/ changes to match main
mattleibow Mar 30, 2026
da284a8
Revert source/SkiaSharp.Views/SkiaSharp.Views/ changes to match main
mattleibow Mar 30, 2026
860134e
Revert Tizen changes: covered by PR #3592
mattleibow Mar 30, 2026
da434c1
Revert externals/skia submodule change: covered by PR #3592
mattleibow Mar 30, 2026
b94eae1
Revert binding/ changes: Tizen covered by PR #3592, remove backup file
mattleibow Mar 30, 2026
f4bb37b
Revert remaining changes: extracted to PRs #3614, #3615, #3592
mattleibow Mar 30, 2026
45ff20e
Revert "Revert remaining changes: extracted to PRs #3614, #3615, #3592"
mattleibow Mar 30, 2026
cd3a2fc
Revert changes covered by other PRs
mattleibow Mar 30, 2026
76da5e1
Revert samples, source, and global.json changes
mattleibow Mar 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
219 changes: 219 additions & 0 deletions .github/skills/validate-samples/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,219 @@
---
name: validate-samples
description: >-
Build and validate SkiaSharp sample projects using CI-produced NuGet packages.
Downloads the latest CI artifacts, detects the preview version, and runs the
samples cake target to verify all samples compile correctly.
Triggers: "validate samples", "build samples", "test samples", "check samples build",
"run samples", "do the samples build", "samples CI", "verify sample builds".
Also use when asked to check if samples work after a code change, or when
investigating sample build failures. Use this skill proactively whenever the
user mentions building, testing, or validating any SkiaSharp sample project.
---

# Validate Samples

Automates the workflow for building SkiaSharp samples against CI-produced NuGet packages.
The samples use package references (not project references) when built through the cake
target, so they need downloadable NuGet packages.

## Quick Reference

```bash
# Full workflow — clear cache, download, detect version, build all samples
dotnet cake --target=validate-samples-full

# Or step by step:
rm -rf externals/package_cache/skiasharp* externals/package_cache/harfbuzzsharp*
dotnet cake --target=docs-download-output
# Detect version from downloaded nupkgs, then:
dotnet cake --target=samples --previewLabel=preview.0 --buildNumber=76
```

## When to Use

- After making changes to samples and wanting to verify they build
- When CI reports sample build failures and you need to reproduce locally
- When validating that a new SkiaSharp release doesn't break samples
- After merging changes that affect sample project files or dependencies

## Step-by-Step Workflow

### Step 1: Clear Cached Packages

Old cached packages cause stale version resolution. Always clear before validating:

```bash
rm -rf externals/package_cache/skiasharp*
rm -rf externals/package_cache/harfbuzzsharp*
```

If you suspect deeper caching issues, also clear the global NuGet cache:

```bash
dotnet nuget locals all --clear
```

### Step 2: Download CI Packages

Download the latest stable and preview NuGet packages from the CI feed:

```bash
dotnet cake --target=docs-download-output
```

This downloads from the **SkiaSharp-CI** Azure DevOps feed:
`https://pkgs.dev.azure.com/xamarin/public/_packaging/SkiaSharp-CI/nuget/v3/index.json`

Two package sets are fetched:
- `_nugets` — stable packages (e.g. `SkiaSharp.3.119.4.nupkg`)
- `_nugetspreview` — preview packages (e.g. `SkiaSharp.3.119.4-preview.0.76.nupkg`)

Output goes to `output/nugets/`.

> **Note:** This target clears `./output/` first. If you also need native binaries
> in `output/native/`, run `externals-download` first, then `docs-download-output`.

### Step 3: Detect the Preview Version

The preview label and build number must be passed to the samples target. Extract them
from the downloaded nupkg filenames:

```bash
# Find a preview SkiaSharp package
PREVIEW_PKG=$(ls output/nugets/SkiaSharp.[0-9]*-*.nupkg 2>/dev/null | grep -v NativeAssets | head -1)
echo "Preview package: $PREVIEW_PKG"

# Extract the suffix (everything after base version, before .nupkg)
# Example: SkiaSharp.3.119.4-preview.0.76.nupkg → preview.0.76
SUFFIX=$(basename "$PREVIEW_PKG" | sed 's/^SkiaSharp\.[0-9]*\.[0-9]*\.[0-9]*-//' | sed 's/\.nupkg$//')
echo "Full suffix: $SUFFIX"

# Split: preview label = everything before last dot, build number = last component
PREVIEW_LABEL=$(echo "$SUFFIX" | sed 's/\.[0-9]*$//')
BUILD_NUMBER=$(echo "$SUFFIX" | grep -o '[0-9]*$')
echo "Preview label: $PREVIEW_LABEL"
echo "Build number: $BUILD_NUMBER"
```

### Step 4: Build Samples

Run the full samples pipeline with the detected version:

```bash
dotnet cake --target=samples --previewLabel=$PREVIEW_LABEL --buildNumber=$BUILD_NUMBER
```

This runs three sub-targets in sequence:
1. **samples-generate** — Copies `samples/` to `output/samples/` and `output/samples-preview/`,
converting `<ProjectReference>` to `<PackageReference>` using versions from `scripts/VERSIONS.txt`
2. **samples-prepare** — Clears cached SkiaSharp/HarfBuzz packages from `externals/package_cache`,
copies nupkgs next to Dockerfiles for Docker sample builds
3. **samples-run** — Builds every sample solution in the output directory

#### Building a Single Sample

Use the `--sample` filter to build just one:

```bash
dotnet cake --target=samples --previewLabel=$PREVIEW_LABEL --buildNumber=$BUILD_NUMBER --sample=tvOS
dotnet cake --target=samples --previewLabel=$PREVIEW_LABEL --buildNumber=$BUILD_NUMBER --sample=Blazor
dotnet cake --target=samples --previewLabel=$PREVIEW_LABEL --buildNumber=$BUILD_NUMBER --sample=Android
```

## Version Construction Deep Dive

### Two-step version system

The CI feed and the NuGet packages use **different versioning**:

1. **CI feed wrapper version** (e.g. `0.0.0-branch.main.2580`) — identifies the source build
2. **Real NuGet version** (e.g. `3.119.4-preview.0.76`) — the user-facing package version inside

When downloading, cake uses `--gitBranch`/`--gitSha`/`--previewLabel` to resolve the CI wrapper version.
After extraction, the real nupkg versions are in `output/nugets/`.

### How preview versions are built

The cake build constructs the NuGet preview suffix from two arguments:

```csharp
// build.cake:57-72
var PREVIEW_LABEL = Argument("previewLabel", EnvironmentVariable("PREVIEW_LABEL") ?? "preview");
var BUILD_NUMBER = Argument("buildNumber", EnvironmentVariable("BUILD_NUMBER") ?? "0");
PREVIEW_NUGET_SUFFIX = $"{PREVIEW_LABEL}.{BUILD_NUMBER}";
// Result: "preview.0.76" when PREVIEW_LABEL="preview.0" and BUILD_NUMBER="76"
```

The final NuGet version: `{base_version}-{PREVIEW_NUGET_SUFFIX}`
- Base version comes from `scripts/VERSIONS.txt` (e.g. `3.119.4`)
- The `.0` in `preview.0.76` is the **preview number** (first preview = 0, second = 1, etc.)

### How download resolution works

The `DownloadPackageAsync` function resolves the CI artifact version (checked in priority order):

```csharp
// scripts/cake/UtilsManaged.cake:165-174
if (PREVIEW_LABEL.StartsWith("pr.")) → "0.0.0-pr.{number}.*"
else if (!string.IsNullOrEmpty(GIT_SHA)) → "0.0.0-commit.{sha}.*"
else if (!string.IsNullOrEmpty(GIT_BRANCH_NAME)) → "0.0.0-branch.{name}.*"
else → "0.0.0-branch.main.*"
```

The `CreateSamplesDirectory()` function in `scripts/cake/samples.cake`:

1. **`<ProjectReference>`** → converted to `<PackageReference>` using the project's
`<PackagingGroup>` as the package ID and version from `VERSIONS.txt`
2. **Existing `<PackageReference>`** → version updated from `VERSIONS.txt`
3. For SkiaSharp/HarfBuzzSharp packages, the preview suffix is appended

Two output trees are created:
- `output/samples/` — stable versions
- `output/samples-preview/` — preview versions (with suffix)

## Cake Arguments Reference

| Argument | Env var | Default | Purpose |
|----------|---------|---------|---------|
| `--previewLabel` | `PREVIEW_LABEL` | `preview` | Preview suffix label |
| `--buildNumber` | `BUILD_NUMBER` | `0` | Build number for suffix |
| `--buildCounter` | `BUILD_COUNTER` | Same as buildNumber | Build counter for CI version |
| `--artifactsFeed` | — | SkiaSharp-CI URL | Override the NuGet feed |
| `--gitBranch` | `GIT_BRANCH_NAME` | `""` | Branch name for CI version |
| `--sample` | — | `""` | Filter to specific sample |

## Troubleshooting

### "The local source 'packages' doesn't exist" (Docker samples)
Docker samples (`Docker/Console`, `Docker/WebApi`) have their own `nuget.config` with a
local `packages` folder. This is by design — they're built via `run.ps1` inside Docker,
not `dotnet build`. The `samples-prepare` target copies nupkgs there automatically.

### Platform-specific samples not building
Some platforms are disabled by default for local builds:
```bash
# These MSBuild properties enable optional platforms
-p:IsNetTVOSSupported=true
-p:IsNetTizenSupported=true
-p:IsNetMacOSSupported=true
```

### WinUI XAML compiler crash on .NET 10
The WinUI sample may need a newer `Microsoft.WindowsAppSDK` version. This is a known
compatibility issue between older WinUI SDK versions and .NET 10.

### Stale packages after repeated runs
If versions don't update between runs:
```bash
rm -rf externals/package_cache/skiasharp* externals/package_cache/harfbuzzsharp*
dotnet nuget locals all --clear
```

## Further Reading

- [Building Samples](../../documentation/dev/building-samples.md) — Full developer documentation
- `build.cake` lines 57-83 — Version construction
- `build.cake` lines 473-651 — Sample targets
- `scripts/cake/samples.cake` — ProjectRef→PackageRef conversion logic
- `scripts/VERSIONS.txt` — Package version source of truth
38 changes: 38 additions & 0 deletions .github/skills/validate-samples/scripts/detect-preview-version.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#!/bin/bash
# detect-preview-version.sh
# Detects the preview label and build number from downloaded nupkg files in output/nugets/
# Usage: source detect-preview-version.sh
# Sets: PREVIEW_LABEL, BUILD_NUMBER, PREVIEW_SUFFIX

set -euo pipefail

NUGETS_DIR="${1:-output/nugets}"

# Find a preview SkiaSharp package (not NativeAssets, not HarfBuzz)
PREVIEW_PKG=$(ls "$NUGETS_DIR"/SkiaSharp.[0-9]*-*.nupkg 2>/dev/null | grep -v NativeAssets | head -1)

if [ -z "$PREVIEW_PKG" ]; then
echo "ERROR: No preview SkiaSharp package found in $NUGETS_DIR" >&2
echo "Run 'dotnet cake --target=docs-download-output' first." >&2
exit 1
fi

# Extract filename
FILENAME=$(basename "$PREVIEW_PKG")
echo "Found: $FILENAME"

# Extract suffix: SkiaSharp.3.119.4-preview.0.76.nupkg → preview.0.76
SUFFIX=$(echo "$FILENAME" | sed 's/^SkiaSharp\.[0-9]*\.[0-9]*\.[0-9]*-//' | sed 's/\.nupkg$//')

# Split on last dot: preview.0 + 76
PREVIEW_LABEL=$(echo "$SUFFIX" | sed 's/\.[0-9]*$//')
BUILD_NUMBER=$(echo "$SUFFIX" | grep -o '[0-9]*$')

echo "Preview label: $PREVIEW_LABEL"
echo "Build number: $BUILD_NUMBER"
echo "Full suffix: $SUFFIX"

# Export for use by caller
export PREVIEW_LABEL
export BUILD_NUMBER
export PREVIEW_SUFFIX="$SUFFIX"
Loading