Converted sdl_monitor_info into a proper object. (nw)

This commit is contained in:
couriersud 2015-01-29 23:19:27 +01:00
parent f8de24c1e5
commit f952a4a3ba
7 changed files with 112 additions and 128 deletions

View File

@ -593,7 +593,8 @@ static int drawsdl2_window_create(sdl_window_info *window, int width, int height
SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, "0");
#endif
// create the SDL window
window->sdl_window = SDL_CreateWindow(window->title, window->monitor()->monitor_x, 0,
window->sdl_window = SDL_CreateWindow(window->title,
window->monitor()->position_size().x, window->monitor()->position_size().y,
width, height, extra_flags);
if (window->fullscreen() && video_config.switchres)
@ -710,7 +711,7 @@ static int drawsdl2_xy_to_render_target(sdl_window_info *window, int x, int y, i
static void drawsdl2_set_target_bounds(sdl_window_info *window)
{
window->target->set_bounds(window->blitwidth, window->blitheight, sdlvideo_monitor_get_aspect(window->monitor()));
window->target->set_bounds(window->blitwidth, window->blitheight, window->monitor()->aspect());
}
//============================================================
@ -761,8 +762,8 @@ static int drawsdl2_window_draw(sdl_window_info *window, UINT32 dc, int update)
if ((window->fullscreen()) && (!video_config.switchres))
{
ch = window->monitor()->center_height;
cw = window->monitor()->center_width;
ch = window->monitor()->center_height();
cw = window->monitor()->center_width();
}
else
{

View File

@ -558,7 +558,8 @@ static int drawogl_window_create(sdl_window_info *window, int width, int height)
//load_gl_lib(window->machine());
// create the SDL window
window->sdl_window = SDL_CreateWindow(window->title, window->monitor()->monitor_x, 0,
window->sdl_window = SDL_CreateWindow(window->title,
window->monitor()->position_size().x, window->monitor()->position_size().y,
width, height, sdl->extra_flags);
if (!window->sdl_window )
@ -570,7 +571,7 @@ static int drawogl_window_create(sdl_window_info *window, int width, int height)
if (window->fullscreen() && video_config.switchres)
{
SDL_DisplayMode mode;
SDL_GetCurrentDisplayMode(window->monitor()->handle, &mode);
SDL_GetCurrentDisplayMode(window->monitor()->handle(), &mode);
mode.w = width;
mode.h = height;
if (window->refresh)
@ -842,7 +843,7 @@ static int drawogl_xy_to_render_target(sdl_window_info *window, int x, int y, in
static void drawogl_set_target_bounds(sdl_window_info *window)
{
window->target->set_bounds(window->blitwidth, window->blitheight, sdlvideo_monitor_get_aspect(window->monitor()));
window->target->set_bounds(window->blitwidth, window->blitheight, window->monitor()->aspect());
}
//============================================================
@ -1312,8 +1313,8 @@ static int drawogl_window_draw(sdl_window_info *window, UINT32 dc, int update)
if ((window->fullscreen()) && (!video_config.switchres))
{
ch = window->monitor()->center_height;
cw = window->monitor()->center_width;
ch = window->monitor()->center_height();
cw = window->monitor()->center_width();
}
else
{

View File

@ -251,7 +251,7 @@ static void setup_texture(sdl_window_info *window, int tempwidth, int tempheight
UINT32 fmt;
// Determine preferred pixelformat and set up yuv if necessary
SDL_GetCurrentDisplayMode(window->monitor()->handle, &mode);
SDL_GetCurrentDisplayMode(window->monitor()->handle(), &mode);
if (sdl->yuv_bitmap)
{
@ -412,7 +412,7 @@ static int drawsdl_window_create(sdl_window_info *window, int width, int height)
if (window->fullscreen() && video_config.switchres)
{
SDL_DisplayMode mode;
SDL_GetCurrentDisplayMode(window->monitor()->handle, &mode);
SDL_GetCurrentDisplayMode(window->monitor()->handle(), &mode);
mode.w = width;
mode.h = height;
if (window->refresh)
@ -623,7 +623,7 @@ static void drawsdl_set_target_bounds(sdl_window_info *window)
const sdl_scale_mode *sm = &scale_modes[video_config.scale_mode];
if (!sm->is_scale)
window->target->set_bounds(window->blitwidth, window->blitheight, sdlvideo_monitor_get_aspect(window->monitor()));
window->target->set_bounds(window->blitwidth, window->blitheight, window->monitor()->aspect());
else
window->target->set_bounds(sdl->hw_scale_width, sdl->hw_scale_height);
}
@ -737,8 +737,8 @@ static int drawsdl_window_draw(sdl_window_info *window, UINT32 dc, int update)
// the first one only
if ((window->fullscreen()) && (!video_config.switchres))
{
ch = window->monitor()->center_height;
cw = window->monitor()->center_width;
ch = window->monitor()->center_height();
cw = window->monitor()->center_width();
}
else
{

View File

@ -6,7 +6,6 @@
#include "watchdog.h"
#include "clifront.h"
#include "modules/lib/osdobj_common.h"
#include "video.h"
#include "modules/osdmodule.h"
#include "modules/font/font_module.h"
@ -215,8 +214,6 @@ public:
private:
virtual void osd_exit();
void extract_window_config(int index, sdl_window_config *conf);
// FIXME: remove machine usage
void extract_video_config(running_machine &machine);

View File

@ -69,20 +69,17 @@ osd_gl_dispatch *gl_dispatch;
#endif
#endif
sdl_monitor_info *sdl_monitor_info::primary_monitor = NULL;
sdl_monitor_info *sdl_monitor_info::list = NULL;
//============================================================
// LOCAL VARIABLES
//============================================================
static sdl_monitor_info *primary_monitor;
static sdl_monitor_info *sdl_monitor_list;
//============================================================
// PROTOTYPES
//============================================================
static void init_monitors(void);
static sdl_monitor_info *pick_monitor(sdl_options &options, int index);
static void check_osd_inputs(running_machine &machine);
static float get_aspect(const char *defdata, const char *data, int report_error);
@ -101,7 +98,7 @@ bool sdl_osd_interface::video_init()
extract_video_config(machine());
// set up monitors first
init_monitors();
sdl_monitor_info::init();
// we need the beam width in a float, contrary to what the core does.
video_config.beamwidth = options().beam();
@ -115,8 +112,8 @@ bool sdl_osd_interface::video_init()
{
sdl_window_config conf;
memset(&conf, 0, sizeof(conf));
extract_window_config(index, &conf);
if (sdlwindow_video_window_create(machine(), index, pick_monitor(options(), index), &conf))
get_resolution(options().resolution(), options().resolution(index), &conf, TRUE);
if (sdlwindow_video_window_create(machine(), index, sdl_monitor_info::pick_monitor(options(), index), &conf))
return false;
}
@ -131,15 +128,7 @@ bool sdl_osd_interface::video_init()
void sdl_osd_interface::video_exit()
{
window_exit();
// free all of our monitor information
while (sdl_monitor_list != NULL)
{
sdl_monitor_info *temp = sdl_monitor_list;
sdl_monitor_list = temp->next;
global_free(temp);
}
sdl_monitor_info::exit();
}
@ -147,20 +136,19 @@ void sdl_osd_interface::video_exit()
// sdlvideo_monitor_refresh
//============================================================
void sdlvideo_monitor_refresh(sdl_monitor_info *monitor)
void sdl_monitor_info::refresh()
{
#if (SDLMAME_SDL2)
SDL_DisplayMode dmode;
#if defined(SDLMAME_WIN32)
SDL_GetDesktopDisplayMode(monitor->handle, &dmode);
SDL_GetDesktopDisplayMode(m_handle, &dmode);
#else
SDL_GetCurrentDisplayMode(monitor->handle, &dmode);
SDL_GetCurrentDisplayMode(m_handle, &dmode);
#endif
monitor->monitor_width = dmode.w;
monitor->monitor_height = dmode.h;
monitor->center_width = dmode.w;
monitor->center_height = dmode.h;
SDL_GetDisplayBounds(m_handle, &m_dimensions);
m_center_width = m_dimensions.w;
m_center_height = m_dimensions.h;
// FIXME: Use SDL_GetDisplayBounds(monitor->handle, &tt) to update monitor_x
// SDL_Rect tt;
@ -169,8 +157,9 @@ void sdlvideo_monitor_refresh(sdl_monitor_info *monitor)
MONITORINFOEX info;
info.cbSize = sizeof(info);
GetMonitorInfo((HMONITOR)monitor->handle, (LPMONITORINFO)&info);
monitor->center_width = monitor->monitor_width = info.rcMonitor.right - info.rcMonitor.left;
monitor->center_height = monitor->monitor_height = info.rcMonitor.bottom - info.rcMonitor.top;
monitor->m_dimensions.x = monitor->m_dimensions.y = 0;
monitor->m_center_width = monitor->m_dimensions.w = info.rcMonitor.right - info.rcMonitor.left;
monitor->m_center_height = monitor->m_dimensions.h = info.rcMonitor.bottom - info.rcMonitor.top;
char *temp = utf8_from_wstring(info.szDevice);
strcpy(monitor->monitor_device, temp);
osd_free(temp);
@ -285,34 +274,20 @@ void sdlvideo_monitor_refresh(sdl_monitor_info *monitor)
// sdlvideo_monitor_get_aspect
//============================================================
float sdlvideo_monitor_get_aspect(sdl_monitor_info *monitor)
float sdl_monitor_info::aspect()
{
// refresh the monitor information and compute the aspect
refresh();
// FIXME: returning 0 looks odd, video_config is bad
if (video_config.keepaspect)
{
sdlvideo_monitor_refresh(monitor);
return monitor->aspect / ((float)monitor->monitor_width / (float)monitor->monitor_height);
return m_aspect / ((float)m_dimensions.w / (float)m_dimensions.h);
}
return 0.0f;
}
//============================================================
// sdlvideo_monitor_from_handle
//============================================================
sdl_monitor_info *sdlvideo_monitor_from_handle(UINT32 hmonitor)
{
sdl_monitor_info *monitor;
// find the matching monitor
for (monitor = sdl_monitor_list; monitor != NULL; monitor = monitor->next)
if (monitor->handle == hmonitor)
return monitor;
return NULL;
}
//============================================================
// update
@ -431,13 +406,13 @@ static BOOL CALLBACK monitor_enum_callback(HMONITOR handle, HDC dc, LPRECT rect,
// init_monitors
//============================================================
static void init_monitors(void)
void sdl_monitor_info::init()
{
sdl_monitor_info **tailptr;
// make a list of monitors
sdl_monitor_list = NULL;
tailptr = &sdl_monitor_list;
sdl_monitor_info::list = NULL;
tailptr = &sdl_monitor_info::list;
#if (SDLMAME_SDL2)
{
@ -452,20 +427,19 @@ static void init_monitors(void)
// allocate a new monitor info
monitor = global_alloc_clear(sdl_monitor_info);
monitor->m_handle = i;
snprintf(monitor->monitor_device, sizeof(monitor->monitor_device)-1, "%s%d", OSDOPTION_SCREEN,i);
snprintf(monitor->m_monitor_device, sizeof(monitor->m_monitor_device)-1, "%s%d", OSDOPTION_SCREEN,i);
SDL_GetDesktopDisplayMode(i, &dmode);
monitor->monitor_width = dmode.w;
monitor->monitor_height = dmode.h;
monitor->center_width = dmode.w;
monitor->center_height = dmode.h;
// FIXME: this should use SDL_GetDisplayBounds!
monitor->monitor_x = monx;
monitor->handle = i;
SDL_GetDisplayBounds(i, &monitor->m_dimensions);
monitor->m_center_width = monitor->m_dimensions.w;
monitor->m_center_height = monitor->m_dimensions.h;
// guess the aspect ratio assuming square pixels
monitor->aspect = (float)(dmode.w) / (float)(dmode.h);
osd_printf_verbose("Adding monitor %s (%d x %d)\n", monitor->monitor_device, dmode.w, dmode.h);
monitor->m_aspect = (float)(dmode.w) / (float)(dmode.h);
osd_printf_verbose("Adding monitor %s (%d x %d)\n", monitor->m_monitor_device, dmode.w, dmode.h);
monx += dmode.w;
@ -486,13 +460,24 @@ static void init_monitors(void)
#endif
}
void sdl_monitor_info::exit()
{
// free all of our monitor information
while (sdl_monitor_info::list != NULL)
{
sdl_monitor_info *temp = sdl_monitor_info::list;
sdl_monitor_info::list = temp->next;
global_free(temp);
}
}
//============================================================
// pick_monitor
//============================================================
#if (SDLMAME_SDL2) || defined(SDLMAME_WIN32)
static sdl_monitor_info *pick_monitor(sdl_options &options, int index)
sdl_monitor_info *sdl_monitor_info::pick_monitor(sdl_options &options, int index)
{
sdl_monitor_info *monitor;
const char *scrname, *scrname2;
@ -513,17 +498,17 @@ static sdl_monitor_info *pick_monitor(sdl_options &options, int index)
// look for a match in the name first
if (scrname != NULL)
{
for (monitor = sdl_monitor_list; monitor != NULL; monitor = monitor->next)
for (monitor = sdl_monitor_info::list; monitor != NULL; monitor = monitor->next)
{
moncount++;
if (strcmp(scrname, monitor->monitor_device) == 0)
if (strcmp(scrname, monitor->device()) == 0)
goto finishit;
}
}
// didn't find it; alternate monitors until we hit the jackpot
index %= moncount;
for (monitor = sdl_monitor_list; monitor != NULL; monitor = monitor->next)
for (monitor = sdl_monitor_info::list; monitor != NULL; monitor = monitor->next)
if (index-- == 0)
goto finishit;
@ -533,7 +518,7 @@ static sdl_monitor_info *pick_monitor(sdl_options &options, int index)
finishit:
if (aspect != 0)
{
monitor->aspect = aspect;
monitor->set_aspect(aspect);
}
return monitor;
}
@ -608,16 +593,6 @@ static void check_osd_inputs(running_machine &machine)
window->modify_prescale(machine, 1);
}
//============================================================
// extract_window_config
//============================================================
void sdl_osd_interface::extract_window_config(int index, sdl_window_config *conf)
{
// per-window options: extract the data
get_resolution(options().resolution(), options().resolution(index), conf, TRUE);
}
//============================================================
// extract_video_config
//============================================================

View File

@ -12,6 +12,8 @@
#ifndef __SDLVIDEO__
#define __SDLVIDEO__
#include "osdsdl.h"
//============================================================
// CONSTANTS
//============================================================
@ -56,21 +58,41 @@ struct sdl_mode
int height;
};
struct sdl_monitor_info
class sdl_monitor_info
{
public:
sdl_monitor_info * next; // pointer to next monitor in list
#ifdef PTR64
UINT64 handle; // handle to the monitor
#else
UINT32 handle; // handle to the monitor
#endif
int monitor_width;
int monitor_height;
char monitor_device[64];
float aspect; // computed/configured aspect ratio of the physical device
int center_width; // width of first physical screen for centering
int center_height; // height of first physical screen for centering
int monitor_x; // X position of this monitor in virtual desktop space (SDL virtual space has them all horizontally stacked, not real geometry)
const UINT64 handle() { return m_handle; }
const SDL_Rect &position_size() { refresh(); return m_dimensions; }
const char *device() { return m_monitor_device; }
float aspect();
int center_width() { refresh(); return m_center_width; }
int center_height() { refresh(); return m_center_height; }
void set_aspect(const float aspect) { m_aspect = aspect; }
// STATIC
static void init();
static void exit();
static sdl_monitor_info *pick_monitor(sdl_options &options, int index);
private:
void refresh();
UINT64 m_handle; // handle to the monitor
SDL_Rect m_dimensions;
char m_monitor_device[64];
float m_aspect; // computed/configured aspect ratio of the physical device
int m_center_width; // width of first physical screen for centering
int m_center_height; // height of first physical screen for centering
// STATIC
static sdl_monitor_info *primary_monitor;
static sdl_monitor_info *list;
};
@ -137,12 +159,4 @@ struct sdl_video_config
extern sdl_video_config video_config;
//============================================================
// PROTOTYPES
//============================================================
void sdlvideo_monitor_refresh(sdl_monitor_info *monitor);
float sdlvideo_monitor_get_aspect(sdl_monitor_info *monitor);
sdl_monitor_info *sdlvideo_monitor_from_handle(UINT32 monitor); //FIXME: Remove? not referenced
#endif

View File

@ -407,8 +407,7 @@ void sdl_window_info::blit_surface_size(int window_width, int window_height)
if (video_config.keepaspect)
{
// make sure the monitor is up-to-date
sdlvideo_monitor_refresh(m_monitor);
target->compute_visible_area(target_width, target_height, sdlvideo_monitor_get_aspect(m_monitor), target->orientation(), target_width, target_height);
target->compute_visible_area(target_width, target_height, m_monitor->aspect(), target->orientation(), target_width, target_height);
desired_aspect = (float)target_width / (float)target_height;
}
@ -849,7 +848,7 @@ void sdl_window_info::pick_best_mode(int *fswidth, int *fsheight)
minimum_height -= 4;
}
num = SDL_GetNumDisplayModes(m_monitor->handle);
num = SDL_GetNumDisplayModes(m_monitor->handle());
if (num == 0)
{
@ -861,7 +860,7 @@ void sdl_window_info::pick_best_mode(int *fswidth, int *fsheight)
for (i = 0; i < num; ++i)
{
SDL_DisplayMode mode;
SDL_GetDisplayMode(m_monitor->handle, i, &mode);
SDL_GetDisplayMode(m_monitor->handle(), i, &mode);
// compute initial score based on difference between target and current
size_score = 1.0f / (1.0f + fabsf((INT32)mode.w - target_width) + fabsf((INT32)mode.h - target_height));
@ -1024,7 +1023,7 @@ void sdl_window_info::video_window_update(running_machine &machine)
}
else
{
blit_surface_size(monitor()->center_width, monitor()->center_height);
blit_surface_size(monitor()->center_width(), monitor()->center_height());
}
// ensure the target bounds are up-to-date, and then get the primitives
@ -1083,8 +1082,8 @@ static OSDWORK_CALLBACK( complete_create_wt )
if (window->fullscreen())
{
// default to the current mode exactly
tempwidth = window->monitor()->monitor_width;
tempheight = window->monitor()->monitor_height;
tempwidth = window->monitor()->position_size().w;
tempheight = window->monitor()->position_size().h;
// if we're allowed to switch resolutions, override with something better
if (video_config.switchres)
@ -1225,11 +1224,8 @@ void sdl_window_info::constrain_to_aspect_ratio(int *window_width, int *window_h
INT32 viswidth, visheight;
float pixel_aspect;
// make sure the monitor is up-to-date
sdlvideo_monitor_refresh(m_monitor);
// get the pixel aspect ratio for the target monitor
pixel_aspect = sdlvideo_monitor_get_aspect(m_monitor);
pixel_aspect = m_monitor->aspect();
// determine the proposed width/height
propwidth = *window_width - extrawidth;
@ -1268,13 +1264,13 @@ void sdl_window_info::constrain_to_aspect_ratio(int *window_width, int *window_h
// clamp against the maximum (fit on one screen for full screen mode)
if (this->m_fullscreen)
{
maxwidth = m_monitor->center_width - extrawidth;
maxheight = m_monitor->center_height - extraheight;
maxwidth = m_monitor->center_width() - extrawidth;
maxheight = m_monitor->center_height() - extraheight;
}
else
{
maxwidth = m_monitor->center_width - extrawidth;
maxheight = m_monitor->center_height - extraheight;
maxwidth = m_monitor->center_width() - extrawidth;
maxheight = m_monitor->center_height() - extraheight;
// further clamp to the maximum width/height in the window
if (this->m_maxwidth != 0)
@ -1355,8 +1351,8 @@ void sdl_window_info::get_max_bounds(int *window_width, int *window_height, int
INT32 maxwidth, maxheight;
// compute the maximum client area
maxwidth = m_monitor->center_width;
maxheight = m_monitor->center_height;
maxwidth = m_monitor->center_width();
maxheight = m_monitor->center_height();
// clamp to the window's max
if (this->m_maxwidth != 0)