ttf-parser — դա TrueType/OpenType տառատեսակների解析ման գրադարան է։
Նոր տարբերակում կա լիարժեք աջակցություն փոփոխական տառատեսակներին։
(մայերի տառատեսակներ) և C API, ինչը պատճառ դարձավ, որպեսզի ես որոշեմ դա գովել լորում։
Էլ այժմ, եթե TrueType տառատեսակների հետ աշխատանք իրականացնելու անհրաժեշտություն կար, գոյություն ունեին երկու տարբերակ՝ FreeType և stb_truetype։ Առաջինը մեծ կոմբային է, երկրորդը աջակցում է բավականին քիչ գործառույթների։
ttf-parser գտնվում է ինչ-որ տեղ միջինում։ Այն աջակցում է բոլոր այն TrueType աղյուսակներին (TrueType ձևաչափը բաղկացած է բազմաթիվ առանձին բինար աղյուսակներից), ինչպիսիք են FreeType-ը, բայց չզբաղվում էGlyph-երի ձևավորման հետ։
Այս դեպքում ttf-parser-ը պարունակում է բազմաթիվ այլ կարևոր տարբերություններ։
- ttf-parser գրված է Rust-ում անվտանգ օգտագործման առանց։ FreeType-ը և stb_truetype-ը գրված են C-ում։
- ttf-parser միակ անվտանգ (memory-safe) իրականացումն է։ Առանցայական հիշվածք կարդալը անհնար է։ FreeType-ում մշտապես ուղղվում են խոցելիությունները, իսկ stb_truetype-ը սկզբունքորեն նախատեսված չէ կարելի պատկերացնել աննկարագրված տառատեսակները։
- ttf-parser միակ thread-safe իրականացմանն է։ Բոլոր解析ման մեթոդները կայուն են։ Կենտրոնական բացառությունը տեղափոխվել որակավորելու համար փոփոխական տառատեսակներ, սակայն այս գործառույթը առանց տիպի է։ FreeType պրակտիկորեն միացավ-նեյլային է։ stb_truetype — reentrant (կարող եք օգտագործել առանձին օրինակներ տարբեր շերտերում, բայց ավելացված միանգամից մեկից շատ)։
- ttf-parser միակ իրականացումն է, որը չի օգտագործում heaps-ում նվիրածթյուն։ Սա թույլ է տալիս արագացնել解析ումը և խուսափել OOM խնդիրներից։
- Բացի դրանից, գրեթե բոլոր առևտրային գործողությունները և թվային տեսակների փոփոխությունները ստուգվում են (ներառյալ ստատիկ)։
- Այն ամենավատ դեպքում գրադարանը կարող է նետել բացառություն։ Այս դեպքում C API-ում բացառությունները կբռնվեն, իսկ գործառույթը կվերադառնա սխալ, բայց չի փախչի։
Ու նետունները անվտանգության բոլոր երաշխիքները ttf-parser-ը նաև ամենաարագ իրականացումը է։ Օրինակ, CFF2解析ումը 3.5 անգամ արագ է, քան FreeType-ում։ Glyf解析ումը այդ ժամանակ 10% դանդաղ է, քան stb_truetype-ում, բայց դա այն պատճառով է, որ այն չի աջակցում փոփոխական տառատեսակներին, որոնց իրականացմամբ պետք է պահվի լրացուցիչ տեղեկատվություն։ Շատ մանրամասն տեղեկություններում։ README.
Ընտանիք: linux.org.ru
