ttf-parser 0.5 - ไลบรารีใหม่สำหรับการทำงานกับแบบอักษร TrueType

ttf-parser เป็นไลบรารีสำหรับแยกวิเคราะห์แบบอักษร TrueType/OpenType
เวอร์ชันใหม่รองรับฟอนต์แบบแปรผันได้เต็มรูปแบบ
(แบบอักษรตัวแปร) และ C API ด้วยเหตุนี้ฉันจึงตัดสินใจโฆษณามันในตำนาน

จนกระทั่งเมื่อไม่นานมานี้ หากมีความจำเป็นต้องทำงานกับฟอนต์ TrueType มีสองตัวเลือกอย่างแน่นอน: FreeType และ stb_truetype อันแรกคือการรวมกันขนาดใหญ่ ส่วนอันที่สองรองรับฟังก์ชันจำนวนค่อนข้างน้อย

ttf-parser อยู่ตรงกลาง รองรับตาราง TrueType เดียวกันทั้งหมด (รูปแบบ TrueType ประกอบด้วยตารางไบนารีแยกกันจำนวนมาก) เหมือนกับ FreeType แต่ไม่ได้วาดร่ายมนตร์เอง

ในเวลาเดียวกัน ttf-parser มีความแตกต่างที่สำคัญอื่น ๆ อีกมากมาย:

  1. ttf-parser เขียนด้วยภาษา Rust โดยไม่ใช้ unsafe FreeType และ stb_truetype เขียนด้วยภาษา C
  2. ttf-parser เป็นเพียงการใช้งานที่ปลอดภัยต่อหน่วยความจำ ไม่สามารถอ่านหน่วยความจำแบบสุ่มได้ ช่องโหว่ได้รับการแก้ไขอย่างต่อเนื่องใน FreeType และโดยหลักการแล้ว stb_truetype ไม่ได้ออกแบบมาเพื่ออ่านแบบอักษรที่กำหนดเอง
  3. ttf-parser เป็นเพียงการใช้งานที่ปลอดภัยสำหรับเธรดเท่านั้น วิธีการแยกวิเคราะห์ทั้งหมดเป็นแบบคงที่ ข้อยกเว้นเพียงอย่างเดียวคือการตั้งค่าพิกัดสำหรับแบบอักษรที่แปรผัน แต่ฟังก์ชันนี้กลับเข้ามาใหม่ FreeType นั้นเป็นแบบเธรดเดียว stb_truetype - reentrant (คุณสามารถใช้สำเนาแต่ละชุดในเธรดที่แตกต่างกันได้ แต่ไม่ใช่ชุดใดชุดหนึ่ง)
  4. ttf-parser เป็นการใช้งานเดียวที่ไม่ใช้การจัดสรรฮีป วิธีนี้ช่วยให้คุณเร่งความเร็วในการแยกวิเคราะห์และหลีกเลี่ยงปัญหากับ OOM
  5. นอกจากนี้ยังมีการตรวจสอบการดำเนินการทางคณิตศาสตร์และการแปลงประเภทตัวเลขเกือบทั้งหมด (รวมถึงแบบคงที่)
  6. ในกรณีที่เลวร้ายที่สุด ห้องสมุดอาจส่งข้อยกเว้น ในกรณีนี้ ใน C API จะมีการตรวจพบข้อยกเว้นและฟังก์ชันจะส่งคืนข้อผิดพลาด แต่จะไม่เกิดข้อผิดพลาด

และแม้จะมีการรับประกันความปลอดภัยทั้งหมด ttf-parser ก็ยังใช้งานได้เร็วที่สุดเช่นกัน ตัวอย่างเช่น การแยกวิเคราะห์ CFF2 จะเร็วกว่า FreeType ถึง 3.5 เท่า ในขณะเดียวกันการแยกวิเคราะห์ glyf นั้นช้ากว่าใน stb_truetype ถึง 10% แต่นี่เป็นเพราะความจริงที่ว่ามันไม่รองรับฟอนต์แบบแปรผันซึ่งการดำเนินการดังกล่าวจำเป็นต้องมีการจัดเก็บเพิ่มเติม ข้อมูล. รายละเอียดเพิ่มเติมใน README.

ที่มา: linux.org.ru

เพิ่มความคิดเห็น