summaryrefslogtreecommitdiff
path: root/rfont.c3
blob: 3c7af6ae7d1b74531bd5f0137352ae7ec92e342e (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
/*
*
* 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");