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