summaryrefslogtreecommitdiff
path: root/rfont.c3l/rfont.c3
blob: 07432584e761abd884f90054d9d7ba5aa3277174 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/**
* 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");