ttf-parser — es una biblioteca para el análisis de fuentes TrueType/OpenType.
La nueva versión incluye soporte completo para fuentes variables.
(fuentes variables) y la API en C, por lo que decidí promocionarla en el foro.
Hasta hace poco, si era necesario trabajar con fuentes TrueType, había exactamente dos opciones: FreeType y stb_truetype. La primera es un enorme compendio, la segunda admite un número bastante limitado de funciones.
ttf-parser se sitúa en algún punto intermedio. Admite todas las mismas tablas TrueType (el formato TrueType consiste en muchas tablas binarias separadas) que FreeType, pero no se encarga de dibujar los glifos.
Además, ttf-parser contiene muchas otras diferencias significativas:
- ttf-parser está escrito en Rust sin el uso de unsafe. FreeType y stb_truetype están escritos en C.
- ttf-parser es la única implementación segura (memory-safe). No es posible leer memoria arbitraria. En FreeType constantemente se corrigen vulnerabilidades, y stb_truetype no está diseñado para leer fuentes arbitrarias.
- ttf-parser es la única implementación thread-safe. Todos los métodos de análisis son constantes. La única excepción es la asignación de coordenadas para fuentes variables, pero esta función es reentrante. FreeType es fundamentalmente de un solo hilo. stb_truetype es reentrante (se pueden usar copias independientes en diferentes hilos, pero no una de muchas).
- ttf-parser es la única implementación que no utiliza asignación en la 'montón'. Esto permite acelerar el análisis y evitar problemas en caso de OOM.
- Además, casi todas las operaciones aritméticas y conversiones de tipos numéricos son verificadas (incluidas las estáticas).
- En el peor de los casos, la biblioteca puede lanzar una excepción. En la API en C, las excepciones serán capturadas y la función devolverá un error, pero no fallará.
Y a pesar de todas las garantías de seguridad, ttf-parser también es la implementación más rápida. Por ejemplo, el análisis de CFF2 es 3.5 veces más rápido que en FreeType. El análisis de glyf, por otro lado, es un 10% más lento que en stb_truetype, pero esto es porque no admite fuentes variables, cuya implementación requiere almacenar información adicional. Más detalles en README.
Fuente: linux.org.ru
