harfbuzz_rs adalah antarmuka tingkat tinggi untuk HarfBuzz, mengungkap fungsionalitas yang paling penting dengan cara yang aman menggunakan karat.
HarfBuzz adalah perpustakaan untuk melakukan tata letak teks yang kompleks. Itu tidak melakukan gambar apa pun. Ini adalah operasi tingkat rendah. Jika Anda hanya ingin menggambar beberapa teks di layar, Anda mungkin harus memilih perpustakaan tingkat tinggi lainnya. Namun jika Anda ingin membangun perpustakaan untuk menggambar teks di beberapa kanvas atau membutuhkan banyak kontrol pada tata letak teks canggih maka ini adalah perpustakaan yang tepat untuk digunakan.
Untuk membentuk serangkaian teks sederhana, Anda hanya membuat Font dari file font, mengisi Buffer dengan beberapa teks dan panggil fungsi 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 ) ;
}Ini harus mencetak sesuatu yang mirip dengan yang berikut:
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
Nilai x_advance , x_offset , y_advance dan y_offset semuanya diberikan dalam apa yang disebut unit font secara default. Dengan menelepon face.upem() Anda mendapatkan jumlah unit font per em untuk face tertentu. Nilai upem ini dapat digunakan untuk mengukur kemajuan dan offset ke ukuran font yang diberikan. Misalnya, jika Anda ingin menampilkan font pada ukuran 16 poin (PT), itu berarti bahwa 1 EM = 16 pt . Dalam contoh ini, untuk mengonversi nilai, katakanlah x_advance , dari font-unit ke titik, kami menghitung ((x_advance * font_size) as f64) / (upem as f64) , di mana font_size = 16 adalah variabel yang menentukan ukuran font dalam poin.
Perhatikan bahwa HarfBuzz secara internal mendukung font penskalaan itu sendiri juga (menggunakan font.set_scale(...) , dll.) Tetapi menurut saya lebih mudah untuk mengukur hasil sendiri seperti yang dijelaskan dalam paragraf di atas.
Peti ini diuji untuk bekerja dengan HarfBuzz Version 2.0 dan lebih tinggi. Versi yang lebih lama mungkin berfungsi juga. Saya merekomendasikan secara statis menghubungkan perpustakaan HarfBuzz yang disediakan oleh peti harfbuzz-sys yang selalu terkini.
Jika Anda ingin menggunakan RustType sebagai fungsi font, memungkinkan fitur rusttype .