harfbuzz_rs est une interface de haut niveau à HarfBuzz, exposant sa fonctionnalité la plus importante en toute sécurité en utilisant la rouille.
HarfBuzz est une bibliothèque pour effectuer une disposition de texte complexe. Il n'effectue aucun dessin. Il s'agit d'une opération assez à bas niveau. Si vous souhaitez simplement dessiner du texte sur l'écran, vous devriez peut-être choisir une autre bibliothèque de plus haut niveau. Cependant, si vous souhaitez créer une bibliothèque pour dessiner du texte sur une canevas ou avoir besoin de beaucoup de contrôle sur la disposition de texte avancée, c'est la bonne bibliothèque à utiliser.
Pour façonner une simple chaîne de texte, vous créez simplement une Font à partir d'un fichier de police, remplissez un Buffer avec du texte et appelez la fonction 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 ) ;
}Cela devrait imprimer quelque chose de similaire à ce qui suit:
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
Les valeurs de x_advance , x_offset , y_advance et y_offset sont toutes données par défaut dans des unités de police . En appelant face.upem() vous obtenez le nombre d'unités de police par EM pour un face spécifique. Cette valeur upem peut être utilisée pour mettre à l'échelle les avancées et les décalages à une taille de police donnée. Par exemple, si vous souhaitez afficher une police à 16 points (pt), cela signifie que 1 em = 16 pt . Dans cet exemple, pour convertir une valeur, disons x_advance , des unités de police en points, nous calculons ((x_advance * font_size) as f64) / (upem as f64) , où font_size = 16 est une variable spécifiant la taille de la police en points.
Notez que HarfBuzz prend également en charge en interne les polices de mise à l'échelle elle-même (en utilisant font.set_scale(...) , etc.), mais à mon avis, il est plus facile de faire évoluer les résultats soi-même comme décrit dans le paragraphe ci-dessus.
Cette caisse est testée pour fonctionner avec HarfBuzz Versions 2.0 et plus. Les versions plus anciennes peuvent également fonctionner. Je recommande de lier statiquement la bibliothèque HarfBuzz fournie par la caisse harfbuzz-sys qui est toujours à jour.
Si vous souhaitez utiliser RustType comme fonctions de police, activez la fonction rusttype .