fn_wasm_import void wasm_clear(void); fn_wasm_import void wasm_draw_text(isize str, i32 len, f32 x, f32 y, isize font_str, i32 font_len, i32 font_size, f32 r, f32 g, f32 b, f32 a); fn_wasm_import void wasm_draw_rect(f32 x, f32 y, f32 w, f32 h, f32 r, f32 g, f32 b, f32 a); fn_wasm_import f32 wasm_measure_text(isize str, i32 len, isize font_str, i32 font_len, i32 font_size); fn_wasm_import void wasm_set_clip(f32 x, f32 y, f32 w, f32 h); gb_read_only s8_t font_face = s8_const_lit("main_font"); typedef struct rn_font_t rn_font_t; struct rn_font_t { f32 size; }; typedef struct rn_state_t rn_state_t; struct rn_state_t { rn_font_t *main_font; app_frame_t *frame; }; rn_state_t rn_state; fn void rn_reload_font(f32 font_size, f32 dpr) { rn_state.main_font->size = font_size * dpr; } fn void rn_init(ma_arena_t *perm, f32 font_size, f32 dpr) { rn_state.main_font = ma_push_type(perm, rn_font_t); rn_reload_font(font_size, dpr); } fn void rn_draw_rect(r2f32_t rect, v4f32_t color) { wasm_draw_rect(rect.min.x, rect.min.y, (rect.max.x - rect.min.x), (rect.max.y - rect.min.y), color.r * 255.f, color.g * 255.f, color.b * 255.f, color.a); } fn void rn_draw_rect_border(r2f32_t rect, v4f32_t color, f32 border_thickness) { r2f32_t left = r2f32_cut_left(&rect, border_thickness); r2f32_t right = r2f32_cut_right(&rect, border_thickness); r2f32_t top = r2f32_cut_top(&rect, border_thickness); r2f32_t bottom = r2f32_cut_bottom(&rect, border_thickness); rn_draw_rect(left, color); rn_draw_rect(right, color); rn_draw_rect(top, color); rn_draw_rect(bottom, color); } fn v2f32_t rn_measure_string(rn_font_t *font, s8_t string) { f32 x = wasm_measure_text((isize)string.str, string.len, (isize) font_face.str, font_face.len, rn_state.main_font->size); return (v2f32_t){x, rn_state.main_font->size}; } fn v2f32_t rn_draw_string(rn_font_t *font, v2f32_t pos, v4f32_t color, s8_t string) { wasm_draw_text((isize)string.str, string.len, pos.x, pos.y, (isize) font_face.str, font_face.len, rn_state.main_font->size, color.r * 255.f, color.g * 255.f, color.b * 255.f, color.a); v2f32_t size = rn_measure_string(font, string); return size; } fn v2f32_t rn_draw_stringf(rn_font_t *font, v2f32_t pos, v4f32_t color, char *str, ...) { S8_FMT(tcx.temp, str, string); return rn_draw_string(font, pos, color, string); } fn void rn_set_clip(r2f32_t rect) { wasm_set_clip(rect.min.x, rect.min.y, (rect.max.x - rect.min.x), (rect.max.y - rect.min.y)); } fn void rn_begin(app_frame_t *frame, v4f32_t clear_color) { rn_state.frame = frame; r2f32_t window_rect = r2f32(0, 0, rn_state.frame->window_size.x, rn_state.frame->window_size.y); wasm_clear(); rn_draw_rect(window_rect, clear_color); } fn void rn_end() { }