diff options
| author | andromeda <andromeda@lenovo> | 2026-04-25 22:50:36 +0200 |
|---|---|---|
| committer | andromeda <andromeda@lenovo> | 2026-04-25 22:50:36 +0200 |
| commit | c101e6571135cfd963e3c3f9543e64c445af7fd8 (patch) | |
| tree | a1b54e635fd95c6353cbac24caf1b361f6bcb7c1 /rfont.c3 | |
| parent | 168abecfafadb57a0c677777a40083761bf8a922 (diff) | |
finish x86_64-linux Wayland bindings for rfont, rgfw, rsgl :)
Diffstat (limited to 'rfont.c3')
| -rw-r--r-- | rfont.c3 | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/rfont.c3 b/rfont.c3 new file mode 100644 index 0000000..3c7af6a --- /dev/null +++ b/rfont.c3 @@ -0,0 +1,129 @@ +/* +* +* 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/>. +* +*/ + +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"); |
