From 1ef0f4065d9630c1f5339ee1c6fbf5c26a85e745 Mon Sep 17 00:00:00 2001 From: Toad King Date: Sun, 26 Aug 2012 20:33:22 -0400 Subject: [PATCH] (RGUI) add support for loading font from .bin file do not store two separate color buffers for font saves around 400kb --- Makefile.wii | 5 ++++- console/font.bin | Bin 0 -> 1792 bytes console/rgui/rgui.c | 49 +++++++++++++++++++++++++------------------- console/rgui/rgui.h | 2 +- gx/frontend/main.c | 5 +++-- 5 files changed, 36 insertions(+), 25 deletions(-) create mode 100644 console/font.bin diff --git a/Makefile.wii b/Makefile.wii index 46efbe7c57..5a5ae93035 100644 --- a/Makefile.wii +++ b/Makefile.wii @@ -37,7 +37,7 @@ CFLAGS += -Wall -std=gnu99 $(MACHDEP) $(INCLUDE) LDFLAGS := $(MACHDEP) -Wl,-Map,$(notdir $(ELF_TARGET)).map -T gx/ld/rvl.ld LIBS := -lfat -lretro_wii -lwiiuse -logc -lbte -OBJ = console/griffin/griffin.o console/font.bmpobj console/rzlib/rzlib.o +OBJ = console/griffin/griffin.o console/font.binobj console/rzlib/rzlib.o ifeq ($(HAVE_LOGGER), 1) CFLAGS += -DHAVE_LOGGER @@ -73,6 +73,9 @@ $(ELF_TARGET): $(OBJ) %.bmpobj: %.bmp $(LD) -r -b binary -o $@ $< +%.binobj: %.bin + $(LD) -r -b binary -o $@ $< + pkg: all cp -r $(DOL_TARGET) gx/pkg/CORE.dol diff --git a/console/font.bin b/console/font.bin new file mode 100644 index 0000000000000000000000000000000000000000..c232ee499bc4eb3854e734c5e2405f25977b4e29 GIT binary patch literal 1792 zcmd^9zi%8x6n=A@!X||?r-XQsK(~8|6gdSXDIx@t*{tU0 zt3jnVU?r+iXS0 zY1Od0P$7k1CyNG{luZ0UmP2#i@UWj|a#_1_k0y*=AVC(1kuZU*uOwZrp zdp;)y56+6;`b*d>Tj}*VqyC}T3;CXC23y_3%!k+OrRNT4Opc=VYn`Dp~!lK zLhq~>YZ?KGN62;&Wx48Pk)y1qKSk7GHrhg*MD-X+>$uLT5RHBYb|pXV-fpzDyRBFg z{wyIgXs9oAJfPUSarGM_e2dUtn!klJE1Iyv`7vwr4VcyyvS%hFn)-8a8+pgGKCAfR z*7|D=W|x0Jeh529>Evu%k^MSHez|UVp@)`&zbd6V^+Il&8F^uRV7Nz`&Z;$auKg=A*UMwY3 zQ0coG+LyS(GO2$P?W^5qvhUeBhMYHEW1WQt75C=HI;+r*M22l9r%k=X%#1lJ_So_p zL?<^)_lROxUR8Adg-gsVrQGu=?eO545|psSLF8bwCPMqlgNwiNtY9_`rMCV7N?=M@ z6c#y1X_9{)rUWG{a!{Q6GlSb?@qHf3)HSUsK}icI4k8C+nn@KYoxE}DLtH@b;<_ne zQCQ?4cQ1x6?;NU7aqjo^1qBZ>c%}p;EO8Jy*sO_==*zZr0cI2VxuHa4Jex)dAS7m~ z8%k4xk`av@6paA~m@LXr{%3wSUAB+%(?i9*@^5~-E> 3; + + if (col != 0xff) + glyph[offset] |= rem; } } } -static void init_font(rgui_handle_t *rgui, const char *path) +static void init_font(rgui_handle_t *rgui, const uint8_t *font_bmp_buf) { for (unsigned i = 0; i < 256; i++) { unsigned y = i / 16; unsigned x = i % 16; - copy_glyph(rgui->font_white[i], - rgui->font_green[i], - rgui->font_buf + 54 + 3 * (256 * (255 - 16 * y) + 16 * x)); + copy_glyph(rgui->font[i], + font_bmp_buf + 54 + 3 * (256 * (255 - 16 * y) + 16 * x)); } } rgui_handle_t *rgui_init(const char *base_path, - uint16_t *buf, size_t buf_pitch, - const uint8_t *font_buf, + uint16_t *framebuf, size_t framebuf_pitch, + const uint8_t *font_bmp_buf, const uint8_t *font_bin_buf, rgui_folder_enum_cb_t folder_cb, void *userdata) { rgui_handle_t *rgui = (rgui_handle_t*)calloc(1, sizeof(*rgui)); - rgui->frame_buf = buf; - rgui->frame_buf_pitch = buf_pitch; - rgui->font_buf = font_buf; + rgui->frame_buf = framebuf; + rgui->frame_buf_pitch = framebuf_pitch; rgui->folder_cb = folder_cb; rgui->userdata = userdata; @@ -145,7 +143,15 @@ rgui_handle_t *rgui_init(const char *base_path, rgui->folder_buf = rgui_list_new(); rgui_list_push(rgui->path_stack, base_path, RGUI_FILE_DIRECTORY, 0); - init_font(rgui, "font.bmp"); + if (font_bmp_buf) + init_font(rgui, font_bmp_buf); + else if (font_bin_buf) + memcpy(rgui->font, font_bin_buf, sizeof(rgui->font)); + else + { + RARCH_ERR("no font bmp or bin, abort"); + rarch_settings_change(S_QUIT); + } return rgui; } @@ -192,12 +198,13 @@ static void blit_line(rgui_handle_t *rgui, { for (unsigned i = 0; i < FONT_WIDTH; i++) { - uint16_t col = green ? - rgui->font_green[(unsigned char)*message][j][i] : - rgui->font_white[(unsigned char)*message][j][i]; + uint8_t rem = 1 << ((i + j * FONT_WIDTH) & 7); + unsigned offset = (i + j * FONT_WIDTH) >> 3; + bool col = (rgui->font[(unsigned char)*message][offset] & rem); if (col) - rgui->frame_buf[(y + j) * (rgui->frame_buf_pitch >> 2) + (x + i)] = col; + rgui->frame_buf[(y + j) * (rgui->frame_buf_pitch >> 2) + (x + i)] = green ? + (3 << 0) | (10 << 4) | (3 << 8) | (7 << 12) : 0x7FFF; } } diff --git a/console/rgui/rgui.h b/console/rgui/rgui.h index a2065ef53b..7ce3eb79f7 100644 --- a/console/rgui/rgui.h +++ b/console/rgui/rgui.h @@ -104,7 +104,7 @@ typedef bool (*rgui_folder_enum_cb_t)(const char *directory, rgui_handle_t *rgui_init(const char *base_path, uint16_t *framebuf, size_t framebuf_pitch, - const uint8_t *font_buf, + const uint8_t *font_bmp_buf, const uint8_t *font_bin_buf, rgui_folder_enum_cb_t folder_cb, void *userdata); void rgui_iterate(rgui_handle_t *rgui, rgui_action_t action); diff --git a/gx/frontend/main.c b/gx/frontend/main.c index cf181c4f15..887fbdc4cf 100644 --- a/gx/frontend/main.c +++ b/gx/frontend/main.c @@ -130,7 +130,8 @@ enum GX_DEVICE_NAV_LAST }; -extern uint8_t _binary_console_font_bmp_start[]; +//extern uint8_t _binary_console_font_bmp_start[]; +extern uint8_t _binary_console_font_bin_start[]; static bool folder_cb(const char *directory, rgui_file_enum_cb_t file_cb, void *userdata, void *ctx) @@ -321,7 +322,7 @@ static void menu_init(void) { rgui = rgui_init("", menu_framebuf, RGUI_WIDTH * sizeof(uint32_t), - _binary_console_font_bmp_start, folder_cb, NULL); + NULL, _binary_console_font_bin_start, folder_cb, NULL); rgui_iterate(rgui, RGUI_ACTION_REFRESH); g_console.mode_switch = MODE_MENU;