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