summaryrefslogtreecommitdiff
path: root/rfont.c3
diff options
context:
space:
mode:
authorandromeda <andromeda@lenovo>2026-04-25 22:50:36 +0200
committerandromeda <andromeda@lenovo>2026-04-25 22:50:36 +0200
commitc101e6571135cfd963e3c3f9543e64c445af7fd8 (patch)
treea1b54e635fd95c6353cbac24caf1b361f6bcb7c1 /rfont.c3
parent168abecfafadb57a0c677777a40083761bf8a922 (diff)
finish x86_64-linux Wayland bindings for rfont, rgfw, rsgl :)
Diffstat (limited to 'rfont.c3')
-rw-r--r--rfont.c3129
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");