summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/ui/ui.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/ui/ui.cpp')
-rw-r--r--src/emu/ui/ui.cpp440
1 files changed, 68 insertions, 372 deletions
diff --git a/src/emu/ui/ui.cpp b/src/emu/ui/ui.cpp
index b002560382c..3f2d252c107 100644
--- a/src/emu/ui/ui.cpp
+++ b/src/emu/ui/ui.cpp
@@ -37,8 +37,6 @@ enum
LOADSAVE_SAVE
};
-#define MAX_SAVED_STATE_JOYSTICK 4
-
/***************************************************************************
LOCAL VARIABLES
@@ -88,25 +86,6 @@ static const input_item_id non_char_keys[] =
ITEM_ID_CANCEL
};
-static const char *s_color_list[] = {
- OPTION_UI_BORDER_COLOR,
- OPTION_UI_BACKGROUND_COLOR,
- OPTION_UI_GFXVIEWER_BG_COLOR,
- OPTION_UI_UNAVAILABLE_COLOR,
- OPTION_UI_TEXT_COLOR,
- OPTION_UI_TEXT_BG_COLOR,
- OPTION_UI_SUBITEM_COLOR,
- OPTION_UI_CLONE_COLOR,
- OPTION_UI_SELECTED_COLOR,
- OPTION_UI_SELECTED_BG_COLOR,
- OPTION_UI_MOUSEOVER_COLOR,
- OPTION_UI_MOUSEOVER_BG_COLOR,
- OPTION_UI_MOUSEDOWN_COLOR,
- OPTION_UI_MOUSEDOWN_BG_COLOR,
- OPTION_UI_DIPSW_COLOR,
- OPTION_UI_SLIDER_COLOR
-};
-
/***************************************************************************
GLOBAL VARIABLES
***************************************************************************/
@@ -160,24 +139,6 @@ static INT32 slider_crossoffset(running_machine &machine, void *arg, std::string
***************************************************************************/
//-------------------------------------------------
-// load ui options
-//-------------------------------------------------
-
-static void load_ui_options(running_machine &machine)
-{
- // parse the file
- std::string error;
- // attempt to open the output file
- emu_file file(machine.options().ini_path(), OPEN_FLAG_READ);
- if (file.open("ui.ini") == FILERR_NONE)
- {
- bool result = machine.ui().options().parse_ini_file((core_file&)file, OPTION_PRIORITY_MAME_INI, OPTION_PRIORITY_DRIVER_INI, error);
- if (!result)
- osd_printf_error("**Error to load ui.ini**");
- }
-}
-
-//-------------------------------------------------
// is_breakable_char - is a given unicode
// character a possible line break?
//-------------------------------------------------
@@ -222,8 +183,7 @@ static inline int is_breakable_char(unicode_char ch)
CORE IMPLEMENTATION
***************************************************************************/
-static const UINT32 mouse_bitmap[32*32] =
-{
+static const UINT32 mouse_bitmap[] = {
0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,
0x09a46f30,0x81ac7c43,0x24af8049,0x00ad7d45,0x00a8753a,0x00a46f30,0x009f6725,0x009b611c,0x00985b14,0x0095560d,0x00935308,0x00915004,0x00904e02,0x008f4e01,0x008f4d00,0x008f4d00,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,
0x00a16a29,0xa2aa783d,0xffbb864a,0xc0b0824c,0x5aaf7f48,0x09ac7b42,0x00a9773c,0x00a67134,0x00a26b2b,0x009e6522,0x009a5e19,0x00965911,0x0094550b,0x00925207,0x00915004,0x008f4e01,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,0x00ffffff,
@@ -266,14 +226,9 @@ static const UINT32 mouse_bitmap[32*32] =
ui_manager::ui_manager(running_machine &machine)
: m_machine(machine)
{
-}
-
-void ui_manager::init()
-{
- load_ui_options(machine());
// initialize the other UI bits
- ui_menu::init(machine());
- ui_gfx_init(machine());
+ ui_menu::init(machine);
+ ui_gfx_init(machine);
// reset instance variables
m_font = nullptr;
@@ -281,32 +236,26 @@ void ui_manager::init()
m_handler_param = 0;
m_single_step = false;
m_showfps = false;
- m_showfps_end = 0;
+ m_showfps_end = false;
m_show_profiler = false;
m_popup_text_end = 0;
m_use_natural_keyboard = false;
m_mouse_arrow_texture = nullptr;
- m_show_timecode_counter = false;
- m_show_timecode_total = false;
- m_load_save_hold = false;
-
- get_font_rows(&machine());
- decode_ui_color(0, &machine());
// more initialization
set_handler(handler_messagebox, 0);
m_non_char_keys_down = std::make_unique<UINT8[]>((ARRAY_LENGTH(non_char_keys) + 7) / 8);
- m_mouse_show = machine().system().flags & MACHINE_CLICKABLE_ARTWORK ? true : false;
+ m_mouse_show = machine.system().flags & MACHINE_CLICKABLE_ARTWORK ? true : false;
// request a callback upon exiting
- machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(ui_manager::exit), this));
+ machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(ui_manager::exit), this));
// retrieve options
- m_use_natural_keyboard = machine().options().natural_keyboard();
- bitmap_argb32 *ui_mouse_bitmap = auto_alloc(machine(), bitmap_argb32(32, 32));
+ m_use_natural_keyboard = machine.options().natural_keyboard();
+ bitmap_argb32 *ui_mouse_bitmap = auto_alloc(machine, bitmap_argb32(32, 32));
UINT32 *dst = &ui_mouse_bitmap->pix32(0);
memcpy(dst,mouse_bitmap,32*32*sizeof(UINT32));
- m_mouse_arrow_texture = machine().render().texture_alloc();
+ m_mouse_arrow_texture = machine.render().texture_alloc();
m_mouse_arrow_texture->set_bitmap(*ui_mouse_bitmap, ui_mouse_bitmap->cliprect(), TEXFORMAT_ARGB32);
}
@@ -363,7 +312,7 @@ void ui_manager::display_startup_screens(bool first_time, bool show_disclaimer)
{
const int maxstate = 4;
int str = machine().options().seconds_to_run();
- bool show_gameinfo = !machine().ui().options().skip_gameinfo();
+ bool show_gameinfo = !machine().options().skip_gameinfo();
bool show_warnings = true, show_mandatory_fileman = true;
int state;
@@ -498,8 +447,7 @@ void ui_manager::update_and_render(render_container *container)
else
m_popup_text_end = 0;
- // display the internal mouse cursor
- if (m_mouse_show || (is_menu_active() && machine().ui().options().ui_mouse()))
+ if (m_mouse_show || (is_menu_active() && machine().options().ui_mouse()))
{
INT32 mouse_target_x, mouse_target_y;
bool mouse_button;
@@ -508,10 +456,8 @@ void ui_manager::update_and_render(render_container *container)
if (mouse_target != nullptr)
{
float mouse_y=-1,mouse_x=-1;
- if (mouse_target->map_point_container(mouse_target_x, mouse_target_y, *container, mouse_x, mouse_y))
- {
- const float cursor_size = 0.6 * machine().ui().get_line_height();
- container->add_quad(mouse_x, mouse_y, mouse_x + cursor_size*container->manager().ui_aspect(container), mouse_y + cursor_size, UI_TEXT_COLOR, m_mouse_arrow_texture, PRIMFLAG_ANTIALIAS(1) | PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
+ if (mouse_target->map_point_container(mouse_target_x, mouse_target_y, *container, mouse_x, mouse_y)) {
+ container->add_quad(mouse_x,mouse_y,mouse_x + 0.05f*container->manager().ui_aspect(container),mouse_y + 0.05f,UI_TEXT_COLOR,m_mouse_arrow_texture,PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
}
}
}
@@ -530,7 +476,7 @@ render_font *ui_manager::get_font()
{
// allocate the font and messagebox string
if (m_font == nullptr)
- m_font = machine().render().font_alloc(machine().ui().options().ui_font());
+ m_font = machine().render().font_alloc(machine().options().ui_font());
return m_font;
}
@@ -646,9 +592,9 @@ void ui_manager::draw_text(render_container *container, const char *buf, float x
// and full size computation
//-------------------------------------------------
-void ui_manager::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 text_size)
+void ui_manager::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 = get_line_height() * text_size;
+ float lineheight = get_line_height();
const char *ends = origs + strlen(origs);
float wrapwidth = origwrapwidth;
const char *s = origs;
@@ -1037,16 +983,6 @@ bool ui_manager::is_menu_active(void)
}
-bool ui_manager::show_timecode_counter()
-{
- return m_show_timecode_counter;
-}
-bool ui_manager::show_timecode_total()
-{
- return m_show_timecode_total;
-}
-
-
/***************************************************************************
TEXT GENERATORS
@@ -1096,7 +1032,11 @@ std::string &ui_manager::warnings_string(std::string &str)
// add a warning if any ROMs were loaded with warnings
if (machine().rom_load().warnings() > 0)
{
- str.append("One or more ROMs/CHDs for this machine are incorrect. The machine may not run correctly.\n");
+ str.append("One or more ROMs/CHDs for this ");
+ str.append(emulator_info::get_gamenoun());
+ str.append(" are incorrect. The ");
+ str.append(emulator_info::get_gamenoun());
+ str.append(" may not run correctly.\n");
if (machine().system().flags & WARNING_FLAGS)
str.append("\n");
}
@@ -1109,11 +1049,15 @@ std::string &ui_manager::warnings_string(std::string &str)
// if we have at least one warning flag, print the general header
if ((machine().system().flags & WARNING_FLAGS) || machine().rom_load().knownbad() > 0)
{
- str.append("There are known problems with this machine\n\n");
+ str.append("There are known problems with this ");
+ str.append(emulator_info::get_gamenoun());
+ str.append("\n\n");
// add a warning if any ROMs are flagged BAD_DUMP/NO_DUMP
if (machine().rom_load().knownbad() > 0) {
- str.append("One or more ROMs/CHDs for this machine have not been correctly dumped.\n");
+ str.append("One or more ROMs/CHDs for this ");
+ str.append(emulator_info::get_gamenoun());
+ str.append(" have not been correctly dumped.\n");
}
// add one line per warning flag
if (machine().system().flags & MACHINE_IMPERFECT_KEYBOARD)
@@ -1127,24 +1071,32 @@ std::string &ui_manager::warnings_string(std::string &str)
if (machine().system().flags & MACHINE_IMPERFECT_SOUND)
str.append("The sound emulation isn't 100% accurate.\n");
if (machine().system().flags & MACHINE_NO_SOUND) {
- str.append("The machine lacks sound.\n");
+ str.append("The ");
+ str.append(emulator_info::get_gamenoun());
+ str.append(" lacks sound.\n");
}
if (machine().system().flags & MACHINE_NO_COCKTAIL)
str.append("Screen flipping in cocktail mode is not supported.\n");
// check if external artwork is present before displaying this warning?
if (machine().system().flags & MACHINE_REQUIRES_ARTWORK) {
- str.append("The machine requires external artwork files\n");
+ str.append("The ");
+ str.append(emulator_info::get_gamenoun());
+ str.append(" requires external artwork files\n");
}
if (machine().system().flags & MACHINE_IS_INCOMPLETE )
{
- str.append("This machine was never completed. It may exhibit strange behavior or missing elements that are not bugs in the emulation.\n");
+ str.append("This ");
+ str.append(emulator_info::get_gamenoun());
+ str.append(" was never completed. It may exhibit strange behavior or missing elements that are not bugs in the emulation.\n");
}
if (machine().system().flags & MACHINE_NO_SOUND_HW )
{
- str.append("This machine has no sound hardware, MAME will produce no sounds, this is expected behaviour.\n");
+ str.append("This ");
+ str.append(emulator_info::get_gamenoun());
+ str.append(" has no sound hardware, MAME will produce no sounds, this is expected behaviour.\n");
}
// if there's a NOT WORKING, UNEMULATED PROTECTION or GAME MECHANICAL warning, make it stronger
@@ -1152,15 +1104,25 @@ std::string &ui_manager::warnings_string(std::string &str)
{
// add the strings for these warnings
if (machine().system().flags & MACHINE_UNEMULATED_PROTECTION) {
- str.append("The machine has protection which isn't fully emulated.\n");
+ str.append("The ");
+ str.append(emulator_info::get_gamenoun());
+ str.append(" has protection which isn't fully emulated.\n");
}
if (machine().system().flags & MACHINE_NOT_WORKING) {
- str.append("\nTHIS MACHINE DOESN'T WORK. The emulation for this machine is not yet complete. "
+ str.append("\nTHIS ");
+ str.append(emulator_info::get_capgamenoun());
+ str.append(" DOESN'T WORK. The emulation for this ");
+ str.append(emulator_info::get_gamenoun());
+ str.append(" is not yet complete. "
"There is nothing you can do to fix this problem except wait for the developers to improve the emulation.\n");
}
if (machine().system().flags & MACHINE_MECHANICAL) {
- str.append("\nCertain elements of this machine cannot be emulated as it requires actual physical interaction or consists of mechanical devices. "
- "It is not possible to fully play this machine.\n");
+ str.append("\nCertain elements of this ");
+ str.append(emulator_info::get_gamenoun());
+ str.append(" cannot be emulated as it requires actual physical interaction or consists of mechanical devices. "
+ "It is not possible to fully play this ");
+ str.append(emulator_info::get_gamenoun());
+ str.append(".\n");
}
// find the parent of this driver
@@ -1178,7 +1140,9 @@ std::string &ui_manager::warnings_string(std::string &str)
{
// this one works, add a header and display the name of the clone
if (!foundworking) {
- str.append("\n\nThere are working clones of this machine: ");
+ str.append("\n\nThere are working clones of this ");
+ str.append(emulator_info::get_gamenoun());
+ str.append(": ");
}
else
str.append(", ");
@@ -1539,24 +1503,11 @@ UINT32 ui_manager::handler_ingame(running_machine &machine, render_container *co
// first draw the FPS counter
if (machine.ui().show_fps_counter())
{
+ std::string tempstring;
machine.ui().draw_text_full(container, machine.video().speed_text().c_str(), 0.0f, 0.0f, 1.0f,
JUSTIFY_RIGHT, WRAP_WORD, DRAW_OPAQUE, ARGB_WHITE, ARGB_BLACK, nullptr, nullptr);
}
- // Show the duration of current part (intro or gameplay or extra)
- if (machine.ui().show_timecode_counter()) {
- std::string tempstring;
- machine.ui().draw_text_full(container, machine.video().timecode_text(tempstring).c_str(), 0.0f, 0.0f, 1.0f,
- JUSTIFY_RIGHT, WRAP_WORD, DRAW_OPAQUE, rgb_t(0xf0,0xf0,0x10,0x10), ARGB_BLACK, NULL, NULL);
- }
- // Show the total time elapsed for the video preview (all parts intro, gameplay, extras)
- if (machine.ui().show_timecode_total()) {
- std::string tempstring;
- machine.ui().draw_text_full(container, machine.video().timecode_total_text(tempstring).c_str(), 0.0f, 0.0f, 1.0f,
- JUSTIFY_LEFT, WRAP_WORD, DRAW_OPAQUE, rgb_t(0xf0,0x10,0xf0,0x10), ARGB_BLACK, NULL, NULL);
- }
-
-
// draw the profiler if visible
if (machine.ui().show_profiler())
{
@@ -1620,10 +1571,6 @@ UINT32 ui_manager::handler_ingame(running_machine &machine, render_container *co
machine.ui().image_handler_ingame();
- // handle a save input timecode request
- if (machine.ui_input().pressed(IPT_UI_TIMECODE))
- machine.video().save_input_timecode();
-
if (ui_disabled) return ui_disabled;
if (machine.ui_input().pressed(IPT_UI_CANCEL))
@@ -1678,7 +1625,6 @@ UINT32 ui_manager::handler_ingame(running_machine &machine, render_container *co
if (machine.ui_input().pressed(IPT_UI_SAVE_STATE))
{
machine.pause();
- machine.ui().m_load_save_hold = true;
return machine.ui().set_handler(handler_load_save, LOADSAVE_SAVE);
}
@@ -1686,7 +1632,6 @@ UINT32 ui_manager::handler_ingame(running_machine &machine, render_container *co
if (machine.ui_input().pressed(IPT_UI_LOAD_STATE))
{
machine.pause();
- machine.ui().m_load_save_hold = true;
return machine.ui().set_handler(handler_load_save, LOADSAVE_LOAD);
}
@@ -1698,21 +1643,15 @@ UINT32 ui_manager::handler_ingame(running_machine &machine, render_container *co
if (machine.ui_input().pressed(IPT_UI_PAUSE))
{
// with a shift key, it is single step
-// if (is_paused && (machine.input().code_pressed(KEYCODE_LSHIFT) || machine.input().code_pressed(KEYCODE_RSHIFT)))
-// {
-// machine.ui().set_single_step(true);
-// machine.resume();
-// }
-// else
+ if (is_paused && (machine.input().code_pressed(KEYCODE_LSHIFT) || machine.input().code_pressed(KEYCODE_RSHIFT)))
+ {
+ machine.ui().set_single_step(true);
+ machine.resume();
+ }
+ else
machine.toggle_pause();
}
- if (machine.ui_input().pressed(IPT_UI_PAUSE_SINGLE))
- {
- machine.ui().set_single_step(true);
- machine.resume();
- }
-
// handle a toggle cheats request
if (machine.ui_input().pressed(IPT_UI_TOGGLE_CHEAT))
machine.cheat().set_enable(!machine.cheat().enabled());
@@ -1741,21 +1680,6 @@ UINT32 ui_manager::handler_ingame(running_machine &machine, render_container *co
if (machine.ui_input().pressed(IPT_UI_THROTTLE))
machine.video().toggle_throttle();
- // toggle autofire
- if (machine.ui_input().pressed(IPT_UI_TOGGLE_AUTOFIRE))
- {
- if (!machine.options().cheat())
- {
- machine.popmessage("Autofire can't be enabled");
- }
- else
- {
- bool autofire_toggle = machine.ioport().get_autofire_toggle();
- machine.ioport().set_autofire_toggle(!autofire_toggle);
- machine.popmessage("Autofire %s", autofire_toggle ? "Enabled" : "Disabled");
- }
- }
-
// check for fast forward
if (machine.ioport().type_pressed(IPT_UI_FAST_FORWARD))
{
@@ -1789,23 +1713,6 @@ UINT32 ui_manager::handler_load_save(running_machine &machine, render_container
else
machine.ui().draw_message_window(container, "Select position to load from");
- // if load/save state sequence is still being pressed, do not read the filename yet
- if (machine.ui().m_load_save_hold) {
- bool seq_in_progress = false;
- const input_seq &load_save_seq = state == LOADSAVE_SAVE ?
- machine.ioport().type_seq(IPT_UI_SAVE_STATE) :
- machine.ioport().type_seq(IPT_UI_LOAD_STATE);
-
- for (int i = 0; i < load_save_seq.length(); i++)
- if (machine.input().code_pressed_once(load_save_seq[i]))
- seq_in_progress = true;
-
- if (seq_in_progress)
- return state;
- else
- machine.ui().m_load_save_hold = false;
- }
-
// check for cancel key
if (machine.ui_input().pressed(IPT_UI_CANCEL))
{
@@ -1833,41 +1740,21 @@ UINT32 ui_manager::handler_load_save(running_machine &machine, render_container
if (machine.input().code_pressed_once(input_code(DEVICE_CLASS_KEYBOARD, 0, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, id)))
file = id - ITEM_ID_0_PAD + '0';
if (file == 0)
- {
- bool found = false;
-
- for (int joy_index = 0; joy_index <= MAX_SAVED_STATE_JOYSTICK; joy_index++)
- for (input_item_id id = ITEM_ID_BUTTON1; id <= ITEM_ID_BUTTON32; ++id)
- if (machine.input().code_pressed_once(input_code(DEVICE_CLASS_JOYSTICK, joy_index, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, id)))
- {
- snprintf(filename, sizeof(filename), "joy%i-%i", joy_index, id - ITEM_ID_BUTTON1 + 1);
- found = true;
- break;
- }
-
- if (!found)
- return state;
- }
- else
- {
- sprintf(filename, "%c", file);
- }
+ return state;
// display a popup indicating that the save will proceed
+ sprintf(filename, "%c", file);
if (state == LOADSAVE_SAVE)
{
- machine.popmessage("Save to position %s", filename);
+ machine.popmessage("Save to position %c", file);
machine.schedule_save(filename);
}
else
{
- machine.popmessage("Load from position %s", filename);
+ machine.popmessage("Load from position %c", file);
machine.schedule_load(filename);
}
- // avoid handling the name of the save state slot as a seperate input
- machine.ui_input().mark_all_as_pressed();
-
// remove the pause and reset the state
machine.resume();
return UI_HANDLER_CANCEL;
@@ -1880,7 +1767,7 @@ UINT32 ui_manager::handler_load_save(running_machine &machine, render_container
void ui_manager::request_quit()
{
- if (!machine().ui().options().confirm_quit())
+ if (!machine().options().confirm_quit())
machine().schedule_exit();
else
set_handler(handler_confirm_quit, 0);
@@ -2603,194 +2490,3 @@ void ui_manager::set_use_natural_keyboard(bool use_natural_keyboard)
machine().options().set_value(OPTION_NATURAL_KEYBOARD, use_natural_keyboard, OPTION_PRIORITY_CMDLINE, error);
assert(error.empty());
}
-
-//-------------------------------------------------
-// wrap_text
-//-------------------------------------------------
-
-int ui_manager::wrap_text(render_container *container, const char *origs, float x, float y, float origwrapwidth, std::vector<int> &xstart, std::vector<int> &xend, float text_size)
-{
- float lineheight = get_line_height() * text_size;
- const char *ends = origs + strlen(origs);
- float wrapwidth = origwrapwidth;
- const char *s = origs;
- const char *linestart;
- float maxwidth = 0;
- float aspect = machine().render().ui_aspect(container);
- int count = 0;
-
- // loop over lines
- while (*s != 0)
- {
- const char *lastbreak = nullptr;
- unicode_char schar;
- int scharcount;
- float lastbreak_width = 0;
- float curwidth = 0;
-
- // get the current character
- scharcount = uchar_from_utf8(&schar, s, ends - s);
- if (scharcount == -1)
- break;
-
- // remember the starting position of the line
- linestart = s;
-
- // loop while we have characters and are less than the wrapwidth
- while (*s != 0 && curwidth <= wrapwidth)
- {
- float chwidth;
-
- // get the current chcaracter
- scharcount = uchar_from_utf8(&schar, s, ends - s);
- if (scharcount == -1)
- break;
-
- // if we hit a newline, stop immediately
- if (schar == '\n')
- break;
-
- // get the width of this character
- chwidth = get_font()->char_width(lineheight, aspect, schar);
-
- // if we hit a space, remember the location and width *without* the space
- if (schar == ' ')
- {
- lastbreak = s;
- lastbreak_width = curwidth;
- }
-
- // add the width of this character and advance
- curwidth += chwidth;
- s += scharcount;
-
- // if we hit any non-space breakable character, remember the location and width
- // *with* the breakable character
- if (schar != ' ' && is_breakable_char(schar) && curwidth <= wrapwidth)
- {
- lastbreak = s;
- lastbreak_width = curwidth;
- }
- }
-
- // if we accumulated too much for the current width, we need to back off
- if (curwidth > wrapwidth)
- {
- // if we hit a break, back up to there with the appropriate width
- if (lastbreak != nullptr)
- {
- s = lastbreak;
- curwidth = lastbreak_width;
- }
-
- // if we didn't hit a break, back up one character
- else if (s > linestart)
- {
- // get the previous character
- s = (const char *)utf8_previous_char(s);
- scharcount = uchar_from_utf8(&schar, s, ends - s);
- if (scharcount == -1)
- break;
-
- curwidth -= get_font()->char_width(lineheight, aspect, schar);
- }
- }
-
- // track the maximum width of any given line
- if (curwidth > maxwidth)
- maxwidth = curwidth;
-
- xstart.push_back(linestart - origs);
- xend.push_back(s - origs);
-
- // loop from the line start and add the characters
- while (linestart < s)
- {
- // get the current character
- unicode_char linechar;
- int linecharcount = uchar_from_utf8(&linechar, linestart, ends - linestart);
- if (linecharcount == -1)
- break;
- linestart += linecharcount;
- }
-
- // advance by a row
- count++;
-
- // skip past any spaces at the beginning of the next line
- scharcount = uchar_from_utf8(&schar, s, ends - s);
- if (scharcount == -1)
- break;
-
- if (schar == '\n')
- s += scharcount;
- else
- while (*s && isspace(schar))
- {
- s += scharcount;
- scharcount = uchar_from_utf8(&schar, s, ends - s);
- if (scharcount == -1)
- break;
- }
- }
- return count;
-}
-
-//-------------------------------------------------
-// draw_textured_box - add primitives to
-// draw an outlined box with the given
-// textured background and line color
-//-------------------------------------------------
-
-void ui_manager::draw_textured_box(render_container *container, float x0, float y0, float x1, float y1, rgb_t backcolor, rgb_t linecolor, render_texture *texture, UINT32 flags)
-{
- container->add_quad(x0, y0, x1, y1, backcolor, texture, flags);
- container->add_line(x0, y0, x1, y0, UI_LINE_WIDTH, linecolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
- container->add_line(x1, y0, x1, y1, UI_LINE_WIDTH, linecolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
- container->add_line(x1, y1, x0, y1, UI_LINE_WIDTH, linecolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
- container->add_line(x0, y1, x0, y0, UI_LINE_WIDTH, linecolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
-}
-
-//-------------------------------------------------
-// get_string_width_ex - return the width of a
-// character string with given text size
-//-------------------------------------------------
-
-float ui_manager::get_string_width_ex(const char *s, float text_size)
-{
- return get_font()->utf8string_width(get_line_height() * text_size, machine().render().ui_aspect(), s);
-}
-
-//-------------------------------------------------
-// decode UI color options
-//-------------------------------------------------
-
-rgb_t decode_ui_color(int id, running_machine *machine)
-{
- static rgb_t color[ARRAY_LENGTH(s_color_list)];
-
- if (machine != nullptr) {
- ui_options option;
- for (int x = 0; x < ARRAY_LENGTH(s_color_list); x++) {
- const char *o_default = option.value(s_color_list[x]);
- const char *s_option = machine->ui().options().value(s_color_list[x]);
- int len = strlen(s_option);
- if (len != 8)
- color[x] = rgb_t((UINT32)strtoul(o_default, nullptr, 16));
- else
- color[x] = rgb_t((UINT32)strtoul(s_option, nullptr, 16));
- }
- }
- return color[id];
-}
-
-//-------------------------------------------------
-// get font rows from options
-//-------------------------------------------------
-
-int get_font_rows(running_machine *machine)
-{
- static int value;
-
- return ((machine != nullptr) ? value = machine->ui().options().font_rows() : value);
-}