Toolkit für OpenType / TrueType -Schriftarten; Textrendern im Allgemeinen
TLDR:
Hinweis : Dies bezieht sich nur auf die Lade- / Zeichnungsfunktionen von TTF / OTF. Das benutzerdefinierte Schriftformat ist immer noch ein Todo. Siehe Roadmap für den Projektstaat
Derzeit ist die API sehr einfach, bietet aber durch CompTime -Konfiguration viel Flexibilität.
Der erste Schritt besteht darin, den Schriftart zu erstellen, der ein Backend als COMPTime -Konfigurationsoption verwendet. Die Optionen sind: fontana , freetype und freetype_harfbuzz . Im folgenden Beispiel verwenden wir das benutzerdefinierte fontana -Backend:
const font_backend: fontana.Backend = .fontana;
const Font = fontana.Font(font_backend);
var font = try Font.initFromFile(allocator, font_path);
defer font.deinit(allocator); Der Font hat 3 öffentliche Funktionen, initFromFile() , deinit() und createPen() . Die ersten beiden funktionieren wie erwartet, gehen wir also zum Pen .
Der Pen verkauft einen Atlas, eine Schriftgröße und Sammlung von CodePoints. Die angegebenen CodePoints werden in Glyphen umgewandelt und in eine Textur rasterisiert. Wenn Sie an einer Anwendung arbeiten, die Text in verschiedenen Größen rendert, können Sie mehr Pens aus derselben Font erstellen.
HINWEIS : Der von einem Stift verwaltete Schriftartatlas kann die Unterstützungstruktur mit anderen Teilen einer Anwendung teilen. Sie besitzt nur die Meta-Daten darüber, was gerenderte Glyphen wo aufbewahrt werden.
Hier ist die Funktionssignatur:
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 Wenn Sie das obige Beispiel fortsetzen, wird hier ein Pen aus unserer Schriftart erstellt.
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 ,
) ;Hinweis : Der Atlas unterstützt nur quadratische Texturen, daher texture_size im Gegensatz zu texture_dimensions
Hinweis : Der Pixeltype wird vom Client übergeben und die Eigenschaften werden während der Rasterung automatisch erkannt. Es sei denn, es ist ein sehr unregelmäßiger Typ, es sollte nur funktionieren.
Der Pen hat einen einzelnen Zweck, um Texturquads zu einem Scheitelpunktpuffer zu generieren, der von einer Grafik -API verwendet werden kann, um Text auf den Bildschirm zu zeichnen. Es hat nur eine einzige öffentliche Funktion:
pub fn write (
self : * @ This ( ) ,
codepoints : [ ] const u8 ,
placement : geometry . Coordinates2D ( f64 ) ,
screen_scale : geometry . Scale2D ( f64 ) ,
writer_interface : anytype ,
) !voidDer Client gibt an, welchen Text, der zu rendern ist, wo er auf dem Bildschirm rendern soll, die Skalierung des Bildschirms und eine Compime -Schnittstelle, mit der die Ausgabe kanalisiert wird.
screen_scale konvertiert Pixel in das Koordinatensystem der Grafik -API, in Vulkan kann es wie folgt berechnet werden:
fn scaleFromScreenDimensions ( width : f64 , height : f64 ) Scale2D ( f64 ) {
return . {
. vertical = 2.0 / height ,
. horizontal = 2.0 / width ,
} ;
}Dies liegt daran, dass Vulkan das NDC Right Coordinate -System verwendet und auf der X- und Y -Achse von -1,0 bis +1,0 (Gesamtlänge von 2,0) wechselt.
writer_interface hat einen von CompTime ausgewerteten Typ und muss die folgende Schnittstelle befriedigen:
pub fn write (
self : * @ This ( ) ,
screen_extent : fontana . geometry . Extent2D ( f32 ) ,
texture_extent : fontana . geometry . Extent2D ( f32 ) ,
) !voidAll dies macht Texturwerte an Positionen in der Ausgangsanzeige ab, die im Koordinatensystem der zugrunde liegenden Grafik -API definiert sind.
Fügen Sie einfach src/fontana.zig als neues Paket in Ihrem Build.zig hinzu.
const fontana_path = "your_project/deps/fontana" ;
exe . addPackage ( . {
. name = "fontana" ,
. source = . { . path = fontana_path ++ "/src/fontana.zig" } ,
} ) ;Fontana wird mit der neuesten Zig -Veröffentlichung synchronisiert. Es wurde zuletzt mit Version 0.12.0-Dev.3180 getestet.
Ein laufendes Beispiel finden Sie in den Beispiel-Repository-Fontana-Examples. Nicht wesentliche Vermögenswerte einschließlich einer großen Menge an Code werden nicht in das Haupttrieb untersucht, um es minimal und automatisch freundlich zu halten.
Um das obige Beispiel in vollständiger Form zu sehen, finden Sie in dieser Datei speziell
Todo: Roadmap hinzufügen
MIT