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 Versions 2.0 и выше. Старые версии также могут работать. Я рекомендую статически связывать библиотеку Harfbuzz, предоставленную ящиком harfbuzz-sys которая всегда является актуальной.
Если вы хотите использовать rusttype в качестве функций шрифта, включите функцию rusttype .