ttf-parser je biblioteka za raščlanjivanje TrueType/OpenType fontova.
Nova verzija ima punu podršku za varijabilne fontove
(varijabilni fontovi) i C API, zbog čega sam odlučio da ga reklamiram u lore-u.
Donedavno, ako je postojala potreba za radom sa TrueType fontovima, postojale su tačno dvije opcije: FreeType i stb_truetype. Prvi je ogroman kombinat, drugi podržava prilično mali broj funkcija.
ttf-parser je negdje u sredini. Podržava sve iste TrueType tabele (TrueType format se sastoji od mnogo zasebnih binarnih tabela) kao FreeType, ali ne crta same glifove.
U isto vrijeme, ttf-parser sadrži mnoge druge značajne razlike:
- ttf-parser je napisan u Rustu bez upotrebe nesigurnog. FreeType i stb_truetype su napisani u C.
- ttf-parser je jedina implementacija bezbedna za memoriju. Čitanje nasumične memorije nije moguće. Ranjivosti se stalno popravljaju u FreeTypeu, a stb_truetype u principu nije dizajniran za čitanje proizvoljnih fontova.
- ttf-parser je jedina implementacija koja je sigurna za niti. Sve metode raščlanjivanja su konstantne. Jedini izuzetak je postavljanje koordinata za promjenjive fontove, ali ova funkcija je ponovno uključena. FreeType je u osnovi jednonitni. stb_truetype - reentrant (možete koristiti pojedinačne kopije u različitim nitima, ali ne jednu od mnogih).
- ttf-parser je jedina implementacija koja ne koristi heap alokacije. Ovo vam omogućava da ubrzate raščlanjivanje i izbjegnete probleme s OOM-om.
- Također, provjeravaju se gotovo sve aritmetičke operacije i konverzije numeričkih tipova (uključujući i statičke).
- U najgorem slučaju, biblioteka može izbaciti izuzetak. U ovom slučaju, u C API-ju, izuzeci će biti uhvaćeni i funkcija će vratiti grešku, ali se neće srušiti.
I pored svih sigurnosnih garancija, ttf-parser je i najbrža implementacija. Na primjer, raščlanjivanje CFF2 je 3.5 puta brže od FreeTypea. U međuvremenu, raščlanjivanje glyf-a je 10% sporije nego u stb_truetype, ali to je zbog činjenice da ne podržava promjenjive fontove, čija implementacija zahtijeva pohranjivanje dodatnih. informacije. Više detalja u README.
izvor: linux.org.ru