pandora: use hw scaler (resolves 32x+sms), frontend refactoring
[libpicofe.git] / common / menu.c
index 39a71b1..691eda4 100644 (file)
@@ -1,4 +1,4 @@
-// (c) Copyright 2006-2009 notaz, All rights reserved.\r
+// (c) Copyright 2006-2010 notaz, All rights reserved.\r
 // Free for non-commercial use.\r
 \r
 // For commercial use, separate licencing terms must be obtained.\r
 static char static_buff[64];\r
 static int  menu_error_time = 0;\r
 char menu_error_msg[64] = { 0, };\r
+void *g_menuscreen_ptr;\r
+void *g_menubg_src_ptr;\r
 void *g_menubg_ptr;\r
 \r
 #ifndef UIQ3\r
 \r
+#if !SCREEN_SIZE_FIXED\r
+int g_menuscreen_w = MSCREEN_WIDTH;\r
+int g_menuscreen_h = MSCREEN_HEIGHT;\r
+#endif\r
+\r
 static unsigned char *menu_font_data = NULL;\r
 static int menu_text_color = 0xffff; // default to white\r
 static int menu_sel_color = -1; // disabled\r
@@ -46,7 +53,7 @@ static const int me_sfont_w = 6, me_sfont_h = 10;
 static void text_out16_(int x, int y, const char *text, int color)\r
 {\r
        int i, lh, tr, tg, tb, len;\r
-       unsigned short *dest = (unsigned short *)g_screen_ptr + x + y * g_screen_width;\r
+       unsigned short *dest = (unsigned short *)g_menuscreen_ptr + x + y * g_menuscreen_w;\r
        tr = (color & 0xf800) >> 8;\r
        tg = (color & 0x07e0) >> 3;\r
        tb = (color & 0x001f) << 3;\r
@@ -66,8 +73,8 @@ static void text_out16_(int x, int y, const char *text, int color)
        }\r
 \r
        lh = me_mfont_h;\r
