pandora: use hw scaler (resolves 32x+sms), frontend refactoring

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@885 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2010-09-06 13:08:23 +00:00
parent 207e58ef99
commit c7eb229a3c
20 changed files with 960 additions and 596 deletions

View file

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