適用於 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 許可證中所定義)均應獲得上述雙重許可,沒有任何附加條款或條件。