适用于 TrueType、OpenType 和 AAT 的高级、安全、零分配字体解析器。
可以用作 Rust 或 C 库。
no_std
/WASM 兼容。比较不同的库非常困难,因此我们使用基于表格的比较。 TrueType 表大致分为三种类型:
head
、 OS/2
等)。glyf
、 CFF
(有点)、 hmtx
等)。cmap
、 kern
、 GPOS
等)的表。特征/库 | ttf 解析器 | 自由类型 | 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 表 | ✓ | ✓ | |
语言 | Rust + C API | C | C |
测试版本 | 0.17.0 | 2.12.0 | 1.24 |
执照 | 麻省理工学院/Apache-2.0 | FTL/GPLv2 | 公共领域 |
传奇:
笔记:
ttf-parser
本身不支持渲染,但它之上有多个渲染库:rusttype、ab-glyph 和 fontdue。TrueType字体是为快速查询而设计的,因此大多数方法都非常快。主要的例外是字形轮廓。字形可以使用两种不同的方法存储:使用字形数据格式和紧凑字体格式 (pdf)。第一个相当简单,这使得处理速度更快。第二种基本上是一种带有基于堆栈的虚拟机的小型语言,这使得它更难处理。
该基准测试测试勾勒出字体中所有字形所需的时间。
x86(AMD 3700X)
表/库 | ttf 解析器 | 自由类型 | 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(苹果M1)
表/库 | ttf 解析器 | 自由类型 | 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 许可证中所定义)均应获得上述双重许可,没有任何附加条款或条件。