diff --git a/src/backend.h b/src/backend.h index 1937141..3921899 100644 --- a/src/backend.h +++ b/src/backend.h @@ -9,6 +9,8 @@ struct msgq; struct ax_backend; struct ax_theme; +struct ax_font_h; + extern const char* ax__backend_impl_name; extern size_t ax__backend_desired_region_size; diff --git a/src/backend/sdl.c b/src/backend/sdl.c index 67107d0..221a7d6 100644 --- a/src/backend/sdl.c +++ b/src/backend/sdl.c @@ -12,10 +12,11 @@ * -------------------------------------------------------------------------- */ const char* ax__backend_impl_name = "SDL"; -size_t ax__backend_desired_region_size = SMALL; +size_t ax__backend_desired_region_size = MEDIUM; struct ax_backend { - struct msgq* mq; + struct rgn* rgn; + struct msgq* inbox; bool shutdown; }; @@ -43,7 +44,8 @@ int ax__backend_new( struct ax_backend* bac = ralloc_typed(init_rgn, struct ax_backend, 1); rgn_pin(init_rgn, bac, (void*) backend_cleanup); - bac->mq = msgq_new(init_rgn); + bac->rgn = init_rgn; + bac->inbox = msgq_new(init_rgn); bac->shutdown = false; if (out_bac != NULL) { @@ -68,7 +70,7 @@ static void backend_cleanup(struct ax_backend* bac) struct msgq* ax__backend_msgq(struct ax_backend* bac) { - return bac->mq; + return bac->inbox; } bool ax__backend_is_shutdown(struct ax_backend* bac) @@ -82,11 +84,29 @@ void ax__backend_wait_for_event(struct ax_backend* bac) usleep(1000 * 1000); } +/* ----------------------------------------------------------------------------- + * Event handling + * -------------------------------------------------------------------------- */ + +struct font_list { + struct font_list* next; + struct ax_theme* thm; + size_t cat; + struct msgq* cb_mq; +}; + +static void load_fonts( + struct ax_backend* bac, struct font_list* fonts); + void ax__backend_step(struct ax_backend* bac) { - msgq_begin_recv(bac->mq); + struct rgn tmp_rgn; + rgn_init(&tmp_rgn, SMALL); + struct font_list* fonts = NULL; - MSGQ_RECV_ALL(bac->mq) { + msgq_begin_recv(bac->inbox); + + MSGQ_RECV_ALL(bac->inbox) { ON(ax_msg_shutdown, { @@ -97,22 +117,53 @@ void ax__backend_step(struct ax_backend* bac) ON(ax_msg_load_font, { - printf("TODO: load font `%s' (size %zu)\n", - m.theme->font_path[m.category], - m.theme->font_size[m.category]); - - m.theme->font_loaded[m.category] = true; - if (ax__theme_is_loaded(m.theme)) { - struct ax_msg_theme_loaded* res = - msgq_begin_send_typed(m.callback_mq, ax_msg_theme_loaded); - res->theme = m.theme; - msgq_end_send(m.callback_mq); - } + struct font_list* l = + ralloc_typed(&tmp_rgn, struct font_list, 1); + l->next = fonts; + l->thm = m.theme; + l->cat = m.category; + l->cb_mq = m.callback_mq; + fonts = l; break; }); default: break; } - msgq_end_recv(bac->mq); + msgq_end_recv(bac->inbox); + + load_fonts(bac, fonts); + + rgn_cleanup(&tmp_rgn); +} + +/* ----------------------------------------------------------------------------- + * Fonts + * -------------------------------------------------------------------------- */ + +struct ax_font_h { + TTF_Font* font; +}; + +static void load_fonts( + struct ax_backend* bac, + struct font_list* fl) +{ + for (; fl != NULL; fl = fl->next) { + struct ax_theme* thm = fl->thm; + struct msgq* cb_mq = fl->cb_mq; + const char* path = thm->font_path[fl->cat]; + size_t size = thm->font_size[fl->cat]; + + struct ax_font_h* handle = ralloc_typed(bac->rgn, struct ax_font_h, 1); + handle->font = TTF_OpenFont(path, size); + thm->font_handle[fl->cat] = handle; + + if (ax__theme_is_loaded(thm)) { + struct ax_msg_theme_loaded* m = + msgq_begin_send_typed(cb_mq, ax_msg_theme_loaded); + m->theme = thm; + msgq_end_send(cb_mq); + } + } } diff --git a/src/ctxt/theme.c b/src/ctxt/theme.c index 0791662..cdd4f55 100644 --- a/src/ctxt/theme.c +++ b/src/ctxt/theme.c @@ -29,7 +29,7 @@ static void theme_init(struct ax_theme* thm) for (size_t i = 0; i < AX_FONT__COUNT; i++) { thm->font_path[i] = NULL; - thm->font_loaded[i] = false; + thm->font_handle[i] = NULL; } thm->font_size[AX_FONT_H1] = 96; diff --git a/src/ctxt/theme.h b/src/ctxt/theme.h index b0f9765..5ceaaa4 100644 --- a/src/ctxt/theme.h +++ b/src/ctxt/theme.h @@ -34,12 +34,14 @@ enum ax_font_cat { AX_FONT__DEFAULT, }; +struct ax_font_h; // defined by backend + struct ax_theme { const char* fatal_err; int64_t colors[AX_COLOR__COUNT]; const char* font_path[AX_FONT__COUNT]; size_t font_size[AX_FONT__COUNT]; - bool font_loaded[AX_FONT__COUNT]; + struct ax_font_h* font_handle[AX_FONT__COUNT]; }; struct ax_theme_builder { @@ -82,7 +84,7 @@ static inline bool ax__theme_is_loaded( struct ax_theme* thm) { for (size_t i = 0; i < AX_FONT__COUNT; i++) { - if (!thm->font_loaded[i]) { + if (thm->font_handle[i] == NULL) { return false; } }