diff --git a/src/emu/emuopts.c b/src/emu/emuopts.c index 6da6d5f7335..8495b4e457f 100644 --- a/src/emu/emuopts.c +++ b/src/emu/emuopts.c @@ -105,6 +105,8 @@ const options_entry emu_options::s_option_entries[] = { OPTION_GAMMA "(0.1-3.0)", "1.0", OPTION_FLOAT, "default game screen gamma correction" }, { OPTION_PAUSE_BRIGHTNESS "(0.0-1.0)", "0.65", OPTION_FLOAT, "amount to scale the screen brightness when paused" }, { OPTION_EFFECT, "none", OPTION_STRING, "name of a PNG file to use for visual effects, or 'none'" }, + { OPTION_MINIMUM_WIDTH, "0", OPTION_INTEGER, "minimum screen width" }, + { OPTION_MINIMUM_HEIGHT, "0", OPTION_INTEGER, "minimum screen height" }, // vector options { NULL, NULL, OPTION_HEADER, "CORE VECTOR OPTIONS" }, diff --git a/src/emu/emuopts.h b/src/emu/emuopts.h index 73c55cddbae..f7560722413 100644 --- a/src/emu/emuopts.h +++ b/src/emu/emuopts.h @@ -113,6 +113,8 @@ enum #define OPTION_GAMMA "gamma" #define OPTION_PAUSE_BRIGHTNESS "pause_brightness" #define OPTION_EFFECT "effect" +#define OPTION_MINIMUM_WIDTH "minimum_width" +#define OPTION_MINIMUM_HEIGHT "minimum_height" // core vector options #define OPTION_ANTIALIAS "antialias" @@ -279,6 +281,8 @@ public: float gamma() const { return float_value(OPTION_GAMMA); } float pause_brightness() const { return float_value(OPTION_PAUSE_BRIGHTNESS); } const char *effect() const { return value(OPTION_EFFECT); } + int minimum_width() const { return int_value(OPTION_MINIMUM_WIDTH); } + int minimum_height() const { return int_value(OPTION_MINIMUM_HEIGHT); } // core vector options bool antialias() const { return bool_value(OPTION_ANTIALIAS); } diff --git a/src/emu/render.c b/src/emu/render.c index 91f87f0c6e7..87b108a4c1c 100644 --- a/src/emu/render.c +++ b/src/emu/render.c @@ -1232,10 +1232,22 @@ void render_target::compute_minimum_size(INT32 &minwidth, INT32 &minheight) for (layout_view::item *curitem = m_curview->first_item(layer); curitem != NULL; curitem = curitem->next()) if (curitem->screen() != NULL) { - // use a hard-coded default visible area for vector screens screen_device *screen = curitem->screen(); - const rectangle vectorvis(0, 639, 0, 479); - const rectangle &visarea = (screen->screen_type() == SCREEN_TYPE_VECTOR) ? vectorvis : screen->visible_area(); + + // get visible area + rectangle visarea = (screen->screen_type() == SCREEN_TYPE_VECTOR) + ? rectangle(0, 639, 0, 479) // use a hard-coded default visible area for vector screens + : screen->visible_area(); + + // is our visible area too small? if so, we need to bump up the size + float minimum_width = m_manager.machine().options().minimum_width(); + float minimum_height = m_manager.machine().options().minimum_height(); + INT32 factor = (INT32) ceil(MAX(minimum_width / visarea.width(), minimum_height / visarea.height())); + factor = MAX(factor, 1); + visarea.min_x *= factor; + visarea.min_y *= factor; + visarea.max_x *= factor; + visarea.max_y *= factor; // apply target orientation to the bounds render_bounds bounds = curitem->bounds();