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