ttf-parser 0.5 - новая бібліятэка для працы з TrueType шрыфтамі

ttf-parser - гэта бібліятэка для разбору TrueType/OpenType шрыфтоў.
У новай версіі з'явілася паўнавартасная падтрымка зменных шрыфтоў
(variable fonts) і C API, з прычыны чаго я вырашыў прарэкламаваць яе на лоры.

Да нядаўняга часу, калі была неабходнасць працы з TrueType шрыфтамі, было роўна два варыянты: FreeType і stb_truetype. Першы з'яўляецца вялізным камбайнам, другі падтрымлівае даволі невялікую колькасць функцый.

ttf-parser знаходзіцца недзе пасярэдзіне. Ён падтрымлівае ўсё тыя ж TrueType табліцы (фармат TrueType складаецца са мноства асобных бінарных табліц) што і FreeType, але не займаецца адмалёўкай саміх гліфаў.

Пры гэтым, ttf-parser утрымоўвае мноства іншых значных адрозненняў:

  1. ttf-parser напісаны на Rust без выкарыстання unsafe. FreeType і stb_truetype напісаны на C.
  2. ttf-parser з'яўляецца адзінай бяспечнай (memory-safe) рэалізацыяй. Чытанне адвольнай памяці немагчыма. Ва FreeType стала выпраўляюць уразлівасці, а stb_truetype у прынцыпе не прызначаны для чытання адвольных шрыфтоў.
  3. ttf-parser з'яўляецца адзінай thread-safe рэалізацыяй. Усе метады парсінгу канстантныя. Адзіным выключэннем зяўляецца заданне каардынат для зменных шрыфтоў, але гэтая функцыя reentrant. FreeType у прынцыпе аднаструменны. stb_truetype - reentrant (можна выкарыстоўваць асобныя копіі ў розных патоках, але не адну з мноства).
  4. ttf-parser з'яўляецца адзінай рэалізацыяй не выкарыстоўвалай алакацыі ў «кучы». Гэта дазваляе паскорыць разбор і пазбегнуць праблем пры OOM.
  5. Таксама, амаль усе арыфметычныя аперацыі і прывядзенне лікавых тыпаў правяраюцца (у тым ліку статычна).
  6. У найгоршым выпадку бібліятэка можа кінуць выключэнне. Пры гэтым у C API выключэнні будуць перахоплены і функцыя верне памылку, але не ўпадзе.

І нягледзячы на ​​ўсе гарантыі бяспекі, ttf-parser таксама з'яўляецца і самай хуткай рэалізацыяй. Напрыклад разбор CFF2 у 3.5 разы хутчэй чым у FreeType. Разбор glyf тым часам на 10% павольней чым у stb_truetype, але гэта з-за таго, што ён не падтрымлівае зменныя шрыфты, для рэалізацыі якіх патрабуецца захоўваць доп. інфармацыю. Больш падрабязнасцяў у README.

Крыніца: linux.org.ru

Дадаць каментар