harfbuzz_rs es una interfaz de alto nivel para HarfBuzz, exponiendo su funcionalidad más importante de manera segura usando óxido.
Harfbuzz es una biblioteca para realizar un diseño de texto complejo. No realiza ningún dibujo. Esta es una operación bastante de bajo nivel. Si simplemente desea dibujar algún texto en la pantalla, tal vez debería elegir otra biblioteca de alto nivel. Sin embargo, si desea construir una biblioteca para dibujar texto en algún lienzo o necesita mucho control en el diseño de texto avanzado, esta es la biblioteca adecuada para usar.
Para dar forma a una cadena simple de texto, simplemente cree una Font desde un archivo de fuente, llene un Buffer con algún texto y llame a la función 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 ) ;
}Esto debería imprimir algo similar a lo siguiente:
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
Los valores de x_advance , x_offset , y_advance y y_offset se dan todos en las llamadas unidades de fuentes de forma predeterminada. Al llamar face.upem() obtienes el número de unidades de fuentes por EM para una face específica. Este valor upem se puede utilizar para escalar los avances y las compensaciones a un tamaño de fuente dado. Por ejemplo, si desea mostrar una fuente en el tamaño de 16 puntos (PT), eso significa que 1 em = 16 pt . En este ejemplo, para convertir un valor, digamos x_advance , de unidades de fuentes a puntos, calculamos ((x_advance * font_size) as f64) / (upem as f64) , donde font_size = 16 es una variable que especifica el tamaño de fuente en los puntos.
Tenga en cuenta que Harfbuzz admite internamente las fuentes de escala también (usando font.set_scale(...) , etc.), pero en mi opinión es más fácil escalar los resultados como se describe en el párrafo anterior.
Esta caja se prueba para que funcione con las versiones de Harfbuzz 2.0 y superior. Las versiones anteriores también pueden funcionar. Recomiendo vincular estáticamente la biblioteca Harfbuzz proporcionada por la caja harfbuzz-sys , que siempre está actualizada.
Si desea usar RustType como funciones de fuentes, habilite la función rusttype .