ttf-parser — това е библиотека за разбиране на шрифтове TrueType/OpenType.
В новата версия имаме пълна поддръжка на променливи шрифтове.
(променливи шрифтове) и 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
