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()を呼び出すことにより、特定のfaceでEMあたりのフォントユニットの数を取得します。この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バージョン2.0以上で動作するようにテストされています。古いバージョンも機能する場合があります。 harfbuzz-sys Crateが提供するHarfbuzzライブラリを静的にリンクすることをお勧めします。
rusttypeをフォント関数として使用する場合は、 rusttype機能を有効にします。