ttf-parser — ist eine Bibliothek zum Parsen von TrueType/OpenType-Schriften.
Die neue Version bietet umfassende Unterstützung für variable Schriftarten.
(variable fonts) und C API, weshalb ich beschlossen habe, sie im Lore zu bewerben.
Bis vor kurzem gab es, wenn man mit TrueType-Schriften arbeiten wollte, genau zwei Optionen: FreeType und stb_truetype. Die erste ist ein riesiger Alleskönner, die zweite unterstützt nur eine recht begrenzte Anzahl von Funktionen.
ttf-parser liegt irgendwo dazwischen. Er unterstützt alle gleichen TrueType-Tabellen (das TrueType-Format besteht aus vielen separaten Binärtabelle), die auch FreeType unterstützt, kümmert sich aber nicht um das Rendern der Glyphen.
Gleichzeitig enthält ttf-parser viele andere signifikante Unterschiede:
- ttf-parser ist in Rust geschrieben und verwendet kein unsafe. FreeType und stb_truetype sind in C geschrieben.
- ttf-parser ist die einzige sichere (memory-safe) Implementierung. Das Lesen beliebigen Speichers ist nicht möglich. Bei FreeType werden ständig Schwachstellen behoben, und stb_truetype ist prinzipiell nicht dafür gedacht, beliebige Schriften zu lesen.
- ttf-parser ist die einzige thread-sichere Implementierung. Alle Parsing-Methoden sind konstant. Die einzige Ausnahme ist das Setzen von Koordinaten für variable Schriftarten, aber diese Funktion ist reentrant. FreeType ist grundsätzlich einheitlich. stb_truetype ist reentrant (es können separate Kopien in verschiedenen Threads verwendet werden, jedoch nicht eine von vielen).
- ttf-parser ist die einzige Implementierung, die keine Heap-Allokation verwendet. Dies beschleunigt das Parsing und vermeidet Probleme bei OOM.
- Zudem werden nahezu alle arithmetischen Operationen und die Umwandlung von numerischen Typen überprüft (einschließlich statischer Überprüfungen).
- Im schlimmsten Fall kann die Bibliothek eine Ausnahme auslösen. In diesem Fall werden die Ausnahmen im C-API abgefangen, und die Funktion gibt einen Fehler zurück, stürzt jedoch nicht ab.
Und trotz aller Sicherheitsgarantien ist ttf-parser auch die schnellste Implementierung. Zum Beispiel ist das Parsing von CFF2 3,5-mal schneller als in FreeType. Das Parsing von glyf ist gleichzeitig 10 % langsamer als in stb_truetype, aber das liegt daran, dass es keine variablen Schriftarten unterstützt, für die zusätzliche Informationen gespeichert werden müssen. Mehr Details in README.
Quelle: linux.org.ru
