ttf-parser er et bibliotek for å analysere TrueType/OpenType-fonter.
Den nye versjonen har full støtte for variable fonter
(variable skrifter) og C API, som et resultat av at jeg bestemte meg for å annonsere det i lore.
Inntil nylig, hvis det var behov for å jobbe med TrueType-fonter, var det nøyaktig to alternativer: FreeType og stb_truetype. Den første er en stor skurtresker, den andre støtter et ganske lite antall funksjoner.
ttf-parser er et sted i midten. Den støtter alle de samme TrueType-tabellene (TrueType-formatet består av mange separate binære tabeller) som FreeType, men tegner ikke glyphene selv.
Samtidig inneholder ttf-parser mange andre betydelige forskjeller:
- ttf-parser er skrevet i Rust uten å bruke usikre. FreeType og stb_truetype er skrevet i C.
- ttf-parser er den eneste minnesikre implementeringen. Det er ikke mulig å lese tilfeldig minne. Sårbarheter fikses hele tiden i FreeType, og stb_truetype er i prinsippet ikke laget for å lese vilkårlige fonter.
- ttf-parser er den eneste trådsikre implementeringen. Alle analyseringsmetoder er konstante. Det eneste unntaket er å sette koordinater for variable fonter, men denne funksjonen er reentrant. FreeType er i utgangspunktet entrådet. stb_truetype - reentrant (du kan bruke individuelle kopier i forskjellige tråder, men ikke en av mange).
- ttf-parser er den eneste implementeringen som ikke bruker heap-allokeringer. Dette lar deg fremskynde parsing og unngå problemer med OOM.
- Også nesten alle aritmetiske operasjoner og konverteringer av numeriske typer kontrolleres (inkludert statisk).
- I verste fall kan biblioteket gi et unntak. I dette tilfellet, i C API, vil unntak bli fanget opp, og funksjonen vil returnere en feil, men vil ikke krasje.
Og til tross for alle sikkerhetsgarantiene, er ttf-parser også den raskeste implementeringen. For eksempel er parsing av CFF2 3.5 ganger raskere enn FreeType. Parsing av glyf er i mellomtiden 10 % tregere enn i stb_truetype, men dette er på grunn av det faktum at det ikke støtter variable fonter, hvis implementering krever lagring av ekstra. informasjon. Flere detaljer i README.
Kilde: linux.org.ru