X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=gp2x%2Fmenu.c;h=a8d1f9e742ace69b32902ca31fce5167d3cd50cf;hb=c7a4ff64287b12487c7e9cc13ce3b7d2aa6e1f06;hp=71ddf688980421b9923e940d7d449caac3122625;hpb=51b55351d2f99c460670e90fdbf1bf8290f8a04f;p=libpicofe.git diff --git a/gp2x/menu.c b/gp2x/menu.c index 71ddf68..a8d1f9e 100644 --- a/gp2x/menu.c +++ b/gp2x/menu.c @@ -13,10 +13,10 @@ #include "gp2x.h" #include "emu.h" #include "menu.h" -#include "fonts.h" #include "usbjoy.h" -#include "asmutils.h" -#include "readpng.h" +#include "../common/arm_utils.h" +#include "../common/menu.h" +#include "../common/readpng.h" #include "version.h" #include @@ -33,389 +33,18 @@ extern int mmuhack_status; extern int state_slot; extern int config_slot, config_slot_current; -static unsigned char menu_font_data[10240]; -static char *gp2xKeyNames[] = { +static const char *gp2xKeyNames[] = { "UP", "???", "LEFT", "???", "DOWN", "???", "RIGHT", "???", "START", "SELECT", "L", "R", "A", "B", "X", "Y", "???", "???", "???", "???", "???", "???", "VOL DOWN", "VOL UP", "???", "???", "???", "PUSH", "???", "???", "???", "???" }; -static int menu_text_color = 0xffff; // default to white -static int menu_sel_color = -1; // disabled char menuErrorMsg[40] = {0, }; static void menu_darken_bg(void *dst, int pixels, int darker); static void menu_prepare_bg(int use_game_bg); -// draws text to current bbp16 screen -static void text_out16_(int x, int y, const char *text, int color) -{ - int i, l, u, tr, tg, tb, len; - unsigned short *dest = (unsigned short *)gp2x_screen + x + y*320; - tr = (color & 0xf800) >> 8; - tg = (color & 0x07e0) >> 3; - tb = (color & 0x001f) << 3; - - if (text == (void *)1) - { - // selector symbol - text = ""; - len = 1; - } - else - len = strlen(text); - - for (i = 0; i < len; i++) - { - unsigned char *src = menu_font_data + (unsigned int)text[i]*4*10; - unsigned short *dst = dest; - for (l = 0; l < 10; l++, dst += 320-8) - { - for (u = 8/2; u > 0; u--, src++) - { - int c, r, g, b; - c = *src >> 4; - r = (*dst & 0xf800) >> 8; - g = (*dst & 0x07e0) >> 3; - b = (*dst & 0x001f) << 3; - r = (c^0xf)*r/15 + c*tr/15; - g = (c^0xf)*g/15 + c*tg/15; - b = (c^0xf)*b/15 + c*tb/15; - *dst++ = ((r<<8)&0xf800) | ((g<<3)&0x07e0) | (b>>3); - c = *src & 0xf; - r = (*dst & 0xf800) >> 8; - g = (*dst & 0x07e0) >> 3; - b = (*dst & 0x001f) << 3; - r = (c^0xf)*r/15 + c*tr/15; - g = (c^0xf)*g/15 + c*tg/15; - b = (c^0xf)*b/15 + c*tb/15; - *dst++ = ((r<<8)&0xf800) | ((g<<3)&0x07e0) | (b>>3); - } - } - dest += 8; - } -} - -void text_out16(int x, int y, const char *texto, ...) -{ - va_list args; - char buffer[512]; - - va_start(args,texto); - vsprintf(buffer,texto,args); - va_end(args); - - text_out16_(x,y,buffer,menu_text_color); -} - - -static void smalltext_out16(int x, int y, const char *texto, int color) -{ - int i; - unsigned char *src; - unsigned short *dst; - - for (i = 0;; i++, x += 6) - { - unsigned char c = (unsigned char) texto[i]; - int h = 8; - - if (!c) break; - - src = fontdata6x8[c]; - dst = (unsigned short *)gp2x_screen + x + y*320; - - while (h--) - { - int w = 0x20; - while (w) - { - if( *src & w ) *dst = color; - dst++; - w>>=1; - } - src++; - - dst += 320-6; - } - } -} - -static void smalltext_out16_lim(int x, int y, const char *texto, int color, int max) -{ - char buffer[320/6+1]; - - strncpy(buffer, texto, 320/6); - if (max > 320/6) max = 320/6; - if (max < 0) max = 0; - buffer[max] = 0; - - smalltext_out16(x, y, buffer, color); -} - -static void draw_selection(int x, int y, int w) -{ - int i, h; - unsigned short *dst, *dest; - - text_out16_(x, y, (void *)1, (menu_sel_color < 0) ? menu_text_color : menu_sel_color); - - if (menu_sel_color < 0) return; // no selection hilight - - if (y > 0) y--; - dest = (unsigned short *)gp2x_screen + x + y*320 + 14; - for (h = 11; h > 0; h--) - { - dst = dest; - for (i = w; i > 0; i--) - *dst++ = menu_sel_color; - dest += 320; - } -} - -static void menu_flip(void) -{ - gp2x_video_flush_cache(); - gp2x_video_flip2(); -} - - -typedef enum -{ - MB_NONE = 1, /* no auto processing */ - MB_ONOFF, /* ON/OFF setting */ - MB_RANGE, /* [min-max] setting */ -} menu_behavior; - -typedef enum -{ - MA_NONE = 1, - MA_MAIN_RESUME_GAME, - MA_MAIN_SAVE_STATE, - MA_MAIN_LOAD_STATE, - MA_MAIN_RESET_GAME, - MA_MAIN_LOAD_ROM, - MA_MAIN_OPTIONS, - MA_MAIN_CONTROLS, - MA_MAIN_CREDITS, - MA_MAIN_PATCHES, - MA_MAIN_EXIT, - MA_OPT_RENDERER, - MA_OPT_SCALING, - MA_OPT_ACC_TIMING, - MA_OPT_ACC_SPRITES, - MA_OPT_SHOW_FPS, - MA_OPT_FRAMESKIP, - MA_OPT_ENABLE_SOUND, - MA_OPT_SOUND_QUALITY, - MA_OPT_ARM940_SOUND, - MA_OPT_6BUTTON_PAD, - MA_OPT_REGION, - MA_OPT_SRAM_STATES, - MA_OPT_CONFIRM_STATES, - MA_OPT_SAVE_SLOT, - MA_OPT_CPU_CLOCKS, - MA_OPT_SCD_OPTS, - MA_OPT_ADV_OPTS, - MA_OPT_SAVECFG, - MA_OPT_SAVECFG_GAME, - MA_OPT_LOADCFG, - MA_OPT2_GAMMA, - MA_OPT2_A_SN_GAMMA, - MA_OPT2_VSYNC, - MA_OPT2_ENABLE_Z80, - MA_OPT2_ENABLE_YM2612, - MA_OPT2_ENABLE_SN76496, - MA_OPT2_GZIP_STATES, - MA_OPT2_NO_LAST_ROM, - MA_OPT2_RAMTIMINGS, - MA_OPT2_SQUIDGEHACK, - MA_OPT2_DONE, - MA_CDOPT_TESTBIOS_USA, - MA_CDOPT_TESTBIOS_EUR, - MA_CDOPT_TESTBIOS_JAP, - MA_CDOPT_LEDS, - MA_CDOPT_CDDA, - MA_CDOPT_PCM, - MA_CDOPT_READAHEAD, - MA_CDOPT_SAVERAM, - MA_CDOPT_SCALEROT_CHIP, - MA_CDOPT_BETTER_SYNC, - MA_CDOPT_DONE, -} menu_id; - -typedef struct -{ - char *name; - menu_behavior beh; - menu_id id; - void *var; /* for on-off settings */ - int mask; - signed char min; /* for ranged integer settings, to be sign-extended */ - signed char max; - char enabled; -} menu_entry; - -static int me_id2offset(const menu_entry *entries, int count, menu_id id) -{ - int i; - for (i = 0; i < count; i++) - { - if (entries[i].id == id) return i; - } - - printf("%s: id %i not found\n", __FUNCTION__, id); - return 0; -} - -static void me_enable(menu_entry *entries, int count, menu_id id, int enable) -{ - int i = me_id2offset(entries, count, id); - entries[i].enabled = enable; -} - -static int me_count_enabled(const menu_entry *entries, int count) -{ - int i, ret = 0; - - for (i = 0; i < count; i++) - { - if (entries[i].enabled) ret++; - } - - return ret; -} - -static menu_id me_index2id(const menu_entry *entries, int count, int index) -{ - int i; - - for (i = 0; i < count; i++) - { - if (entries[i].enabled) - { - if (index == 0) break; - index--; - } - } - if (i >= count) i = count - 1; - return entries[i].id; -} - -typedef void (me_draw_custom_f)(const menu_entry *entry, int x, int y, void *param); - -static void me_draw(const menu_entry *entries, int count, int x, int y, me_draw_custom_f *cust_draw, void *param) -{ - int i, y1 = y; - - for (i = 0; i < count; i++) - { - if (!entries[i].enabled) continue; - if (entries[i].name == NULL) - { - if (cust_draw != NULL) - cust_draw(&entries[i], x, y1, param); - y1 += 10; - continue; - } - text_out16(x, y1, entries[i].name); - if (entries[i].beh == MB_ONOFF) - text_out16(x + 27*8, y1, (*(int *)entries[i].var & entries[i].mask) ? "ON" : "OFF"); - else if (entries[i].beh == MB_RANGE) - text_out16(x + 27*8, y1, "%i", *(int *)entries[i].var); - y1 += 10; - } -} - -static int me_process(menu_entry *entries, int count, menu_id id, int is_next) -{ - int i = me_id2offset(entries, count, id); - menu_entry *entry = &entries[i]; - switch (entry->beh) - { - case MB_ONOFF: - *(int *)entry->var ^= entry->mask; - return 1; - case MB_RANGE: - *(int *)entry->var += is_next ? 1 : -1; - if (*(int *)entry->var < (int)entry->min) *(int *)entry->var = (int)entry->min; - if (*(int *)entry->var > (int)entry->max) *(int *)entry->var = (int)entry->max; - return 1; - default: - return 0; - } -} - - -static int parse_hex_color(char *buff) -{ - char *endp = buff; - int t = (int) strtoul(buff, &endp, 16); - if (endp != buff) return ((t>>8)&0xf800) | ((t>>5)&0x07e0) | ((t>>3)&0x1f); - return -1; -} - -void menu_init(void) -{ - int c, l; - unsigned char *fd = menu_font_data; - char buff[256]; - FILE *f; - - // generate default font from fontdata8x8 - memset(menu_font_data, 0, sizeof(menu_font_data)); - for (c = 0; c < 256; c++) - { - for (l = 0; l < 8; l++) - { - unsigned char fd8x8 = fontdata8x8[c*8+l]; - if (fd8x8&0x80) *fd |= 0xf0; - if (fd8x8&0x40) *fd |= 0x0f; fd++; - if (fd8x8&0x20) *fd |= 0xf0; - if (fd8x8&0x10) *fd |= 0x0f; fd++; - if (fd8x8&0x08) *fd |= 0xf0; - if (fd8x8&0x04) *fd |= 0x0f; fd++; - if (fd8x8&0x02) *fd |= 0xf0; - if (fd8x8&0x01) *fd |= 0x0f; fd++; - } - fd += 8*2/2; // 2 empty lines - } - - // load custom font and selector (stored as 1st symbol in font table) - readpng(menu_font_data, "skin/font.png", READPNG_FONT); - memcpy(menu_font_data, menu_font_data + ((int)'>')*4*10, 4*10); // default selector symbol is '>' - readpng(menu_font_data, "skin/selector.png", READPNG_SELECTOR); - - // load custom colors - f = fopen("skin/skin.txt", "r"); - if (f != NULL) - { - printf("found skin.txt\n"); - while (!feof(f)) - { - fgets(buff, sizeof(buff), f); - if (buff[0] == '#' || buff[0] == '/') continue; // comment - if (buff[0] == '\r' || buff[0] == '\n') continue; // empty line - if (strncmp(buff, "text_color=", 11) == 0) - { - int tmp = parse_hex_color(buff+11); - if (tmp >= 0) menu_text_color = tmp; - else printf("skin.txt: parse error for text_color\n"); - } - else if (strncmp(buff, "selection_color=", 16) == 0) - { - int tmp = parse_hex_color(buff+16); - if (tmp >= 0) menu_sel_color = tmp; - else printf("skin.txt: parse error for selection_color\n"); - } - else - printf("skin.txt: parse error: %s\n", buff); - } - fclose(f); - } -} - static unsigned long inp_prev = 0; static int inp_prevjoy = 0; @@ -500,6 +129,11 @@ static unsigned long wait_for_input_usbjoy(unsigned long interesting, int *joy) return ret; } +static void menu_flip(void) +{ + gp2x_video_flush_cache(); + gp2x_video_flip2(); +} // --------- loading ROM screen ---------- @@ -887,7 +521,7 @@ static void draw_savestate_menu(int menu_sel, int is_loading) text_out16(tl_x, 30, is_loading ? "Load state" : "Save state"); - draw_selection(tl_x - 16, tl_y + menu_sel*10, 108); + menu_draw_selection(tl_x - 16, tl_y + menu_sel*10, 108); /* draw all 10 slots */ y = tl_y; @@ -1029,7 +663,7 @@ static void draw_key_config(const bind_action_t *opts, int opt_cnt, int player_i x = 40; } - draw_selection(x - 16, tl_y + sel*10, (player_idx >= 0) ? 66 : 130); + menu_draw_selection(x - 16, tl_y + sel*10, (player_idx >= 0) ? 66 : 130); y = tl_y; for (i = 0; i < opt_cnt; i++, y+=10) @@ -1110,7 +744,7 @@ static void draw_kc_sel(int menu_sel) y = tl_y; gp2x_pd_clone_buffer2(); - draw_selection(tl_x - 16, tl_y + menu_sel*10, 138); + menu_draw_selection(tl_x - 16, tl_y + menu_sel*10, 138); text_out16(tl_x, y, "Player 1"); text_out16(tl_x, (y+=10), "Player 2"); @@ -1246,7 +880,7 @@ static void draw_cd_menu_options(int menu_sel, struct bios_names_t *bios_names) gp2x_pd_clone_buffer2(); - draw_selection(tl_x - 16, tl_y + menu_sel*10, 246); + menu_draw_selection(tl_x - 16, tl_y + menu_sel*10, 246); me_draw(cdopt_entries, CDOPT_ENTRY_COUNT, tl_x, tl_y, menu_cdopt_cust_draw, bios_names); @@ -1347,7 +981,7 @@ menu_entry opt2_entries[] = { { NULL, MB_NONE, MA_OPT2_GAMMA, NULL, 0, 0, 0, 1 }, { "A_SN's gamma curve", MB_ONOFF, MA_OPT2_A_SN_GAMMA, ¤tConfig.EmuOpt, 0x1000, 0, 0, 1 }, - { "Perfecf vsync", MB_ONOFF, MA_OPT2_VSYNC, ¤tConfig.EmuOpt, 0x2000, 0, 0, 1 }, + { "Perfect vsync", MB_ONOFF, MA_OPT2_VSYNC, ¤tConfig.EmuOpt, 0x2000, 0, 0, 1 }, { "Emulate Z80", MB_ONOFF, MA_OPT2_ENABLE_Z80, ¤tConfig.PicoOpt,0x0004, 0, 0, 1 }, { "Emulate YM2612 (FM)", MB_ONOFF, MA_OPT2_ENABLE_YM2612, ¤tConfig.PicoOpt,0x0001, 0, 0, 1 }, { "Emulate SN76496 (PSG)", MB_ONOFF, MA_OPT2_ENABLE_SN76496,¤tConfig.PicoOpt,0x0002, 0, 0, 1 }, @@ -1377,7 +1011,7 @@ static void draw_amenu_options(int menu_sel) gp2x_pd_clone_buffer2(); - draw_selection(tl_x - 16, tl_y + menu_sel*10, 252); + menu_draw_selection(tl_x - 16, tl_y + menu_sel*10, 252); me_draw(opt2_entries, OPT2_ENTRY_COUNT, tl_x, tl_y, menu_opt2_cust_draw, NULL); @@ -1546,7 +1180,7 @@ static void draw_menu_options(int menu_sel) gp2x_pd_clone_buffer2(); - draw_selection(tl_x - 16, tl_y + menu_sel*10, 284); + menu_draw_selection(tl_x - 16, tl_y + menu_sel*10, 284); me_draw(opt_entries, OPT_ENTRY_COUNT, tl_x, tl_y, menu_opt_cust_draw, NULL); @@ -1785,7 +1419,7 @@ static void draw_menu_root(int menu_sel) text_out16(tl_x, 20, "PicoDrive v" VERSION); - draw_selection(tl_x - 16, tl_y + menu_sel*10, 146); + menu_draw_selection(tl_x - 16, tl_y + menu_sel*10, 146); me_draw(main_entries, MAIN_ENTRY_COUNT, tl_x, tl_y, NULL, NULL); @@ -2008,7 +1642,7 @@ int menu_loop_tray(void) char curr_path[PATH_MAX], *selfname; FILE *tstf; - gp2x_memset_all_buffers(0, 0xe0, 320*240); + gp2x_memset_all_buffers(0, 0, 320*240*2); menu_gfx_prepare(); if ( (tstf = fopen(currentConfig.lastRomFile, "rb")) )