diff --git a/src/backend/sdl.c b/src/backend/sdl.c index 9f74bd9..edc213b 100644 --- a/src/backend/sdl.c +++ b/src/backend/sdl.c @@ -7,6 +7,7 @@ #include "../concurrent/msg.h" #include "../concurrent/msgq.h" #include "../concurrent/pubsub.h" +#include "../geom/graphics.h" #include #include #include @@ -298,17 +299,67 @@ fail: ASSERT(rv == 0, "error: %s", SDL_GetError()); } +/* ----------------------------------------------------------------------------- + * Rendering + * -------------------------------------------------------------------------- */ + +static void draw_clear(SDL_Renderer* r, uint64_t bg); +static void draw_glyph(SDL_Renderer* r, const struct ax_glyph* gl); + static void render_windows(struct window_list* wl) { for (; wl != NULL; wl = wl->next) { - // SDL_Window* sdl_win = wl->handle->win; SDL_Renderer* r = wl->handle->rnd; - SDL_SetRenderDrawColor(r, 255, 255, 255, 255); - SDL_RenderClear(r); + + pthread_mutex_lock(&wl->win->mx); + struct ax_graphics* gr = wl->win->graphics; + draw_clear(r, gr->bg); + for (size_t i = 0; i < ax__graphics_glyph_count(gr); i++) { + draw_glyph(r, ax__graphics_glyph(gr, i)); + } + pthread_mutex_unlock(&wl->win->mx); + SDL_RenderPresent(r); } } +static void draw_set_color(SDL_Renderer* r, uint64_t col) +{ + SDL_SetRenderDrawColor(r, + (col & 0xff0000) >> 16, + (col & 0x00ff00) >> 8, + (col & 0x0000ff) >> 0, + 255); +} + +static void draw_clear(SDL_Renderer* r, uint64_t bg) +{ + draw_set_color(r, bg); + SDL_RenderClear(r); +} + +static void draw_glyph(SDL_Renderer* r, const struct ax_glyph* gl) +{ + switch (gl->ty) { + case AX_GLYPH_RECT: + draw_set_color(r, gl->d.rect.f); + SDL_RenderFillRect(r, &(SDL_Rect) { + .x = gl->d.rect.x, + .y = gl->d.rect.y, + .w = gl->d.rect.w, + .h = gl->d.rect.h + }); + break; + + default: { + enum ax_glyph_type val = gl->ty; + const char* str; +#include "../../_build/glyph.printer.inc" + ASSERT(0, "unimplemented glyph type `%s'", str); + } + } +} + /* ----------------------------------------------------------------------------- * Event handling * -------------------------------------------------------------------------- */ diff --git a/test/main.c b/test/main.c index 346d72b..9db0810 100644 --- a/test/main.c +++ b/test/main.c @@ -35,7 +35,7 @@ static struct ax_window* make_window() { ax_begin_window(ax); ax_set_window_title(ax, "Test App"); - ax_set_window_size(ax, 1000, 400, false); + ax_set_window_size(ax, 800, 600, false); return ax_end_window(ax); }