include/alba.h
1#ifndef ALBA_H
2#define ALBA_H
3
4#include "webgpu.h"
5#include "ft2build.h"
6#include FT_FREETYPE_H
7
8// Dynamic arrays
9typedef struct {
10 uint64_t element_size;
11 uint64_t length;
12 uint64_t capacity;
13 void *data;
14} AlbaArray;
15
16AlbaArray alba_create_array(uint64_t element_size, uint64_t capacity);
17
18void alba_array_reserve(AlbaArray *array, uint64_t request);
19
20void alba_array_append(AlbaArray *array, const void *value);
21
22void alba_array_extend(AlbaArray *array, uint64_t size, const void *data);
23
24void alba_array_release(const AlbaArray *array);
25
26void alba_array_clear(AlbaArray *array);
27
28void alba_array_sort(const AlbaArray *array, uint32_t (*is_before_pivot)(void *pivot, void *elem));
29
30void *alba_array_last(const AlbaArray *array);
31
32void alba_array_print(const AlbaArray *array, void (*print_element)(void *element));
33
34// String
35typedef AlbaArray AlbaString;
36
37AlbaString alba_create_string(const char *text, uint64_t length);
38
39char *alba_string_to_char(const AlbaString *string);
40
41void alba_string_extend(AlbaString *string, const char *text, uint64_t length);
42
43static void alba_string_release(const AlbaString *string) { alba_array_release(string); }
44
45// Helper structures
46typedef struct {
47 float r, g, b, a;
48} AlbaColor;
49
50#define RED {1, 0, 0, 1}
51#define GREEN {0, 1, 0, 1}
52#define BLUE {0, 0, 1, 1}
53#define BLACK {0, 0, 0, 1}
54#define WHITE {1, 1, 1, 1}
55#define TRANSPARENT {0, 0, 0, 0}
56#define YELLOW {1, 1, 0, 1}
57#define MAGENTA {1, 0, 1, 1}
58#define CYAN {0, 1, 1, 1}
59
60void alba_color_print(const AlbaColor *color);
61
62int alba_color_is_transparent(const AlbaColor *color);
63
64typedef struct {
65 float x, y;
66} AlbaVector;
67
68void alba_vector_print(const AlbaVector *vector);
69
70inline AlbaVector alba_vector_add(const AlbaVector a, const AlbaVector b) {
71 return (AlbaVector){a.x + b.x, a.y + b.y};
72}
73
74inline AlbaVector alba_vector_sub(const AlbaVector a, const AlbaVector b) {
75 return (AlbaVector){a.x - b.x, a.y - b.y};
76}
77
78inline AlbaVector alba_vector_mul(const AlbaVector a, const AlbaVector b) {
79 return (AlbaVector){a.x * b.x, a.y * b.y};
80}
81
82inline AlbaVector alba_vector_div(const AlbaVector a, const AlbaVector b) {
83 return (AlbaVector){a.x / b.x, a.y / b.y};
84}
85
86typedef struct {
87 AlbaColor color;
88 AlbaVector uv;
89} AlbaAttribute;
90
91void alba_attribute_print(const AlbaAttribute *attribute);
92
93// Window
94typedef struct {
95 char *title;
96 uint32_t initial_width;
97 uint32_t initial_height;
98 AlbaColor clear_color;
99} AlbaWindowOptions;
100
101typedef struct AlbaWindowImpl AlbaWindow;
102
103AlbaWindow *alba_create_window(const AlbaWindowOptions *options);
104
105uint32_t alba_window_should_close(const AlbaWindow *window);
106
107// TODO: think about API here, use AlbaVector
108// Returns window size, in scaled coordinates (e.g. will honor
109// the windowing system scaling). The point at this coordinate
110// is at the bottom right of the window.
111void alba_window_get_size(const AlbaWindow *window, float *width, float *height);
112
113void alba_window_render(AlbaWindow *window);
114
115void alba_window_release(AlbaWindow *window);
116
117void alba_release();
118
119// Low level drawing
120void alba_draw_triangles_indexed(
121 AlbaWindow *window,
122 uint32_t num_vertices,
123 const AlbaVector *vertices,
124 const AlbaAttribute *attributes,
125 uint32_t num_indices,
126 uint32_t *indices
127);
128
129void alba_draw_triangles(
130 AlbaWindow *window,
131 uint32_t num_vertices,
132 const AlbaVector *vertices,
133 const AlbaAttribute *attributes
134);
135
136// Higher level drawing
137void alba_draw_triangle(AlbaWindow *window, const AlbaVector vertices[3], AlbaColor color);
138
139void alba_draw_quad(AlbaWindow *window, const AlbaVector vertices[4], AlbaColor color);
140
141void alba_draw_rect_aa(AlbaWindow *window, float x0, float y0, float x1, float y1, AlbaColor color);
142
143void alba_generate_regular_polygon(AlbaArray *array, uint32_t num_sides, float x, float y, float r);
144
145void alba_generate_circle(AlbaArray *array, float x, float y, float r);
146
147void alba_generate_rounded_rect_aa(AlbaArray *array, float x0, float y0, float x1, float y1, float r);
148
149void alba_draw_concave_polygon(AlbaWindow *window, float x, float y, const AlbaArray *contour, AlbaColor color);
150
151void alba_draw_regular_polygon(AlbaWindow *window, uint32_t num_sides, float x, float y, float r, AlbaColor color);
152
153void alba_draw_circle(AlbaWindow *window, float x, float y, float r, AlbaColor color);
154
155void alba_draw_rounded_rect_aa(AlbaWindow *window, float x0, float y0, float x1, float y1, float r, AlbaColor color);
156
157// Text drawing
158typedef struct {
159 AlbaColor color;
160 uint64_t font_size;
161} AlbaTextStyle;
162
163void alba_draw_text(
164 AlbaWindow *window,
165 AlbaVector pos,
166 AlbaString string,
167 AlbaTextStyle style
168);
169
170#endif // ALBA_H