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