Um analisador de fontes de alto nível, seguro e com alocação zero para TrueType, OpenType e AAT.
Pode ser usado como uma biblioteca Rust ou C.
no_std
/WASM.É muito difícil comparar bibliotecas diferentes, por isso estamos usando comparação baseada em tabelas. Existem aproximadamente três tipos de tabelas TrueType:
head
, OS/2
, etc.).glyf
, CFF
(meio), hmtx
, etc.).cmap
, kern
, GPOS
, etc.).Recurso/Biblioteca | analisador ttf | Tipo Livre | stb_truetype |
---|---|---|---|
Memória segura | ✓ | ||
Tópico seguro | ✓ | ~ (principalmente reentrante) | |
Alocação zero | ✓ | ||
Fontes variáveis | ✓ | ✓ | |
Renderização | - 1 | ✓ | ~ (muito primitivo) |
mesa ankr | ✓ | ||
tabela avar | ✓ | ✓ | |
tabela bdat | ~ (nº 4) | ✓ | |
mesa bloc | ✓ | ✓ | |
Tabela CBDT | ~ (nº 8, 9) | ✓ | |
Tabela CBLC | ✓ | ✓ | |
Tabela COLR | ✓ | ✓ | |
Tabela CPAL | ✓ | ✓ | |
Tabela CFF | ✓ | ✓ | ~ (sem suporte seac ) |
Tabela CFF2 | ✓ | ✓ | |
tabela cmap | ~ (nº 8) | ✓ | ~ (não 2,8,10,14; somente Unicode) |
Tabela EBDT | ~ (nº 8, 9) | ✓ | |
Tabela EBLC | ✓ | ✓ | |
tabela de feat | ✓ | ||
tabela fvar | ✓ | ✓ | |
mesa gasp | ✓ | ||
Tabela GDEF | ~ | ||
mesa glyf | ~ 2 | ✓ | ~ 2 |
Tabela GPOS | ✓ | ~ (apenas 2) | |
Tabela GSUB | ✓ | ||
tabela gvar | ✓ | ✓ | |
mesa head | ✓ | ✓ | ✓ |
mesa hhea | ✓ | ✓ | ✓ |
tabela hmtx | ✓ | ✓ | ✓ |
Tabela HVAR | ✓ | ✓ | |
mesa kern | ✓ | ~ (apenas 0) | ~ (apenas 0) |
mesa kerx | ✓ | ||
Tabela MATH | ✓ | ||
tabela maxp | ✓ | ✓ | ✓ |
mesa morx | ✓ | ||
Tabela MVAR | ✓ | ✓ | |
tabela name | ✓ | ✓ | |
Tabela OS/2 | ✓ | ✓ | |
tabela post | ✓ | ✓ | |
mesa sbix | ~ (somente PNG) | ~ (somente PNG) | |
Tabela STAT | ✓ | ||
Tabela SVG | ✓ | ✓ | ✓ |
mesa trak | ✓ | ||
mesa vhea | ✓ | ✓ | |
tabela vmtx | ✓ | ✓ | |
Tabela VORG | ✓ | ✓ | |
Tabela VVAR | ✓ | ✓ | |
Linguagem | API Ferrugem + C | C | C |
Versão testada | 0.17.0 | 2.12.0 | 1,24 |
Licença | MIT/Apache-2.0 | FTL/GPLv2 | domínio público |
Lenda:
Notas:
ttf-parser
não suporte renderização por si só, existem várias bibliotecas de renderização em cima dele: rusttype, ab-glyph e fontdue.Fontes TrueType projetadas para consultas rápidas, portanto a maioria dos métodos são muito rápidos. A principal exceção é o contorno do glifo. Os glifos podem ser armazenados usando dois métodos diferentes: usando Glyph Data Format e Compact Font Format (pdf). O primeiro é bastante simples, o que torna seu processamento mais rápido. A segunda é basicamente uma linguagem minúscula com uma VM baseada em pilha, o que torna seu processamento muito mais difícil.
O benchmark testa quanto tempo leva para delinear todos os glifos em uma fonte.
x86 (AMD 3700X)
Tabela/Biblioteca | analisador ttf | Tipo Livre | 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)
Tabela/Biblioteca | analisador ttf | Tipo Livre | 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 | - |
Nota: o FreeType é surpreendentemente lento, então estou preocupado por ter estragado alguma coisa.
E aqui estão alguns benchmarks de métodos:
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)
Licenciado sob qualquer um dos
a sua opção.
A menos que você declare explicitamente o contrário, qualquer contribuição enviada intencionalmente para inclusão no trabalho por você, conforme definido na licença Apache-2.0, deverá ser licenciada duplamente conforme acima, sem quaisquer termos ou condições adicionais.