Opentype / TrueTypeフォント用のツールキット。一般的にテキストレンダリング
TLDR:
注:これは、TTF / OTFの読み込み /描画機能を指します。カスタムフォント形式はまだTODOです。プロジェクトのロードマップを参照してください
現在、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()があります。最初の2つの作品は予想どおりですので、 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 ,
) ;注: Atlasは正方形のテクスチャのみをサポートしているため、texture_dimensionsとは対照的にtexture_size
注: PixelTypeはクライアントによって渡され、そのプロパティはラスター化中に自動的に検出されます。それが非常に不規則なタイプでない限り、それはただ機能するはずです。
Penタイプには、グラフィックスAPIによって使用されてテキストを画面に描画できる頂点バッファーにテクスチャクワッドを生成するための単一の目的があります。単一のパブリック関数のみがあります。
pub fn write (
self : * @ This ( ) ,
codepoints : [ ] const u8 ,
placement : geometry . Coordinates2D ( f64 ) ,
screen_scale : geometry . Scale2D ( f64 ) ,
writer_interface : anytype ,
) !voidクライアントは、レンダリングするテキスト、画面上のレンダリング場所、画面のスケーリング、および出力をチャネルするために使用されるコンプタイムインターフェイスを指定します。
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 、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は、最新のZigリリースと同期しています。バージョン0.12.0-dev.3180で最後にテストされました。
実行中の例は、リポジトリFontana-Examplesの例にあります。大量のコードを含む非必須資産は、メインリポジトリにチェックされていないため、最小限で自動化に優しいものにします。
上記の例を完全な形式で見るには、このファイルを具体的に参照してください
TODO:ロードマップを追加します
mit