From: notaz <notasas@gmail.com>
Date: Sun, 9 Sep 2012 21:21:37 +0000 (+0300)
Subject: merge border style from gpfce
X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=675d1d368c75ef01523108f3180090a9ed12edf4;p=libpicofe.git

merge border style from gpfce
---

diff --git a/menu.c b/menu.c
index 3acab62..63a9943 100644
--- a/menu.c
+++ b/menu.c
@@ -1,5 +1,5 @@
 /*
- * (C) Gražvydas "notaz" Ignotas, 2006-2011
+ * (C) Gražvydas "notaz" Ignotas, 2006-2012
  *
  * This work is licensed under the terms of any of these licenses
  * (at your option):
@@ -29,6 +29,7 @@ char menu_error_msg[64] = { 0, };
 void *g_menuscreen_ptr;
 void *g_menubg_src_ptr;
 void *g_menubg_ptr;
+static char rom_fname_reload[256];
 
 #if !MSCREEN_SIZE_FIXED
 int g_menuscreen_w;
@@ -48,6 +49,9 @@ static const int me_mfont_w = 8, me_mfont_h = 10;
 static const int me_sfont_w = 6, me_sfont_h = 10;
 #endif
 
+static int g_border_style;
+static int border_left, border_right, border_top, border_bottom;
+
 // draws text to current bbp16 screen
 static void text_out16_(int x, int y, const char *text, int color)
 {
@@ -106,6 +110,15 @@ static void text_out16_(int x, int y, const char *text, int color)
 		}
 		dest += me_mfont_w;
 	}
+
+	if (x < border_left)
+		border_left = x;
+	if (x + i * me_mfont_w > border_right)
+		border_right = x + i * me_mfont_w;
+	if (y < border_top)
+		border_top = y;
+	if (y + me_mfont_h > border_bottom)
+		border_bottom = y + me_mfont_h;
 }
 
 void text_out16(int x, int y, const char *texto, ...)
@@ -223,7 +236,7 @@ static char tolower_simple(char c)
 	return c;
 }
 
-void menu_init(void)
+void menu_init_base(void)
 {
 	int i, c, l;
 	unsigned char *fd, *fds;
@@ -323,18 +336,6 @@ void menu_init(void)
 	setlocale(LC_TIME, "");
 }
 
-static void menu_draw_begin(int need_bg)
-{
-	plat_video_menu_begin();
-	if (need_bg)
-		memcpy(g_menuscreen_ptr, g_menubg_ptr, g_menuscreen_w * g_menuscreen_h * 2);
-}
-
-static void menu_draw_end(void)
-{
-	plat_video_menu_end();
-}
-
 static void menu_darken_bg(void *dst, void *src, int pixels, int darker)
 {
 	unsigned int *dest = dst;
@@ -358,6 +359,88 @@ static void menu_darken_bg(void *dst, void *src, int pixels, int darker)
 	}
 }
 
+static void menu_darken_text_bg(void)
+{
+	int x, y, xmin, xmax, ymax, ls;
+	unsigned short *screen = g_menuscreen_ptr;
+
+	xmin = border_left - 3;
+	if (xmin < 0)
+		xmin = 0;
+	xmax = border_right + 2;
+	if (xmax > g_menuscreen_w - 1)
+		xmax = g_menuscreen_w - 1;
+
+	y = border_top - 3;
+	if (y < 0)
+		y = 0;
+	ymax = border_bottom + 2;
+	if (ymax > g_menuscreen_h - 1)
+		ymax = g_menuscreen_h - 1;
+
+	for (x = xmin; x <= xmax; x++)
+		screen[y * g_menuscreen_w + x] = 0xa514;
+	for (y++; y < ymax; y++)
+	{
+		ls = y * g_menuscreen_w;
+		screen[ls + xmin] = 0xffff;
+		for (x = xmin + 1; x < xmax; x++)
+		{
+			unsigned int p = screen[ls + x];
+			if (p != 0xffff)
+				screen[ls + x] = ((p&0xf79e)>>1) - ((p&0xc618)>>3);
+		}
+		screen[ls + xmax] = 0xffff;
+	}
+	ls = y * g_menuscreen_w;
+	for (x = xmin; x <= xmax; x++)
+		screen[ls + x] = 0xffff;
+}
+
+static int borders_pending;
+
+static void menu_reset_borders(void)
+{
+	border_left = g_menuscreen_w;
+	border_right = 0;
+	border_top = g_menuscreen_h;
+	border_bottom = 0;
+}
+
+static void menu_draw_begin(int need_bg, int no_borders)
+{
+	plat_video_menu_begin();
+
+	menu_reset_borders();
+	borders_pending = g_border_style && !no_borders;
+
+	if (need_bg) {
+		if (g_border_style && no_borders) {
+			menu_darken_bg(g_menuscreen_ptr, g_menubg_ptr,
+				g_menuscreen_w * g_menuscreen_h, 1);
+		}
+		else {
+			memcpy(g_menuscreen_ptr, g_menubg_ptr,
+				g_menuscreen_w * g_menuscreen_h * 2);
+		}
+	}
+}
+
+static void menu_draw_end(void)
+{
+	if (borders_pending)
+		menu_darken_text_bg();
+	plat_video_menu_end();
+}
+
+static void menu_separation(void)
+{
+	if (borders_pending) {
+		menu_darken_text_bg();
+		menu_reset_borders();
+	}
+}
+
 static int me_id2offset(const menu_entry *ent, menu_id id)
 {
 	int i;
@@ -487,7 +570,7 @@ static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void))
 #endif
 
 	/* draw */
