ttf-parser er et bibliotek til parsing af TrueType/OpenType skrifttyper.
I den nye version er der kommet fuld støtte til variable skrifttyper
(variable fonts) og C API, hvilket fik mig til at reklamere for det på loren.
Indtil for nylig, hvis du skulle arbejde med TrueType skrifttyper, var der præcis to muligheder: FreeType og stb_truetype. Den første er en stor samling, den anden understøtter et ret begrænset antal funktioner.
ttf-parser ligger et sted imellem. Det understøtter de samme TrueType tabeller (TrueType-formatet består af mange separate binære tabeller) som FreeType, men håndterer ikke tegning af glyphs.
Samtidig indeholder ttf-parser mange andre betydelige forskelle:
- ttf-parser er skrevet i Rust uden brug af unsafe. FreeType og stb_truetype er skrevet i C.
- ttf-parser er den eneste memory-safe implementering. Læsning af vilkårlig hukommelse er umuligt. I FreeType rettes sårbarheder løbende, mens stb_truetype i princippet ikke er beregnet til at læse vilkårlige skrifttyper.
- ttf-parser er den eneste thread-safe implementering. Alle parsingmetoder er konstante. Den eneste undtagelse er indstillingen af koordinater for variable skrifttyper, men denne funktion er reentrant. FreeType er i princippet enkelttrådet. stb_truetype er reentrant (kan bruge separate kopier i forskellige tråde, men ikke en af mange).
- ttf-parser er den eneste implementering, der ikke bruger allokering i ‚heap‘. Dette muliggør hurtigere parsing og undgår problemer ved OOM.
- Desuden bliver næsten alle aritmetiske operationer og konverteringer mellem numeriske typer kontrolleret (herunder statisk).
- I værste fald kan biblioteket kaste en exception. I dette tilfælde vil exceptioner i C API blive opfanget, og funktionen vil returnere en fejl, men ikke crashe.
Og på trods af alle sikkerhedsgarantierne er ttf-parser også den hurtigste implementering. For eksempel er parsing af CFF2 3,5 gange hurtigere end i FreeType. Parsing af glyf er i mellemtiden 10% langsommere end i stb_truetype, men det skyldes, at den ikke understøtter variable skrifttyper, der kræver opbevaring af ekstra oplysninger. Flere detaljer i README.
Kilde: linux.org.ru