-       if (y + lh > g_screen_height)\r
-               lh = g_screen_height - y;\r
+       if (y + lh > g_menuscreen_h)\r
+               lh = g_menuscreen_h - y;\r
 \r
        for (i = 0; i < len; i++)\r
        {\r
@@ -75,7 +82,7 @@ static void text_out16_(int x, int y, const char *text, int color)
                unsigned short *dst = dest;\r
                int u, l;\r
 \r
-               for (l = 0; l < lh; l++, dst += g_screen_width - me_mfont_w)\r
+               for (l = 0; l < lh; l++, dst += g_menuscreen_w - me_mfont_w)\r
                {\r
                        for (u = me_mfont_w / 2; u > 0; u--, src++)\r
                        {\r
@@ -106,7 +113,7 @@ void text_out16(int x, int y, const char *texto, ...)
 {\r
        va_list args;\r
        char    buffer[256];\r
-       int     maxw = (g_screen_width - x) / me_mfont_w;\r
+       int     maxw = (g_menuscreen_w - x) / me_mfont_w;\r
 \r
        if (maxw < 0)\r
                return;\r
@@ -139,7 +146,7 @@ static void smalltext_out16_(int x, int y, const char *texto, int color)
                        break;\r
 \r
                src = fontdata6x8[c];\r
-               dst = (unsigned short *)g_screen_ptr + x + y * g_screen_width;\r
+               dst = (unsigned short *)g_menuscreen_ptr + x + y * g_menuscreen_w;\r
 \r
                while (h--)\r
                {\r
@@ -154,7 +161,7 @@ static void smalltext_out16_(int x, int y, const char *texto, int color)
                                                dst += multiplier;\r
                                }\r
 \r
-                               dst += g_screen_width - me_sfont_w;\r
+                               dst += g_menuscreen_w - me_sfont_w;\r
                        }\r
                        src++;\r
                }\r
@@ -164,7 +171,7 @@ static void smalltext_out16_(int x, int y, const char *texto, int color)
 static void smalltext_out16(int x, int y, const char *texto, int color)\r
 {\r
        char buffer[128];\r
-       int maxw = (g_screen_width - x) / me_sfont_w;\r
+       int maxw = (g_menuscreen_w - x) / me_sfont_w;\r
 \r
        if (maxw < 0)\r
                return;\r
@@ -187,13 +194,13 @@ static void menu_draw_selection(int x, int y, int w)
        if (menu_sel_color < 0) return; // no selection hilight\r
 \r
        if (y > 0) y--;\r
-       dest = (unsigned short *)g_screen_ptr + x + y * g_screen_width + me_mfont_w * 2 - 2;\r
+       dest = (unsigned short *)g_menuscreen_ptr + x + y * g_menuscreen_w + me_mfont_w * 2 - 2;\r
        for (h = me_mfont_h + 1; h > 0; h--)\r
        {\r
                dst = dest;\r
                for (i = w - (me_mfont_w * 2 - 2); i > 0; i--)\r
                        *dst++ = menu_sel_color;\r
-               dest += g_screen_width;\r
+               dest += g_menuscreen_w;\r
        }\r
 }\r
 \r
@@ -335,8 +342,12 @@ static void menu_enter(int is_rom_loaded)
 {\r
        if (is_rom_loaded)\r
        {\r
+               void *src = g_menubg_src_ptr;\r
+               if (src == NULL)\r
+                       src = g_menuscreen_ptr;\r
+\r
                // darken the active framebuffer\r
-               menu_darken_bg(g_menubg_ptr, g_screen_ptr, g_screen_width * g_screen_height, 1);\r
+               menu_darken_bg(g_menubg_ptr, src, g_menuscreen_w * g_menuscreen_h, 1);\r
        }\r
        else\r
        {\r
@@ -344,8 +355,8 @@ static void menu_enter(int is_rom_loaded)
 \r
                // should really only happen once, on startup..\r
                emu_make_path(buff, "skin/background.png", sizeof(buff));\r
-               if (readpng(g_menubg_ptr, buff, READPNG_BG, g_screen_width, g_screen_height) < 0)\r
-                       memset(g_menubg_ptr, 0, g_screen_width * g_screen_height * 2);\r
+               if (readpng(g_menubg_ptr, buff, READPNG_BG, g_menuscreen_w, g_menuscreen_h) < 0)\r
+                       memset(g_menubg_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2);\r
        }\r
 \r
        plat_video_menu_enter(is_rom_loaded);\r
@@ -442,17 +453,17 @@ static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void))
        h = n * me_mfont_h;\r
        w += me_mfont_w * 2; /* selector */\r
 \r
-       if (w > g_screen_width) {\r
-               lprintf("width %d > %d\n", w, g_screen_width);\r
-               w = g_screen_width;\r
+       if (w > g_menuscreen_w) {\r
+               lprintf("width %d > %d\n", w, g_menuscreen_w);\r
+               w = g_menuscreen_w;\r
        }\r
-       if (h > g_screen_height) {\r
-               lprintf("height %d > %d\n", w, g_screen_height);\r
-               h = g_screen_height;\r
+       if (h > g_menuscreen_h) {\r
+               lprintf("height %d > %d\n", w, g_menuscreen_h);\r
+               h = g_menuscreen_h;\r
        }\r
 \r
-       x = g_screen_width  / 2 - w / 2;\r
-       y = g_screen_height / 2 - h / 2;\r
+       x = g_menuscreen_w  / 2 - w / 2;\r
+       y = g_menuscreen_h / 2 - h / 2;\r
 \r
        /* draw */\r
        plat_video_menu_begin();\r
@@ -513,10 +524,10 @@ static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void))
        }\r
 \r
        /* display help or message if we have one */\r
-       h = (g_screen_height - h) / 2; // bottom area height\r
+       h = (g_menuscreen_h - h) / 2; // bottom area height\r
        if (menu_error_msg[0] != 0) {\r
                if (h >= me_mfont_h + 4)\r
-                       text_out16(5, g_screen_height - me_mfont_h - 4, menu_error_msg);\r
+                       text_out16(5, g_menuscreen_h - me_mfont_h - 4, menu_error_msg);\r
                else\r
                        lprintf("menu msg doesn't fit!\n");\r
 \r
@@ -530,7 +541,7 @@ static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void))
                        tmp = strchr(tmp + 1, '\n');\r
                if (h >= l * me_sfont_h + 4)\r
                        for (tmp = ent_sel->help; l > 0; l--, tmp = strchr(tmp, '\n') + 1)\r
-                               smalltext_out16(5, g_screen_height - (l * me_sfont_h + 4), tmp, 0xffff);\r
+                               smalltext_out16(5, g_menuscreen_h - (l * me_sfont_h + 4), tmp, 0xffff);\r
        }\r
 \r
        if (draw_more != NULL)\r
@@ -671,14 +682,14 @@ static void draw_menu_credits(void)
                p++;\r
        }\r
 \r