-	menu_draw_begin(1);
+	menu_draw_begin(1, 0);
 	menu_draw_selection(x, y + vi_sel_ln * me_mfont_h, w);
 	x += me_mfont_w * 2;
 
@@ -569,6 +652,8 @@ static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void))
 				smalltext_out16(5, g_menuscreen_h - (l * me_sfont_h + 4), tmp, 0xffff);
 	}
 
+	menu_separation();
+
 	if (draw_more != NULL)
 		draw_more();
 
@@ -710,7 +795,7 @@ static void draw_menu_message(const char *msg, void (*draw_more)(void))
 	if (x < 0) x = 0;
 	if (y < 0) y = 0;
 
-	menu_draw_begin(1);
+	menu_draw_begin(1, 0);
 
 	for (p = msg; *p != 0 && y <= g_menuscreen_h - me_mfont_h; y += me_mfont_h) {
 		text_out16(x, y, p);
@@ -721,6 +806,8 @@ static void draw_menu_message(const char *msg, void (*draw_more)(void))
 			p++;
 	}
 
+	menu_separation();
+
 	if (draw_more != NULL)
 		draw_more();
 
@@ -735,7 +822,7 @@ static void do_delete(const char *fpath, const char *fname)
 	const char *nm;
 	char tmp[64];
 
-	menu_draw_begin(1);
+	menu_draw_begin(1, 0);
 
 	len = strlen(fname);
 	if (len > g_menuscreen_w / me_sfont_w)
@@ -773,7 +860,7 @@ static void draw_dirlist(char *curdir, struct dirent **namelist, int n, int sel)
 	start = max_cnt / 2 - sel;
 	n--; // exclude current dir (".")
 
-	menu_draw_begin(1);
+	menu_draw_begin(1, 1);
 
 //	if (!rom_loaded)
 //		menu_darken_bg(gp2x_screen, 320*240, 0);
@@ -1036,7 +1123,7 @@ static void draw_savestate_menu(int menu_sel, int is_loading)
 		x = 12 + me_mfont_w * 2;
 #endif
 
-	menu_draw_begin(1);
+	menu_draw_begin(1, 1);
 
 	text_out16(x, y, is_loading ? "Load state" : "Save state");
 	y += 3 * me_mfont_h;
@@ -1098,7 +1185,7 @@ static int menu_loop_savestate(int is_loading)
 			if (menu_sel < STATE_SLOT_COUNT) {
 				state_slot = menu_sel;
 				if (emu_save_load_game(is_loading, 0)) {
-					me_update_msg(is_loading ? "Load failed" : "Save failed");
+					menu_update_msg(is_loading ? "Load failed" : "Save failed");
 					break;
 				}
 				ret = 1;
@@ -1199,7 +1286,7 @@ static void draw_key_config(const me_bind_action *opts, int opt_cnt, int player_
 	if (x < me_mfont_w * 2)
 		x = me_mfont_w * 2;
 
-	menu_draw_begin(1);
+	menu_draw_begin(1, 0);
 	if (player_idx >= 0)
 		text_out16(x, y, "Player %i controls", player_idx + 1);
 	else
@@ -1212,6 +1299,8 @@ static void draw_key_config(const me_bind_action *opts, int opt_cnt, int player_
 		text_out16(x, y, "%s : %s", opts[i].name,
 			action_binds(player_idx, opts[i].mask, dev_id));
 
+	menu_separation();
+
 	if (dev_id < 0)
 		dev_name = "(all devices)";
 	else
diff --git a/menu.h b/menu.h
index 79b8278..07aee2a 100644
--- a/menu.h
+++ b/menu.h
@@ -117,16 +117,9 @@ extern int g_menuscreen_w;
 extern int g_menuscreen_h;
 #endif
 
-void menu_init(void);
+void menu_init_base(void);
+void menu_update_msg(const char *msg);
 void text_out16(int x, int y, const char *texto, ...);
-void me_update_msg(const char *msg);
-
-void menu_romload_prepare(const char *rom_name);
-void menu_romload_end(void);
-
-void menu_loop(void);
-int  menu_loop_tray(void);
 
 menu_entry *me_list_get_first(void);
 menu_entry *me_list_get_next(void);
-