Toolkit para fuentes OpenType / TrueType; Renderización de texto en general
TLDR:
Nota : Esto solo se refiere a las capacidades de carga / dibujo TTF / OTF. El formato de fuente personalizado sigue siendo un tarro. Ver hoja de ruta para el estado de proyecto
Actualmente, la API es muy simple, pero proporciona mucha flexibilidad a través de la configuración de Comptime.
El primer paso es crear el tipo de fuente, que toma un backend como una opción de configuración de Comptime. Las opciones son: fontana , freetype y freetype_harfbuzz . En el ejemplo a continuación, estamos utilizando el backend fontana personalizado:
const font_backend: fontana.Backend = .fontana;
const Font = fontana.Font(font_backend);
var font = try Font.initFromFile(allocator, font_path);
defer font.deinit(allocator); El tipo Font tiene 3 funciones públicas, initFromFile() , deinit() y createPen() . Los dos primeros funcionan como se esperaba, así que pasemos al tipo de Pen .
El tipo Pen encapsula un atlas, tamaño de fuente y colección de puntos de código. Los puntos de código especificados se convertirán en glifos y se estremecerán en una textura. Si trabaja en una aplicación que representará texto en diferentes tamaños, puede generar más Pens a partir de la misma Font .
Nota : El Atlas de fuentes administrados por un bolígrafo puede compartir la textura de respaldo con otras partes de una aplicación, solo posee los metadatos sobre lo que se almacenan los glifos renderizados donde se almacenan.
Aquí está la firma de la función:
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 Continuando con el ejemplo anterior, aquí se crea una Pen a partir de nuestra fuente.
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 ,
) ;Nota : El Atlas solo admite texturas cuadradas, por lo tanto, texture_size en lugar de texture_dimensions
Nota : El cliente pasa el PixelType y sus propiedades se detectan automáticamente durante la rasterización. A menos que sea un tipo muy irregular, solo debería funcionar.
El tipo Pen tiene un solo propósito, para generar quads de textura en un búfer de vértice que puede ser utilizado por una API gráfica para dibujar texto a la pantalla. Solo tiene una sola función pública:
pub fn write (
self : * @ This ( ) ,
codepoints : [ ] const u8 ,
placement : geometry . Coordinates2D ( f64 ) ,
screen_scale : geometry . Scale2D ( f64 ) ,
writer_interface : anytype ,
) !voidEl cliente especifica qué texto representarlo, dónde renderizarlo en la pantalla, la escala de la pantalla y una interfaz de Comptime utilizada para canalizar la salida.
screen_scale convierte los píxeles en el sistema de coordenadas de la API de gráficos, en Vulkan se puede calcular de la siguiente manera:
fn scaleFromScreenDimensions ( width : f64 , height : f64 ) Scale2D ( f64 ) {
return . {
. vertical = 2.0 / height ,
. horizontal = 2.0 / width ,
} ;
}Esto se debe a que Vulkan usa el sistema de coordenadas de la derecha NDC, que pasa de -1.0 a +1.0 (longitud total de 2.0) en el eje x e y.
writer_interface es de un tipo evaluado Comptime y tiene que satisfacer la siguiente interfaz:
pub fn write (
self : * @ This ( ) ,
screen_extent : fontana . geometry . Extent2D ( f32 ) ,
texture_extent : fontana . geometry . Extent2D ( f32 ) ,
) !voidTodo lo que hace es mapear los valores de textura a las ubicaciones en la pantalla de salida, definida en el sistema de coordenadas de la API gráfica subyacente.
Simplemente agregue src/fontana.zig como un nuevo paquete en su build.zig.
const fontana_path = "your_project/deps/fontana" ;
exe . addPackage ( . {
. name = "fontana" ,
. source = . { . path = fontana_path ++ "/src/fontana.zig" } ,
} ) ;Fontana se mantiene sincronizado con el último lanzamiento en zig. Se probó por última vez con la versión 0.12.0-dev.3180 .
Se puede encontrar un ejemplo en ejecución en el ejemplo del repositorio Fontana-Examples. Los activos no esenciales, incluida la gran cantidad de código, no se registran en el repositorio principal para mantenerlo mínimo y amigable para la automatización.
Para ver el ejemplo anterior en forma completa, consulte este archivo específicamente
TODO: Agregar hoja de ruta
MIT