harfbuzz_rs é uma interface de alto nível para Harfbuzz, expondo sua funcionalidade mais importante de maneira segura usando a ferrugem.
O HarfBuzz é uma biblioteca para executar um layout de texto complexo. Não realiza nenhum desenho. Esta é uma operação de baixo nível. Se você deseja simplesmente desenhar algum texto na tela, talvez deva escolher outra biblioteca de alto nível. No entanto, se você deseja criar uma biblioteca para desenhar texto em algumas lonvas ou precisar de muito controle sobre o layout avançado de texto, esta é a biblioteca correta para usar.
Para moldar uma sequência simples de texto, você apenas cria uma Font a partir de um arquivo de fonte, preencha um Buffer com algum texto e chame a função 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 ) ;
}Isso deve imprimir algo semelhante ao seguinte:
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
Os valores de x_advance , x_offset , y_advance e y_offset são todos dados nas chamadas unidades de fonte por padrão. Ao chamar face.upem() você obtém o número de unidades de fonte por Em para uma face específica. Esse valor upem pode ser usado para escalar os avanços e compensações para um determinado tamanho de fonte. Por exemplo, se você deseja exibir uma fonte no tamanho de 16 pontos (pt), isso significa que 1 em = 16 pt . Neste exemplo, para converter um valor, digamos x_advance , de unidades de fonte em pontos, calculamos ((x_advance * font_size) as f64) / (upem as f64) , onde font_size = 16 é uma variável que especifica o tamanho da FONT nos pontos.
Observe que o Harfbuzz também suporta as fontes de escala internamente (usando font.set_scale(...) , etc.), mas, na minha opinião, é mais fácil escalar os resultados, conforme descrito no parágrafo acima.
Esta caixa é testada para trabalhar com o HarfBuzz Versions 2.0 e superior. As versões mais antigas também podem funcionar. Eu recomendo vincular estaticamente a biblioteca Harfbuzz fornecida pela caixa harfbuzz-sys que está sempre atualizada.
Se você deseja usar o Rusttype, pois as funções de fonte permitem o recurso rusttype .