ttf-parser - гэта бібліятэка для разбору TrueType/OpenType шрыфтоў.
У новай версіі з'явілася паўнавартасная падтрымка зменных шрыфтоў
(variable fonts) і C API, з прычыны чаго я вырашыў прарэкламаваць яе на лоры.
Да нядаўняга часу, калі была неабходнасць працы з TrueType шрыфтамі, было роўна два варыянты: FreeType і stb_truetype. Першы з'яўляецца вялізным камбайнам, другі падтрымлівае даволі невялікую колькасць функцый.
ttf-parser знаходзіцца недзе пасярэдзіне. Ён падтрымлівае ўсё тыя ж TrueType табліцы (фармат TrueType складаецца са мноства асобных бінарных табліц) што і FreeType, але не займаецца адмалёўкай саміх гліфаў.
Пры гэтым, ttf-parser утрымоўвае мноства іншых значных адрозненняў:
- ttf-parser напісаны на Rust без выкарыстання unsafe. FreeType і stb_truetype напісаны на C.
- ttf-parser з'яўляецца адзінай бяспечнай (memory-safe) рэалізацыяй. Чытанне адвольнай памяці немагчыма. Ва FreeType стала выпраўляюць уразлівасці, а stb_truetype у прынцыпе не прызначаны для чытання адвольных шрыфтоў.
- ttf-parser з'яўляецца адзінай thread-safe рэалізацыяй. Усе метады парсінгу канстантныя. Адзіным выключэннем зяўляецца заданне каардынат для зменных шрыфтоў, але гэтая функцыя reentrant. FreeType у прынцыпе аднаструменны. stb_truetype - reentrant (можна выкарыстоўваць асобныя копіі ў розных патоках, але не адну з мноства).
- ttf-parser з'яўляецца адзінай рэалізацыяй не выкарыстоўвалай алакацыі ў «кучы». Гэта дазваляе паскорыць разбор і пазбегнуць праблем пры OOM.
- Таксама, амаль усе арыфметычныя аперацыі і прывядзенне лікавых тыпаў правяраюцца (у тым ліку статычна).
- У найгоршым выпадку бібліятэка можа кінуць выключэнне. Пры гэтым у C API выключэнні будуць перахоплены і функцыя верне памылку, але не ўпадзе.
І нягледзячы на ўсе гарантыі бяспекі, ttf-parser таксама з'яўляецца і самай хуткай рэалізацыяй. Напрыклад разбор CFF2 у 3.5 разы хутчэй чым у FreeType. Разбор glyf тым часам на 10% павольней чым у stb_truetype, але гэта з-за таго, што ён не падтрымлівае зменныя шрыфты, для рэалізацыі якіх патрабуецца захоўваць доп. інфармацыю. Больш падрабязнасцяў у README.
Крыніца: linux.org.ru