From f657344d858988c259c5ff6ffeffd982d393da97 Mon Sep 17 00:00:00 2001 From: jdgleaver Date: Fri, 11 Dec 2020 17:26:39 +0000 Subject: [PATCH] (OpenDingux/sdl_dingux_gfx) OSD font clean-up --- gfx/drivers/sdl_dingux_gfx.c | 55 ++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/gfx/drivers/sdl_dingux_gfx.c b/gfx/drivers/sdl_dingux_gfx.c index 85ff74b282..e232a5aaed 100644 --- a/gfx/drivers/sdl_dingux_gfx.c +++ b/gfx/drivers/sdl_dingux_gfx.c @@ -57,6 +57,7 @@ typedef struct sdl_dingux_video { retro_time_t last_frame_time; SDL_Surface *screen; + bitmapfont_lut_t *osd_font; unsigned frame_width; unsigned frame_height; unsigned frame_padding; @@ -64,7 +65,6 @@ typedef struct sdl_dingux_video uint32_t font_colour32; uint16_t font_colour16; uint16_t menu_texture[SDL_DINGUX_MENU_WIDTH * SDL_DINGUX_MENU_HEIGHT]; - bool font_lut[SDL_DINGUX_NUM_FONT_GLYPHS][FONT_WIDTH * FONT_HEIGHT]; bool rgb32; bool vsync; bool keep_aspect; @@ -100,32 +100,6 @@ static void sdl_dingux_init_font_color(sdl_dingux_video_t *vid) vid->font_colour16 = (red << 11) | (green << 6) | blue; } -static void sdl_dingux_init_font_lut(sdl_dingux_video_t *vid) -{ - size_t symbol_index; - size_t i, j; - - /* Loop over all possible characters */ - for (symbol_index = 0; - symbol_index < SDL_DINGUX_NUM_FONT_GLYPHS; - symbol_index++) - { - for (j = 0; j < FONT_HEIGHT; j++) - { - for (i = 0; i < FONT_WIDTH; i++) - { - uint8_t rem = 1 << ((i + j * FONT_WIDTH) & 7); - unsigned offset = (i + j * FONT_WIDTH) >> 3; - - /* LUT value is 'true' if specified glyph - * position contains a pixel */ - vid->font_lut[symbol_index][i + (j * FONT_WIDTH)] = - (bitmap_bin[FONT_OFFSET(symbol_index) + offset] & rem) > 0; - } - } - } -} - static void sdl_dingux_blit_text16( sdl_dingux_video_t *vid, unsigned x, unsigned y, @@ -135,6 +109,7 @@ static void sdl_dingux_blit_text16( * (padding region is never cleared, so * any text pixels would remain as garbage) */ uint16_t *screen_buf = (uint16_t*)vid->screen->pixels; + bool **font_lut = vid->osd_font->lut; /* 16 bit - divide pitch by 2 */ uint16_t screen_stride = (uint16_t)(vid->screen->pitch >> 1); uint16_t screen_width = vid->screen->w; @@ -163,6 +138,7 @@ static void sdl_dingux_blit_text16( else { uint16_t i, j; + bool *symbol_lut; uint32_t symbol = utf8_walk(&str); /* Stupid hack: 'oe' ligatures are not really @@ -177,13 +153,15 @@ static void sdl_dingux_blit_text16( if (symbol >= SDL_DINGUX_NUM_FONT_GLYPHS) continue; + symbol_lut = font_lut[symbol]; + for (j = 0; j < FONT_HEIGHT; j++) { uint32_t buff_offset = ((y + j) * screen_stride) + x_pos; for (i = 0; i < FONT_WIDTH; i++) { - if (vid->font_lut[symbol][i + (j * FONT_WIDTH)]) + if (*(symbol_lut + i + (j * FONT_WIDTH))) { uint16_t *screen_buf_ptr = screen_buf + buff_offset + i; @@ -211,6 +189,7 @@ static void sdl_dingux_blit_text32( * (padding region is never cleared, so * any text pixels would remain as garbage) */ uint32_t *screen_buf = (uint32_t*)vid->screen->pixels; + bool **font_lut = vid->osd_font->lut; /* 32 bit - divide pitch by 4 */ uint32_t screen_stride = (uint32_t)(vid->screen->pitch >> 2); uint32_t screen_width = vid->screen->w; @@ -239,6 +218,7 @@ static void sdl_dingux_blit_text32( else { uint32_t i, j; + bool *symbol_lut; uint32_t symbol = utf8_walk(&str); /* Stupid hack: 'oe' ligatures are not really @@ -253,13 +233,15 @@ static void sdl_dingux_blit_text32( if (symbol >= SDL_DINGUX_NUM_FONT_GLYPHS) continue; + symbol_lut = font_lut[symbol]; + for (j = 0; j < FONT_HEIGHT; j++) { uint32_t buff_offset = ((y + j) * screen_stride) + x_pos; for (i = 0; i < FONT_WIDTH; i++) { - if (vid->font_lut[symbol][i + (j * FONT_WIDTH)]) + if (*(symbol_lut + i + (j * FONT_WIDTH))) { uint32_t *screen_buf_ptr = screen_buf + buff_offset + i; @@ -339,6 +321,9 @@ static void sdl_dingux_gfx_free(void *data) if (vid->filter_type != DINGUX_IPU_FILTER_BICUBIC) dingux_ipu_set_filter_type(DINGUX_IPU_FILTER_BICUBIC); + if (vid->osd_font) + bitmapfont_free_lut(vid->osd_font); + free(vid); } @@ -472,8 +457,18 @@ static void *sdl_dingux_gfx_init(const video_info_t *video, sdl_dingux_input_driver_init(input_driver_name, joypad_driver_name, input, input_data); + /* Initialise OSD font */ sdl_dingux_init_font_color(vid); - sdl_dingux_init_font_lut(vid); + + vid->osd_font = bitmapfont_get_lut(); + + if (!vid->osd_font || + vid->osd_font->glyph_max < + (SDL_DINGUX_NUM_FONT_GLYPHS - 1)) + { + RARCH_ERR("[SDL1]: Failed to init OSD font\n"); + goto error; + } return vid;