From a7be43dc68b5a371692cec6297371f7a8e1f55c2 Mon Sep 17 00:00:00 2001 From: Aaron Giles Date: Mon, 16 Jun 2008 17:05:44 +0000 Subject: [PATCH] Added new function video_get_view_for_target() which selects a view based on a command-line parameter and the configuration. Changed Windows OSD code to use this instead of its own logic. Changed -snapview to share the logic as well, enabling 'auto' as a -snapview option. --- docs/config.txt | 5 +- src/emu/render.h | 1 - src/emu/video.c | 96 +++++++++++++++++++++++++++++++-------- src/emu/video.h | 7 +++ src/osd/windows/drawgdi.c | 1 + src/osd/windows/window.c | 64 ++------------------------ 6 files changed, 93 insertions(+), 81 deletions(-) diff --git a/docs/config.txt b/docs/config.txt index ad1965044e6..ab0fc4f2da7 100644 --- a/docs/config.txt +++ b/docs/config.txt @@ -487,8 +487,9 @@ Core state/playback options Note that does not need to be a perfect match; rather, it will select the first view whose name matches all the characters specified by . For example, -snapview native will match the - "Native (15:14)" view even though it is not a perfect match. The - default value is 'internal'. + "Native (15:14)" view even though it is not a perfect match. + can also be 'auto', which selects the first view with all + screens present. The default value is 'internal'. -mngwrite diff --git a/src/emu/render.h b/src/emu/render.h index 840d6ef891d..cd1ab31b15c 100644 --- a/src/emu/render.h +++ b/src/emu/render.h @@ -12,7 +12,6 @@ #ifndef __RENDER_H__ #define __RENDER_H__ -#include "driver.h" #include "osdepend.h" #include diff --git a/src/emu/video.c b/src/emu/video.c index 7aa855d14d9..f81ee8c1815 100644 --- a/src/emu/video.c +++ b/src/emu/video.c @@ -360,24 +360,7 @@ void video_init(running_machine *machine) /* otherwise, find the requested view and select it */ else - { - int viewindex; - - /* scan for a match or partial match */ - for (viewindex = 0; ; viewindex++) - { - const char *name = render_target_get_view_name(global.snap_target, viewindex); - - /* stop scanning when we hit NULL */ - if (name == NULL) - break; - if (mame_strnicmp(name, viewname, strlen(viewname)) == 0) - { - render_target_set_view(global.snap_target, viewindex); - break; - } - } - } + render_target_set_view(global.snap_target, video_get_view_for_target(machine, global.snap_target, viewname, 0, 1)); /* extract snap resolution if present */ if (sscanf(options_get_string(mame_options(), OPTION_SNAPSIZE), "%dx%d", &global.snap_width, &global.snap_height) != 2) @@ -2620,6 +2603,83 @@ void video_avi_add_sound(running_machine *machine, const INT16 *sound, int numsa +/*************************************************************************** + CONFIGURATION HELPERS +***************************************************************************/ + +/*------------------------------------------------- + video_get_view_for_target - select a view + for a given target +-------------------------------------------------*/ + +int video_get_view_for_target(running_machine *machine, render_target *target, const char *viewname, int targetindex, int numtargets) +{ + int viewindex = -1; + + /* auto view just selects the nth view */ + if (strcmp(viewname, "auto") != 0) + { + /* scan for a matching view name */ + for (viewindex = 0; ; viewindex++) + { + const char *name = render_target_get_view_name(target, viewindex); + + /* stop scanning when we hit NULL */ + if (name == NULL) + { + viewindex = -1; + break; + } + if (mame_strnicmp(name, viewname, strlen(viewname)) == 0) + break; + } + } + + /* if we don't have a match, default to the nth view */ + if (viewindex == -1) + { + int scrcount = video_screen_count(machine->config); + + /* if we have enough targets to be one per screen, assign in order */ + if (numtargets >= scrcount) + { + /* find the first view with this screen and this screen only */ + for (viewindex = 0; ; viewindex++) + { + UINT32 viewscreens = render_target_get_view_screens(target, viewindex); + if (viewscreens == (1 << targetindex)) + break; + if (viewscreens == 0) + { + viewindex = -1; + break; + } + } + } + + /* otherwise, find the first view that has all the screens */ + if (viewindex == -1) + { + for (viewindex = 0; ; viewindex++) + { + UINT32 viewscreens = render_target_get_view_screens(target, viewindex); + if (viewscreens == (1 << scrcount) - 1) + break; + if (viewscreens == 0) + break; + } + } + } + + /* make sure it's a valid view */ + if (render_target_get_view_name(target, viewindex) == NULL) + viewindex = 0; + + return viewindex; +} + + + /*************************************************************************** SOFTWARE RENDERING ***************************************************************************/ diff --git a/src/emu/video.h b/src/emu/video.h index 3910ad898f6..f8c4e9251cd 100644 --- a/src/emu/video.h +++ b/src/emu/video.h @@ -17,6 +17,7 @@ #include "mamecore.h" #include "devintrf.h" #include "timer.h" +#include "render.h" /*************************************************************************** @@ -271,4 +272,10 @@ void video_avi_begin_recording(running_machine *machine, const char *name); void video_avi_end_recording(running_machine *machine); void video_avi_add_sound(running_machine *machine, const INT16 *sound, int numsamples); + +/* ----- configuration helpers ----- */ + +/* select a view for a given target */ +int video_get_view_for_target(running_machine *machine, render_target *target, const char *viewname, int targetindex, int numtargets); + #endif /* __VIDEO_H__ */ diff --git a/src/osd/windows/drawgdi.c b/src/osd/windows/drawgdi.c index fe393ce1abf..58f53944508 100644 --- a/src/osd/windows/drawgdi.c +++ b/src/osd/windows/drawgdi.c @@ -13,6 +13,7 @@ // MAME headers #include "mamecore.h" +#include "restrack.h" // MAMEOS headers #include "window.h" diff --git a/src/osd/windows/window.c b/src/osd/windows/window.c index 8c4c59fb843..396bfe5dc9b 100644 --- a/src/osd/windows/window.c +++ b/src/osd/windows/window.c @@ -843,72 +843,16 @@ static void create_window_class(void) static void set_starting_view(running_machine *machine, int index, win_window_info *window, const char *view) { const char *defview = options_get_string(mame_options(), WINOPTION_VIEW); - int viewindex = -1; + int viewindex; assert(GetCurrentThreadId() == main_threadid); // choose non-auto over auto if (strcmp(view, "auto") == 0 && strcmp(defview, "auto") != 0) view = defview; - - // auto view just selects the nth view - if (strcmp(view, "auto") != 0) - { - // scan for a matching view name - for (viewindex = 0; ; viewindex++) - { - const char *name = render_target_get_view_name(window->target, viewindex); - - // stop scanning if we hit NULL - if (name == NULL) - { - viewindex = -1; - break; - } - if (mame_strnicmp(name, view, strlen(view)) == 0) - break; - } - } - - // if we don't have a match, default to the nth view - if (viewindex == -1) - { - int scrcount = video_screen_count(machine->config); - - // if we have enough screens to be one per monitor, assign in order - if (video_config.numscreens >= scrcount) - { - // find the first view with this screen and this screen only - for (viewindex = 0; ; viewindex++) - { - UINT32 viewscreens = render_target_get_view_screens(window->target, viewindex); - if (viewscreens == (1 << index)) - break; - if (viewscreens == 0) - { - viewindex = -1; - break; - } - } - } - - // otherwise, find the first view that has all the screens - if (viewindex == -1) - { - for (viewindex = 0; ; viewindex++) - { - UINT32 viewscreens = render_target_get_view_screens(window->target, viewindex); - if (viewscreens == (1 << scrcount) - 1) - break; - if (viewscreens == 0) - break; - } - } - } - - // make sure it's a valid view - if (render_target_get_view_name(window->target, viewindex) == NULL) - viewindex = 0; + + // query the video system to help us pick a view + viewindex = video_get_view_for_target(machine, window->target, view, index, video_config.numscreens); // set the view render_target_set_view(window->target, viewindex);