mirror of
https://github.com/holub/mame
synced 2025-04-23 08:49:55 +03:00
- intscalex, intscaley and unevenstretchx now consider the system orientation and screen rotation
This commit is contained in:
parent
0df3c1d099
commit
161a08dd4a
@ -74,15 +74,6 @@ enum
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// MACROS
|
||||
//**************************************************************************
|
||||
|
||||
#define ISWAP(var1, var2) do { int temp = var1; var1 = var2; var2 = temp; } while (0)
|
||||
#define FSWAP(var1, var2) do { float temp = var1; var1 = var2; var2 = temp; } while (0)
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
@ -136,8 +127,8 @@ inline void apply_orientation(render_bounds &bounds, int orientation)
|
||||
// swap first
|
||||
if (orientation & ORIENTATION_SWAP_XY)
|
||||
{
|
||||
FSWAP(bounds.x0, bounds.y0);
|
||||
FSWAP(bounds.x1, bounds.y1);
|
||||
std::swap(bounds.x0, bounds.y0);
|
||||
std::swap(bounds.x1, bounds.y1);
|
||||
}
|
||||
|
||||
// apply X flip
|
||||
@ -164,9 +155,9 @@ inline void apply_orientation(render_bounds &bounds, int orientation)
|
||||
inline void normalize_bounds(render_bounds &bounds)
|
||||
{
|
||||
if (bounds.x0 > bounds.x1)
|
||||
FSWAP(bounds.x0, bounds.x1);
|
||||
std::swap(bounds.x0, bounds.x1);
|
||||
if (bounds.y0 > bounds.y1)
|
||||
FSWAP(bounds.y0, bounds.y1);
|
||||
std::swap(bounds.y0, bounds.y1);
|
||||
}
|
||||
|
||||
|
||||
@ -947,7 +938,7 @@ render_target::render_target(render_manager &manager, const internal_layout *lay
|
||||
if (manager.machine().options().uneven_stretch() && !manager.machine().options().uneven_stretch_x())
|
||||
m_scale_mode = SCALE_FRACTIONAL;
|
||||
else
|
||||
m_scale_mode = manager.machine().options().uneven_stretch_x()? SCALE_FRACTIONAL_X : SCALE_INTEGER;
|
||||
m_scale_mode = manager.machine().options().uneven_stretch_x() ? SCALE_FRACTIONAL_X : SCALE_INTEGER;
|
||||
|
||||
// determine the base orientation based on options
|
||||
if (!manager.machine().options().rotate())
|
||||
@ -1161,6 +1152,10 @@ const render_screen_list &render_target::view_screens(int viewindex)
|
||||
|
||||
void render_target::compute_visible_area(INT32 target_width, INT32 target_height, float target_pixel_aspect, int target_orientation, INT32 &visible_width, INT32 &visible_height)
|
||||
{
|
||||
bool system_swap_xy = (m_manager.machine().system().flags & ORIENTATION_SWAP_XY) == ORIENTATION_SWAP_XY;
|
||||
bool target_swap_xy = (target_orientation & ORIENTATION_SWAP_XY) == ORIENTATION_SWAP_XY;
|
||||
bool swap_xy = system_swap_xy ^ target_swap_xy;
|
||||
|
||||
switch (m_scale_mode)
|
||||
{
|
||||
case SCALE_FRACTIONAL:
|
||||
@ -1177,7 +1172,7 @@ void render_target::compute_visible_area(INT32 target_width, INT32 target_height
|
||||
|
||||
// first apply target orientation
|
||||
if (target_orientation & ORIENTATION_SWAP_XY)
|
||||
FSWAP(width, height);
|
||||
std::swap(width, height);
|
||||
|
||||
// apply the target pixel aspect ratio
|
||||
height *= target_pixel_aspect;
|
||||
@ -1222,21 +1217,35 @@ void render_target::compute_visible_area(INT32 target_width, INT32 target_height
|
||||
bool x_is_integer = !(target_aspect >= 1.0f && m_scale_mode == SCALE_FRACTIONAL_X);
|
||||
bool y_is_integer = !(target_aspect < 1.0f && m_scale_mode == SCALE_FRACTIONAL_X);
|
||||
|
||||
// apply swap to scale mode
|
||||
if (swap_xy)
|
||||
std::swap(x_is_integer, y_is_integer);
|
||||
|
||||
// first compute scale factors to fit the screen
|
||||
float xscale = (float)target_width / src_width;
|
||||
float yscale = (float)target_height / src_height;
|
||||
float maxxscale = std::max(1.0f, float(m_int_overscan ? render_round_nearest(xscale) : floor(xscale)));
|
||||
float maxyscale = std::max(1.0f, float(m_int_overscan ? render_round_nearest(yscale) : floor(yscale)));
|
||||
|
||||
// apply swap to maximum scale factors
|
||||
if (swap_xy)
|
||||
std::swap(maxxscale, maxyscale);
|
||||
|
||||
// now apply desired scale mode and aspect correction
|
||||
if (m_keepaspect && target_aspect > src_aspect) xscale *= src_aspect / target_aspect * (maxyscale / yscale);
|
||||
if (m_keepaspect && target_aspect < src_aspect) yscale *= target_aspect / src_aspect * (maxxscale / xscale);
|
||||
if (x_is_integer) xscale = std::min(maxxscale, std::max(1.0f, render_round_nearest(xscale)));
|
||||
if (y_is_integer) yscale = std::min(maxyscale, std::max(1.0f, render_round_nearest(yscale)));
|
||||
|
||||
// apply swap to user defined scale factors
|
||||
int int_scale_x = m_int_scale_x;
|
||||
int int_scale_y = m_int_scale_y;
|
||||
if (swap_xy)
|
||||
std::swap(int_scale_x, int_scale_y);
|
||||
|
||||
// check if we have user defined scale factors, if so use them instead
|
||||
xscale = m_int_scale_x? m_int_scale_x : xscale;
|
||||
yscale = m_int_scale_y? m_int_scale_y : yscale;
|
||||
xscale = int_scale_x > 0 ? int_scale_x : xscale;
|
||||
yscale = int_scale_y > 0 ? int_scale_y : yscale;
|
||||
|
||||
// set the final width/height
|
||||
visible_width = render_round_nearest(src_width * xscale);
|
||||
@ -2051,7 +2060,7 @@ void render_target::add_element_primitives(render_primitive_list &list, const ob
|
||||
INT32 height = render_round_nearest(xform.yscale);
|
||||
set_render_bounds_wh(&prim->bounds, render_round_nearest(xform.xoffs), render_round_nearest(xform.yoffs), (float) width, (float) height);
|
||||
if (xform.orientation & ORIENTATION_SWAP_XY)
|
||||
ISWAP(width, height);
|
||||
std::swap(width, height);
|
||||
width = std::min(width, m_maxtexwidth);
|
||||
height = std::min(height, m_maxtexheight);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user