diff options
Diffstat (limited to 'rfont.c3l/rfont.c3')
| -rw-r--r-- | rfont.c3l/rfont.c3 | 165 |
1 files changed, 87 insertions, 78 deletions
diff --git a/rfont.c3l/rfont.c3 b/rfont.c3l/rfont.c3 index e3fa1fb..66678fe 100644 --- a/rfont.c3l/rfont.c3 +++ b/rfont.c3l/rfont.c3 @@ -1,11 +1,18 @@ /** -* 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 <https://www.gnu.org/licenses/>. + * Copyright (C) 2026 andromeda <andromeda@galaxious.de> + * + * 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 <https://www.gnu.org/licenses/>. **/ module rfont; @@ -13,10 +20,10 @@ module rfont; const int MAX_GLYPHS = 256; const int INIT_VERTS = 20 * MAX_GLYPHS; -alias Texture = usz; +typedef Texture = usz; alias Surface = void*; -struct Render_data +struct RenderData { float* verts; float* tcoords; @@ -26,56 +33,45 @@ struct Render_data 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*); +alias RenderProcSize = fn usz(); +alias RenderProcInitPtr = fn void(void*); +alias RenderProcCreateAtlas = fn Texture(void*, uint, uint); +alias RenderProcFreeAtlas = fn void(void*, Texture); +alias RenderProcBitmapToAtlas = fn void(void*, Texture, uint, uint, uint, char*, float, float, float*, float*); +alias RenderProcRender = fn void(void*, RenderData*); +alias RenderProcSetFramebuffer = fn void(void*, uint, uint); +alias RenderProcSetColor = fn void(void*, float, float, float, float); +alias RenderProcSetSurface = fn void(void*, Surface); +alias RenderProcFreePtr = fn void(void*); -struct Renderer_proc +struct RendererProc { - 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; + RenderProcSize size; + RenderProcInitPtr init_ptr; + RenderProcCreateAtlas create_atlas; + RenderProcFreeAtlas free_atlas; + RenderProcBitmapToAtlas bitmap_to_atlas; + RenderProcRender render; + RenderProcSetFramebuffer set_framebuffer; + RenderProcSetColor set_color; + RenderProcSetSurface set_surface; + RenderProcFreePtr free_ptr; } struct Renderer { void* ctx; - Renderer_proc proc; + RendererProc 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; -} +extern fn usz Renderer.size(&self) @cname("RFont_renderer_size"); +extern fn Renderer* renderer_init(RendererProc) @cname("RFont_renderer_init"); +extern fn void renderer_initPtr(RendererProc, void*, Renderer*) @cname("RFont_renderer_initPtr"); +extern fn void Renderer.set_framebuffer(&self, uint, uint) @cname("RFont_renderer_set_framebuffer"); +extern fn void Renderer.set_surface(&self, Surface) @cname("RFont_renderer_set_surface"); +extern fn void Renderer.set_color(&self, float, float, float, float) @cname("RFont_renderer_set_color"); +extern fn void Renderer.free(&self) @cname("RFont_renderer_free"); +extern fn void Renderer.free_ptr(&self) @cname("RFont_renderer_freePtr"); struct Glyph { @@ -94,34 +90,47 @@ struct Glyph float advance; } -alias Src = void; +typedef Src = void; -alias Glyph_fallback_callback = fn Glyph(Renderer*, Font*, uint, usz); +struct Font +{ + Src* src; + float fheight; + float descent; + float num_of_long_hor_metrics; + float space_adv; + uint max_height; + Glyph[MAX_GLYPHS] glyphs; + usz glyph_len; + Texture atlas; + usz atlas_width; + usz atlas_height; + float atlas_x; + float atlas_y; + float[INIT_VERTS * 3] verts; + float[INIT_VERTS * 2] tcoords; + ushort[INIT_VERTS * 6] elements; +} 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"); +extern fn Font* Renderer.font_init(&self, ZString, uint, usz, usz) @cname("RFont_font_init"); +extern fn Font* Renderer.font_init_ptr(&self, ZString, uint, usz, usz, Font*) @cname("RFont_font_init_ptr"); +extern fn Font* Renderer.font_init_data(&self, char*, uint, usz, usz) @cname("RFont_font_init_data"); +extern fn Font* Renderer.font_init_data_ptr(&self, char*, uint, usz, usz, Font*) @cname("RFont_font_init_data_ptr"); +extern fn void Renderer.font_free(&self, Font*) @cname("RFont_font_free"); +extern fn void Renderer.font_free_ptr(&self, Font*) @cname("RFont_font_free_ptr"); + +alias GlyphFallbackCallback = fn Glyph(Renderer*, Font*, uint, usz); + +extern fn GlyphFallbackCallback set_glyph_fallback_callback(GlyphFallbackCallback) @cname("RFont_set_glyph_fallback_callback"); +extern fn Glyph Renderer.add_char(&self, Font*, CChar, usz) @cname("RFont_font_add_char"); +extern fn Glyph Renderer.add_codepoint(&self, Font*, uint, usz) @cname("RFont_font_add_codepoint"); +extern fn Glyph Renderer.add_codepoint_ex(&self, Font*, uint, usz, char) @cname("RFont_font_add_codepoint_ex"); +extern fn void Renderer.add_string(&self, Font*, ZString, usz*, usz) @cname("RFont_font_add_string"); +extern fn void Renderer.add_string_len(&self, Font*, ZString, usz, usz*, usz) @cname("RFont_font_add_string_len"); +extern fn void Renderer.area(&self, Font*, ZString, uint, uint*, uint*) @cname("RFont_text_area"); +extern fn void Renderer.area_spacing(&self, Font*, ZString, float, uint, uint*, uint*) @cname("RFont_text_area_spacing"); +extern fn void Renderer.area_len(&self, Font*, ZString, usz, uint, usz, float, uint*, uint*) @cname("RFont_text_area_len"); +extern fn void Renderer.draw_text(&self, Font*, ZString, float, float, uint) @cname("RFont_draw_text"); +extern fn void Renderer.draw_text_spacing(&self, Font*, ZString, float, float, uint, float) @cname("RFont_draw_text_spacing"); +extern fn void Renderer.draw_text_len(&self, Font*, ZString, usz, float, float, uint, float) @cname("RFont_draw_text_len"); |
