ttf-parser — to biblioteka do analizy czcionek TrueType/OpenType.
W nowej wersji dodano pełne wsparcie dla czcionek zmiennych
(czcionki zmienne) oraz C API, w związku z czym zdecydowałem się na jej reklamę na lforum.
Do niedawna, jeśli zachodziła potrzeba pracy z czcionkami TrueType, były dwa rozwiązania: FreeType i stb_truetype. Pierwsza to ogromny kombajn, druga wspiera dość małą ilość funkcji.
ttf-parser znajduje się gdzieś pośrodku. Wspiera wszystkie te same tabele TrueType (format TrueType składa się z wielu oddzielnych tabel binarnych), co FreeType, ale nie zajmuje się renderowaniem samych glifów.
Jednak ttf-parser zawiera wiele innych znaczących różnic:
- ttf-parser jest napisany w Rust bez użycia unsafe. FreeType i stb_truetype są napisane w C.
- ttf-parser jest jedyną bezpieczną (memory-safe) implementacją. Odczyt dowolnej pamięci jest niemożliwy. W FreeType na bieżąco naprawiane są luki, a stb_truetype w zasadzie nie jest przeznaczony do odczytu dowolnych czcionek.
- ttf-parser jest jedyną implementacją thread-safe. Wszystkie metody analizy są stałe. Jedyne wyjątek stanowi ustalanie współrzędnych dla czcionek zmiennych, ale ta funkcja jest reentrant. FreeType w zasadzie jest jednowątkowy. stb_truetype — reentrant (można używać różnych kopii w różnych wątkach, ale nie jednej z wielu).
- ttf-parser jest jedyną implementacją, która nie wykorzystuje alokacji w „kupie”. To pozwala przyspieszyć analizę i uniknąć problemów przy OOM.
- Ponadto prawie wszystkie operacje arytmetyczne i konwersje typów numerycznych są sprawdzane (w tym statycznie).
- W najgorszym przypadku biblioteka może zgłosić wyjątek. Przy tym w C API wyjątki będą przechwytywane, a funkcja zwróci błąd, ale nie zakończy działania.
I mimo wszystkich gwarancji bezpieczeństwa, ttf-parser jest również najszybszą implementacją. Na przykład analiza CFF2 jest 3,5 razy szybsza niż w FreeType. Analiza glyf jest tymczasem o 10% wolniejsza niż w stb_truetype, ale to dlatego, że nie wspiera czcionek zmiennych, dla których wymagana jest dodatkowa informacja. Więcej szczegółów w README.
Źródło: linux.org.ru
