Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@
AI uses this data to generate the polished release notes below.
Re-run the script to refresh this data from git history.

Generated: 2026-06-11T23:22:02Z by generate-release-notes.py
Generated: 2026-06-12T15:24:12Z by generate-release-notes.py
version: 4.148.0
status: unreleased
supersedes: 4.147.0 (preview only, rolled up)
branch: main
diff: release/3.119.4..main
prs: 160
branch: release/4.148.0-rc.1
diff: release/3.119.4..release/4.148.0-rc.1
prs: 162

- docs: update release notes for 4.148.0 (unreleased) by @github-actions[bot] in https://github.com/mono/SkiaSharp/pull/4153 [community ✨] (1 commit, 1 day)
- Fix SKPixmap/SKBitmap GetPixelSpan to use RowBytes for stride by @mattleibow in https://github.com/mono/SkiaSharp/pull/4148 (9 commits, 2 days)
- release-notes: emit two-way supersede links on successor pages by @mattleibow in https://github.com/mono/SkiaSharp/pull/4152 (1 commit, 1 day)
- release-notes: roll up preview-only/skipped versions into their successor by @mattleibow in https://github.com/mono/SkiaSharp/pull/4149 (4 commits, 2 days)
- Fix SKIASHARP_VERSION yaml missed by the m148 bump by @mattleibow in https://github.com/mono/SkiaSharp/pull/4144 (2 commits, 1 day)
Expand Down Expand Up @@ -173,93 +175,87 @@
- Bump SkiaSharp to Skia milestone 132 by @ramezgerges in https://github.com/mono/SkiaSharp/pull/3560 [community ✨] (31 commits, 11 days) (skia: mono/skia#171)
-->

<!-- Generated: 2026-06-11T23:28:00Z by claude-sonnet-4.6 -->
<!-- Generated: 2026-06-12T15:28:00Z by claude-sonnet-4.6 -->

# Version 4.148.0

> **Upcoming release** · In development · Not yet available on NuGet
> **SkiaSharp 4.x — major release** · In development · Not yet available on NuGet

> **Supersedes [4.147.0](4.147.0.md)** · Rolls up preview-only work that was never released as stable — those changes are included cumulatively below.

## Highlights

