Version 4.148.0
First stable v4 release · Released June 22, 2026 · NuGet · GitHub Release
Supersedes 4.147.0 · Rolls up preview-only work that was never released as stable — those changes are included cumulatively below.
API changes · SkiaSharp API diff · HarfBuzzSharp API diff
Highlights
SkiaSharp 4.148.0 is the first stable v4 release, built on Skia m148. It modernizes font, text, sampling, stream, and image APIs while improving singleton lifetimes and pixel access. This is a breaking release with platform, Vulkan, and legacy API migrations.
Breaking Changes
- Legacy paint and pre-v4 APIs are compile errors — Legacy SKPaint text/font members, paint-state-reading overloads, sample-count render-target constructors, run-buffer span methods, SKPaintHinting, and SKFilterQuality are no longer available through the reference assemblies. Move text state to SKFont, pass SKTextAlign and SKSamplingOptions explicitly, use constructors without sampleCount, and use the run-buffer properties. (#4068, #4114, #4205)
- Default font and typeface behavior changes — A default-constructed SKFont now uses SKTypeface.Empty, so text measures to zero and does not draw. New or reset SKPaint instances and missing Android family names use SKTypeface.Default. Pass the intended typeface explicitly and use IsEmpty instead of null checks. (#3730)
- WebAssembly native assets now require .NET 8 — Native assets for the Emscripten versions used by .NET 6 and .NET 7 are no longer shipped. Move Blazor WebAssembly and Uno Platform WebAssembly projects to .NET 8 or later. (#4022)
- Tizen native assets are now 64-bit only — The Skia m147 update removes the EOL 32-bit Tizen arm and x86 assets. Target tizen-arm64 or tizen-x64 when upgrading. (#3702)
- HarfBuzz palette colors use HBColor — Face.GetPaletteColors now returns HBColor values instead of raw uint values so HarfBuzz BGRA channels are represented correctly. Update code to use HBColor and the ColorExtensions conversions. (#4000)
- Large SKStream.Move offsets no longer truncate — SKStream.Move(long) is obsolete and now throws OverflowException when the offset does not fit in 32 bits. Validate the range and call Move(int). (#3714)
- Ganesh Vulkan now requires Vulkan 1.1 — Creating a Ganesh context for Vulkan 1.0 now aborts instead of returning null. Create the instance as Vulkan 1.1 or later, set GRVkBackendContext.MaxAPIVersion consistently, or select another backend before context creation.
- Vulkan backend context fields are removed — GRVkBackendContextNative no longer exposes fMinAPIVersion, fInstanceVersion, fExtensions, fFeatures, or fOwnsInstanceAndDevice. Use fVkExtensions and fDeviceFeatures or fDeviceFeatures2, and manage Vulkan instance and device ownership outside the context.
- Vulkan YCbCr conversion layout and naming change — Vulkan YCbCr conversion info gains Components, changing its native layout, and GRVkYcbcrConversionInfo replaces GrVkYcbcrConversionInfo. Update type names, initializers, equality code, and native layout assumptions. (#4001)
- Preview API names align with .NET conventions — SKDocumentXpsOptions.DPI is now Dpi. Update source references to the new property name. (#4001)
Engine
- Bundled engine advances to Skia m148 — The cumulative update brings SKPathBuilder, HDR and CICP color support, codec and filter improvements, runtime-effect thread safety, raster-pipeline corrections, and malformed-region rejection. — ❤️ @ramezgerges (#3560, #3660, #3702, #4044, #4125)
- Image, parser, font, and shaping engines are refreshed — The bundled stack updates libjpeg-turbo, FreeType, zlib, libpng, Expat, and HarfBuzz, including improved OpenType shaping and CFF2 subsetting. (#4012, #3726, #3720, #3718, #3717, #4079, #4035)
API Surface
- Variable and color fonts gain first-class APIs — SkiaSharp and HarfBuzzSharp can query variation axes and palettes, clone typefaces with coordinates or palette overrides, and convert correctly represented HBColor values. — ❤️ @ramezgerges (#3703, #3742, #4000)
- Animated WebP encoding arrives — SKWebpEncoder encodes single images or timed frame sequences through stream and span-friendly overloads. (#3771)
- Streams expose memory-backed data — SKStream.GetData returns ref-counted SKData when the stream can provide its contents cheaply. (#3772)
- Drawing and document controls expand — New APIs add sampling-aware surface drawing, XPS document creation, per-resource GPU flushing, and shader-backed mask filters. (#3491, #4001)
- Single-channel half-float pixels are supported — SKColorType.RF16 exposes Skia m148's opaque 16-bit half-float red format. (#4125)
Bug Fixes
- Pixel spans use correct strides and offsets — SKPixmap and SKBitmap pixel spans honor RowBytes for shared-buffer subsets, and typed non-square pixmap access uses the correct row-major offset. (#4148, #4128)
- Font and glyph handling is more robust — Default typeface resolution no longer crashes during Android or NanoServer initialization, and byte-span glyph checks no longer recurse until a stack overflow. — ❤️ @ramezgerges (#3730, #3744, #3742, #3835)
- Android GL views resume after navigation — SKGLView retains the correct dimensions when a MAUI tab or page is reattached, avoiding a blank surface. — ❤️ @SimonvBez (#3076)
- WinUI native projection loading supports .NET 9 — The projection DLL is packaged in a compatible runtime location so .NET 9 Windows consumers can resolve it. (#4084)
Lifecycle & Internals
- Singleton and wrapper lifetimes are reliable — Lazy singleton initialization avoids type cycles, shared native singletons are not freed during teardown, and wrappers remain alive across in-flight native calls. — ❤️ @ramezgerges (#4080)
- Native loading can be configured before first use — Compatibility checks now run before the first Skia P/Invoke rather than during assembly loading, preserving custom native-library resolver setup. (#4133)
- SKPath finalization no longer races its builder — Pending path mutations are not flushed after disposal starts, preventing a finalizer-thread crash when SKPathBuilder is collected first. — ❤️ @ramezgerges (#3796)
Platform
- Linux Bionic native assets are available — SkiaSharp and HarfBuzzSharp now ship linux-bionic packages for x64 and arm64 environments. — ❤️ @4Darmygeometry (#3217)
- Tizen support moves to 64-bit architectures — New tizen-x64 and tizen-arm64 assets replace the retired 32-bit Tizen targets. — ❤️ @ramezgerges (#3620, #3702)
- WebAssembly support starts at .NET 8 — Native assets remain available for .NET 8 and later Emscripten toolchains, with a clear build error on unsupported .NET 6 and .NET 7 projects. (#4022)
- Apple library targets regain workload compatibility — Apple .NET 10 library TFMs use the base 26.0 platform version instead of requiring Xcode 26.2. (#3798)
Security
- Verified Skia core and Ganesh fixes are included — The shipped m147 and m148 engine revisions contain verified fixes for malformed input, runtime effects, raster pipelines, pixels, SKP and SkSL handling, PathOps, GPU text, and Ganesh/Vulkan memory safety. (#4044, #4125)
- Bundled native dependencies include security fixes — The shipped Expat, libpng, FreeType, and HarfBuzz versions include their curated parser, image, font, and shaping security updates. (#3717, #4079, #3718, #3726, #4035)
HarfBuzzSharp 14.2.0
HarfBuzzSharp 14.2.0 updates shaping from 8.3.1.6 with improved OpenType shaping, CFF2 subsetting, and font-table handling. It also includes variable-font and color-palette APIs, HBColor values, and Linux Bionic and 64-bit Tizen assets.
Community Contributors ❤️
Thank you to everyone who contributed to this release!
| Contributor | Contributions |
|---|---|
| @ramezgerges | Skia milestone updates, variable fonts, default typeface reliability, singleton lifecycle rework, and the SKPath finalizer fix (#3560, #3666, #3702, #3703, #3714, #3730, #3785, #3796, #4068, #4080) |
| @4Darmygeometry | Linux Bionic native assets and modern C# support for legacy target frameworks (#3217, #3642) |
| @SimonvBez | Android SKGLView rendering after tab and page navigation (#3076) |
Stable (June 22, 2026)
Completes the v4 deprecation pass by making the remaining legacy render-target constructors, run-buffer span methods, SKPaintHinting, and SKFilterQuality compile errors with supported replacements. Removes the obsolete enums from the reference surface while retaining implementation-assembly ABI compatibility. Keeps two SKCanvas.DrawText overloads at warning level so they complete the normal deprecation cycle before a future promotion to error. (#4205)
Release Candidate 1 (June 12, 2026)
Advances to Skia m148, makes legacy SKPaint text/font APIs compile errors, and fixes pixel-span addressing, singleton lifetimes, configurable native loading, and WinUI projection resolution. It includes verified Skia and native-dependency security fixes. (#4125, #4068, #4114, #4148, #4128, #4080, #4133, #4084, #4044, #4079, #4035)
Preview 3 (May 24, 2026)
Requires .NET 8 or later for WebAssembly native assets and replaces preview palette uint values with HBColor. It adds XPS, per-resource GPU flush, and shader mask-filter APIs, refreshes native dependencies, and prevents NanoServer font initialization crashes. (#4022, #4000, #4001, #4012, #3726, #3720, #3835)
Preview 2 (May 6, 2026)
Adds animated WebP encoding and SKStream.GetData, fixes SKPath finalizer crashes, and restores broad Apple .NET 10 workload compatibility. (#3771, #3772, #3796, #3798)
Preview 1 (April 28, 2026)
Updates to Skia m147 and adds SKPathBuilder, variable and color-font APIs, CICP color spaces, sampling-aware drawing, Linux Bionic, and 64-bit Tizen assets. It changes default font behavior, rejects oversized SKStream.Move offsets, fixes Android initialization and GL reattachment, and drops 32-bit Tizen assets. (#3702, #3703, #3742, #3491, #3660, #3217, #3620, #3730, #3714, #3076)