Высокоуровневый, безопасный анализатор шрифтов с нулевым выделением памяти для TrueType, OpenType и AAT.
Может использоваться как библиотека Rust или C.
no_std
/WASM совместим.Сравнивать разные библиотеки очень сложно, поэтому мы используем сравнение на основе таблиц. Существует примерно три типа таблиц TrueType:
head
, OS/2
и т. д.).glyf
, CFF
(вроде), hmtx
и т. д.).cmap
, kern
, GPOS
и т. д.).Функция/Библиотека | ttf-парсер | FreeType | stb_truetype |
---|---|---|---|
Сейф памяти | ✓ | ||
Потокобезопасный | ✓ | ~ (в основном реентерабельный) | |
Нулевое распределение | ✓ | ||
Переменные шрифты | ✓ | ✓ | |
Рендеринг | - 1 | ✓ | ~ (очень примитивно) |
таблица ankr | ✓ | ||
avar стол | ✓ | ✓ | |
таблица bdat | ~ (№ 4) | ✓ | |
таблица bloc | ✓ | ✓ | |
Таблица CBDT | ~ (№ 8, 9) | ✓ | |
Таблица CBLC | ✓ | ✓ | |
Таблица COLR | ✓ | ✓ | |
Таблица CPAL | ✓ | ✓ | |
Таблица CFF | ✓ | ✓ | ~ (без seac поддержки) |
Таблица CFF2 | ✓ | ✓ | |
таблица cmap | ~ (№ 8) | ✓ | ~ (нет 2,8,10,14; только Unicode) |
Таблица EBDT | ~ (№ 8, 9) | ✓ | |
Таблица EBLC | ✓ | ✓ | |
таблица feat | ✓ | ||
таблица fvar | ✓ | ✓ | |
таблица gasp | ✓ | ||
Таблица GDEF | ~ | ||
таблица glyf | ~ 2 | ✓ | ~ 2 |
Таблица GPOS | ✓ | ~ (всего 2) | |
Стол GSUB | ✓ | ||
таблица gvar | ✓ | ✓ | |
head стол | ✓ | ✓ | ✓ |
hhea стол | ✓ | ✓ | ✓ |
таблица hmtx | ✓ | ✓ | ✓ |
Таблица HVAR | ✓ | ✓ | |
стол kern | ✓ | ~ (всего 0) | ~ (всего 0) |
стол kerx | ✓ | ||
Таблица MATH | ✓ | ||
таблица maxp | ✓ | ✓ | ✓ |
стол morx | ✓ | ||
Таблица MVAR | ✓ | ✓ | |
таблица name | ✓ | ✓ | |
Таблица OS/2 | ✓ | ✓ | |
post таблицу | ✓ | ✓ | |
sbix стол | ~ (только PNG) | ~ (только PNG) | |
Таблица STAT | ✓ | ||
SVG таблица | ✓ | ✓ | ✓ |
таблица trak | ✓ | ||
vhea стол | ✓ | ✓ | |
таблица vmtx | ✓ | ✓ | |
Стол VORG | ✓ | ✓ | |
Таблица VVAR | ✓ | ✓ | |
Язык | Руст + C API | С | С |
Протестированная версия | 0.17.0 | 2.12.0 | 1.24 |
Лицензия | Массачусетский технологический институт/Апач-2.0 | FTL/GPLv2 | общественное достояние |
Легенда:
Примечания:
ttf-parser
сам по себе не поддерживает рендеринг, поверх него существует несколько библиотек рендеринга:rusttype, ab-glyph и Fontdue.Шрифты TrueType предназначены для быстрого выполнения запросов, поэтому большинство методов очень быстрые. Основное исключение — обводка глифов. Глифы можно хранить двумя разными способами: с использованием формата данных глифов и формата компактного шрифта (pdf). Первый довольно простой, что ускоряет его обработку. Второй — это, по сути, крошечный язык со стековой виртуальной машиной, что значительно усложняет его обработку.
Тест проверяет, сколько времени требуется для обрисовки всех глифов в шрифте.
x86 (3700X AMD)
Стол/Библиотека | ttf-парсер | FreeType | stb_truetype |
---|---|---|---|
glyf | 0.901 ms | 1.171 ms | 0.675 ms |
gvar | 2.972 ms | 4.132 ms | - |
CFF | 1.197 ms | 5.647 ms | 2.813 ms |
CFF2 | 1.968 ms | 6.392 ms | - |
АРМ (Яблоко М1)
Стол/Библиотека | ttf-парсер | FreeType | stb_truetype |
---|---|---|---|
glyf | 0.550 ms | 0.854 ms | 0.703 ms |
gvar | 2.270 ms | 4.594 ms | - |
CFF | 1.054 ms | 5.223 ms | 3.262 ms |
CFF2 | 1.765 ms | 5.995 ms | - |
Примечание. FreeType работает на удивление медленно, поэтому я беспокоюсь, что что-то напутал.
И вот некоторые тесты методов:
test outline_glyph_276_from_cff2 ... bench: 867 ns/iter (+/- 15)
test from_data_otf_cff ... bench: 968 ns/iter (+/- 13)
test from_data_otf_cff2 ... bench: 887 ns/iter (+/- 25)
test outline_glyph_276_from_cff ... bench: 678 ns/iter (+/- 41)
test outline_glyph_276_from_glyf ... bench: 649 ns/iter (+/- 11)
test outline_glyph_8_from_cff2 ... bench: 534 ns/iter (+/- 14)
test from_data_ttf ... bench: 467 ns/iter (+/- 11)
test glyph_name_post_276 ... bench: 223 ns/iter (+/- 5)
test outline_glyph_8_from_cff ... bench: 315 ns/iter (+/- 13)
test outline_glyph_8_from_glyf ... bench: 291 ns/iter (+/- 5)
test family_name ... bench: 183 ns/iter (+/- 102)
test glyph_name_cff_276 ... bench: 62 ns/iter (+/- 1)
test glyph_index_u41 ... bench: 16 ns/iter (+/- 0)
test glyph_name_cff_8 ... bench: 5 ns/iter (+/- 0)
test glyph_name_post_8 ... bench: 2 ns/iter (+/- 0)
test subscript_metrics ... bench: 2 ns/iter (+/- 0)
test glyph_hor_advance ... bench: 2 ns/iter (+/- 0)
test glyph_hor_side_bearing ... bench: 2 ns/iter (+/- 0)
test glyph_name_8 ... bench: 1 ns/iter (+/- 0)
test ascender ... bench: 1 ns/iter (+/- 0)
test underline_metrics ... bench: 1 ns/iter (+/- 0)
test strikeout_metrics ... bench: 1 ns/iter (+/- 0)
test x_height ... bench: 1 ns/iter (+/- 0)
test units_per_em ... bench: 0.5 ns/iter (+/- 0)
test width ... bench: 0.2 ns/iter (+/- 0)
Лицензировано по любому из
по вашему выбору.
Если вы явно не указали иное, любой вклад, намеренно представленный вами для включения в работу, как это определено в лицензии Apache-2.0, должен иметь двойную лицензию, как указано выше, без каких-либо дополнительных условий.