From f15ca4db35a3466cc59b796c2a5d8b963721a02c Mon Sep 17 00:00:00 2001 From: notaz Date: Mon, 11 May 2009 19:34:00 +0000 Subject: [PATCH] quick support for doeblesize 'small' font git-svn-id: file:///home/notaz/opt/svn/PicoDrive/platform@689 be3aeb3a-fb24-0410-a615-afba39da0efa --- common/menu.c | 106 ++++++++++++++++++++++++++++--------------------- common/posix.h | 6 ++- 2 files changed, 65 insertions(+), 47 deletions(-) diff --git a/common/menu.c b/common/menu.c index c2e18fa..b4a76cc 100644 --- a/common/menu.c +++ b/common/menu.c @@ -33,10 +33,14 @@ static int menu_error_time = 0; static unsigned char *menu_font_data = NULL; static int menu_text_color = 0xffff; // default to white static int menu_sel_color = -1; // disabled + +/* note: these might become non-constant in future */ #if MENU_X2 static const int me_mfont_w = 16, me_mfont_h = 20; +static const int me_sfont_w = 12, me_sfont_h = 20; #else static const int me_mfont_w = 8, me_mfont_h = 10; +static const int me_sfont_w = 6, me_sfont_h = 10; #endif // draws text to current bbp16 screen @@ -113,35 +117,41 @@ void text_out16(int x, int y, const char *texto, ...) text_out16_(x,y,buffer,menu_text_color); } - +/* draws in 6x8 font, might multiply size by integer */ static void smalltext_out16_(int x, int y, const char *texto, int color) { - int i; unsigned char *src; unsigned short *dst; + int multiplier = me_sfont_w / 6; + int i; - for (i = 0;; i++, x += 6) + for (i = 0;; i++, x += me_sfont_w) { unsigned char c = (unsigned char) texto[i]; int h = 8; - if (!c) break; + if (!c || c == '\n') + break; src = fontdata6x8[c]; dst = (unsigned short *)g_screen_ptr + x + y * g_screen_width; while (h--) { - int w = 0x20; - while (w) + int m, w2, h2; + for (h2 = multiplier; h2 > 0; h2--) { - if( *src & w ) *dst = color; - dst++; - w>>=1; + for (m = 0x20; m; m >>= 1) { + if (*src & m) + for (w2 = multiplier; w2 > 0; w2--) + *dst++ = color; + else + dst += multiplier; + } + + dst += g_screen_width - me_sfont_w; } src++; - - dst += g_screen_width - 6; } } } @@ -585,15 +595,15 @@ static void cdload_progress_cb(int percent) int ln, len = percent * g_screen_width / 100; unsigned short *dst = (unsigned short *)g_screen_ptr + g_screen_width * 10 * 2; - memset(dst, 0xff, g_screen_width * (10 - 2) * 2); + memset(dst, 0xff, g_screen_width * (me_sfont_h - 2) * 2); - smalltext_out16(1, 3 * 10, "Processing CD image / MP3s", 0xffff); - smalltext_out16(1, 4 * 10, rom_fname_loaded, 0xffff); - dst += g_screen_width * 30; + smalltext_out16(1, 3 * me_sfont_h, "Processing CD image / MP3s", 0xffff); + smalltext_out16(1, 4 * me_sfont_h, rom_fname_loaded, 0xffff); + dst += g_screen_width * me_sfont_h * 3; if (len > g_screen_width) len = g_screen_width; - for (ln = (10 - 2); ln > 0; ln--, dst += g_screen_width) + for (ln = (me_sfont_h - 2); ln > 0; ln--, dst += g_screen_width) memset(dst, 0xff, len * 2); plat_video_menu_end(); @@ -610,12 +620,12 @@ void menu_romload_prepare(const char *rom_name) /* fill both buffers, callbacks won't update in full */ plat_video_menu_begin(); smalltext_out16(1, 1, "Loading", 0xffff); - smalltext_out16(1, 10, p, 0xffff); + smalltext_out16(1, me_sfont_h, p, 0xffff); plat_video_menu_end(); plat_video_menu_begin(); smalltext_out16(1, 1, "Loading", 0xffff); - smalltext_out16(1, 10, p, 0xffff); + smalltext_out16(1, me_sfont_h, p, 0xffff); plat_video_menu_end(); PicoCartLoadProgressCB = load_progress_cb; @@ -626,7 +636,7 @@ void menu_romload_prepare(const char *rom_name) void menu_romload_end(void) { PicoCartLoadProgressCB = PicoCDLoadProgressCB = NULL; - smalltext_out16(1, (cdload_called ? 6 : 3) * 10, + smalltext_out16(1, (cdload_called ? 6 : 3) * me_sfont_h, "Starting emulation...", 0xffff); plat_video_menu_end(); } @@ -651,9 +661,9 @@ static unsigned short file2color(const char *fname) static void draw_dirlist(char *curdir, struct dirent **namelist, int n, int sel) { - int max_cnt, start, i, pos; + int max_cnt, start, i, x, pos; - max_cnt = g_screen_height / 10; + max_cnt = g_screen_height / me_sfont_h; start = max_cnt / 2 - sel; n--; // exclude current dir (".") @@ -664,21 +674,22 @@ static void draw_dirlist(char *curdir, struct dirent **namelist, int n, int sel) menu_darken_bg((short *)g_screen_ptr + g_screen_width * max_cnt/2 * 10, g_screen_width * 8, 0); + x = 5 + me_mfont_w + 1; if (start - 2 >= 0) - smalltext_out16(14, (start - 2)*10, curdir, 0xffff); + smalltext_out16(14, (start - 2) * me_sfont_h, curdir, 0xffff); for (i = 0; i < n; i++) { pos = start + i; if (pos < 0) continue; if (pos >= max_cnt) break; if (namelist[i+1]->d_type == DT_DIR) { - smalltext_out16(14, pos*10, "/", 0xfff6); - smalltext_out16(14+6, pos*10, namelist[i+1]->d_name, 0xfff6); + smalltext_out16(x, pos * me_sfont_h, "/", 0xfff6); + smalltext_out16(x + me_sfont_w, pos * me_sfont_h, namelist[i+1]->d_name, 0xfff6); } else { unsigned short color = file2color(namelist[i+1]->d_name); - smalltext_out16(14, pos*10, namelist[i+1]->d_name, color); + smalltext_out16(x, pos * me_sfont_h, namelist[i+1]->d_name, color); } } - smalltext_out16(5, max_cnt/2 * 10, ">", 0xffff); + smalltext_out16(5, max_cnt/2 * me_sfont_h, ">", 0xffff); plat_video_menu_end(); } @@ -855,14 +866,14 @@ static void draw_patchlist(int sel) if (pos < 0) continue; if (pos >= max_cnt) break; active = PicoPatches[i].active; - smalltext_out16(14, pos*10, active ? "ON " : "OFF", active ? 0xfff6 : 0xffff); - smalltext_out16(14+6*4, pos*10, PicoPatches[i].name, active ? 0xfff6 : 0xffff); + smalltext_out16(14, pos * me_sfont_h, active ? "ON " : "OFF", active ? 0xfff6 : 0xffff); + smalltext_out16(14+6*4, pos * me_sfont_h, PicoPatches[i].name, active ? 0xfff6 : 0xffff); } pos = start + i; if (pos < max_cnt) - smalltext_out16(14, pos * 10, "done", 0xffff); + smalltext_out16(14, pos * me_sfont_h, "done", 0xffff); - text_out16(5, max_cnt / 2 * 10, ">"); + text_out16(5, max_cnt / 2 * me_sfont_h, ">"); plat_video_menu_end(); } @@ -965,7 +976,7 @@ static void draw_savestate_menu(int menu_sel, int is_loading) if (state_slot_flags & (1 << menu_sel)) draw_savestate_bg(menu_sel); - w = 13 * me_mfont_w + me_mfont_w * 2; + w = (13 + 2) * me_mfont_w; h = (1+2+10+1) * me_mfont_h; x = g_screen_width / 2 - w / 2; if (x < 0) x = 0; @@ -1048,6 +1059,7 @@ static char *action_binds(int player_idx, int action_mask, int dev_id) for (k = 0; k < count; k++) { const char *xname; + int len; if (!(binds[k] & action_mask)) continue; @@ -1055,9 +1067,12 @@ static char *action_binds(int player_idx, int action_mask, int dev_id) continue; xname = in_get_key_name(dev_id, k); - if (static_buff[0]) - strncat(static_buff, " + ", sizeof(static_buff)); - strncat(static_buff, xname, sizeof(static_buff)); + len = strlen(static_buff); + if (len) { + strncat(static_buff, " + ", sizeof(static_buff) - len - 1); + len += 3; + } + strncat(static_buff, xname, sizeof(static_buff) - len - 1); } return static_buff; @@ -1677,9 +1692,6 @@ static int menu_loop_options(menu_id id, int keys) // ------------ debug menu ------------ -#include -#include - #include extern void SekStepM68k(void); @@ -1707,17 +1719,21 @@ static void draw_text_debug(const char *str, int skip, int from) p = str; while (skip-- > 0) { - while (*p && *p != '\n') p++; - if (*p == 0 || p[1] == 0) return; + while (*p && *p != '\n') + p++; + if (*p == 0 || p[1] == 0) + return; p++; } str = p; - for (line = from; line < g_screen_height / 10; line++) + for (line = from; line < g_screen_height / me_sfont_h; line++) { - while (*p && *p != '\n') p++; - smalltext_out16(1, line*10, str, 0xffff); - if (*p == 0) break; + smalltext_out16(1, line * me_sfont_h, str, 0xffff); + while (*p && *p != '\n') + p++; + if (*p == 0) + break; p++; str = p; } } @@ -1732,7 +1748,7 @@ static void draw_frame_debug(void) memset(g_screen_ptr, 0, g_screen_width * g_screen_height * 2); emu_forcedFrame(0); - smalltext_out16(4, g_screen_height - 8, layer_str, 0xffff); + smalltext_out16(4, g_screen_height - me_sfont_h, layer_str, 0xffff); } static void debug_menu_loop(void) @@ -1750,7 +1766,7 @@ static void debug_menu_loop(void) emu_platformDebugCat(tmp); draw_text_debug(tmp, 0, 0); if (dumped) { - smalltext_out16(g_screen_width - 6 * me_mfont_h, + smalltext_out16(g_screen_width - 6 * me_sfont_h, g_screen_height - me_mfont_h, "dumped", 0xffff); dumped = 0; } diff --git a/common/posix.h b/common/posix.h index 9100141..2c2d98d 100644 --- a/common/posix.h +++ b/common/posix.h @@ -1,12 +1,14 @@ -/* define POSIX stuff: dirent, scandir, getcwd */ +/* define POSIX stuff: dirent, scandir, getcwd, mkdir */ #if defined(__linux__) #include #include +#include +#include #else -#error "must define dirent" +#error "must provide posix" #endif -- 2.39.2