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 2.0 وأعلى. قد تعمل الإصدارات القديمة أيضًا. أوصي بربط مكتبة Harfbuzz بشكل ثابت الذي يوفره قفص harfbuzz-sys والذي يعد دائمًا محدثًا.
إذا كنت ترغب في استخدام Rusttype كوظائف الخط ، فإنه يتيح ميزة rusttype .