Toolkit สำหรับแบบอักษร opentype / Truetype; การแสดงข้อความโดยทั่วไป
tldr:
หมายเหตุ : นี่หมายถึงความสามารถในการโหลด / การวาด TTF / OTF เท่านั้น รูปแบบตัวอักษรที่กำหนดเองยังคงเป็นสิ่งที่ต้องทำ ดูแผนงานสำหรับสถานะของโครงการ
ปัจจุบัน API นั้นง่ายมาก แต่ให้ความยืดหยุ่นมากมายผ่านการกำหนดค่า 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 ห่อหุ้มแผนที่ขนาดตัวอักษรและคอลเลกชันของ codepoints codepoints ที่ระบุจะถูกแปลงเป็นร่ายมนตร์และแรสเตอร์สเป็นพื้นผิว หากทำงานกับแอปพลิเคชันที่จะแสดงข้อความในขนาดที่แตกต่างกันคุณสามารถสร้าง Pens ได้มากขึ้นจาก Font เดียวกัน
หมายเหตุ : Atlas แบบอักษรที่จัดการโดยปากกาสามารถแบ่งปันพื้นผิวการสำรองกับส่วนอื่น ๆ ของแอปพลิเคชันมันเป็นเจ้าของเมตาด้าเกี่ยวกับสิ่งที่ glyphs ที่แสดงผลจะถูกเก็บไว้ที่
นี่คือฟังก์ชั่นลายเซ็น:
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 ,
) ;หมายเหตุ : Atlas รองรับพื้นผิวแบบสี่เหลี่ยมเท่านั้นดังนั้น Texture_size เมื่อเทียบกับ sexture_dimensions
หมายเหตุ : Pixeltype ถูกส่งผ่านโดยไคลเอนต์และตรวจพบคุณสมบัติของมันโดยอัตโนมัติในระหว่างการแรสเตอร์ เว้นแต่จะเป็นประเภทที่ผิดปกติมากมันควรจะทำงาน
ประเภท Pen มีวัตถุประสงค์เดียวเพื่อสร้างพื้นผิวสี่เหลี่ยมจัตุรัสกับบัฟเฟอร์จุดสุดยอดที่สามารถใช้งานได้โดยกราฟิก API เพื่อวาดข้อความไปยังหน้าจอ มันมีฟังก์ชั่นสาธารณะเพียงอย่างเดียวเท่านั้น:
pub fn write (
self : * @ This ( ) ,
codepoints : [ ] const u8 ,
placement : geometry . Coordinates2D ( f64 ) ,
screen_scale : geometry . Scale2D ( f64 ) ,
writer_interface : anytype ,
) !voidไคลเอนต์ระบุว่าข้อความใดที่จะแสดงผลที่จะแสดงบนหน้าจอการปรับขนาดของหน้าจอและอินเทอร์เฟซ comptime ที่ใช้ในการส่งออก
screen_scale แปลงพิกเซลเป็นระบบพิกัดของกราฟิก API ใน 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ทั้งหมดนี้ทำคือแผนที่ค่าพื้นผิวไปยังตำแหน่งบนจอแสดงผลเอาต์พุตที่กำหนดไว้ในระบบพิกัดของกราฟิก API
เพียงเพิ่ม 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-ตัวอย่าง สินทรัพย์ที่ไม่จำเป็นรวมถึงรหัสจำนวนมากจะไม่ถูกตรวจสอบใน repo หลักเพื่อให้เป็นมิตรน้อยที่สุดและเป็นมิตรกับระบบอัตโนมัติ
หากต้องการดูตัวอย่างข้างต้นในรูปแบบที่สมบูรณ์ให้ดูไฟล์นี้โดยเฉพาะ
TODO: เพิ่มแผนงาน
มิกซ์