-       x = g_screen_width  / 2 - w * me_mfont_w / 2;\r
-       y = g_screen_height / 2 - h * me_mfont_h / 2;\r
+       x = g_menuscreen_w  / 2 - w * me_mfont_w / 2;\r
+       y = g_menuscreen_h / 2 - h * me_mfont_h / 2;\r
        if (x < 0) x = 0;\r
        if (y < 0) y = 0;\r
 \r
        plat_video_menu_begin();\r
 \r
-       for (p = creds; *p != 0 && y <= g_screen_height - me_mfont_h; y += me_mfont_h) {\r
+       for (p = creds; *p != 0 && y <= g_menuscreen_h - me_mfont_h; y += me_mfont_h) {\r
                text_out16(x, y, p);\r
 \r
                for (; *p != 0 && *p != '\n'; p++)\r
@@ -696,30 +707,30 @@ static int cdload_called = 0;
 \r
 static void load_progress_cb(int percent)\r
 {\r
-       int ln, len = percent * g_screen_width / 100;\r
-       unsigned short *dst = (unsigned short *)g_screen_ptr + g_screen_width * me_sfont_h * 2;\r
+       int ln, len = percent * g_menuscreen_w / 100;\r
+       unsigned short *dst = (unsigned short *)g_menuscreen_ptr + g_menuscreen_w * me_sfont_h * 2;\r
 \r
-       if (len > g_screen_width)\r
-               len = g_screen_width;\r
-       for (ln = me_sfont_h - 2; ln > 0; ln--, dst += g_screen_width)\r
+       if (len > g_menuscreen_w)\r
+               len = g_menuscreen_w;\r
+       for (ln = me_sfont_h - 2; ln > 0; ln--, dst += g_menuscreen_w)\r
                memset(dst, 0xff, len * 2);\r
        plat_video_menu_end();\r
 }\r
 \r
 static void cdload_progress_cb(const char *fname, int percent)\r
 {\r
-       int ln, len = percent * g_screen_width / 100;\r
-       unsigned short *dst = (unsigned short *)g_screen_ptr + g_screen_width * me_sfont_h * 2;\r
+       int ln, len = percent * g_menuscreen_w / 100;\r
+       unsigned short *dst = (unsigned short *)g_menuscreen_ptr + g_menuscreen_w * me_sfont_h * 2;\r
 \r
-       memset(dst, 0xff, g_screen_width * (me_sfont_h - 2) * 2);\r
+       memset(dst, 0xff, g_menuscreen_w * (me_sfont_h - 2) * 2);\r
 \r
        smalltext_out16(1, 3 * me_sfont_h, "Processing CD image / MP3s", 0xffff);\r
        smalltext_out16(1, 4 * me_sfont_h, fname, 0xffff);\r
-       dst += g_screen_width * me_sfont_h * 3;\r
+       dst += g_menuscreen_w * me_sfont_h * 3;\r
 \r
-       if (len > g_screen_width)\r
-               len = g_screen_width;\r
-       for (ln = (me_sfont_h - 2); ln > 0; ln--, dst += g_screen_width)\r
+       if (len > g_menuscreen_w)\r
+               len = g_menuscreen_w;\r
+       for (ln = (me_sfont_h - 2); ln > 0; ln--, dst += g_menuscreen_w)\r
                memset(dst, 0xff, len * 2);\r
 \r
        plat_video_menu_end();\r
@@ -767,13 +778,13 @@ static void do_delete(const char *fpath, const char *fname)
        plat_video_menu_begin();\r
 \r
        if (!rom_loaded)\r
-               menu_darken_bg(g_screen_ptr, g_screen_ptr, g_screen_width * g_screen_height, 0);\r
+               menu_darken_bg(g_menuscreen_ptr, g_menuscreen_ptr, g_menuscreen_w * g_menuscreen_h, 0);\r
 \r
        len = strlen(fname);\r
-       if (len > g_screen_width / me_sfont_w)\r
-               len = g_screen_width / me_sfont_w;\r
+       if (len > g_menuscreen_w / me_sfont_w)\r
+               len = g_menuscreen_w / me_sfont_w;\r
 \r
-       mid = g_screen_width / 2;\r
+       mid = g_menuscreen_w / 2;\r
        text_out16(mid - me_mfont_w * 15 / 2,  8 * me_mfont_h, "About to delete");\r
        smalltext_out16(mid - len * me_sfont_w / 2, 9 * me_mfont_h + 5, fname, 0xbdff);\r
        text_out16(mid - me_mfont_w * 13 / 2, 11 * me_mfont_h, "Are you sure?");\r
@@ -817,7 +828,7 @@ static void draw_dirlist(char *curdir, struct dirent **namelist, int n, int sel)
        int max_cnt, start, i, x, pos;\r
        void *darken_ptr;\r
 \r
-       max_cnt = g_screen_height / me_sfont_h;\r
+       max_cnt = g_menuscreen_h / me_sfont_h;\r
        start = max_cnt / 2 - sel;\r
        n--; // exclude current dir (".")\r
 \r
@@ -826,8 +837,8 @@ static void draw_dirlist(char *curdir, struct dirent **namelist, int n, int sel)
 //     if (!rom_loaded)\r
 //             menu_darken_bg(gp2x_screen, 320*240, 0);\r
 \r
-       darken_ptr = (short *)g_screen_ptr + g_screen_width * max_cnt/2 * me_sfont_h;\r
-       menu_darken_bg(darken_ptr, darken_ptr, g_screen_width * me_sfont_h * 8 / 10, 0);\r
+       darken_ptr = (short *)g_menuscreen_ptr + g_menuscreen_w * max_cnt/2 * me_sfont_h;\r
+       menu_darken_bg(darken_ptr, darken_ptr, g_menuscreen_w * me_sfont_h * 8 / 10, 0);\r
 \r
        x = 5 + me_mfont_w + 1;\r
        if (start - 2 >= 0)\r
@@ -1024,7 +1035,7 @@ static void draw_patchlist(int sel)
 {\r
        int max_cnt, start, i, pos, active;\r
 \r
-       max_cnt = g_screen_height / me_sfont_h;\r
+       max_cnt = g_menuscreen_h / me_sfont_h;\r
        start = max_cnt / 2 - sel;\r
 \r
        plat_video_menu_begin();\r
@@ -1113,9 +1124,9 @@ static void draw_savestate_menu(int menu_sel, int is_loading)
 \r
        w = (13 + 2) * me_mfont_w;\r
        h = (1+2+10+1) * me_mfont_h;\r
-       x = g_screen_width / 2 - w / 2;\r
+       x = g_menuscreen_w / 2 - w / 2;\r
        if (x < 0) x = 0;\r
-       y = g_screen_height / 2 - h / 2;\r
+       y = g_menuscreen_h / 2 - h / 2;\r
        if (y < 0) y = 0;\r
 \r
        plat_video_menu_begin();\r
@@ -1257,8 +1268,8 @@ static void draw_key_config(const me_bind_action *opts, int opt_cnt, int player_
        int x, y, w, i;\r
 \r
        w = ((player_idx >= 0) ? 20 : 30) * me_mfont_w;\r
-       x = g_screen_width / 2 - w / 2;\r
-       y = (g_screen_height - 4 * me_mfont_h) / 2 - (2 + opt_cnt) * me_mfont_h / 2;\r
+       x = g_menuscreen_w / 2 - w / 2;\r
+       y = (g_menuscreen_h - 4 * me_mfont_h) / 2 - (2 + opt_cnt) * me_mfont_h / 2;\r
        if (x < me_mfont_w * 2)\r
                x = me_mfont_w * 2;\r
 \r
@@ -1279,23 +1290,23 @@ static void draw_key_config(const me_bind_action *opts, int opt_cnt, int player_
        w = strlen(dev_name) * me_mfont_w;\r
        if (w < 30 * me_mfont_w)\r
                w = 30 * me_mfont_w;\r
-       if (w > g_screen_width)\r
-               w = g_screen_width;\r
+       if (w > g_menuscreen_w)\r
+               w = g_menuscreen_w;\r
 \r
-       x = g_screen_width / 2 - w / 2;\r
+       x = g_menuscreen_w / 2 - w / 2;\r
 \r
        if (!is_bind) {\r
                snprintf(buff2, sizeof(buff2), "%s", in_get_key_name(-1, -PBTN_MOK));\r
                snprintf(buff, sizeof(buff), "%s - bind, %s - clear", buff2,\r
                                in_get_key_name(-1, -PBTN_MA2));\r
-               text_out16(x, g_screen_height - 4 * me_mfont_h, buff);\r
+               text_out16(x, g_menuscreen_h - 4 * me_mfont_h, buff);\r
        }\r
        else\r
-               text_out16(x, g_screen_height - 4 * me_mfont_h, "Press a button to bind/unbind");\r
+               text_out16(x, g_menuscreen_h - 4 * me_mfont_h, "Press a button to bind/unbind");\r
 \r
        if (dev_count > 1) {\r
-               text_out16(x, g_screen_height - 3 * me_mfont_h, dev_name);\r
-               text_out16(x, g_screen_height - 2 * me_mfont_h, "Press left/right for other devs");\r
+               text_out16(x, g_menuscreen_h - 3 * me_mfont_h, dev_name);\r
+               text_out16(x, g_menuscreen_h - 2 * me_mfont_h, "Press left/right for other devs");\r
        }\r
 \r
        plat_video_menu_end();\r
@@ -1881,7 +1892,7 @@ static void draw_text_debug(const char *str, int skip, int from)
        }\r
 \r
        str = p;\r
-       for (line = from; line < g_screen_height / me_sfont_h; line++)\r
+       for (line = from; line < g_menuscreen_h / me_sfont_h; line++)\r
        {\r
                smalltext_out16(1, line * me_sfont_h, str, 0xffff);\r
                while (*p && *p != '\n')\r
@@ -1907,10 +1918,10 @@ static void draw_frame_debug(void)
        if (PicoDrawMask & PDRAW_SPRITES_HI_ON)  memcpy(layer_str + 19, "spr_hi", 6);\r
        if (PicoDrawMask & PDRAW_32X_ON)         memcpy(layer_str + 26, "32x", 4);\r
 \r
-       memset(g_screen_ptr, 0, g_screen_width * g_screen_height * 2);\r
+       memset(g_menuscreen_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2);\r
        pemu_forced_frame(0, 0);\r
        smalltext_out16(4, 1, "build: r" REVISION "  "__DATE__ " " __TIME__ " " COMPILER, 0xffff);\r
-       smalltext_out16(4, g_screen_height - me_sfont_h, layer_str, 0xffff);\r
+       smalltext_out16(4, g_menuscreen_h - me_sfont_h, layer_str, 0xffff);\r
 }\r
 \r
 static void debug_menu_loop(void)\r
@@ -1928,23 +1939,23 @@ static void debug_menu_loop(void)
                                plat_debug_cat(tmp);\r
                                draw_text_debug(tmp, 0, 0);\r
                                if (dumped) {\r
-                                       smalltext_out16(g_screen_width - 6 * me_sfont_h,\r
-                                               g_screen_height - me_mfont_h, "dumped", 0xffff);\r
+                                       smalltext_out16(g_menuscreen_w - 6 * me_sfont_h,\r
+                                               g_menuscreen_h - me_mfont_h, "dumped", 0xffff);\r
                                        dumped = 0;\r
                                }\r
                                break;\r
                        case 1: draw_frame_debug();\r
                                break;\r
-                       case 2: memset(g_screen_ptr, 0, g_screen_width * g_screen_height * 2);\r
+                       case 2: memset(g_menuscreen_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2);\r
                                pemu_forced_frame(0, 1);\r
-                               menu_darken_bg(g_screen_ptr, g_screen_ptr, g_screen_width * g_screen_height, 0);\r
-                               PDebugShowSpriteStats((unsigned short *)g_screen_ptr + (g_screen_height/2 - 240/2)*g_screen_width +\r
-                                       g_screen_width/2 - 320/2, g_screen_width);\r
+                               menu_darken_bg(g_menuscreen_ptr, g_menuscreen_ptr, g_menuscreen_w * g_menuscreen_h, 0);\r
+                               PDebugShowSpriteStats((unsigned short *)g_menuscreen_ptr + (g_menuscreen_h/2 - 240/2)*g_menuscreen_w +\r
+                                       g_menuscreen_w/2 - 320/2, g_menuscreen_w);\r
                                break;\r
-                       case 3: memset(g_screen_ptr, 0, g_screen_width * g_screen_height * 2);\r
-                               PDebugShowPalette(g_screen_ptr, g_screen_width);\r
-                               PDebugShowSprite((unsigned short *)g_screen_ptr + g_screen_width*120 + g_screen_width/2 + 16,\r
-                                       g_screen_width, spr_offs);\r
+                       case 3: memset(g_menuscreen_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2);\r
+                               PDebugShowPalette(g_menuscreen_ptr, g_menuscreen_w);\r
+                               PDebugShowSprite((unsigned short *)g_menuscreen_ptr + g_menuscreen_w*120 + g_menuscreen_w/2 + 16,\r
+                                       g_menuscreen_w, spr_offs);\r
                                draw_text_debug(PDebugSpriteList(), spr_offs, 6);\r
                                break;\r
                        case 4: plat_video_menu_begin();\r