SkiaSharp 4 is the first major version upgrade in many years, built on the Skia m148 engine and bringing a wave of new capabilities: animated WebP encoding, variable and color-palette font support, expanded platform reach (Linux Bionic, Tizen x64/arm64), and a comprehensive API modernization sweep. This release cumulatively includes all work from the skipped 4.147.0 preview cycle. Special thanks to [@ramezgerges](https://github.com/ramezgerges), [@4Darmygeometry](https://github.com/4Darmygeometry), [@SimonvBez](https://github.com/SimonvBez), and [@ebariche](https://github.com/ebariche) for major community contributions across this release.
SkiaSharp 4.148.0 is the inaugural stable release of the 4.x major line, spanning 162 merged pull requests and advancing the Skia engine through four consecutive milestones (m132 → m148). The release delivers long-awaited typography APIs — variable font axis control and color font palette support — alongside animated WebP encoding, improved surface compositing, and a wave of native dependency security updates. Community contributors [@ramezgerges](https://github.com/ramezgerges), [@4Darmygeometry](https://github.com/4Darmygeometry), [@SimonvBez](https://github.com/SimonvBez), [@ebariche](https://github.com/ebariche), and [@Copilot](https://github.com/Copilot) drove significant portions of the new functionality.

This release rolls up all work from the 4.147.0 preview cycle cumulatively — nothing from that preview line is missing here.

## ⚠️ Breaking Changes

- **SkiaSharp major version bump to 4.x** — The package version jumps from 3.x to 4.x. Existing NuGet references require a version update. ([#3640](https://github.com/mono/SkiaSharp/pull/3640))
- **`SKPaint` text/font obsolete members are now errors** — APIs marked `[Obsolete]` in earlier releases now produce compile errors. Migrate to the `SKFont`-based text APIs. ❤️ [@ramezgerges](https://github.com/ramezgerges) ([#4068](https://github.com/mono/SkiaSharp/pull/4068))
- **Major version 4.x** — The NuGet package version has advanced from 3.x to 4.x. ([#3640](https://github.com/mono/SkiaSharp/pull/3640))
- **`SKPaint` text/font APIs are now errors** — Deprecated text and font properties on `SKPaint` (e.g. `TextSize`, `Typeface`, `MeasureText`) are now compile-time errors. Migrate to `SKFont` and the `SKPaint`/`SKFont` split model. ❤️ [@ramezgerges](https://github.com/ramezgerges) ([#4068](https://github.com/mono/SkiaSharp/pull/4068))
- **Singleton lifecycle changed** — `SKColorSpace.CreateSrgb()` and related managed singletons have revised lifecycle semantics. Code that stores or compares singleton instances by reference should be audited. ❤️ [@ramezgerges](https://github.com/ramezgerges) ([#4080](https://github.com/mono/SkiaSharp/pull/4080))

## New Features

### Engine

- **Skia milestone m148** — Updated the Skia engine to milestone 148, picking up rendering improvements, bug fixes, and upstream security patches. ([#4125](https://github.com/mono/SkiaSharp/pull/4125))

### Images & Encoding

- **Animated WebP encoding (`SKWebpEncoder`)** — Full support for encoding multi-frame animated WebP files. ([#3771](https://github.com/mono/SkiaSharp/pull/3771))

### API Surface

- **`SKStream.GetData()`** — Zero-copy conversion of any `SKStream` to an `SKData` object. ([#3772](https://github.com/mono/SkiaSharp/pull/3772))
- **`HBColor` struct** — Adds a proper managed type for HarfBuzz `hb_color_t`, replacing raw integer handling. ([#4000](https://github.com/mono/SkiaSharp/pull/4000))
- **`SKSamplingOptions` on `SKSurface.Draw` / `SKCanvas.DrawSurface`** — Exposes sampling-quality control on surface-to-canvas drawing. ❤️ [@Copilot](https://github.com/Copilot) ([#3491](https://github.com/mono/SkiaSharp/pull/3491))
- **Missing API wrappers and naming fixes** — Adds several previously unbound C API entry points and corrects naming convention violations. ([#4001](https://github.com/mono/SkiaSharp/pull/4001))
- **Obsolete legacy `SKPaint` state-reading APIs** — Remaining `SKPaint` text/font state properties are marked `[Obsolete]` in preparation for removal. ([#4114](https://github.com/mono/SkiaSharp/pull/4114))
- **Skia milestones m132 → m148** — Four consecutive Skia engine upgrades land in this release, picking up substantial upstream improvements in rendering correctness, GPU backend performance, and text shaping. ❤️ [@ramezgerges](https://github.com/ramezgerges) ([#3560](https://github.com/mono/SkiaSharp/pull/3560), [#3702](https://github.com/mono/SkiaSharp/pull/3702)), ([#3660](https://github.com/mono/SkiaSharp/pull/3660), [#4125](https://github.com/mono/SkiaSharp/pull/4125))

### Text & Fonts

- **Variable font support** — Full OpenType variable font axis support in `SKTypeface` and `HarfBuzzSharp`. ❤️ [@ramezgerges](https://github.com/ramezgerges) ([#3703](https://github.com/mono/SkiaSharp/pull/3703))
- **Color font palette support** — Adds `SKTypeface` APIs to enumerate and select color font palettes (CPAL/COLR). ([#3742](https://github.com/mono/SkiaSharp/pull/3742))
- **Variable font support** — Full variable font axis control in `SKFont` and `HarfBuzzSharp`, enabling smooth interpolation of weight, width, slant, italic, and any custom axes. ❤️ [@ramezgerges](https://github.com/ramezgerges) ([#3703](https://github.com/mono/SkiaSharp/pull/3703))
- **Color font palettes** — COLR/CPAL color fonts now support selecting the active palette and overriding individual color entries; variable color fonts are handled more robustly. ([#3742](https://github.com/mono/SkiaSharp/pull/3742))
- **`HBColor` struct** — New `HBColor` value type correctly represents `hb_color_t` for palette color operations in HarfBuzzSharp. ([#4000](https://github.com/mono/SkiaSharp/pull/4000))
- **Default typeface in managed layer** — The fallback typeface resolution was moved to the managed C# layer, fixing platform-specific font fallback edge cases. ❤️ [@ramezgerges](https://github.com/ramezgerges) ([#3730](https://github.com/mono/SkiaSharp/pull/3730))
- **Legacy `SKPaint` APIs obsoleted** — Remaining state-reading APIs on `SKPaint` are now `[Obsolete]`, continuing the push toward the split font/paint model. ([#4114](https://github.com/mono/SkiaSharp/pull/4114))

### Platform
### Images & Encoding

- **Linux Bionic native assets** — New native assets for Linux Bionic to support scenarios using the Android NDK sysroot outside of Android. ❤️ [@4Darmygeometry](https://github.com/4Darmygeometry) ([#3217](https://github.com/mono/SkiaSharp/pull/3217))
- **Tizen x64 and ARM64 native builds** — Tizen native support extended to x64 and arm64 architectures. ([#3620](https://github.com/mono/SkiaSharp/pull/3620))
- **Animated WebP encoding** — New `SKWebpEncoder` supports multi-frame animated WebP output from a sequence of frames. ([#3771](https://github.com/mono/SkiaSharp/pull/3771))
- **Zero-copy `SKStream.GetData()`** — Converts a stream to `SKData` without an intermediate buffer copy, useful for efficient source pipelines. ([#3772](https://github.com/mono/SkiaSharp/pull/3772))

## Bug Fixes

- **`SKPixmap.GetPixelSpan<T>(x, y)` offset** — Fixed a bug where the row stride calculation used `Height` instead of `Width`, producing wrong pixel addresses. ([#4128](https://github.com/mono/SkiaSharp/pull/4128))
- **`SKPath` finalizer crash** — Fixed a crash when `SKPathBuilder` is collected by the GC before the `SKPath` built from it. ❤️ [@ramezgerges](https://github.com/ramezgerges) ([#3796](https://github.com/mono/SkiaSharp/pull/3796))
- **Default typeface resolution** — Moved default-typeface lookup from native to the managed layer, fixing inconsistencies on platforms without a system font manager. ❤️ [@ramezgerges](https://github.com/ramezgerges) ([#3730](https://github.com/mono/SkiaSharp/pull/3730))
- **Singleton instance lifecycle** — Reworked the lifecycle of shared singleton objects to prevent premature disposal and ordering bugs. ❤️ [@ramezgerges](https://github.com/ramezgerges) ([#4080](https://github.com/mono/SkiaSharp/pull/4080))
- **Native-compat gate timing** — Moved the native compatibility check from `[ModuleInitializer]` to the `SkiaApi` static constructor, fixing edge cases in .NET trimming and NativeAOT scenarios. ([#4133](https://github.com/mono/SkiaSharp/pull/4133))
- **Android `SKGLView` tab switch** — Fixed `SKGLView` not re-rendering after a MAUI `TabBar` tab switch on Android. ❤️ [@SimonvBez](https://github.com/SimonvBez) ([#3076](https://github.com/mono/SkiaSharp/pull/3076))
- **WinUI Projection DLL discovery** — Fixed `libWinAppSDK_SkiaSharp.dll` not being found by .NET 9 WinUI consumers. ([#4084](https://github.com/mono/SkiaSharp/pull/4084))
### API Surface

## Security
- **`SKSamplingOptions` on surfaces** — `SKSurface.Draw` and `SKCanvas.DrawSurface` now accept `SKSamplingOptions`, giving callers control over filter quality and mipmap behaviour when compositing surfaces. ❤️ [@Copilot](https://github.com/Copilot) ([#3491](https://github.com/mono/SkiaSharp/pull/3491))
- **Missing API wrappers** — Several C-layer wrappers added and naming convention violations fixed across the binding layer. ([#4001](https://github.com/mono/SkiaSharp/pull/4001))

Multiple native dependencies updated with security patches:
## Bug Fixes

- **expat 2.8.1** ([#4079](https://github.com/mono/SkiaSharp/pull/4079))
- **HarfBuzz 14.2.0** ([#4035](https://github.com/mono/SkiaSharp/pull/4035))
- **libjpeg-turbo 3.1.4.1** ([#4012](https://github.com/mono/SkiaSharp/pull/4012))
- **FreeType 2.14.3** ([#3726](https://github.com/mono/SkiaSharp/pull/3726))
- **zlib 1.3.2.1** ([#3720](https://github.com/mono/SkiaSharp/pull/3720))
- **libpng 1.6.58** ([#3718](https://github.com/mono/SkiaSharp/pull/3718))
- **libexpat 2.7.5** ([#3717](https://github.com/mono/SkiaSharp/pull/3717))
- **`GetPixelSpan` stride** — `SKPixmap.GetPixelSpan()` and `SKBitmap.GetPixelSpan()` now use `RowBytes` instead of a width-based stride, preventing silent out-of-bounds reads for padded bitmaps. ([#4148](https://github.com/mono/SkiaSharp/pull/4148))
- **`GetPixelSpan<T>(x, y)` offset** — Fixed the pixel-addressed overload computing the row offset with `Height` instead of `Width`, returning wrong pixels for non-square bitmaps. ([#4128](https://github.com/mono/SkiaSharp/pull/4128))
- **`SKPath` finalizer crash** — Fixed a crash when `SKPath` is finalized after its `SKPathBuilder` is already collected; the GC can no longer trigger a use-after-free via finalizer ordering. ❤️ [@ramezgerges](https://github.com/ramezgerges) ([#3796](https://github.com/mono/SkiaSharp/pull/3796))
- **Android `SKGLView` in MAUI `TabBar`** — `SKGLView` now renders correctly after a tab switch in MAUI `Shell`/`TabBar` on Android. ❤️ [@SimonvBez](https://github.com/SimonvBez) ([#3076](https://github.com/mono/SkiaSharp/pull/3076))
- **WinUI Projection DLL for .NET 9** — Fixed `SkiaSharp.Views.WinUI` failing to load its projection assembly for .NET 9 consumers. ([#4084](https://github.com/mono/SkiaSharp/pull/4084))
- **Apple platform TFMs** — Target framework monikers corrected to versioned for libraries and unversioned for app targets, resolving build errors on newer Apple OS SDKs. ([#3798](https://github.com/mono/SkiaSharp/pull/3798))
- **Native-compat gate** — The native library compatibility check was moved from `[ModuleInitializer]` to the `SkiaApi` static constructor, fixing edge cases where the check ran too early. ([#4133](https://github.com/mono/SkiaSharp/pull/4133))

## Platform Support

| Platform | What's New |
|----------|-----------|
| 🐧 Linux | Bionic (NDK legacy ABI) native assets |
| 🍎 Apple | TFM alignment: 26.0 for libraries, unversioned for app targets |
| 🤖 Android | Fixed `SKGLView` rendering after MAUI tab switch |
| 🪟 Windows | Fixed WinUI Projection DLL discovery for .NET 9 |
| 🏗️ Tizen | x64 and ARM64 native builds |
| 🌐 WebAssembly | Dropped pre-.NET 8 Emscripten build variants |
| 🐧 Linux | New Bionic (Android NDK-compatible) native library |
| 🤖 Android | Fixed `SKGLView` rendering after tab switch in MAUI |
| 🪟 Windows | Fixed WinUI Projection DLL for .NET 9 |
| 🍎 Apple | Corrected TFMs for library and app targets |
| 🌐 WebAssembly | Dropped pre-.NET 8 Emscripten builds; SkiaFiddle bundle −60% |
| 🏗️ Tizen | Added x64 and arm64 native builds; SDK updated to 10.0 |

- **Linux Bionic** — Adds a native library built against the Android NDK Bionic ABI, enabling SkiaSharp in custom Linux-on-Android and embedded environments. ❤️ [@4Darmygeometry](https://github.com/4Darmygeometry) ([#3217](https://github.com/mono/SkiaSharp/pull/3217))
- **WebAssembly** — Pre-.NET 8 Emscripten configurations removed; WASM targets .NET 8+ only. The SkiaFiddle web application reduced its bundle size by ~60%. ❤️ [@ebariche](https://github.com/ebariche) ([#3849](https://github.com/mono/SkiaSharp/pull/3849)), ([#4022](https://github.com/mono/SkiaSharp/pull/4022))
- **Tizen** — x64 and arm64 native build targets added; Tizen SDK installer updated from 6.1 to 10.0. ([#3620](https://github.com/mono/SkiaSharp/pull/3620), [#3743](https://github.com/mono/SkiaSharp/pull/3743))

## Security

- **Native dependency updates** — libpng → 1.6.58, expat → 2.7.5 / 2.8.1, freetype → 2.14.3, harfbuzz → 14.2.0, libjpeg-turbo → 3.1.4.1, zlib → 1.3.2.1-motley. ([#3718](https://github.com/mono/SkiaSharp/pull/3718), [#3717](https://github.com/mono/SkiaSharp/pull/3717), [#4079](https://github.com/mono/SkiaSharp/pull/4079), [#3726](https://github.com/mono/SkiaSharp/pull/3726), [#4035](https://github.com/mono/SkiaSharp/pull/4035), [#4012](https://github.com/mono/SkiaSharp/pull/4012), [#3720](https://github.com/mono/SkiaSharp/pull/3720))

## Community Contributors ❤️

| Contributor | What They Did |
|-------------|--------------|
| [@ramezgerges](https://github.com/ramezgerges) | Variable font support, color font robustness, singleton lifecycle rework, `SKPath` finalizer fix, default-typeface fix, `SKPaint` API cleanup, Skia milestone bumps |
| [@4Darmygeometry](https://github.com/4Darmygeometry) | Linux Bionic native assets, C# 13 PolySharp support on legacy TFMs |
| [@SimonvBez](https://github.com/SimonvBez) | Fixed Android `SKGLView` not rendering after MAUI tab switch |
| [@Copilot](https://github.com/Copilot) | `SKSamplingOptions` support on `SKSurface.Draw` / `SKCanvas.DrawSurface` |
| [@ebariche](https://github.com/ebariche) | Reduced SkiaFiddle WASM application size by ~60% |
| [@sasakrsmanovic](https://github.com/sasakrsmanovic) | Updated Uno Platform link and description in README |
| [@ramezgerges](https://github.com/ramezgerges) | Variable font support, color font APIs, singleton lifecycle rework, `SKPaint` cleanup, `SKPath` finalizer fix, default typeface resolution, SkiaFiddle UX, Uno Platform samples |
| [@4Darmygeometry](https://github.com/4Darmygeometry) | Linux Bionic native library, C# 13 PolySharp support on legacy TFMs |
| [@SimonvBez](https://github.com/SimonvBez) | Fixed Android MAUI `SKGLView` rendering after tab switch |
| [@ebariche](https://github.com/ebariche) | Reduced SkiaFiddle WASM bundle size by ~60% |
| [@Copilot](https://github.com/Copilot) | Added `SKSamplingOptions` support to `SKSurface.Draw` and `SKCanvas.DrawSurface` |

Plus several CI, build infrastructure, and developer tooling improvements.
Plus several CI and documentation improvements.
6 changes: 3 additions & 3 deletions documentation/docfx/releases/TOC.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
- name: Overview
href: index.md
- name: Version 4.148.x
href: 4.148.0-unreleased.md
href: 4.148.0.md
items:
- name: Version 4.148.0 (Unreleased)
href: 4.148.0-unreleased.md
- name: Version 4.148.0
href: 4.148.0.md
- name: Version 4.147.x
href: 4.147.0.md
items:
Expand Down
2 changes: 1 addition & 1 deletion documentation/docfx/releases/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Release notes for all SkiaSharp versions.
### SkiaSharp 4.x

- **Version 4.148.x**
- [Version 4.148.0 (Unreleased)](4.148.0-unreleased.md)
- [Version 4.148.0](4.148.0.md)
- **Version 4.147.x**
- [Version 4.147.0](4.147.0.md)

Expand Down