Un analyseur de polices de haut niveau, sûr et sans allocation pour TrueType, OpenType et AAT.
Peut être utilisé comme bibliothèque Rust ou C.
no_std
/WASM.Il est très difficile de comparer différentes bibliothèques, c'est pourquoi nous utilisons une comparaison basée sur des tableaux. Il existe environ trois types de tables TrueType :
head
, OS/2
, etc.).glyf
, CFF
(un peu), hmtx
, etc.).cmap
, kern
, GPOS
, etc.).Fonctionnalité/Bibliothèque | analyseur ttf | Type libre | stb_truetype |
---|---|---|---|
Mémoire sécurisée | ✓ | ||
Thread-safe | ✓ | ~ (principalement réentrant) | |
Allocation nulle | ✓ | ||
Polices variables | ✓ | ✓ | |
Rendu | - 1 | ✓ | ~ (très primitif) |
tableau ankr | ✓ | ||
tableau avar | ✓ | ✓ | |
table bdat | ~ (n°4) | ✓ | |
table bloc | ✓ | ✓ | |
Tableau CBDT | ~ (non 8, 9) | ✓ | |
Tableau CBLC | ✓ | ✓ | |
Tableau COLR | ✓ | ✓ | |
Tableau CPAL | ✓ | ✓ | |
Tableau CFF | ✓ | ✓ | ~ (pas de support seac ) |
Tableau CFF2 | ✓ | ✓ | |
table cmap | ~ (n°8) | ✓ | ~ (non 2,8,10,14 ; Unicode uniquement) |
Tableau EBDT | ~ (non 8, 9) | ✓ | |
Tableau EBLC | ✓ | ✓ | |
tableau feat | ✓ | ||
table fvar | ✓ | ✓ | |
table gasp | ✓ | ||
Tableau GDEF | ~ | ||
tableau glyf | ~ 2 | ✓ | ~ 2 |
Tableau GPOS | ✓ | ~ (seulement 2) | |
Tableau GSUB | ✓ | ||
tableau gvar | ✓ | ✓ | |
table head | ✓ | ✓ | ✓ |
table hhea | ✓ | ✓ | ✓ |
table hmtx | ✓ | ✓ | ✓ |
Tableau HVAR | ✓ | ✓ | |
table kern | ✓ | ~ (seulement 0) | ~ (seulement 0) |
table kerx | ✓ | ||
tableau MATH | ✓ | ||
table maxp | ✓ | ✓ | ✓ |
table morx | ✓ | ||
Tableau MVAR | ✓ | ✓ | |
table name | ✓ | ✓ | |
Tableau OS/2 | ✓ | ✓ | |
table post | ✓ | ✓ | |
table sbix | ~ (PNG uniquement) | ~ (PNG uniquement) | |
Tableau STAT | ✓ | ||
Tableau SVG | ✓ | ✓ | ✓ |
table trak | ✓ | ||
table vhea | ✓ | ✓ | |
table vmtx | ✓ | ✓ | |
Tableau VORG | ✓ | ✓ | |
Tableau VVAR | ✓ | ✓ | |
Langue | API Rouille + C | C | C |
Version testée | 0.17.0 | 2.12.0 | 1.24 |
Licence | MIT/Apache-2.0 | FTL/GPLv2 | domaine public |
Légende:
Remarques :
ttf-parser
ne prenne pas en charge le rendu par lui-même, il existe plusieurs bibliothèques de rendu : rusttype, ab-glyph et fontdue.Polices TrueType conçues pour des requêtes rapides, la plupart des méthodes sont donc très rapides. La principale exception concerne le contour des glyphes. Les glyphes peuvent être stockés de deux manières différentes : en utilisant le format de données de glyphe et le format de police compact (pdf). Le premier est assez simple, ce qui rend son traitement plus rapide. Le second est essentiellement un petit langage avec une VM basée sur une pile, ce qui rend son traitement beaucoup plus difficile.
Le benchmark teste le temps nécessaire pour décrire tous les glyphes d'une police.
x86 (AMD 3700X)
Table/Bibliothèque | analyseur ttf | Type libre | 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 | - |
BRAS (Apple M1)
Table/Bibliothèque | analyseur ttf | Type libre | 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 | - |
Remarque : FreeType est étonnamment lent, j'ai donc peur d'avoir raté quelque chose.
Et voici quelques benchmarks de méthodes :
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)
Autorisé sous l'un ou l'autre des
à votre choix.
Sauf indication contraire explicite de votre part, toute contribution intentionnellement soumise pour inclusion dans le travail par vous, telle que définie dans la licence Apache-2.0, bénéficiera d'une double licence comme ci-dessus, sans termes ou conditions supplémentaires.