В мире цифровой типографики и рендеринга текста движок HarfBuzz давно стал стандартом для реализации функционала по формированию (шейпингу) текста. Его роль в обработке сложных шрифтов и многоязычных текстов трудно переоценить — именно благодаря этому свободному движку современные системы и приложения получают качественное и корректное отображение символов. Однако традиционная версия HarfBuzz написана на языке C++, что накладывает определённые ограничения на гибкость и безопасность разработки. Возникает потребность в реализациях на более современных языках программирования, предлагающих встроенные механизмы управления памятью и обеспечивающих более высокий уровень безопасности кода. В результате появился HarfRust — официальный порт HarfBuzz, реализованный на языке Rust.
Эта статья детально расскажет о проекте HarfRust, его значимости для индустрии, основных изменениях, которые отличают порт от оригинала, а также перспективах развития и использовании в современных приложениях. HarfRust представляет собой реализацию ядра шейпинг-движка HarfBuzz на языке Rust, совпадающую по функциональности с версией HarfBuzz 12.1.0. Само портирование было инициировано с целью обеспечить более безопасную, удобную и поддерживаемую альтернативу работе с текстом, избегая распространённых проблем из области управления памятью и сложной связки с внешними зависимостями.
Проект начал своё развитие как форк RustyBuzz и перешел к использованию библиотеки read-fonts для работы с загрузкой и разбором шрифтов — важным шагом, позволившим отказаться от многочисленных собственных реализаций парсинга шрифтов, ранее требовавшихся для работы библиотеки. Главное преимущество HarfRust заключается в безопасности. Код полностью написан на Rust и не содержит unsafe-блоков, что крайне важно для создания программных компонентов с повышенными требованиями к надёжности. Большинство его зависимостей также не используют небезопасный код, что делает HarfRust привлекательным для разработчиков, стремящихся создавать надёжное и безопасное программное обеспечение. Архитектурно HarfBuzz традиционно состоит из нескольких частей — модуля шейпинга, работающего с Unicode, парсера шрифтов, системы подмножества и утилит, а также связующих компонентов для интеграции с различными платформами и внешними библиотеками вроде FreeType и ICU.
В HarfRust портирован лишь наиболее важный функционал — собственно шейпинг и связанные с ним Unicode-рутины. При этом парсинг шрифтов полностью передан библиотеке read-fonts, которая обеспечивает удобное и современное API для обработки различных форматов и особенностей шрифтов. Отсутствие интеграции с внешними системами — одна из отличительных черт HarfRust по сравнению с оригинальным HarfBuzz. Здесь нет поддержки средств загрузки шрифтов с помощью FreeType, CoreText, Uniscribe или DirectWrite, а также отсутствие функционала, связанного с ICU или GLib. Аналогично недоступна поддержка graphite2 и некоторых устаревших таблиц шрифтов, таких как mort, снятых с поддержки Apple.
Это сделано с намерением сфокусироваться исключительно на ядре шейпинга, предоставляя максимально чистый и безопасный модуль без внутренних зависимостей, осложняющих сопровождение. Особенностью HarfRust является также отсутствие свойства размера шрифта в API. Все операции шейпинга выполняются в единицах UnitsPerEm, то есть без встроенного масштабирования. Это значит, что разработчик ответственен за корректное масштабирование результатов в зависимости от требования приложения. Такой подход повышает универсальность и позволяет избежать неоправданных предположений в библиотечном уровне, делегируя контроль за размером вышестоящему коду.
Несмотря на то, что HarfRust несколько уступает оригинальному HarfBuzz по производительности — рейтинг около 75% от скорости исходника на обычных шрифтах является отличным показателем для проекта, построенного на высокоуровневом языке — он остаётся привлекательным выбором для новых приложений, предпочитающих безопасный и современный код. Для оценки производительности проекта доступны бенчмарки, которые можно запустить самостоятельно, используя команду cargo bench. Данный момент очень важен для корпоративных пользователей и разработчиков, оценивающих trade-off между скоростью и безопасностью. Стоит отметить, что HarfRust не является полноценным заменителем HarfBuzz. Например, некоторые экспериментальные фичи движка, поддерживаемые в оригинале, пока не реализованы в Rust-версии.
Также пока отсутствует арабский fallback-шейпер, использующий динамическое создание lookup-таблиц, а это требует сложной логики, связанной с сериализацией и подмножествами шрифтов. Подобные возможности пока в разработке или планах сообщества. Роль HarfRust в экосистеме современных инструментов для работы с шрифтами усиливается благодаря активной поддержке Google Fonts и интеграции с другими проектами на Rust, такими как fontations и read-fonts. Совместная работа этих библиотек создает цельный стек для типографики и текстовой обработки, который может служить основой для новых кроссплатформенных систем. Google Fonts публиковали свои мотивы перехода на Rust в репозитории oxidize — эксперименты и миграция, призванные повысить безопасность, облегчить сопровождение и масштабирование font-технологий.
Для разработчиков и исследователей, интересующихся внутренностями шейпинга текста и дальнейшим развитием, HarfRust содержит обширную документацию и пояснительные материалы. В частности, разработчики оставили полезные заметки по процессу бэкторкинга с оригинального кода HarfBuzz, инструкции по генерации машин состояний с помощью Ragel, а также ссылки на соответствующие исследования и планы по оптимизации. Такая открытость и доступность материалов способствует развитию сообщества и привлечению новых участников, готовых внести вклад. Лицензирование проекта является ещё одним плюсом: HarfRust распространяется под лицензией MIT — одной из наиболее либеральных и удобных для коммерческого и свободного использования. Оригинальный HarfBuzz носит лицензию Old MIT, что также обеспечивает высокую степень свободы, но для многих разработчиков Rust-проекты отличаются более прозрачным и современным оформлением лицензий и зависимостей.
Важно отметить, что HarfRust не пытается конкурировать с HarfBuzz в каждой детали, но предлагает альтернативу, отвечающую современным требованиям безопасности и экосистемы. Приложениям, которые работают на Rust или имеют строгие требования к безопасности памяти, HarfRust становится оптимальным вариантом. Также проект открывает перспективы для будущего интегрирования в экосистемы, где доверие к языку и безопасность стоят на первом месте. Таким образом, HarfRust становится важным звеном в развитии технологий текстовой обработки, особенно в контексте современного подхода к разработке с упором на безопасность, удобство поддержки и расширяемость. Проект предлагает новую парадигму работы с формированием текста, сохраняя при этом совместимость со многими HARFBUZZ-ориентированными решениями и оставаясь перспективным направлением для тех, кто хочет работать над типографикой в современном программном стеке.