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, 0}
 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);
 52int alba_color_is_transparent(const AlbaColor* color);
 53
 54typedef struct
 55{
 56    float x, y;
 57} AlbaVector;
 58
 59void alba_vector_print(const AlbaVector* vector);
 60
 61inline AlbaVector alba_vector_add(const AlbaVector a, const AlbaVector b)
 62{
 63    return (AlbaVector){a.x + b.x, a.y + b.y};
 64}
 65
 66inline AlbaVector alba_vector_sub(const AlbaVector a, const AlbaVector b)
 67{
 68    return (AlbaVector){a.x - b.x, a.y - b.y};
 69}
 70
 71inline AlbaVector alba_vector_mul(const AlbaVector a, const AlbaVector b)
 72{
 73    return (AlbaVector){a.x * b.x, a.y * b.y};
 74}
 75
 76inline AlbaVector alba_vector_div(const AlbaVector a, const AlbaVector b)
 77{
 78    return (AlbaVector){a.x / b.x, a.y / b.y};
 79}
 80
 81typedef struct
 82{
 83    AlbaColor color;
 84    AlbaVector uv;
 85} AlbaAttribute;
 86
 87void alba_attribute_print(const AlbaAttribute* attribute);
 88
 89// Window
 90typedef struct
 91{
 92    char* title;
 93    uint32_t initial_width;
 94    uint32_t initial_height;
 95    AlbaColor clear_color;
 96} AlbaWindowOptions;
 97
 98typedef struct AlbaWindowImpl AlbaWindow;
 99
100AlbaWindow* alba_create_window(const AlbaWindowOptions* options);
101uint32_t alba_window_should_close(const AlbaWindow* window);
102// TODO: think about API here, use AlbaVector
103// Returns window size, in scaled coordinates (e.g. will honor
104// the windowing system scaling). The point at this coordinate
105// is at the bottom right of the window.
106void alba_window_get_size(const AlbaWindow* window, float* width, float* height);
107void alba_window_render(AlbaWindow* window);
108void alba_window_release(AlbaWindow* window);
109
110void alba_release();
111
112// Low level drawing
113void alba_draw_triangles_indexed(
114    AlbaWindow* window,
115    uint32_t num_vertices,
116    const AlbaVector* vertices,
117    const AlbaAttribute* attributes,
118    uint32_t num_indices,
119    uint32_t* indices
120);
121void alba_draw_triangles(
122    AlbaWindow* window,
123    uint32_t num_vertices,
124    const AlbaVector* vertices,
125    const AlbaAttribute* attributes
126);
127
128// Higher level drawing
129void alba_draw_triangle(AlbaWindow* window, const AlbaVector vertices[3], AlbaColor color);
130void alba_draw_quad(AlbaWindow* window, const AlbaVector vertices[4], AlbaColor color);
131void alba_draw_rect_aa(AlbaWindow* window, float x0, float y0, float x1, float y1, AlbaColor color);
132
133void alba_generate_regular_polygon(AlbaArray* array, uint32_t num_sides, float x, float y, float r);
134void alba_generate_circle(AlbaArray* array, float x, float y, float r);
135void alba_generate_rounded_rect_aa(AlbaArray* array, float x0, float y0, float x1, float y1, float r);
136
137void alba_draw_concave_polygon(AlbaWindow* window, float x, float y, const AlbaArray* contour, AlbaColor color);
138void alba_draw_regular_polygon(AlbaWindow* window, uint32_t num_sides, float x, float y, float r, AlbaColor color);
139void alba_draw_circle(AlbaWindow* window, float x, float y, float r, AlbaColor color);
140void alba_draw_rounded_rect_aa(AlbaWindow* window, float x0, float y0, float x1, float y1, float r, AlbaColor color);
141
142// Text drawing
143typedef struct
144{
145    AlbaColor color;
146    uint64_t font_size;
147} AlbaTextStyle;
148
149void alba_draw_text(
150    AlbaWindow* window,
151    AlbaVector pos,
152    AlbaString string,
153    AlbaTextStyle style
154);
155
156#endif // ALBA_H