مجموعة أدوات لخطوط Opentype / trueType ؛ تقديم النص بشكل عام
TLDR:
ملاحظة : يشير هذا فقط إلى إمكانيات التحميل / الرسم TTF / OTF. لا يزال تنسيق الخط المخصص عبارة عن TODO. انظر خارطة الطريق لحالة المشروع
حاليا ، واجهة برمجة التطبيقات بسيطة للغاية ولكنها توفر الكثير من المرونة من خلال تكوين Comptime.
الخطوة الأولى هي إنشاء نوع الخط ، الذي يأخذ الواجهة الخلفية كخيار تكوين CompTime. الخيارات هي: fontana و freetype و freetype_harfbuzz . في المثال أدناه ، نستخدم الواجهة الخلفية المخصصة fontana :
const font_backend: fontana.Backend = .fontana;
const Font = fontana.Font(font_backend);
var font = try Font.initFromFile(allocator, font_path);
defer font.deinit(allocator); يحتوي نوع Font على 3 وظائف عامة ، initFromFile() ، deinit() و createPen() . أول عملين كما هو متوقع ، لذلك دعونا ننتقل إلى نوع Pen .
يعكس نوع Pen أطلس وحجم الخط وجمع نقاط الترميز. سيتم تحويل نقاط الترميز المحددة إلى حروف رسومية ونافذة إلى نسيج. إذا كنت تعمل على تطبيق سيعرض نصًا بأحجام مختلفة ، فيمكنك إنشاء المزيد من Pens من نفس Font .
ملاحظة : يمكن لخط الأطلس المدير من قبل القلم مشاركة نسيج الدعم مع أجزاء أخرى من التطبيق ، فهي تمتلك فقط بيانات التعريف حول ما يتم تخزين الرسوم الحرارية التي يتم تخزينها في مكان.
هذا هو توقيع الوظيفة:
pub fn createPen (
self : * @ This ( ) ,
comptime PixelType : type ,
allocator : std . mem . Allocator ,
size : Size ,
points_per_pixel : f64 ,
codepoints : [ ] const u8 ,
texture_size : u32 ,
texture_pixels : [ * ] PixelType ,
) ! Pen مع الاستمرار في المثال أعلاه ، هنا يتم إنشاء Pen من خطنا.
const PixelType = graphics . RGBA ( f32 ) ;
const points_per_pixel = 100 ;
const font_size = fontana . Size { . point = 24 . 0 } ;
const pen = try font . createPen (
PixelType ,
allocator ,
font_size ,
points_per_pixel ,
atlas_codepoints ,
texture . dimensions . width ,
texture . pixels ,
) ;ملاحظة : يدعم الأطلس فقط القوام المربع ، وبالتالي الملمس - على عكس الملمس.
ملاحظة : يتم تمرير Pixeltype بواسطة العميل ويتم اكتشاف خصائصه تلقائيًا أثناء النقطية. ما لم يكن نوعًا غير منتظم للغاية ، يجب أن يعمل فقط.
يحتوي نوع Pen على غرض واحد ، لإنشاء كواد الملمس إلى المخزن المؤقت للقمة التي يمكن استخدامها بواسطة واجهة برمجة تطبيقات الرسومات لرسم النص على الشاشة. لديها وظيفة عامة واحدة فقط:
pub fn write (
self : * @ This ( ) ,
codepoints : [ ] const u8 ,
placement : geometry . Coordinates2D ( f64 ) ,
screen_scale : geometry . Scale2D ( f64 ) ,
writer_interface : anytype ,
) !voidيحدد العميل النص الذي يجب تقديمه ، حيث يتم تقديمه على الشاشة ، وتوسيع نطاق الشاشة وواجهة CompTime المستخدمة لتوجيه الإخراج.
يقوم screen_scale بتحويل وحدات البكسل إلى نظام الإحداثيات في واجهة برمجة تطبيقات الرسومات ، في Vulkan يمكن حسابها على النحو التالي:
fn scaleFromScreenDimensions ( width : f64 , height : f64 ) Scale2D ( f64 ) {
return . {
. vertical = 2.0 / height ,
. horizontal = 2.0 / width ,
} ;
}وذلك لأن Vulkan يستخدم نظام الإحداثيات اليمنى NDC ، من -1.0 إلى +1.0 (الطول الإجمالي 2.0) على كل من محور X و Y.
writer_interface من نوع Comptime الذي تم تقييمه ، ويتعين عليه تلبية الواجهة التالية:
pub fn write (
self : * @ This ( ) ,
screen_extent : fontana . geometry . Extent2D ( f32 ) ,
texture_extent : fontana . geometry . Extent2D ( f32 ) ,
) !voidكل هذا يفعل هو قيم نسيج الخريطة للمواقع الموجودة على شاشة الإخراج ، المحددة في نظام الإحداثيات في واجهة برمجة تطبيقات الرسومات الأساسية.
فقط أضف src/fontana.zig كحزمة جديدة في build.zig.
const fontana_path = "your_project/deps/fontana" ;
exe . addPackage ( . {
. name = "fontana" ,
. source = . { . path = fontana_path ++ "/src/fontana.zig" } ,
} ) ;يتم الاحتفاظ Fontana متزامن مع أحدث إصدار من التعرج. تم اختباره آخر مرة مع الإصدار 0.12.0-dev.3180 .
يمكن العثور على مثال قيد التشغيل في أمثلة مستودعات مستودع Fontana. لا يتم فحص الأصول غير الأساسية بما في ذلك كمية كبيرة من التعليمات البرمجية في الريبو الرئيسي للحفاظ على الحد الأدنى والأتمتة ودية.
لرؤية المثال أعلاه في شكل كامل ، راجع هذا الملف على وجه التحديد
TODO: إضافة خريطة الطريق
معهد ماساتشوستس للتكنولوجيا