TrueType, OpenType 및 AAT를 위한 높은 수준의 안전하고 할당이 없는 글꼴 파서입니다.
Rust 또는 C 라이브러리로 사용할 수 있습니다.
no_std
/WASM 호환.서로 다른 라이브러리를 비교하는 것은 매우 어려우므로 테이블 기반 비교를 사용합니다. 트루타입 테이블에는 대략 세 가지 유형이 있습니다.
head
, OS/2
등)glyf
, CFF
(kinda), 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 없음, 유니코드 전용) |
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 테이블 | ✓ | ✓ | |
언어 | 러스트 + C API | 기음 | 기음 |
테스트 버전 | 0.17.0 | 2.12.0 | 1.24 |
특허 | MIT / 아파치-2.0 | FTL/GPLv2 | 공개 도메인 |
전설:
참고:
ttf-parser
자체적으로 렌더링을 지원하지 않지만 그 위에 Rusttype, ab-glyph 및 Fontdue와 같은 여러 렌더링 라이브러리가 있습니다.빠른 쿼리를 위해 설계된 트루타입 글꼴이므로 대부분의 방법이 매우 빠릅니다. 주요 예외는 글리프 개요입니다. 글리프는 두 가지 방법, 즉 글리프 데이터 형식과 컴팩트 글꼴 형식(pdf)을 사용하여 저장할 수 있습니다. 첫 번째는 매우 간단하므로 처리 속도가 더 빠릅니다. 두 번째는 기본적으로 스택 기반 VM을 사용하는 작은 언어이므로 처리하기가 훨씬 더 어렵습니다.
벤치마크는 글꼴의 모든 글리프 윤곽선을 그리는 데 걸리는 시간을 테스트합니다.
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 라이선스에 정의된 대로 귀하가 저작물에 포함하기 위해 의도적으로 제출한 기여는 추가 이용약관 없이 위와 같이 이중 라이선스가 부여됩니다.