From 77cc6538e1473543a39f5292f246a17f7162827b Mon Sep 17 00:00:00 2001 From: Couriersud Date: Wed, 27 Jan 2010 23:52:28 +0000 Subject: [PATCH] UI menu interface changes - all ui functions now expect a render_container - removed all macros referencing render_container_get_ui - ui_menu_alloc now is passed a container to which to render the menu. This is a first round of changes to allow using ui_* functions in a more generic way. --- src/emu/cheat.c | 4 +- src/emu/cheat.h | 2 +- src/emu/drivers/empty.c | 3 +- src/emu/mame.c | 4 +- src/emu/render.h | 7 +-- src/emu/ui.c | 88 +++++++++++++-------------- src/emu/ui.h | 12 ++-- src/emu/uigfx.c | 54 ++++++++-------- src/emu/uigfx.h | 2 +- src/emu/uimenu.c | 125 ++++++++++++++++++++------------------ src/emu/uimenu.h | 9 +-- src/emu/video.c | 2 +- src/mame/video/deco16ic.c | 2 +- src/mame/video/ssv.c | 4 +- src/mame/video/taito_f3.c | 2 +- 15 files changed, 164 insertions(+), 156 deletions(-) diff --git a/src/emu/cheat.c b/src/emu/cheat.c index b4a6bdc36cb..08cc50f6b8a 100644 --- a/src/emu/cheat.c +++ b/src/emu/cheat.c @@ -508,7 +508,7 @@ void cheat_set_global_enable(running_machine *machine, int enable) to render text -------------------------------------------------*/ -void cheat_render_text(running_machine *machine) +void cheat_render_text(running_machine *machine, render_container *container) { cheat_private *cheatinfo = machine->cheat_data; if (cheatinfo != NULL) @@ -520,7 +520,7 @@ void cheat_render_text(running_machine *machine) if (cheatinfo->output[linenum].len() != 0) { /* output the text */ - ui_draw_text_full(cheatinfo->output[linenum], + ui_draw_text_full(container, cheatinfo->output[linenum], 0.0f, (float)linenum * ui_get_line_height(), 1.0f, cheatinfo->justify[linenum], WRAP_NEVER, DRAW_OPAQUE, ARGB_WHITE, ARGB_BLACK, NULL, NULL); diff --git a/src/emu/cheat.h b/src/emu/cheat.h index 6d2d99600cd..91b28181a29 100644 --- a/src/emu/cheat.h +++ b/src/emu/cheat.h @@ -40,7 +40,7 @@ void cheat_set_global_enable(running_machine *machine, int enable); /* ----- cheat UI helpers ----- */ /* render any text overlays */ -void cheat_render_text(running_machine *machine); +void cheat_render_text(running_machine *machine, render_container *container); /* return data about the next menu entry, or the first entry if previous == NULL */ void *cheat_get_next_menu_entry(running_machine *machine, void *previous, const char **description, const char **state, UINT32 *flags); diff --git a/src/emu/drivers/empty.c b/src/emu/drivers/empty.c index 78b295378b3..1cc24fb64a3 100644 --- a/src/emu/drivers/empty.c +++ b/src/emu/drivers/empty.c @@ -10,6 +10,7 @@ **************************************************************************/ #include "emu.h" +#include "render.h" #include "uimenu.h" @@ -22,7 +23,7 @@ static MACHINE_START( empty ) { /* force the UI to show the game select screen */ - ui_menu_force_game_select(machine); + ui_menu_force_game_select(machine, render_container_get_ui()); } diff --git a/src/emu/mame.c b/src/emu/mame.c index 09b639898e6..69aa08b0790 100644 --- a/src/emu/mame.c +++ b/src/emu/mame.c @@ -77,10 +77,10 @@ #include "emuopts.h" #include "osdepend.h" #include "config.h" -#include "cheat.h" #include "debugger.h" #include "profiler.h" #include "render.h" +#include "cheat.h" #include "ui.h" #include "uimenu.h" #include "uiinput.h" @@ -540,7 +540,7 @@ void mame_schedule_exit(running_machine *machine) if (started_empty && options_get_string(mame_options(), OPTION_GAMENAME)[0] != 0) { options_set_string(mame_options(), OPTION_GAMENAME, "", OPTION_PRIORITY_CMDLINE); - ui_menu_force_game_select(machine); + ui_menu_force_game_select(machine, render_container_get_ui()); } /* otherwise, exit for real */ diff --git a/src/emu/render.h b/src/emu/render.h index f1ec29dfae4..ada70da2b50 100644 --- a/src/emu/render.h +++ b/src/emu/render.h @@ -145,11 +145,8 @@ enum ***************************************************************************/ /* convenience macros for adding items to the UI container */ -#define render_ui_add_point(x0,y0,diam,argb,flags) render_container_add_line(render_container_get_ui(), x0, y0, x0, y0, diam, argb, flags) -#define render_ui_add_line(x0,y0,x1,y1,diam,argb,flags) render_container_add_line(render_container_get_ui(), x0, y0, x1, y1, diam, argb, flags) -#define render_ui_add_rect(x0,y0,x1,y1,argb,flags) render_container_add_quad(render_container_get_ui(), x0, y0, x1, y1, argb, NULL, flags) -#define render_ui_add_quad(x0,y0,x1,y1,argb,tex,flags) render_container_add_quad(render_container_get_ui(), x0, y0, x1, y1, argb, tex, flags) -#define render_ui_add_char(x0,y0,ht,asp,argb,font,ch) render_container_add_char(render_container_get_ui(), x0, y0, ht, asp, argb, font, ch) +#define render_container_add_point(c, x0,y0,diam,argb,flags) render_container_add_line(c, x0, y0, x0, y0, diam, argb, flags) +#define render_container_add_rect(c, x0,y0,x1,y1,argb,flags) render_container_add_quad(c, x0, y0, x1, y1, argb, NULL, flags) /* convenience macros for adding items to a screen container */ #define render_screen_add_point(scr,x0,y0,diam,argb,flags) render_container_add_line(render_container_get_screen(scr), x0, y0, x0, y0, diam, argb, flags) diff --git a/src/emu/ui.c b/src/emu/ui.c index 61bbdda5788..49975851f57 100644 --- a/src/emu/ui.c +++ b/src/emu/ui.c @@ -14,8 +14,8 @@ #include "video/vector.h" #include "machine/laserdsc.h" #include "profiler.h" -#include "cheat.h" #include "render.h" +#include "cheat.h" #include "rendfont.h" #include "ui.h" #include "uiinput.h" @@ -54,7 +54,7 @@ enum static render_font *ui_font; /* current UI handler */ -static UINT32 (*ui_handler_callback)(running_machine *, UINT32); +static UINT32 (*ui_handler_callback)(running_machine *, render_container *, UINT32); static UINT32 ui_handler_param; /* flag to track single stepping */ @@ -91,11 +91,11 @@ static astring &disclaimer_string(running_machine *machine, astring &buffer); static astring &warnings_string(running_machine *machine, astring &buffer); /* UI handlers */ -static UINT32 handler_messagebox(running_machine *machine, UINT32 state); -static UINT32 handler_messagebox_ok(running_machine *machine, UINT32 state); -static UINT32 handler_messagebox_anykey(running_machine *machine, UINT32 state); -static UINT32 handler_ingame(running_machine *machine, UINT32 state); -static UINT32 handler_load_save(running_machine *machine, UINT32 state); +static UINT32 handler_messagebox(running_machine *machine, render_container *container, UINT32 state); +static UINT32 handler_messagebox_ok(running_machine *machine, render_container *container, UINT32 state); +static UINT32 handler_messagebox_anykey(running_machine *machine, render_container *container, UINT32 state); +static UINT32 handler_ingame(running_machine *machine, render_container *container, UINT32 state); +static UINT32 handler_load_save(running_machine *machine, render_container *container, UINT32 state); /* slider controls */ static slider_state *slider_alloc(running_machine *machine, const char *title, INT32 minval, INT32 defval, INT32 maxval, INT32 incval, slider_update update, void *arg); @@ -135,7 +135,7 @@ static INT32 slider_crossoffset(running_machine *machine, void *arg, astring *st pair for the current UI handler -------------------------------------------------*/ -INLINE UINT32 ui_set_handler(UINT32 (*callback)(running_machine *, UINT32), UINT32 param) +INLINE UINT32 ui_set_handler(UINT32 (*callback)(running_machine *, render_container *, UINT32), UINT32 param) { ui_handler_callback = callback; ui_handler_param = param; @@ -340,10 +340,10 @@ void ui_set_startup_text(running_machine *machine, const char *text, int force) render it; called by video.c -------------------------------------------------*/ -void ui_update_and_render(running_machine *machine) +void ui_update_and_render(running_machine *machine, render_container *container) { /* always start clean */ - render_container_empty(render_container_get_ui()); + render_container_empty(container); /* if we're paused, dim the whole screen */ if (mame_get_phase(machine) >= MAME_PHASE_RESET && (single_step || mame_is_paused(machine))) @@ -354,19 +354,19 @@ void ui_update_and_render(running_machine *machine) if (alpha > 255) alpha = 255; if (alpha >= 0) - render_ui_add_rect(0.0f, 0.0f, 1.0f, 1.0f, MAKE_ARGB(alpha,0x00,0x00,0x00), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_rect(container, 0.0f, 0.0f, 1.0f, 1.0f, MAKE_ARGB(alpha,0x00,0x00,0x00), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } /* render any cheat stuff at the bottom */ - cheat_render_text(machine); + cheat_render_text(machine, container); /* call the current UI handler */ assert(ui_handler_callback != NULL); - ui_handler_param = (*ui_handler_callback)(machine, ui_handler_param); + ui_handler_param = (*ui_handler_callback)(machine, container, ui_handler_param); /* display any popup messages */ if (osd_ticks() < popup_text_end) - ui_draw_text_box(messagebox_text, JUSTIFY_CENTER, 0.5f, 0.9f, messagebox_backcolor); + ui_draw_text_box(container, messagebox_text, JUSTIFY_CENTER, 0.5f, 0.9f, messagebox_backcolor); else popup_text_end = 0; @@ -462,13 +462,13 @@ float ui_get_string_width(const char *s) color -------------------------------------------------*/ -void ui_draw_outlined_box(float x0, float y0, float x1, float y1, rgb_t backcolor) +void ui_draw_outlined_box(render_container *container, float x0, float y0, float x1, float y1, rgb_t backcolor) { - render_ui_add_rect(x0, y0, x1, y1, backcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - render_ui_add_line(x0, y0, x1, y0, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - render_ui_add_line(x1, y0, x1, y1, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - render_ui_add_line(x1, y1, x0, y1, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - render_ui_add_line(x0, y1, x0, y0, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_rect(container, x0, y0, x1, y1, backcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_line(container, x0, y0, x1, y0, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_line(container, x1, y0, x1, y1, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_line(container, x1, y1, x0, y1, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_line(container, x0, y1, x0, y0, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } @@ -476,9 +476,9 @@ void ui_draw_outlined_box(float x0, float y0, float x1, float y1, rgb_t backcolo ui_draw_text - simple text renderer -------------------------------------------------*/ -void ui_draw_text(const char *buf, float x, float y) +void ui_draw_text(render_container *container, const char *buf, float x, float y) { - ui_draw_text_full(buf, x, y, 1.0f - x, JUSTIFY_LEFT, WRAP_WORD, DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, NULL); + ui_draw_text_full(container, buf, x, y, 1.0f - x, JUSTIFY_LEFT, WRAP_WORD, DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, NULL); } @@ -488,7 +488,7 @@ void ui_draw_text(const char *buf, float x, float y) and full size computation -------------------------------------------------*/ -void ui_draw_text_full(const char *origs, float x, float y, float origwrapwidth, int justify, int wrap, int draw, rgb_t fgcolor, rgb_t bgcolor, float *totalwidth, float *totalheight) +void ui_draw_text_full(render_container *container, const char *origs, float x, float y, float origwrapwidth, int justify, int wrap, int draw, rgb_t fgcolor, rgb_t bgcolor, float *totalwidth, float *totalheight) { float lineheight = ui_get_line_height(); const char *ends = origs + strlen(origs); @@ -625,7 +625,7 @@ void ui_draw_text_full(const char *origs, float x, float y, float origwrapwidth, /* if opaque, add a black box */ if (draw == DRAW_OPAQUE) - render_ui_add_rect(curx, cury, curx + curwidth, cury + lineheight, bgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_rect(container, curx, cury, curx + curwidth, cury + lineheight, bgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); /* loop from the line start and add the characters */ while (linestart < s) @@ -638,7 +638,7 @@ void ui_draw_text_full(const char *origs, float x, float y, float origwrapwidth, if (draw != DRAW_NONE) { - render_ui_add_char(curx, cury, lineheight, render_get_ui_aspect(), fgcolor, ui_font, linechar); + render_container_add_char(container, curx, cury, lineheight, render_get_ui_aspect(), fgcolor, ui_font, linechar); curx += ui_get_char_width(linechar); } linestart += linecharcount; @@ -647,11 +647,11 @@ void ui_draw_text_full(const char *origs, float x, float y, float origwrapwidth, /* append ellipses if needed */ if (wrap == WRAP_TRUNCATE && *s != 0 && draw != DRAW_NONE) { - render_ui_add_char(curx, cury, lineheight, render_get_ui_aspect(), fgcolor, ui_font, '.'); + render_container_add_char(container, curx, cury, lineheight, render_get_ui_aspect(), fgcolor, ui_font, '.'); curx += ui_get_char_width('.'); - render_ui_add_char(curx, cury, lineheight, render_get_ui_aspect(), fgcolor, ui_font, '.'); + render_container_add_char(container, curx, cury, lineheight, render_get_ui_aspect(), fgcolor, ui_font, '.'); curx += ui_get_char_width('.'); - render_ui_add_char(curx, cury, lineheight, render_get_ui_aspect(), fgcolor, ui_font, '.'); + render_container_add_char(container, curx, cury, lineheight, render_get_ui_aspect(), fgcolor, ui_font, '.'); curx += ui_get_char_width('.'); } @@ -692,13 +692,13 @@ void ui_draw_text_full(const char *origs, float x, float y, float origwrapwidth, message with a box around it -------------------------------------------------*/ -void ui_draw_text_box(const char *text, int justify, float xpos, float ypos, rgb_t backcolor) +void ui_draw_text_box(render_container *container, const char *text, int justify, float xpos, float ypos, rgb_t backcolor) { float target_width, target_height; float target_x, target_y; /* compute the multi-line target width/height */ - ui_draw_text_full(text, 0, 0, 1.0f - 2.0f * UI_BOX_LR_BORDER, + ui_draw_text_full(container, text, 0, 0, 1.0f - 2.0f * UI_BOX_LR_BORDER, justify, WRAP_WORD, DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &target_width, &target_height); if (target_height > 1.0f - 2.0f * UI_BOX_TB_BORDER) target_height = floor((1.0f - 2.0f * UI_BOX_TB_BORDER) / ui_get_line_height()) * ui_get_line_height(); @@ -718,11 +718,11 @@ void ui_draw_text_box(const char *text, int justify, float xpos, float ypos, rgb target_y = 1.0f - UI_BOX_TB_BORDER - target_height; /* add a box around that */ - ui_draw_outlined_box(target_x - UI_BOX_LR_BORDER, + ui_draw_outlined_box(container, target_x - UI_BOX_LR_BORDER, target_y - UI_BOX_TB_BORDER, target_x + target_width + UI_BOX_LR_BORDER, target_y + target_height + UI_BOX_TB_BORDER, backcolor); - ui_draw_text_full(text, target_x, target_y, target_width, + ui_draw_text_full(container, text, target_x, target_y, target_width, justify, WRAP_WORD, DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, NULL); } @@ -1080,9 +1080,9 @@ astring &game_info_astring(running_machine *machine, astring &string) messagebox_text string but handles no input -------------------------------------------------*/ -static UINT32 handler_messagebox(running_machine *machine, UINT32 state) +static UINT32 handler_messagebox(running_machine *machine, render_container *container, UINT32 state) { - ui_draw_text_box(messagebox_text, JUSTIFY_LEFT, 0.5f, 0.5f, messagebox_backcolor); + ui_draw_text_box(container, messagebox_text, JUSTIFY_LEFT, 0.5f, 0.5f, messagebox_backcolor); return 0; } @@ -1092,10 +1092,10 @@ static UINT32 handler_messagebox(running_machine *machine, UINT32 state) messagebox_text string and waits for an OK -------------------------------------------------*/ -static UINT32 handler_messagebox_ok(running_machine *machine, UINT32 state) +static UINT32 handler_messagebox_ok(running_machine *machine, render_container *container, UINT32 state) { /* draw a standard message window */ - ui_draw_text_box(messagebox_text, JUSTIFY_LEFT, 0.5f, 0.5f, messagebox_backcolor); + ui_draw_text_box(container, messagebox_text, JUSTIFY_LEFT, 0.5f, 0.5f, messagebox_backcolor); /* an 'O' or left joystick kicks us to the next state */ if (state == 0 && (input_code_pressed_once(machine, KEYCODE_O) || ui_input_pressed(machine, IPT_UI_LEFT))) @@ -1122,10 +1122,10 @@ static UINT32 handler_messagebox_ok(running_machine *machine, UINT32 state) any keypress -------------------------------------------------*/ -static UINT32 handler_messagebox_anykey(running_machine *machine, UINT32 state) +static UINT32 handler_messagebox_anykey(running_machine *machine, render_container *container, UINT32 state) { /* draw a standard message window */ - ui_draw_text_box(messagebox_text, JUSTIFY_LEFT, 0.5f, 0.5f, messagebox_backcolor); + ui_draw_text_box(container, messagebox_text, JUSTIFY_LEFT, 0.5f, 0.5f, messagebox_backcolor); /* if the user cancels, exit out completely */ if (ui_input_pressed(machine, IPT_UI_CANCEL)) @@ -1147,14 +1147,14 @@ static UINT32 handler_messagebox_anykey(running_machine *machine, UINT32 state) of the standard keypresses -------------------------------------------------*/ -static UINT32 handler_ingame(running_machine *machine, UINT32 state) +static UINT32 handler_ingame(running_machine *machine, render_container *container, UINT32 state) { int is_paused = mame_is_paused(machine); /* first draw the FPS counter */ if (showfps || osd_ticks() < showfps_end) { - ui_draw_text_full(video_get_speed_text(machine), 0.0f, 0.0f, 1.0f, + ui_draw_text_full(container, video_get_speed_text(machine), 0.0f, 0.0f, 1.0f, JUSTIFY_RIGHT, WRAP_WORD, DRAW_OPAQUE, ARGB_WHITE, ARGB_BLACK, NULL, NULL); } else @@ -1165,7 +1165,7 @@ static UINT32 handler_ingame(running_machine *machine, UINT32 state) { astring profilertext; profiler_get_text(machine, profilertext); - ui_draw_text_full(profilertext, 0.0f, 0.0f, 1.0f, JUSTIFY_LEFT, WRAP_WORD, DRAW_OPAQUE, ARGB_WHITE, ARGB_BLACK, NULL, NULL); + ui_draw_text_full(container, profilertext, 0.0f, 0.0f, 1.0f, JUSTIFY_LEFT, WRAP_WORD, DRAW_OPAQUE, ARGB_WHITE, ARGB_BLACK, NULL, NULL); } /* if we're single-stepping, pause now */ @@ -1312,7 +1312,7 @@ static UINT32 handler_ingame(running_machine *machine, UINT32 state) specifying a game to save or load -------------------------------------------------*/ -static UINT32 handler_load_save(running_machine *machine, UINT32 state) +static UINT32 handler_load_save(running_machine *machine, render_container *container, UINT32 state) { char filename[20]; input_code code; @@ -1324,9 +1324,9 @@ static UINT32 handler_load_save(running_machine *machine, UINT32 state) /* okay, we're waiting for a key to select a slot; display a message */ if (state == LOADSAVE_SAVE) - ui_draw_message_window("Select position to save to"); + ui_draw_message_window(container, "Select position to save to"); else - ui_draw_message_window("Select position to load from"); + ui_draw_message_window(container, "Select position to load from"); /* check for cancel key */ if (ui_input_pressed(machine, IPT_UI_CANCEL)) diff --git a/src/emu/ui.h b/src/emu/ui.h index f90a958fa60..51665b9579d 100644 --- a/src/emu/ui.h +++ b/src/emu/ui.h @@ -112,7 +112,7 @@ struct _slider_state MACROS ***************************************************************************/ -#define ui_draw_message_window(text) ui_draw_text_box(text, JUSTIFY_LEFT, 0.5f, 0.5f, UI_BACKGROUND_COLOR) +#define ui_draw_message_window(c, text) ui_draw_text_box(c, text, JUSTIFY_LEFT, 0.5f, 0.5f, UI_BACKGROUND_COLOR) @@ -130,7 +130,7 @@ int ui_display_startup_screens(running_machine *machine, int first_time, int sho void ui_set_startup_text(running_machine *machine, const char *text, int force); /* once-per-frame update and render */ -void ui_update_and_render(running_machine *machine); +void ui_update_and_render(running_machine *machine, render_container *container); /* returns the current UI font */ render_font *ui_get_font(void); @@ -143,16 +143,16 @@ float ui_get_char_width(unicode_char ch); float ui_get_string_width(const char *s); /* draw an outlined box filled with a given color */ -void ui_draw_outlined_box(float x0, float y0, float x1, float y1, rgb_t backcolor); +void ui_draw_outlined_box(render_container *container, float x0, float y0, float x1, float y1, rgb_t backcolor); /* simple text draw at the given coordinates */ -void ui_draw_text(const char *buf, float x, float y); +void ui_draw_text(render_container *container, const char *buf, float x, float y); /* full-on text draw with all the options */ -void ui_draw_text_full(const char *origs, float x, float y, float wrapwidth, int justify, int wrap, int draw, rgb_t fgcolor, rgb_t bgcolor, float *totalwidth, float *totalheight); +void ui_draw_text_full(render_container *container, const char *origs, float x, float y, float wrapwidth, int justify, int wrap, int draw, rgb_t fgcolor, rgb_t bgcolor, float *totalwidth, float *totalheight); /* draw a multi-line message with a box around it */ -void ui_draw_text_box(const char *text, int justify, float xpos, float ypos, rgb_t backcolor); +void ui_draw_text_box(render_container *container, const char *text, int justify, float xpos, float ypos, rgb_t backcolor); /* display a temporary message at the bottom of the screen */ void CLIB_DECL ui_popup_time(int seconds, const char *text, ...) ATTR_PRINTF(2,3); diff --git a/src/emu/uigfx.c b/src/emu/uigfx.c index 1eacbafee91..0b37046707a 100644 --- a/src/emu/uigfx.c +++ b/src/emu/uigfx.c @@ -80,18 +80,18 @@ static void ui_gfx_exit(running_machine *machine); /* palette handling */ static void palette_handle_keys(running_machine *machine, ui_gfx_state *state); -static void palette_handler(running_machine *machine, ui_gfx_state *state); +static void palette_handler(running_machine *machine, render_container *container, ui_gfx_state *state); /* graphics set handling */ static void gfxset_handle_keys(running_machine *machine, ui_gfx_state *state, int xcells, int ycells); static void gfxset_draw_item(running_machine *machine, const gfx_element *gfx, int index, bitmap_t *bitmap, int dstx, int dsty, int color, int rotate); static void gfxset_update_bitmap(running_machine *machine, ui_gfx_state *state, int xcells, int ycells, gfx_element *gfx); -static void gfxset_handler(running_machine *machine, ui_gfx_state *state); +static void gfxset_handler(running_machine *machine, render_container *container, ui_gfx_state *state); /* tilemap handling */ static void tilemap_handle_keys(running_machine *machine, ui_gfx_state *state, int viswidth, int visheight); static void tilemap_update_bitmap(running_machine *machine, ui_gfx_state *state, int width, int height); -static void tilemap_handler(running_machine *machine, ui_gfx_state *state); +static void tilemap_handler(running_machine *machine, render_container *container, ui_gfx_state *state); @@ -151,7 +151,7 @@ static void ui_gfx_exit(running_machine *machine) ui_gfx_ui_handler - primary UI handler -------------------------------------------------*/ -UINT32 ui_gfx_ui_handler(running_machine *machine, UINT32 uistate) +UINT32 ui_gfx_ui_handler(running_machine *machine, render_container *container, UINT32 uistate) { ui_gfx_state *state = &ui_gfx; @@ -171,7 +171,7 @@ again: /* if we have a palette, display it */ if (machine->config->total_colors > 0) { - palette_handler(machine, state); + palette_handler(machine, container, state); break; } @@ -182,7 +182,7 @@ again: /* if we have graphics sets, display them */ if (machine->gfx[0] != NULL) { - gfxset_handler(machine, state); + gfxset_handler(machine, container, state); break; } @@ -193,7 +193,7 @@ again: /* if we have tilemaps, display them */ if (tilemap_count(machine) > 0) { - tilemap_handler(machine, state); + tilemap_handler(machine, container, state); break; } @@ -234,7 +234,7 @@ cancel: viewer -------------------------------------------------*/ -static void palette_handler(running_machine *machine, ui_gfx_state *state) +static void palette_handler(running_machine *machine, render_container *container, ui_gfx_state *state) { int total = state->palette.which ? colortable_palette_get_size(machine->colortable) : machine->config->total_colors; const char *title = state->palette.which ? "COLORTABLE" : "PALETTE"; @@ -276,14 +276,14 @@ static void palette_handler(running_machine *machine, ui_gfx_state *state) x0 = boxbounds.x0 - (0.5f - 0.5f * (titlewidth + chwidth)); /* go ahead and draw the outer box now */ - ui_draw_outlined_box(boxbounds.x0 - x0, boxbounds.y0, boxbounds.x1 + x0, boxbounds.y1, UI_GFXVIEWER_BG_COLOR); + ui_draw_outlined_box(container, boxbounds.x0 - x0, boxbounds.y0, boxbounds.x1 + x0, boxbounds.y1, UI_GFXVIEWER_BG_COLOR); /* draw the title */ x0 = 0.5f - 0.5f * titlewidth; y0 = boxbounds.y0 + 0.5f * chheight; for (x = 0; title[x] != 0; x++) { - render_ui_add_char(x0, y0, chheight, render_get_ui_aspect(), ARGB_WHITE, ui_font, title[x]); + render_container_add_char(container, x0, y0, chheight, render_get_ui_aspect(), ARGB_WHITE, ui_font, title[x]); x0 += render_font_get_char_width(ui_font, chheight, render_get_ui_aspect(), title[x]); } @@ -297,12 +297,12 @@ static void palette_handler(running_machine *machine, ui_gfx_state *state) { x0 = boxbounds.x0 + 6.0f * chwidth + (float)x * cellwidth; y0 = boxbounds.y0 + 2.0f * chheight; - render_ui_add_char(x0 + 0.5f * (cellwidth - chwidth), y0, chheight, render_get_ui_aspect(), ARGB_WHITE, ui_font, "0123456789ABCDEF"[x & 0xf]); + render_container_add_char(container, x0 + 0.5f * (cellwidth - chwidth), y0, chheight, render_get_ui_aspect(), ARGB_WHITE, ui_font, "0123456789ABCDEF"[x & 0xf]); /* if we're skipping, draw a point between the character and the box to indicate which */ /* one it's referring to */ if (skip != 0) - render_ui_add_point(x0 + 0.5f * cellwidth, 0.5f * (y0 + chheight + cellboxbounds.y0), UI_LINE_WIDTH, ARGB_WHITE, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_point(container, x0 + 0.5f * cellwidth, 0.5f * (y0 + chheight + cellboxbounds.y0), UI_LINE_WIDTH, ARGB_WHITE, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } /* draw the side column headers */ @@ -319,14 +319,14 @@ static void palette_handler(running_machine *machine, ui_gfx_state *state) x0 = boxbounds.x0 + 5.5f * chwidth; y0 = boxbounds.y0 + 3.5f * chheight + (float)y * cellheight; if (skip != 0) - render_ui_add_point(0.5f * (x0 + cellboxbounds.x0), y0 + 0.5f * cellheight, UI_LINE_WIDTH, ARGB_WHITE, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_point(container, 0.5f * (x0 + cellboxbounds.x0), y0 + 0.5f * cellheight, UI_LINE_WIDTH, ARGB_WHITE, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); /* draw the row header */ sprintf(buffer, "%5X", state->palette.offset + y * state->palette.count); for (x = 4; x >= 0; x--) { x0 -= render_font_get_char_width(ui_font, chheight, render_get_ui_aspect(), buffer[x]); - render_ui_add_char(x0, y0 + 0.5f * (cellheight - chheight), chheight, render_get_ui_aspect(), ARGB_WHITE, ui_font, buffer[x]); + render_container_add_char(container, x0, y0 + 0.5f * (cellheight - chheight), chheight, render_get_ui_aspect(), ARGB_WHITE, ui_font, buffer[x]); } } @@ -338,7 +338,7 @@ static void palette_handler(running_machine *machine, ui_gfx_state *state) if (index < total) { pen_t pen = state->palette.which ? colortable_palette_get_color(machine->colortable, index) : raw_color[index]; - render_ui_add_rect(cellboxbounds.x0 + x * cellwidth, cellboxbounds.y0 + y * cellheight, + render_container_add_rect(container, cellboxbounds.x0 + x * cellwidth, cellboxbounds.y0 + y * cellheight, cellboxbounds.x0 + (x + 1) * cellwidth, cellboxbounds.y0 + (y + 1) * cellheight, 0xff000000 | pen, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } @@ -422,7 +422,7 @@ static void palette_handle_keys(running_machine *machine, ui_gfx_state *state) viewer -------------------------------------------------*/ -static void gfxset_handler(running_machine *machine, ui_gfx_state *state) +static void gfxset_handler(running_machine *machine, render_container *container, ui_gfx_state *state) { render_font *ui_font = ui_get_font(); int set = state->gfxset.set; @@ -519,14 +519,14 @@ static void gfxset_handler(running_machine *machine, ui_gfx_state *state) x0 = boxbounds.x0 - (0.5f - 0.5f * (titlewidth + chwidth)); /* go ahead and draw the outer box now */ - ui_draw_outlined_box(boxbounds.x0 - x0, boxbounds.y0, boxbounds.x1 + x0, boxbounds.y1, UI_GFXVIEWER_BG_COLOR); + ui_draw_outlined_box(container, boxbounds.x0 - x0, boxbounds.y0, boxbounds.x1 + x0, boxbounds.y1, UI_GFXVIEWER_BG_COLOR); /* draw the title */ x0 = 0.5f - 0.5f * titlewidth; y0 = boxbounds.y0 + 0.5f * chheight; for (x = 0; title[x] != 0; x++) { - render_ui_add_char(x0, y0, chheight, render_get_ui_aspect(), ARGB_WHITE, ui_font, title[x]); + render_container_add_char(container, x0, y0, chheight, render_get_ui_aspect(), ARGB_WHITE, ui_font, title[x]); x0 += render_font_get_char_width(ui_font, chheight, render_get_ui_aspect(), title[x]); } @@ -536,12 +536,12 @@ static void gfxset_handler(running_machine *machine, ui_gfx_state *state) { x0 = boxbounds.x0 + 6.0f * chwidth + (float)x * cellwidth; y0 = boxbounds.y0 + 2.0f * chheight; - render_ui_add_char(x0 + 0.5f * (cellwidth - chwidth), y0, chheight, render_get_ui_aspect(), ARGB_WHITE, ui_font, "0123456789ABCDEF"[x & 0xf]); + render_container_add_char(container, x0 + 0.5f * (cellwidth - chwidth), y0, chheight, render_get_ui_aspect(), ARGB_WHITE, ui_font, "0123456789ABCDEF"[x & 0xf]); /* if we're skipping, draw a point between the character and the box to indicate which */ /* one it's referring to */ if (skip != 0) - render_ui_add_point(x0 + 0.5f * cellwidth, 0.5f * (y0 + chheight + boxbounds.y0 + 3.5f * chheight), UI_LINE_WIDTH, ARGB_WHITE, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_point(container, x0 + 0.5f * cellwidth, 0.5f * (y0 + chheight + boxbounds.y0 + 3.5f * chheight), UI_LINE_WIDTH, ARGB_WHITE, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } /* draw the side column headers */ @@ -558,14 +558,14 @@ static void gfxset_handler(running_machine *machine, ui_gfx_state *state) x0 = boxbounds.x0 + 5.5f * chwidth; y0 = boxbounds.y0 + 3.5f * chheight + (float)y * cellheight; if (skip != 0) - render_ui_add_point(0.5f * (x0 + boxbounds.x0 + 6.0f * chwidth), y0 + 0.5f * cellheight, UI_LINE_WIDTH, ARGB_WHITE, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_point(container, 0.5f * (x0 + boxbounds.x0 + 6.0f * chwidth), y0 + 0.5f * cellheight, UI_LINE_WIDTH, ARGB_WHITE, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); /* draw the row header */ sprintf(buffer, "%5X", state->gfxset.offset[set] + y * xcells); for (x = 4; x >= 0; x--) { x0 -= render_font_get_char_width(ui_font, chheight, render_get_ui_aspect(), buffer[x]); - render_ui_add_char(x0, y0 + 0.5f * (cellheight - chheight), chheight, render_get_ui_aspect(), ARGB_WHITE, ui_font, buffer[x]); + render_container_add_char(container, x0, y0 + 0.5f * (cellheight - chheight), chheight, render_get_ui_aspect(), ARGB_WHITE, ui_font, buffer[x]); } } @@ -573,7 +573,7 @@ static void gfxset_handler(running_machine *machine, ui_gfx_state *state) gfxset_update_bitmap(machine, state, xcells, ycells, gfx); /* add the final quad */ - render_ui_add_quad(boxbounds.x0 + 6.0f * chwidth, boxbounds.y0 + 3.5f * chheight, + render_container_add_quad(container, boxbounds.x0 + 6.0f * chwidth, boxbounds.y0 + 3.5f * chheight, boxbounds.x0 + 6.0f * chwidth + (float)cellboxwidth / (float)targwidth, boxbounds.y0 + 3.5f * chheight + (float)cellboxheight / (float)targheight, ARGB_WHITE, state->texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); @@ -839,7 +839,7 @@ static void gfxset_draw_item(running_machine *machine, const gfx_element *gfx, i viewer -------------------------------------------------*/ -static void tilemap_handler(running_machine *machine, ui_gfx_state *state) +static void tilemap_handler(running_machine *machine, render_container *container, ui_gfx_state *state) { render_font *ui_font = ui_get_font(); float chwidth, chheight; @@ -919,14 +919,14 @@ static void tilemap_handler(running_machine *machine, ui_gfx_state *state) } /* go ahead and draw the outer box now */ - ui_draw_outlined_box(boxbounds.x0, boxbounds.y0, boxbounds.x1, boxbounds.y1, UI_GFXVIEWER_BG_COLOR); + ui_draw_outlined_box(container, boxbounds.x0, boxbounds.y0, boxbounds.x1, boxbounds.y1, UI_GFXVIEWER_BG_COLOR); /* draw the title */ x0 = 0.5f - 0.5f * titlewidth; y0 = boxbounds.y0 + 0.5f * chheight; for (x = 0; title[x] != 0; x++) { - render_ui_add_char(x0, y0, chheight, render_get_ui_aspect(), ARGB_WHITE, ui_font, title[x]); + render_container_add_char(container, x0, y0, chheight, render_get_ui_aspect(), ARGB_WHITE, ui_font, title[x]); x0 += render_font_get_char_width(ui_font, chheight, render_get_ui_aspect(), title[x]); } @@ -934,7 +934,7 @@ static void tilemap_handler(running_machine *machine, ui_gfx_state *state) tilemap_update_bitmap(machine, state, mapboxwidth / pixelscale, mapboxheight / pixelscale); /* add the final quad */ - render_ui_add_quad(mapboxbounds.x0, mapboxbounds.y0, + render_container_add_quad(container, mapboxbounds.x0, mapboxbounds.y0, mapboxbounds.x1, mapboxbounds.y1, ARGB_WHITE, state->texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXORIENT(state->tilemap.rotate)); diff --git a/src/emu/uigfx.h b/src/emu/uigfx.h index b87aa6a6e21..d7d1d2c42e8 100644 --- a/src/emu/uigfx.h +++ b/src/emu/uigfx.h @@ -24,7 +24,7 @@ void ui_gfx_init(running_machine *machine); /* master handler */ -UINT32 ui_gfx_ui_handler(running_machine *machine, UINT32 state); +UINT32 ui_gfx_ui_handler(running_machine *machine, render_container *container, UINT32 state); #endif /* __UIGFX_H__ */ diff --git a/src/emu/uimenu.c b/src/emu/uimenu.c index 5134680c4fc..a0ccc569a93 100644 --- a/src/emu/uimenu.c +++ b/src/emu/uimenu.c @@ -117,6 +117,7 @@ struct _ui_menu_item struct _ui_menu { running_machine * machine; /* machine we are attached to */ + render_container * container; /* render_container we render to */ ui_menu_handler_func handler; /* handler callback */ void * parameter; /* parameter */ ui_menu_event event; /* the UI event that occurred */ @@ -302,7 +303,7 @@ static void menu_select_game_custom_render(running_machine *machine, ui_menu *me /* menu helpers */ static void menu_render_triangle(bitmap_t *dest, const bitmap_t *source, const rectangle *sbounds, void *param); -static void menu_settings_custom_render_one(float x1, float y1, float x2, float y2, const dip_descriptor *dip, UINT32 selectedmask); +static void menu_settings_custom_render_one(render_container *container, float x1, float y1, float x2, float y2, const dip_descriptor *dip, UINT32 selectedmask); static void menu_settings_custom_render(running_machine *machine, ui_menu *menu, void *state, void *selectedref, float top, float bottom, float x, float y, float x2, float y2); @@ -431,7 +432,7 @@ static void ui_menu_exit(running_machine *machine) ui_menu_alloc - allocate a new menu -------------------------------------------------*/ -ui_menu *ui_menu_alloc(running_machine *machine, ui_menu_handler_func handler, void *parameter) +ui_menu *ui_menu_alloc(running_machine *machine, render_container *container, ui_menu_handler_func handler, void *parameter) { ui_menu *menu; @@ -440,6 +441,7 @@ ui_menu *ui_menu_alloc(running_machine *machine, ui_menu_handler_func handler, v /* initialize the state */ menu->machine = machine; + menu->container = container; menu->handler = handler; menu->parameter = parameter; @@ -808,7 +810,7 @@ static void ui_menu_draw(running_machine *machine, ui_menu *menu, int customonly x2 = visible_left + visible_width + UI_BOX_LR_BORDER; y2 = visible_top + visible_main_menu_height + UI_BOX_TB_BORDER; if (!customonly) - ui_draw_outlined_box(x1, y1, x2, y2, UI_BACKGROUND_COLOR); + ui_draw_outlined_box(menu->container, x1, y1, x2, y2, UI_BACKGROUND_COLOR); /* determine the first visible line based on the current selection */ top_line = menu->selected - visible_lines / 2; @@ -828,7 +830,7 @@ static void ui_menu_draw(running_machine *machine, ui_menu *menu, int customonly { mouse_target = ui_input_find_mouse(machine, &mouse_target_x, &mouse_target_y, &mouse_button); if (mouse_target != NULL) - if (render_target_map_point_container(mouse_target, mouse_target_x, mouse_target_y, render_container_get_ui(), &mouse_x, &mouse_y)) + if (render_target_map_point_container(mouse_target, mouse_target_x, mouse_target_y, menu->container, &mouse_x, &mouse_y)) mouse_hit = TRUE; } @@ -874,13 +876,14 @@ static void ui_menu_draw(running_machine *machine, ui_menu *menu, int customonly /* if we have some background hilighting to do, add a quad behind everything else */ if (bgcolor != UI_TEXT_BG_COLOR) - render_ui_add_quad(line_x0, line_y0, line_x1, line_y1, bgcolor, hilight_texture, + render_container_add_quad(menu->container, line_x0, line_y0, line_x1, line_y1, bgcolor, hilight_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(TRUE)); /* if we're on the top line, display the up arrow */ if (linenum == 0 && top_line != 0) { - render_ui_add_quad( 0.5f * (x1 + x2) - 0.5f * ud_arrow_width, + render_container_add_quad( menu->container, + 0.5f * (x1 + x2) - 0.5f * ud_arrow_width, line_y + 0.25f * line_height, 0.5f * (x1 + x2) + 0.5f * ud_arrow_width, line_y + 0.75f * line_height, @@ -894,7 +897,8 @@ static void ui_menu_draw(running_machine *machine, ui_menu *menu, int customonly /* if we're on the bottom line, display the down arrow */ else if (linenum == visible_lines - 1 && itemnum != menu->numitems - 1) { - render_ui_add_quad( 0.5f * (x1 + x2) - 0.5f * ud_arrow_width, + render_container_add_quad( menu->container, + 0.5f * (x1 + x2) - 0.5f * ud_arrow_width, line_y + 0.25f * line_height, 0.5f * (x1 + x2) + 0.5f * ud_arrow_width, line_y + 0.75f * line_height, @@ -907,11 +911,11 @@ static void ui_menu_draw(running_machine *machine, ui_menu *menu, int customonly /* if we're just a divider, draw a line */ else if (strcmp(itemtext, MENU_SEPARATOR_ITEM) == 0) - render_ui_add_line(visible_left, line_y + 0.5f * line_height, visible_left + visible_width, line_y + 0.5f * line_height, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_line(menu->container, visible_left, line_y + 0.5f * line_height, visible_left + visible_width, line_y + 0.5f * line_height, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); /* if we don't have a subitem, just draw the string centered */ else if (item->subtext == NULL) - ui_draw_text_full(itemtext, effective_left, line_y, effective_width, + ui_draw_text_full(menu->container, itemtext, effective_left, line_y, effective_width, JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NORMAL, fgcolor, bgcolor, NULL, NULL); /* otherwise, draw the item on the left and the subitem text on the right */ @@ -922,7 +926,7 @@ static void ui_menu_draw(running_machine *machine, ui_menu *menu, int customonly float item_width, subitem_width; /* draw the left-side text */ - ui_draw_text_full(itemtext, effective_left, line_y, effective_width, + ui_draw_text_full(menu->container, itemtext, effective_left, line_y, effective_width, JUSTIFY_LEFT, WRAP_TRUNCATE, DRAW_NORMAL, fgcolor, bgcolor, &item_width, NULL); /* give 2 spaces worth of padding */ @@ -937,13 +941,14 @@ static void ui_menu_draw(running_machine *machine, ui_menu *menu, int customonly } /* draw the subitem right-justified */ - ui_draw_text_full(subitem_text, effective_left + item_width, line_y, effective_width - item_width, + ui_draw_text_full(menu->container, subitem_text, effective_left + item_width, line_y, effective_width - item_width, JUSTIFY_RIGHT, WRAP_TRUNCATE, DRAW_NORMAL, subitem_invert ? fgcolor3 : fgcolor2, bgcolor, &subitem_width, NULL); /* apply arrows */ if (itemnum == menu->selected && (item->flags & MENU_FLAG_LEFT_ARROW)) { - render_ui_add_quad( effective_left + effective_width - subitem_width - gutter_width, + render_container_add_quad( menu->container, + effective_left + effective_width - subitem_width - gutter_width, line_y + 0.1f * line_height, effective_left + effective_width - subitem_width - gutter_width + lr_arrow_width, line_y + 0.9f * line_height, @@ -953,7 +958,8 @@ static void ui_menu_draw(running_machine *machine, ui_menu *menu, int customonly } if (itemnum == menu->selected && (item->flags & MENU_FLAG_RIGHT_ARROW)) { - render_ui_add_quad( effective_left + effective_width + gutter_width - lr_arrow_width, + render_container_add_quad( menu->container, + effective_left + effective_width + gutter_width - lr_arrow_width, line_y + 0.1f * line_height, effective_left + effective_width + gutter_width, line_y + 0.9f * line_height, @@ -975,7 +981,7 @@ static void ui_menu_draw(running_machine *machine, ui_menu *menu, int customonly float target_x, target_y; /* compute the multi-line target width/height */ - ui_draw_text_full(item->subtext, 0, 0, visible_width * 0.75f, + ui_draw_text_full(menu->container, item->subtext, 0, 0, visible_width * 0.75f, JUSTIFY_RIGHT, WRAP_WORD, DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &target_width, &target_height); /* determine the target location */ @@ -985,11 +991,11 @@ static void ui_menu_draw(running_machine *machine, ui_menu *menu, int customonly target_y = line_y - target_height - UI_BOX_TB_BORDER; /* add a box around that */ - ui_draw_outlined_box(target_x - UI_BOX_LR_BORDER, + ui_draw_outlined_box(menu->container, target_x - UI_BOX_LR_BORDER, target_y - UI_BOX_TB_BORDER, target_x + target_width + UI_BOX_LR_BORDER, target_y + target_height + UI_BOX_TB_BORDER, subitem_invert ? UI_SELECTED_BG_COLOR : UI_BACKGROUND_COLOR); - ui_draw_text_full(item->subtext, target_x, target_y, target_width, + ui_draw_text_full(menu->container, item->subtext, target_x, target_y, target_width, JUSTIFY_RIGHT, WRAP_WORD, DRAW_NORMAL, UI_SELECTED_COLOR, UI_SELECTED_BG_COLOR, NULL, NULL); } @@ -1022,7 +1028,7 @@ static void ui_menu_draw_text_box(ui_menu *menu) float target_x, target_y; /* compute the multi-line target width/height */ - ui_draw_text_full(text, 0, 0, 1.0f - 2.0f * UI_BOX_LR_BORDER - 2.0f * gutter_width, + ui_draw_text_full(menu->container, text, 0, 0, 1.0f - 2.0f * UI_BOX_LR_BORDER - 2.0f * gutter_width, JUSTIFY_LEFT, WRAP_WORD, DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &target_width, &target_height); target_height += 2.0f * line_height; if (target_height > 1.0f - 2.0f * UI_BOX_TB_BORDER) @@ -1047,22 +1053,23 @@ static void ui_menu_draw_text_box(ui_menu *menu) target_y = 1.0f - UI_BOX_TB_BORDER - target_height; /* add a box around that */ - ui_draw_outlined_box(target_x - UI_BOX_LR_BORDER - gutter_width, + ui_draw_outlined_box(menu->container, target_x - UI_BOX_LR_BORDER - gutter_width, target_y - UI_BOX_TB_BORDER, target_x + target_width + gutter_width + UI_BOX_LR_BORDER, target_y + target_height + UI_BOX_TB_BORDER, (menu->item[0].flags & MENU_FLAG_REDTEXT) ? UI_RED_COLOR : UI_BACKGROUND_COLOR); - ui_draw_text_full(text, target_x, target_y, target_width, + ui_draw_text_full(menu->container, text, target_x, target_y, target_width, JUSTIFY_LEFT, WRAP_WORD, DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, NULL); /* draw the "return to prior menu" text with a hilight behind it */ - render_ui_add_quad( target_x + 0.5f * UI_LINE_WIDTH, + render_container_add_quad(menu->container, + target_x + 0.5f * UI_LINE_WIDTH, target_y + target_height - line_height, target_x + target_width - 0.5f * UI_LINE_WIDTH, target_y + target_height, UI_SELECTED_BG_COLOR, hilight_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(TRUE)); - ui_draw_text_full(backtext, target_x, target_y + target_height - line_height, target_width, + ui_draw_text_full(menu->container, backtext, target_x, target_y + target_height - line_height, target_width, JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NORMAL, UI_SELECTED_COLOR, UI_SELECTED_BG_COLOR, NULL, NULL); /* artificially set the hover to the last item so a double-click exits */ @@ -1337,11 +1344,11 @@ void ui_menu_stack_pop(running_machine *machine) and calls the menu handler -------------------------------------------------*/ -UINT32 ui_menu_ui_handler(running_machine *machine, UINT32 state) +UINT32 ui_menu_ui_handler(running_machine *machine, render_container *container, UINT32 state) { /* if we have no menus stacked up, start with the main menu */ if (menu_stack == NULL) - ui_menu_stack_push(ui_menu_alloc(machine, menu_main, NULL)); + ui_menu_stack_push(ui_menu_alloc(machine, container, menu_main, NULL)); /* update the menu state */ if (menu_stack != NULL) @@ -1367,16 +1374,16 @@ UINT32 ui_menu_ui_handler(running_machine *machine, UINT32 state) standard menu handler -------------------------------------------------*/ -UINT32 ui_slider_ui_handler(running_machine *machine, UINT32 state) +UINT32 ui_slider_ui_handler(running_machine *machine, render_container *container, UINT32 state) { UINT32 result; /* if this is the first call, push the sliders menu */ if (state) - ui_menu_stack_push(ui_menu_alloc(machine, menu_sliders, (void *)1)); + ui_menu_stack_push(ui_menu_alloc(machine, container, menu_sliders, (void *)1)); /* handle standard menus */ - result = ui_menu_ui_handler(machine, state); + result = ui_menu_ui_handler(machine, container, state); /* if we are cancelled, pop the sliders menu */ if (result == UI_HANDLER_CANCEL) @@ -1391,7 +1398,7 @@ UINT32 ui_slider_ui_handler(running_machine *machine, UINT32 state) select menu to be visible and inescapable -------------------------------------------------*/ -void ui_menu_force_game_select(running_machine *machine) +void ui_menu_force_game_select(running_machine *machine, render_container *container) { char *gamename = (char *)options_get_string(mame_options(), OPTION_GAMENAME); @@ -1399,8 +1406,8 @@ void ui_menu_force_game_select(running_machine *machine) ui_menu_stack_reset(machine); /* add the quit entry followed by the game select entry */ - ui_menu_stack_push(ui_menu_alloc(machine, menu_quit_game, NULL)); - ui_menu_stack_push(ui_menu_alloc(machine, menu_select_game, gamename)); + ui_menu_stack_push(ui_menu_alloc(machine, container, menu_quit_game, NULL)); + ui_menu_stack_push(ui_menu_alloc(machine, container, menu_select_game, gamename)); /* force the menus on */ ui_show_menu(); @@ -1448,7 +1455,7 @@ static void menu_main(running_machine *machine, ui_menu *menu, void *parameter, /* process the menu */ event = ui_menu_process(machine, menu, 0); if (event != NULL && event->iptkey == IPT_UI_SELECT) - ui_menu_stack_push(ui_menu_alloc(machine, (ui_menu_handler_func)event->itemref, NULL)); + ui_menu_stack_push(ui_menu_alloc(machine, menu->container, (ui_menu_handler_func)event->itemref, NULL)); } @@ -1545,7 +1552,7 @@ static void menu_input_groups(running_machine *machine, ui_menu *menu, void *par /* process the menu */ event = ui_menu_process(machine, menu, 0); if (event != NULL && event->iptkey == IPT_UI_SELECT) - ui_menu_stack_push(ui_menu_alloc(machine, menu_input_general, event->itemref)); + ui_menu_stack_push(ui_menu_alloc(machine, menu->container, menu_input_general, event->itemref)); } @@ -2101,7 +2108,7 @@ static void menu_settings_custom_render(running_machine *machine, ui_menu *menu, y2 = y1 + bottom; /* draw extra menu area */ - ui_draw_outlined_box(x1, y1, x2, y2, UI_BACKGROUND_COLOR); + ui_draw_outlined_box(menu->container, x1, y1, x2, y2, UI_BACKGROUND_COLOR); y1 += (float)DIP_SWITCH_SPACING; /* iterate over DIP switches */ @@ -2117,7 +2124,7 @@ static void menu_settings_custom_render(running_machine *machine, ui_menu *menu, selectedmask |= 1 << (diploc->swnum - 1); /* draw one switch */ - menu_settings_custom_render_one(x1, y1, x2, y1 + DIP_SWITCH_HEIGHT, dip, selectedmask); + menu_settings_custom_render_one(menu->container, x1, y1, x2, y1 + DIP_SWITCH_HEIGHT, dip, selectedmask); y1 += (float)(DIP_SWITCH_SPACING + DIP_SWITCH_HEIGHT); } } @@ -2128,7 +2135,7 @@ static void menu_settings_custom_render(running_machine *machine, ui_menu *menu, DIP switch -------------------------------------------------*/ -static void menu_settings_custom_render_one(float x1, float y1, float x2, float y2, const dip_descriptor *dip, UINT32 selectedmask) +static void menu_settings_custom_render_one(render_container *container, float x1, float y1, float x2, float y2, const dip_descriptor *dip, UINT32 selectedmask) { float switch_field_width = SINGLE_TOGGLE_SWITCH_FIELD_WIDTH * render_get_ui_aspect(); float switch_width = SINGLE_TOGGLE_SWITCH_WIDTH * render_get_ui_aspect(); @@ -2143,7 +2150,8 @@ static void menu_settings_custom_render_one(float x1, float y1, float x2, float x1 += (x2 - x1 - numtoggles * switch_field_width) / 2; /* draw the dip switch name */ - ui_draw_text_full( dip->name, + ui_draw_text_full( container, + dip->name, 0, y1 + (DIP_SWITCH_HEIGHT - UI_TARGET_FONT_HEIGHT) / 2, x1 - ui_get_string_width(" "), @@ -2166,7 +2174,7 @@ static void menu_settings_custom_render_one(float x1, float y1, float x2, float float innerx1; /* first outline the switch */ - ui_draw_outlined_box(x1, y1, x1 + switch_field_width, y2, UI_BACKGROUND_COLOR); + ui_draw_outlined_box(container, x1, y1, x1 + switch_field_width, y2, UI_BACKGROUND_COLOR); /* compute x1/x2 for the inner filled in switch */ innerx1 = x1 + (switch_field_width - switch_width) / 2; @@ -2175,13 +2183,13 @@ static void menu_settings_custom_render_one(float x1, float y1, float x2, float if (dip->mask & (1 << toggle)) { float innery1 = (dip->state & (1 << toggle)) ? y1_on : y1_off; - render_ui_add_rect(innerx1, innery1, innerx1 + switch_width, innery1 + SINGLE_TOGGLE_SWITCH_HEIGHT, + render_container_add_rect(container, innerx1, innery1, innerx1 + switch_width, innery1 + SINGLE_TOGGLE_SWITCH_HEIGHT, (selectedmask & (1 << toggle)) ? UI_DIPSW_COLOR : UI_TEXT_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } else { - render_ui_add_rect(innerx1, y1_off, innerx1 + switch_width, y1_on + SINGLE_TOGGLE_SWITCH_HEIGHT, + render_container_add_rect(container, innerx1, y1_off, innerx1 + switch_width, y1_on + SINGLE_TOGGLE_SWITCH_HEIGHT, UI_UNAVAILABLE_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } @@ -2865,11 +2873,11 @@ static void menu_sliders_custom_render(running_machine *machine, ui_menu *menu, x2 = 1.0f - UI_BOX_LR_BORDER; /* draw extra menu area */ - ui_draw_outlined_box(x1, y1, x2, y2, UI_BACKGROUND_COLOR); + ui_draw_outlined_box(menu->container, x1, y1, x2, y2, UI_BACKGROUND_COLOR); y1 += UI_BOX_TB_BORDER; /* determine the text height */ - ui_draw_text_full(tempstring, 0, 0, x2 - x1 - 2.0f * UI_BOX_LR_BORDER, + ui_draw_text_full(menu->container, tempstring, 0, 0, x2 - x1 - 2.0f * UI_BOX_LR_BORDER, JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NONE, ARGB_WHITE, ARGB_BLACK, NULL, &text_height); /* draw the thermometer */ @@ -2885,18 +2893,18 @@ static void menu_sliders_custom_render(running_machine *machine, ui_menu *menu, current_x = bar_left + bar_width * percentage; /* fill in the percentage */ - render_ui_add_rect(bar_left, bar_top, current_x, bar_bottom, UI_SLIDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_rect(menu->container, bar_left, bar_top, current_x, bar_bottom, UI_SLIDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); /* draw the top and bottom lines */ - render_ui_add_line(bar_left, bar_top, bar_left + bar_width, bar_top, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - render_ui_add_line(bar_left, bar_bottom, bar_left + bar_width, bar_bottom, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_line(menu->container, bar_left, bar_top, bar_left + bar_width, bar_top, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_line(menu->container, bar_left, bar_bottom, bar_left + bar_width, bar_bottom, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); /* draw default marker */ - render_ui_add_line(default_x, bar_area_top, default_x, bar_top, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - render_ui_add_line(default_x, bar_bottom, default_x, bar_area_top + bar_area_height, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_line(menu->container, default_x, bar_area_top, default_x, bar_top, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + render_container_add_line(menu->container, default_x, bar_bottom, default_x, bar_area_top + bar_area_height, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); /* draw the actual text */ - ui_draw_text_full(tempstring, x1 + UI_BOX_LR_BORDER, y1 + line_height, x2 - x1 - 2.0f * UI_BOX_LR_BORDER, + ui_draw_text_full(menu->container, tempstring, x1 + UI_BOX_LR_BORDER, y1 + line_height, x2 - x1 - 2.0f * UI_BOX_LR_BORDER, JUSTIFY_CENTER, WRAP_WORD, DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, &text_height); } } @@ -2918,7 +2926,7 @@ static void menu_video_targets(running_machine *machine, ui_menu *menu, void *pa /* process the menu */ event = ui_menu_process(machine, menu, 0); if (event != NULL && event->iptkey == IPT_UI_SELECT) - ui_menu_stack_push(ui_menu_alloc(machine, menu_video_options, event->itemref)); + ui_menu_stack_push(ui_menu_alloc(machine, menu->container, menu_video_options, event->itemref)); } @@ -2978,9 +2986,9 @@ static void menu_video_options(running_machine *machine, ui_menu *menu, void *pa if (target == render_get_ui_target()) { render_container_user_settings settings; - render_container_get_user_settings(render_container_get_ui(), &settings); + render_container_get_user_settings(menu->container, &settings); settings.orientation = orientation_add(delta ^ ROT180, settings.orientation); - render_container_set_user_settings(render_container_get_ui(), &settings); + render_container_set_user_settings(menu->container, &settings); } changed = TRUE; } @@ -3392,7 +3400,7 @@ static void menu_select_game(running_machine *machine, ui_menu *menu, void *para /* special case for configure inputs */ if ((FPTR)driver == 1) - ui_menu_stack_push(ui_menu_alloc(menu->machine, menu_input_groups, NULL)); + ui_menu_stack_push(ui_menu_alloc(menu->machine, menu->container, menu_input_groups, NULL)); /* anything else is a driver */ else @@ -3427,7 +3435,7 @@ static void menu_select_game(running_machine *machine, ui_menu *menu, void *para else if (event->iptkey == IPT_UI_CANCEL && menustate->search[0] != 0) { /* since we have already been popped, we must recreate ourself from scratch */ - ui_menu_stack_push(ui_menu_alloc(menu->machine, menu_select_game, NULL)); + ui_menu_stack_push(ui_menu_alloc(menu->machine, menu->container, menu_select_game, NULL)); } /* typed characters append to the buffer */ @@ -3455,7 +3463,8 @@ static void menu_select_game(running_machine *machine, ui_menu *menu, void *para /* if we're in an error state, overlay an error message */ if (menustate->error) - ui_draw_text_box("The selected game is missing one or more required ROM or CHD images. " + ui_draw_text_box(menu->container, + "The selected game is missing one or more required ROM or CHD images. " "Please select a different game.\n\nPress any key to continue.", JUSTIFY_CENTER, 0.5f, 0.5f, UI_RED_COLOR); } @@ -3621,7 +3630,7 @@ static void menu_select_game_custom_render(running_machine *machine, ui_menu *me sprintf(&tempbuf[0][0], "Type name or select: (random)"); /* get the size of the text */ - ui_draw_text_full(&tempbuf[0][0], 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE, + ui_draw_text_full(menu->container, &tempbuf[0][0], 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, NULL); width += 2 * UI_BOX_LR_BORDER; maxwidth = MAX(width, origx2 - origx1); @@ -3633,7 +3642,7 @@ static void menu_select_game_custom_render(running_machine *machine, ui_menu *me y2 = origy1 - UI_BOX_TB_BORDER; /* draw a box */ - ui_draw_outlined_box(x1, y1, x2, y2, UI_BACKGROUND_COLOR); + ui_draw_outlined_box(menu->container, x1, y1, x2, y2, UI_BACKGROUND_COLOR); /* take off the borders */ x1 += UI_BOX_LR_BORDER; @@ -3642,7 +3651,7 @@ static void menu_select_game_custom_render(running_machine *machine, ui_menu *me y2 -= UI_BOX_TB_BORDER; /* draw the text within it */ - ui_draw_text_full(&tempbuf[0][0], x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE, + ui_draw_text_full(menu->container, &tempbuf[0][0], x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, NULL); /* determine the text to render below */ @@ -3709,7 +3718,7 @@ static void menu_select_game_custom_render(running_machine *machine, ui_menu *me maxwidth = origx2 - origx1; for (line = 0; line < 4; line++) { - ui_draw_text_full(&tempbuf[line][0], 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE, + ui_draw_text_full(menu->container, &tempbuf[line][0], 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, NULL); width += 2 * UI_BOX_LR_BORDER; maxwidth = MAX(maxwidth, width); @@ -3729,7 +3738,7 @@ static void menu_select_game_custom_render(running_machine *machine, ui_menu *me color = UI_YELLOW_COLOR; if (driver != NULL && (driver->flags & (GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION)) != 0) color = UI_RED_COLOR; - ui_draw_outlined_box(x1, y1, x2, y2, color); + ui_draw_outlined_box(menu->container, x1, y1, x2, y2, color); /* take off the borders */ x1 += UI_BOX_LR_BORDER; @@ -3740,7 +3749,7 @@ static void menu_select_game_custom_render(running_machine *machine, ui_menu *me /* draw all lines */ for (line = 0; line < 4; line++) { - ui_draw_text_full(&tempbuf[line][0], x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE, + ui_draw_text_full(menu->container, &tempbuf[line][0], x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, NULL); y1 += ui_get_line_height(); } diff --git a/src/emu/uimenu.h b/src/emu/uimenu.h index 24ad7d3a9fe..b58dd9f2b33 100644 --- a/src/emu/uimenu.h +++ b/src/emu/uimenu.h @@ -14,6 +14,7 @@ #ifndef __UIMENU_H__ #define __UIMENU_H__ +#include "render.h" /*************************************************************************** @@ -87,7 +88,7 @@ void ui_menu_init(running_machine *machine); /* ----- core menu management ----- */ /* allocate a new menu */ -ui_menu *ui_menu_alloc(running_machine *machine, ui_menu_handler_func handler, void *parameter); +ui_menu *ui_menu_alloc(running_machine *machine, render_container *container, ui_menu_handler_func handler, void *parameter); /* free a menu */ void ui_menu_free(ui_menu *menu); @@ -140,13 +141,13 @@ void ui_menu_stack_pop(running_machine *machine); /* ----- UI system interaction ----- */ /* master handler */ -UINT32 ui_menu_ui_handler(running_machine *machine, UINT32 state); +UINT32 ui_menu_ui_handler(running_machine *machine, render_container *container, UINT32 state); /* slider handler */ -UINT32 ui_slider_ui_handler(running_machine *machine, UINT32 state); +UINT32 ui_slider_ui_handler(running_machine *machine, render_container *container, UINT32 state); /* force game select menu */ -void ui_menu_force_game_select(running_machine *machine); +void ui_menu_force_game_select(running_machine *machine, render_container *container); int ui_menu_is_force_game_select(void); diff --git a/src/emu/video.c b/src/emu/video.c index edfcc9044e7..7b8c8691bcf 100644 --- a/src/emu/video.c +++ b/src/emu/video.c @@ -1299,7 +1299,7 @@ void video_frame_update(running_machine *machine, int debug) } /* draw the user interface */ - ui_update_and_render(machine); + ui_update_and_render(machine, render_container_get_ui()); /* if we're throttling, synchronize before rendering */ if (!debug && !skipped_it && effective_throttle(machine)) diff --git a/src/mame/video/deco16ic.c b/src/mame/video/deco16ic.c index 5832b5066ea..f84363978eb 100644 --- a/src/mame/video/deco16ic.c +++ b/src/mame/video/deco16ic.c @@ -823,7 +823,7 @@ void deco16_print_debug_info(running_machine *machine, bitmap_t *bitmap) sprintf(&buf[strlen(buf)],"%04X",deco16_priority); - ui_draw_text(buf,60,40); + ui_draw_text(render_container_get_ui(), buf,60,40); } /*****************************************************************************************/ diff --git a/src/mame/video/ssv.c b/src/mame/video/ssv.c index dbfb12835df..c04afa08b53 100644 --- a/src/mame/video/ssv.c +++ b/src/mame/video/ssv.c @@ -905,7 +905,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta if (input_code_pressed(machine, KEYCODE_Z)) /* Display some info on each sprite */ { char buf[30]; sprintf(buf, "%02X",/*(s2[2] & ~0x3ff)>>8*/mode>>8); - ui_draw_text(buf, sx, sy); + ui_draw_text(render_container_get_ui(), buf, sx, sy); } #endif @@ -1085,7 +1085,7 @@ static void gdfs_draw_zooming_sprites(running_machine *machine, bitmap_t *bitmap { char buf[10]; sprintf(buf, "%X",size); - ui_draw_text(buf, sx / 0x10000, sy / 0x10000); + ui_draw_text(render_container_get_ui(), buf, sx / 0x10000, sy / 0x10000); } #endif } /* single-sprites */ diff --git a/src/mame/video/taito_f3.c b/src/mame/video/taito_f3.c index ab10c9fcb74..b54cd5d14dd 100644 --- a/src/mame/video/taito_f3.c +++ b/src/mame/video/taito_f3.c @@ -480,7 +480,7 @@ static void print_debug_info(bitmap_t *bitmap) l[3]=f3_line_ram[0x15e0]&0xffff; bufptr += sprintf(bufptr,"5000: %04x %04x %04x %04x\n",l[0],l[1],l[2],l[3]); - ui_draw_text(buf, 60, 40); + ui_draw_text(render_container_get_ui(), buf, 60, 40); } /******************************************************************************/