Ein hochwertiger, sicherer Font-Parser ohne Zuordnung für TrueType, OpenType und AAT.
Kann als Rust- oder C-Bibliothek verwendet werden.
no_std
/WASM kompatibel.Es ist sehr schwierig, verschiedene Bibliotheken zu vergleichen, daher verwenden wir einen tabellenbasierten Vergleich. Es gibt ungefähr drei Arten von TrueType-Tabellen:
head
, OS/2
usw.).glyf
, CFF
(irgendwie), hmtx
usw.).cmap
, kern
, GPOS
usw.).Funktion/Bibliothek | ttf-Parser | FreeType | stb_truetype |
---|---|---|---|
Speichersicher | ✓ | ||
Threadsicher | ✓ | ~ (meistens wiedereintretend) | |
Nullzuteilung | ✓ | ||
Variable Schriftarten | ✓ | ✓ | |
Rendern | - 1 | ✓ | ~ (sehr primitiv) |
ankr | ✓ | ||
avar Tisch | ✓ | ✓ | |
bdat -Tabelle | ~ (Nr. 4) | ✓ | |
bloc | ✓ | ✓ | |
CBDT -Tabelle | ~ (Nr. 8, 9) | ✓ | |
CBLC Tabelle | ✓ | ✓ | |
COLR Tabelle | ✓ | ✓ | |
CPAL Tabelle | ✓ | ✓ | |
CFF Tabelle | ✓ | ✓ | ~ (keine seac Unterstützung) |
CFF2 Tabelle | ✓ | ✓ | |
cmap Tabelle | ~ (Nr. 8) | ✓ | ~ (kein 2,8,10,14; nur Unicode) |
EBDT Tabelle | ~ (Nr. 8, 9) | ✓ | |
EBLC Tabelle | ✓ | ✓ | |
feat | ✓ | ||
fvar Tabelle | ✓ | ✓ | |
gasp | ✓ | ||
GDEF -Tabelle | ~ | ||
glyf Tabelle | ~ 2 | ✓ | ~ 2 |
GPOS Tabelle | ✓ | ~ (nur 2) | |
GSUB Tabelle | ✓ | ||
gvar Tisch | ✓ | ✓ | |
head | ✓ | ✓ | ✓ |
hhea Tisch | ✓ | ✓ | ✓ |
hmtx -Tabelle | ✓ | ✓ | ✓ |
HVAR Tabelle | ✓ | ✓ | |
kern Tabelle | ✓ | ~ (nur 0) | ~ (nur 0) |
kerx | ✓ | ||
MATH Tabelle | ✓ | ||
maxp Tabelle | ✓ | ✓ | ✓ |
morx -Tisch | ✓ | ||
MVAR Tabelle | ✓ | ✓ | |
name | ✓ | ✓ | |
OS/2 Tabelle | ✓ | ✓ | |
post | ✓ | ✓ | |
sbix Tabelle | ~ (nur PNG) | ~ (nur PNG) | |
STAT Tabelle | ✓ | ||
SVG Tabelle | ✓ | ✓ | ✓ |
trak Tisch | ✓ | ||
vhea Tisch | ✓ | ✓ | |
vmtx Tabelle | ✓ | ✓ | |
VORG -Tisch | ✓ | ✓ | |
VVAR Tabelle | ✓ | ✓ | |
Sprache | Rust + C-API | C | C |
Getestete Version | 0,17,0 | 2.12.0 | 1.24 |
Lizenz | MIT / Apache-2.0 | FTL / GPLv2 | Public Domain |
Legende:
Hinweise:
ttf-parser
das Rendern selbst nicht unterstützt, gibt es darüber hinaus mehrere Rendering-Bibliotheken: Rusttype, Ab-Glyph und Fontdue.TrueType-Schriftarten sind für schnelle Abfragen konzipiert, daher sind die meisten Methoden sehr schnell. Die Hauptausnahme ist die Glyphenkonturierung. Glyphen können mit zwei verschiedenen Methoden gespeichert werden: mit dem Glyph Data Format und dem Compact Font Format (pdf). Die erste ist recht einfach und lässt sich daher schneller verarbeiten. Bei der zweiten handelt es sich im Grunde genommen um eine winzige Sprache mit einer stapelbasierten VM, was die Verarbeitung erheblich erschwert.
Der Benchmark testet, wie lange es dauert, alle Glyphen in einer Schriftart zu umreißen.
x86 (AMD 3700X)
Tisch/Bibliothek | ttf-Parser | 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 | - |
ARM (Apple M1)
Tisch/Bibliothek | ttf-Parser | 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 | - |
Hinweis: FreeType ist überraschend langsam, daher befürchte ich, dass ich etwas vermasselt habe.
Und hier sind einige Methoden-Benchmarks:
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)
Lizenziert unter einem von beiden
nach Ihrer Wahl.
Sofern Sie nicht ausdrücklich etwas anderes angeben, unterliegt jeder Beitrag, der von Ihnen absichtlich zur Aufnahme in das Werk eingereicht wird, wie in der Apache-2.0-Lizenz definiert, einer Doppellizenz wie oben, ohne zusätzliche Bedingungen oder Konditionen.