Toolkit untuk font OpenType / Truetype; rendering teks secara umum
TLDR:
Catatan : Ini hanya mengacu pada kemampuan pemuatan / gambar TTF / OTF. Format font khusus masih merupakan todo. Lihat peta jalan untuk keadaan proyek
Saat ini, API sangat sederhana tetapi memberikan banyak fleksibilitas melalui konfigurasi CompTime.
Langkah pertama adalah membuat tipe font, yang mengambil backend sebagai opsi konfigurasi comptime. Opsinya adalah: fontana , freetype dan freetype_harfbuzz . Dalam contoh di bawah ini, kami menggunakan backend fontana yang dibangun khusus:
const font_backend: fontana.Backend = .fontana;
const Font = fontana.Font(font_backend);
var font = try Font.initFromFile(allocator, font_path);
defer font.deinit(allocator); Jenis Font memiliki 3 fungsi publik, initFromFile() , deinit() dan createPen() . Dua yang pertama bekerja seperti yang diharapkan, jadi mari kita beralih ke jenis Pen .
Jenis Pen enkapsul atlas, ukuran font, dan pengumpulan titik codepoints. Titik kode yang ditentukan akan dikonversi menjadi mesin terbang dan raster menjadi tekstur. Jika mengerjakan aplikasi yang akan memberikan teks pada ukuran yang berbeda, Anda dapat menghasilkan lebih banyak Pens dari Font yang sama.
CATATAN : Atlas font yang dikelola oleh pena dapat berbagi tekstur dukungan dengan bagian lain dari suatu aplikasi, itu hanya memiliki meta-data tentang apa yang diberikan mesin terbang disimpan di mana.
Inilah fungsinya tanda tangan:
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 Melanjutkan contoh di atas, di sini Pen dibuat dari font kami.
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 ,
) ;Catatan : Atlas hanya mendukung tekstur kuadrat, maka tekstur_size sebagai lawan dari tekstur_dimensi
Catatan : Pixeltype dilewatkan oleh klien dan sifatnya terdeteksi secara otomatis selama rasterisasi. Kecuali jika itu tipe yang sangat tidak teratur, ia harus bekerja.
Jenis Pen memiliki satu tujuan, untuk menghasilkan paha tekstur ke buffer simpul yang dapat digunakan oleh API grafis untuk menggambar teks ke layar. Hanya memiliki satu fungsi publik:
pub fn write (
self : * @ This ( ) ,
codepoints : [ ] const u8 ,
placement : geometry . Coordinates2D ( f64 ) ,
screen_scale : geometry . Scale2D ( f64 ) ,
writer_interface : anytype ,
) !voidKlien menentukan teks apa yang akan diterjemahkan, di mana untuk membuatnya di layar, penskalaan layar dan antarmuka comptime yang digunakan untuk menyalurkan output.
screen_scale mengonversi piksel ke sistem koordinat API grafis, di Vulkan dapat dihitung sebagai berikut:
fn scaleFromScreenDimensions ( width : f64 , height : f64 ) Scale2D ( f64 ) {
return . {
. vertical = 2.0 / height ,
. horizontal = 2.0 / width ,
} ;
}Ini karena Vulkan menggunakan sistem koordinat kanan NDC, naik dari -1.0 ke +1.0 (total panjang 2.0) pada sumbu X dan Y.
writer_interface adalah jenis yang dievaluasi comptime, dan harus memenuhi antarmuka berikut:
pub fn write (
self : * @ This ( ) ,
screen_extent : fontana . geometry . Extent2D ( f32 ) ,
texture_extent : fontana . geometry . Extent2D ( f32 ) ,
) !voidYang dilakukannya adalah memetakan nilai tekstur ke lokasi pada tampilan output, yang didefinisikan dalam sistem koordinat API grafis yang mendasarinya.
Cukup tambahkan src/fontana.zig sebagai paket baru di build.zig Anda.
const fontana_path = "your_project/deps/fontana" ;
exe . addPackage ( . {
. name = "fontana" ,
. source = . { . path = fontana_path ++ "/src/fontana.zig" } ,
} ) ;Fontana disinkronkan dengan rilis zig terbaru. Terakhir diuji dengan versi 0.12.0-dev.3180 .
Contoh lari dapat ditemukan dalam contoh fontana-contoh repositori. Aset yang tidak penting termasuk sejumlah besar kode tidak diperiksa ke repo utama agar tetap minim dan ramah otomatisasi.
Untuk melihat contoh di atas dalam bentuk lengkap, lihat file ini secara khusus
TODO: Tambahkan peta jalan
Mit