harfbuzz_rs เป็นอินเทอร์เฟซระดับสูงสำหรับ Harfbuzz เปิดเผยฟังก์ชั่นที่สำคัญที่สุดในลักษณะที่ปลอดภัยโดยใช้สนิม
Harfbuzz เป็นไลบรารีสำหรับการจัดวางข้อความที่ซับซ้อน มันไม่ได้ทำการวาดภาพใด ๆ นี่เป็นการดำเนินการในระดับต่ำ หากคุณต้องการวาดข้อความบนหน้าจอคุณควรเลือกไลบรารีระดับสูงอื่น ๆ อีก อย่างไรก็ตามหากคุณต้องการสร้างไลบรารีสำหรับการวาดข้อความบนผืนผ้าใบบางตัวหรือต้องการการควบคุมจำนวนมากเกี่ยวกับเค้าโครงข้อความขั้นสูงนี่เป็นไลบรารีที่เหมาะสมที่จะใช้
ในการกำหนดสตริงข้อความอย่างง่ายคุณเพียงแค่สร้าง Font จากไฟล์ตัวอักษรให้เติม Buffer ด้วยข้อความบางส่วนและเรียกใช้ฟังก์ชัน shape
use harfbuzz_rs :: * ;
let path = "path/to/some/font_file.otf" ;
let index = 0 ; //< face index in the font file
let face = Face :: from_file ( path , index ) ? ;
let mut font = Font :: new ( face ) ;
let buffer = UnicodeBuffer :: new ( ) . add_str ( "Hello World!" ) ;
let output = shape ( & font , buffer , & [ ] ) ;
// The results of the shaping operation are stored in the `output` buffer.
let positions = output . get_glyph_positions ( ) ;
let infos = output . get_glyph_infos ( ) ;
// iterate over the shaped glyphs
for ( position , info ) in positions . iter ( ) . zip ( infos ) {
let gid = info . codepoint ;
let cluster = info . cluster ;
let x_advance = position . x_advance ;
let x_offset = position . x_offset ;
let y_offset = position . y_offset ;
// Here you would usually draw the glyphs.
println ! ( "gid{:?}={:?}@{:?},{:?}+{:?}" , gid , cluster , x_advance , x_offset , y_offset ) ;
}สิ่งนี้ควรพิมพ์สิ่งที่คล้ายกับสิ่งต่อไปนี้:
gid41=0@741,0+0
gid70=1@421,0+0
gid77=2@258,0+0
gid77=3@253,0+0
gid80=4@510,0+0
gid1=5@227,0+0
gid56=6@874,0+0
gid80=7@498,0+0
gid83=8@367,0+0
gid77=9@253,0+0
gid69=10@528,0+0
gid2=11@276,0+0
ค่าของ x_advance , x_offset , y_advance และ y_offset ทั้งหมดได้รับใน หน่วยฟอนต์ ที่เรียกว่าตามค่าเริ่มต้น โดยการโทร face.upem() คุณจะได้รับจำนวนหน่วยฟอนต์ต่อ em สำหรับ face ที่เฉพาะเจาะจง ค่า upem นี้สามารถใช้ในการขยายความก้าวหน้าและการชดเชยเป็นขนาดตัวอักษรที่กำหนด ตัวอย่างเช่นหากคุณต้องการแสดงแบบอักษรที่ขนาด 16 จุด (PT) นั่นหมายความว่า 1 em = 16 pt ในตัวอย่างนี้ในการแปลงค่าให้พูด x_advance จากฟอนต์หน่วยเป็นคะแนนเราคำนวณ ((x_advance * font_size) as f64) / (upem as f64) โดยที่ font_size = 16 เป็นตัวแปรที่ระบุขนาดตัวอักษรในจุด
โปรดทราบว่า harfbuzz ภายในสนับสนุนการปรับสเกลของตัวเองด้วย (ใช้ font.set_scale(...) ฯลฯ ) แต่ในความคิดของฉันมันง่ายกว่าที่จะขยายผลลัพธ์ด้วยตนเองตามที่อธิบายไว้ในย่อหน้าข้างต้น
ลังนี้ได้รับการทดสอบเพื่อทำงานกับ Harfbuzz Version 2.0 ขึ้นไป รุ่นเก่าอาจใช้งานได้เช่นกัน ฉันขอแนะนำให้เชื่อมโยงไลบรารี Harfbuzz แบบคงที่ที่จัดทำโดยลัง harfbuzz-sys ซึ่งทันสมัยอยู่เสมอ
หากคุณต้องการใช้ RustType เป็นฟังก์ชั่นแบบอักษรเปิดใช้งานคุณสมบัติ rusttype