Kit de ferramentas para fontes OpenType / TrueType; renderização de texto em geral
TLDR:
Nota : Isso se refere apenas aos recursos de carregamento / desenho de TTF / OTF. O formato de fonte personalizado ainda é um TODO. Veja Roteiro para o estado do projeto
Atualmente, a API é muito simples, mas oferece muita flexibilidade através da configuração do Comptime.
A primeira etapa é criar o tipo de fonte, que leva um back -end como uma opção de configuração do Comptime. As opções são: fontana , freetype e freetype_harfbuzz . No exemplo abaixo, estamos usando o fontana Backend personalizado: 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); O tipo de Font possui 3 funções públicas, initFromFile() , deinit() e createPen() . Os dois primeiros funcionam como esperado, então vamos para o tipo de Pen .
O tipo de Pen encapsula um atlas, tamanho da fonte e coleta de pontos de código. Os pontos de código especificados serão convertidos em glifos e rasterizados em uma textura. Se estiver trabalhando em um aplicativo que renderizará o texto em tamanhos diferentes, você poderá gerar mais Pens da mesma Font .
NOTA : O Atlas de fonte gerenciado por uma caneta pode compartilhar a textura de apoio com outras partes de um aplicativo, ele possui apenas os meta-dados sobre o que os glifos renderizados são armazenados onde.
Aqui está a assinatura da função:
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 o exemplo acima, aqui uma Pen é criada a partir de nossa fonte.
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 : O Atlas suporta apenas texturas quadradas, portanto texture_size, em oposição a texture_dimensions
NOTA : O PixelType é passado pelo cliente e suas propriedades são detectadas automaticamente durante a rasterização. A menos que seja um tipo muito irregular, ele deve funcionar.
O tipo Pen tem um único objetivo, gerar quads de textura para um buffer de vértice que pode ser usado por uma API de gráficos para desenhar texto para a tela. Ele tem apenas uma única função pública:
pub fn write (
self : * @ This ( ) ,
codepoints : [ ] const u8 ,
placement : geometry . Coordinates2D ( f64 ) ,
screen_scale : geometry . Scale2D ( f64 ) ,
writer_interface : anytype ,
) !voidO cliente especifica qual texto renderizar, onde renderizá -lo na tela, a escala da tela e uma interface Comptime usada para canalizar a saída.
screen_scale converte pixels no sistema de coordenadas da API gráfica, em Vulkan pode ser calculado da seguinte forma:
fn scaleFromScreenDimensions ( width : f64 , height : f64 ) Scale2D ( f64 ) {
return . {
. vertical = 2.0 / height ,
. horizontal = 2.0 / width ,
} ;
}Isso ocorre porque o Vulkan usa o sistema de coordenadas corretas do NDC, passando de -1,0 a +1,0 (comprimento total de 2,0) no eixo x e y.
writer_interface é de um tipo de avaliação da Comptime e deve satisfazer a seguinte interface:
pub fn write (
self : * @ This ( ) ,
screen_extent : fontana . geometry . Extent2D ( f32 ) ,
texture_extent : fontana . geometry . Extent2D ( f32 ) ,
) !voidTudo isso faz é o mapear os valores de textura dos locais na tela de saída, definida no sistema de coordenadas da API gráfica subjacente.
Basta adicionar src/fontana.zig como um novo pacote em seu build.zig.
const fontana_path = "your_project/deps/fontana" ;
exe . addPackage ( . {
. name = "fontana" ,
. source = . { . path = fontana_path ++ "/src/fontana.zig" } ,
} ) ;O Fontana é mantido em sincronia com a versão mais recente do Zig. Foi testado pela última vez com a versão 0.12.0-Dev.3180 .
Um exemplo em execução pode ser encontrado nos exemplos de exemplo de repositório Fontana. Ativos não essenciais, incluindo grande quantidade de código, não são verificados no repositório principal para mantê-lo mínimo e amigável à automação.
Para ver o exemplo acima em forma completa, consulte este arquivo especificamente
TODO: Adicione o roteiro
Mit