用於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類型封裝了一個地圖集,字體大小和代碼點的收集。指定的編碼點將轉換為字形,並將其柵格化為紋理。如果在一個將呈現不同尺寸的文本的應用程序上工作,則可以從同一Font中生成更多的Pens 。
注意:由筆管理的字體地圖集可以與應用程序的其他部分共享背景紋理,它僅擁有元數據,內容涉及將渲染的字形存儲在哪裡。
這是功能簽名:
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 ,
) ;注意:地圖集僅支持正方形的紋理,因此紋理_size而不是紋理_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右坐標系,X和Y軸上都從-1.0到+1.0(總長度為2.0)。
writer_interface是一個評估的類型,必須滿足以下接口:
pub fn write (
self : * @ This ( ) ,
screen_extent : fontana . geometry . Extent2D ( f32 ) ,
texture_extent : fontana . geometry . Extent2D ( f32 ) ,
) !void所有這些都是在輸出顯示器上的位置的映射紋理值,該位置在基礎圖形API的坐標系統中定義。
只需在您的build.zig中添加src/fontana.zig作為新軟件包。
const fontana_path = "your_project/deps/fontana" ;
exe . addPackage ( . {
. name = "fontana" ,
. source = . { . path = fontana_path ++ "/src/fontana.zig" } ,
} ) ;Fontana與最新的Zig版本保持一致。它是最後一次使用0.12.0-dev.3180的版本測試。
可以在示例存儲庫FONTANA-DISAMPLES中找到一個運行示例。不需要大量代碼(包括大量代碼)的非必需資產未被檢查到主要存儲庫中,以使其最小和自動化友好。
要以完整形式查看上面的示例,請參閱此文件
托多:添加路線圖
麻省理工學院