ttf-parser 0.5 – нова бібліотека для роботи з TrueType шрифтами

ttf-parser — це бібліотека для розбирання шрифтів TrueType/OpenType.
У новій версії з'явилася повноцінна підтримка змінних шрифтів
(змінні шрифти) та 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

Додати коментар або відгук