summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorRoberto Esteves <contact@robertoesteves.dev>2026-01-05 14:11:50 +0000
committerRoberto Esteves <contact@robertoesteves.dev>2026-01-05 14:11:50 +0000
commit52c6a7635056ee78d282ba2a55eb26f2663bb577 (patch)
tree9d37d851e63e96e53ef3836321f03d4f2839edef /include
parentda12440cabe270584ff650703e90db540d2ec4c9 (diff)
refactor some stuff:HEADmaster
- add meson build system - refactor executable to be a test - remove stdlib from base library
Diffstat (limited to 'include')
-rw-r--r--include/rgl.h148
1 files changed, 148 insertions, 0 deletions
diff --git a/include/rgl.h b/include/rgl.h
new file mode 100644
index 0000000..ac69ed0
--- /dev/null
+++ b/include/rgl.h
@@ -0,0 +1,148 @@
+#ifndef RGL_H
+#define RGL_H
+
+#ifdef RGL_DEBUG
+
+static char *ERROR_MESSAGE;
+
+#define RGL_CRASH(text) \
+ do { \
+ ERROR_MESSAGE = text; \
+ __builtin_trap(); \
+ } while (0)
+
+#define RGL_ASSERT(cond, text) \
+ if (!(cond)) { \
+ RGL_CRASH(text); \
+ }
+
+#else
+
+#define RGL_CRASH(text)
+#define RGL_ASSERT(cond, text)
+
+#endif
+
+static int RGL_ABS(int n) {
+ return n < 0 ? -n : n;
+}
+
+/* Memory */
+
+typedef struct {
+ unsigned int size;
+ unsigned int capacity;
+
+ unsigned char *data;
+} RGL_Arena;
+
+void *RGL_ArenaAlloc(RGL_Arena *arena, unsigned int size);
+
+unsigned int RGL_ArenaCheckpoint(RGL_Arena *arena);
+
+void RGL_ArenaRollback(RGL_Arena *arena, unsigned int checkpoint);
+
+void RGL_ArenaReset(RGL_Arena *arena);
+
+/* Math */
+
+typedef unsigned int RGL_Fixed;
+
+#define RGL_SUBPIXEL_SHIFT 8
+#define RGL_SUBPIXEL_SCALE 256
+#define RGL_SUBPIXEL_MASK 255
+
+static RGL_Fixed RGL_GetFixedI(int x) {
+ return (RGL_Fixed)(x << RGL_SUBPIXEL_SHIFT);
+}
+
+static RGL_Fixed RGL_GetFixedF(float x) {
+ return (RGL_Fixed)(x * RGL_SUBPIXEL_SCALE);
+}
+
+static RGL_Fixed RGL_GetFixedD(double x) {
+ return (RGL_Fixed)(x * RGL_SUBPIXEL_SCALE);
+}
+
+static int RGL_FixedToInt(RGL_Fixed x) {
+ return x >> RGL_SUBPIXEL_SHIFT;
+}
+
+static RGL_Fixed RGL_FixedMul(RGL_Fixed a, RGL_Fixed b) {
+ return (RGL_Fixed)(((long int)a * b) >> RGL_SUBPIXEL_SHIFT);
+}
+
+/* Graphics */
+
+typedef unsigned int RGL_Color;
+
+#define RGL_COLOR(a, r, g, b) \
+ ((RGL_Color)((a << 24) | (r << 16) | (g << 8) | b))
+
+typedef struct {
+ unsigned int width, height;
+ unsigned int *data;
+} RGL_Buffer;
+
+typedef struct {
+ RGL_Color color;
+ unsigned int x, y, width, height;
+} RGL_Rectangle;
+
+typedef struct {
+ RGL_Fixed x, y;
+} RGL_Point;
+
+typedef enum { PathStroke, PathFill } RGL_PathVerb;
+
+typedef struct {
+ RGL_PathVerb verb;
+ unsigned int size;
+ RGL_Color color;
+} RGL_PathHeader;
+
+typedef enum {
+ Rect,
+ Path,
+} RGL_CommandType;
+
+typedef struct {
+ RGL_CommandType type;
+ union {
+ RGL_Rectangle rect;
+ RGL_PathHeader path;
+ } data;
+} RGL_Command;
+
+typedef struct {
+ RGL_Arena arena;
+ unsigned int size;
+
+ RGL_Command *commands;
+} RGL_CommandQueue;
+
+typedef struct {
+ RGL_Color color;
+ RGL_CommandQueue queue;
+
+ RGL_Command *current;
+} RGL_Context;
+
+void RGL_Rect(RGL_Context *ctx, unsigned int x, unsigned int y,
+ unsigned int width, unsigned int height);
+
+void RGL_BeginPath(RGL_Context *ctx, RGL_PathVerb verb);
+
+void RGL_PathMoveTo(RGL_Context *ctx, int x, int y);
+
+void RGL_EndPath(RGL_Context *ctx);
+
+void RGL_DrawRect(RGL_Buffer *buf, RGL_Command *cmd);
+
+void RGL_DrawStroke(RGL_Buffer *buf, RGL_PathHeader *path, RGL_Point *points);
+
+void RGL_DrawPath(RGL_Buffer *buf, RGL_PathHeader *path, RGL_Point *points);
+
+void RGL_Draw(RGL_Context *ctx, RGL_Buffer *buf);
+
+#endif