Table of Contents

Version 4.147.0

Opens the v4 line · NuGet (prerelease)

Superseded by 4.148.0 · Never released as stable — these changes rolled up into 4.148.0.

API changes · SkiaSharp API diff · HarfBuzzSharp API diff

Highlights

SkiaSharp 4.147.0 opens the v4 line on Skia m147 with variable fonts and animated WebP encoding. The engine jumps from milestone 132 all the way to 147, bringing variable font support end-to-end (SkiaSharp and HarfBuzzSharp), color font palettes, animated WebP encoding, and new sampling options on surface draws. Tizen picks up x64/arm64 and Linux Bionic joins the supported native asset set.

Breaking Changes

  • GrVkYcbcrConversionInfo renamed to GRVkYcbcrConversionInfo — The Vulkan YCbCr conversion info struct now follows the SkiaSharp GR casing convention. Update any reference and rebuild — the old name and its IEquatable/Equals/== operators are gone.
  • Assembly version bumped to 4.x — SkiaSharp.dll now reports assembly version 4.147.0.0 (up from 3.119.0.0). Consumers with strong-name binding redirects or hard-coded version checks must be updated. Review the linked API-diff report before upgrading.

Engine

  • Skia updated to milestone m147 — The bundled engine advances through m132, m133 and lands on m147, picking up every upstream fix and feature between the two lines. — ❤️ @ramezgerges (#3560, #3660, #3702)
  • Variable fonts and color font palettes — Variable font support is wired through SkiaSharp and HarfBuzzSharp, and SKFont/SKTypeface gain color font palette selection and hardened variable-font handling. — ❤️ @ramezgerges (#3703, #3742)
  • Managed default typeface resolution — Default typeface lookup moves to the managed layer, fixing #3693 and letting consumers observe/override the fallback without a native round-trip. — ❤️ @ramezgerges (#3730)
  • Legacy font manager entry point restored — The Skia shim regains sk_fontmgr_legacy_create_typeface, so downstream code depending on the legacy typeface factory works again. (#3744)

API Surface

  • SKSamplingOptions on SKSurface.Draw and SKCanvas.DrawSurface — New overloads accept SKSamplingOptions so callers can pick the mipmap and filter mode for surface-to-surface draws instead of the implicit default. (#3491)
  • SKStream.GetData() for zero-copy conversion — Turn any seekable stream into an SKData without an intermediate byte[] copy — useful when handing decoded assets to codecs and shaders. (#3772)
  • Animated WebP encoding — SKWebpEncoder can now emit animated WebP files from a frame sequence, closing a long-standing gap next to the existing decoder. (#3771)
  • HBColor struct and missing HarfBuzz wrappers — HarfBuzzSharp gets a proper HBColor struct (matching hb_color_t) and fills in wrappers that had been missing or mis-named — a step toward full API coverage. (#4000, #4001)

Bug Fixes

  • SKPath finalizer crash when SKPathBuilder collected first — A GC ordering bug that could crash on finalization when an SKPathBuilder was collected before the SKPath it produced is fixed. — ❤️ @ramezgerges (#3796)
  • Android SKGLView blank after MAUI TabBar switch — Switching tabs in a MAUI TabBar no longer leaves SKGLView blank; the GL surface is now correctly re-attached after the view is re-added to the tree. — ❤️ @SimonvBez (#3076)

Platform

  • Tizen picks up x64 and arm64 native builds — Tizen ships alongside the existing x86/arm slices, so consumers on 64-bit Tizen devices no longer have to fall back to emulation. (#3620)
  • Linux Bionic native assets — Android-hosted Linux (linux-bionic) is a first-class native target — the runtime identifier now resolves to purpose-built binaries instead of the desktop-glibc build. — ❤️ @4Darmygeometry (#3217)
  • Apple TFM alignment — Libraries target the versioned Apple TFMs (26.0) while sample apps use the unversioned ones, matching current .NET SDK guidance and unblocking MAUI-style consumers. (#3798)
  • WASM drops pre-.NET 8 Emscripten builds — Native builds for pre-.NET 8 Emscripten versions are removed — .NET 8 is the floor for the SkiaSharp WASM runtime asset. (#4022)

Security

  • Bundled native dependencies refreshed — libexpat 2.7.5, libpng 1.6.58, zlib 1.3.2.1-motley, freetype 2.14.3 and libjpeg-turbo 3.1.4.1 all pick up their latest upstream security and bug fixes. (#3717, #3718, #3720, #3726, #4012)

HarfBuzzSharp 8.3.1.6

Adds an HBColor value type, variable-font shaping and color-palette support, and refreshes the bundled HarfBuzz to 8.3.1.6.

Community Contributors ❤️

Thank you to everyone who contributed to this release!

Contributor Contributions
@ramezgerges The Skia m132/m147 bumps, variable font support end-to-end, the managed default-typeface fix, and the SKPath/SKPathBuilder finalizer crash fix (#3560, #3666, #3692, #3702, #3703, #3714, #3730, #3758, #3762, #3785, #3790, #3796, #3821, #3867)
@4Darmygeometry Linux Bionic native assets and PolySharp-based C# 13 support on legacy TFMs (#3217, #3642)
@ebariche Uno-side sample and integration fixes (#3849)
@sasakrsmanovic Sample and infrastructure fixes (#3966)
@SimonvBez Fixed SKGLView not rendering after MAUI TabBar tab switches on Android (#3076)

Preview 3 (May 24, 2026)

Preview 3 finished the API pass with HBColor and missing HarfBuzz wrappers, dropped native WASM builds for pre-.NET 8 Emscripten, and picked up freetype 2.14.3, zlib 1.3.2.1-motley and libjpeg-turbo 3.1.4.1.

Full changelog

Preview 2 (May 6, 2026)

Preview 2 added animated WebP encoding, zero-copy SKStream.GetData(), the SKPath finalizer crash fix, and the Apple TFM realignment.

Full changelog

Preview 1 (April 28, 2026)

Preview 1 opened the v4 line: Skia m132 → m133 → m147, variable fonts, color font palettes, SKSamplingOptions on surface draws, the managed default-typeface fix, Tizen x64/arm64, Linux Bionic, and dependency refreshes for libpng/libexpat.

Full changelog