用于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中找到一个运行示例。不需要大量代码(包括大量代码)的非必需资产未被检查到主要存储库中,以使其最小和自动化友好。
要以完整形式查看上面的示例,请参阅此文件
托多:添加路线图
麻省理工学院