/* * * Copyright (C) 2026 andromeda * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with this program. If not, see . * */ module rfont; const int MAX_GLYPHS = 256; const int INIT_VERTS = 20 * MAX_GLYPHS; alias Texture = usz; alias Surface = void*; struct Render_data { float* verts; float* tcoords; ushort* elements; Texture atlas; usz nverts; usz nelements; } alias Renderer_proc_size = fn usz(); alias Renderer_proc_initPtr = fn void(void*); alias Renderer_proc_create_atlas = fn Texture(void*, uint, uint); alias Renderer_proc_free_atlas = fn void(void*, Texture); alias Renderer_proc_bitmap_to_atlas = fn void(void*, Texture, uint, uint, uint, char*, float, float, float*, float*); alias Renderer_proc_render = fn void(void*, Render_data*); alias Renderer_proc_set_framebuffer = fn void(void*, uint, uint); alias Renderer_proc_set_color = fn void(void*, float, float, float, float); alias Renderer_proc_set_surface = fn void(void*, Surface); alias Renderer_proc_freePtr = fn void(void*); struct Renderer_proc { Renderer_proc_size size; Renderer_proc_initPtr initPtr; Renderer_proc_create_atlas create_atlas; Renderer_proc_free_atlas free_atlas; Renderer_proc_bitmap_to_atlas bitmap_to_atlas; Renderer_proc_render render; Renderer_proc_set_framebuffer set_framebuffer; Renderer_proc_set_color set_color; Renderer_proc_set_surface set_surface; Renderer_proc_freePtr freePtr; } struct Renderer { void* ctx; Renderer_proc proc; } struct Font { Src* src; float fheight; float descent; float numOfLongHorMetrics; float space_adv; uint maxHeight; Glyph[MAX_GLYPHS] glyphs; usz glyph_len; Texture atlas; usz atlasWidth; usz atlasHeight; float atlasX; float atlasY; float[INIT_VERTS*3] verts; float[INIT_VERTS*2] tcoords; ushort[INIT_VERTS*6] elements; } struct Glyph { uint codepoint; usz size; int x; int x2; int y; int y2; Font* font; int src; float w; float h; float x1; float y1; float advance; } alias Src = void; alias Glyph_fallback_callback = fn Glyph(Renderer*, Font*, uint, usz); extern fn CChar* codepoint_to_utf8(uint) @cname("RFont_codepoint_to_utf8"); extern fn Font* font_init(Renderer*, ZString, uint, usz, usz) @cname("RFont_font_init"); extern fn Font* font_init_ptr(Renderer*, ZString, uint, usz, usz, Font*) @cname("RFont_font_init_ptr"); extern fn Font* font_init_data(Renderer*, char*, uint, usz, usz) @cname("RFont_font_init_data"); extern fn Font* font_init_data_ptr(Renderer*, char*, uint, usz, usz, Font*) @cname("RFont_font_init_data_ptr"); extern fn void font_free(Renderer*, Font*) @cname("RFont_font_free"); extern fn void font_free_ptr(Renderer*, Font*) @cname("RFont_font_free_ptr"); extern fn Glyph_fallback_callback set_glyph_fallback_callback(Glyph_fallback_callback) @cname("RFont_set_glyph_fallback_callback"); extern fn Glyph font_add_char(Renderer*, Font*, CChar, usz) @cname("RFont_font_add_char"); extern fn Glyph font_add_codepoint(Renderer*, Font*, uint, usz) @cname("RFont_font_add_codepoint"); extern fn Glyph font_add_codepoint_ex(Renderer*, Font*, uint, usz, char) @cname("RFont_font_add_codepoint_ex"); extern fn void font_add_string(Renderer*, Font*, ZString, usz*, usz) @cname("RFont_font_add_string"); extern fn void font_add_string_len(Renderer*, Font*, ZString, usz, usz*, usz) @cname("RFont_font_add_string_len"); extern fn void text_area(Renderer*, Font*, ZString, uint, uint*, uint*) @cname("RFont_text_area"); extern fn void text_area_spacing(Renderer*, Font*, ZString, float, uint, uint*, uint*) @cname("RFont_text_area_spacing"); extern fn void text_area_len(Renderer*, Font*, ZString, usz, uint, usz, float, uint*, uint*) @cname("RFont_text_area_len"); extern fn void draw_text(Renderer*, Font*, ZString, float, float, uint) @cname("RFont_draw_text"); extern fn void draw_text_spacing(Renderer*, Font*, ZString, float, float, uint, float) @cname("RFont_draw_text_spacing"); extern fn void draw_text_len(Renderer*, Font*, ZString, usz, float, float, uint, float) @cname("RFont_draw_text_len"); extern fn usz renderer_size(Renderer*) @cname("RFont_renderer_size"); extern fn Renderer* renderer_init(Renderer_proc) @cname("RFont_renderer_init"); extern fn void renderer_initPtr(Renderer_proc, void*, Renderer*) @cname("RFont_renderer_initPtr"); extern fn void renderer_set_framebuffer(Renderer*, uint, uint) @cname("RFont_renderer_set_framebuffer"); extern fn void renderer_set_surface(Renderer*, Surface) @cname("RFont_renderer_set_surface"); extern fn void renderer_set_color(Renderer*, float, float, float, float) @cname("RFont_renderer_set_color"); extern fn void renderer_free(Renderer*) @cname("RFont_renderer_free"); extern fn void renderer_freePtr(Renderer*) @cname("RFont_renderer_freePtr");