SkiaSharp 4.0 Preview 1: неизменяемый SKPath, переменные шрифты и новый со-мейнтейнер
SkiaSharp 4.0 Preview 1 выходит вместе с Uno Platform в роли со-мейнтейнера рядом с командой .NET. SKPath становится неизменяемым за новым SKPathBuilder, а HarfBuzzSharp получает полное управление осями переменных шрифтов OpenType.
David Ortinau объявил о SkiaSharp 4.0 Preview 1 28 апреля 2026 года, и в этом анонсе важнее самого скачка версии две новости: Uno Platform теперь официальный со-мейнтейнер рядом с командой .NET, а движок Skia в одной этой версии продвинули вперёд на годы апстримной работы.
Со-мейнтейнинг SkiaSharp
До этого релиза обновления SkiaSharp двигались в ритме Microsoft, который заметно замедлился в 2024 и 2025 годах, пока фокус команды смещался в другие места. Включить Uno Platform в формальную роль со-мейнтейнера значимо, потому что у Uno уже давно есть внутренний форк (unoplatform/Uno.SkiaSharp) для WebAssembly, и именно этот форк стал источником большинства обновлений движка в этой предварительной версии (PR #3560 и #3702). Практический эффект: графика в .NET MAUI, контролы Avalonia, приложения Uno и любой консольный рендерер, использующий SkiaSharp, теперь работают на актуальном Skia вместо того, что отставал от Chromium на год или больше.
Исправления сборки для Android API 36, генераторный tooling на стороне Linux и обновлённая WebAssembly-галерея пришли через тот же набор контрибуций.
SKPath становится неизменяемым
Самое крупное изменение API в том, что SKPath теперь под капотом неизменяемый. Привычные мутирующие методы остаются ради обратной совместимости, но современный способ построить путь — через новый SKPathBuilder:
using var builder = new SKPathBuilder();
builder.MoveTo(50, 0);
builder.LineTo(50, -50);
builder.LineTo(-30, -80);
builder.Close();
using SKPath path = builder.Detach();
canvas.DrawPath(path, paint);
Detach() отдаёт вам неизменяемый результат. Поскольку лежащий в основе SkPath после конструирования больше не мутирует, среда выполнения может безопасно делиться, хешировать и переиспользовать геометрию пути между потоками, что важно для любого UI-фреймворка, кеширующего примитивы рисования между кадрами. Существующий код, вызывающий path.MoveTo(...) напрямую, продолжает компилироваться и работать, поэтому приложениям MAUI и Xamarin.Forms не нужно ничего менять, чтобы взять Preview 1.
Переменные шрифты через HarfBuzzSharp
Другое заметное добавление — полное управление осями переменных шрифтов OpenType. HarfBuzzSharp теперь раскрывает оси, которые шрифт декларирует (вес, ширина, наклон, оптический размер или любая пользовательская ось), и позволяет создавать варианты гарнитуры без необходимости поставлять десяток статических файлов шрифта:
using var blob = SKData.Create("Inter.ttf");
using var typeface = SKTypeface.FromData(blob);
var variation = new SKFontVariation
{
{ "wght", 650 },
{ "wdth", 110 },
};
using var variant = typeface.CreateVariant(variation);
using var font = new SKFont(variant, size: 24);
canvas.DrawText("Hello, variable fonts", 0, 0, font, paint);
Раньше вызывающим коду приходилось спускаться до нативных хэндлов HarfBuzz, чтобы задать координаты осей. Preview 1 выставляет те же элементы управления через простые управляемые API в SkiaSharp и HarfBuzzSharp.
Как взять предварительную версию
Пакет опубликован за aka.ms/skiasharp-40-package. Предварительная версия нацелена на тот же набор платформ, что и 3.x (net8.0, net9.0, net10.0 плюс обычные мобильные heads), и команда просит обратной связи перед фиксацией поверхности API для стабильного релиза 4.0. Если вы поддерживаете собственную библиотеку контролов Skia, это окно, чтобы протестировать семантику неизменяемого пути на вашем цикле рисования и сообщить обо всём, что мутирует путь после кеширования: именно этот паттерн уходит из “работает в 3.x” в “нужен SKPathBuilder” в 4.0.
Для более глубокого разбора Uno Platform проводит мероприятие Focus on SkiaSharp 30 июня с сессиями инженеров, стоявших за этим релизом.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.