From 6e157429b7a5a64af6265d075c88595df2d6fd79 Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Sun, 1 Oct 2017 16:23:22 -0500 Subject: BACKENDS: Fix window sizing of games that switch between multiple resolutions --- .../graphics/surfacesdl/surfacesdl-graphics.cpp | 45 +++++++++++++++------- backends/graphics/surfacesdl/surfacesdl-graphics.h | 2 + 2 files changed, 33 insertions(+), 14 deletions(-) (limited to 'backends/graphics/surfacesdl') diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp index de54145d5f..897cdcb352 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp @@ -598,19 +598,11 @@ void SurfaceSdlGraphicsManager::detectSupportedFormats() { } #endif -bool SurfaceSdlGraphicsManager::setGraphicsMode(int mode) { - Common::StackLock lock(_graphicsMutex); - - assert(_transactionMode == kTransactionActive); - - if (_oldVideoMode.setup && _oldVideoMode.mode == mode) - return true; - - int newScaleFactor = 1; - +int SurfaceSdlGraphicsManager::getGraphicsModeScale(int mode) const { + int scale; switch (mode) { case GFX_NORMAL: - newScaleFactor = 1; + scale = 1; break; #ifdef USE_SCALERS case GFX_DOUBLESIZE: @@ -623,18 +615,34 @@ bool SurfaceSdlGraphicsManager::setGraphicsMode(int mode) { #ifdef USE_HQ_SCALERS case GFX_HQ2X: #endif - newScaleFactor = 2; + scale = 2; break; case GFX_TRIPLESIZE: case GFX_ADVMAME3X: #ifdef USE_HQ_SCALERS case GFX_HQ3X: #endif - newScaleFactor = 3; + scale = 3; break; #endif - default: + scale = -1; + } + + return scale; +} + +bool SurfaceSdlGraphicsManager::setGraphicsMode(int mode) { + Common::StackLock lock(_graphicsMutex); + + assert(_transactionMode == kTransactionActive); + + if (_oldVideoMode.setup && _oldVideoMode.mode == mode) + return true; + + int newScaleFactor = getGraphicsModeScale(mode); + + if (newScaleFactor == -1) { warning("unknown gfx mode %d", mode); return false; } @@ -774,6 +782,15 @@ void SurfaceSdlGraphicsManager::initSize(uint w, uint h, const Graphics::PixelFo return; #endif + if ((int)w != _videoMode.screenWidth || (int)h != _videoMode.screenHeight) { + const bool useDefault = defaultGraphicsModeConfig(); + if (useDefault && w > 320) { + resetGraphicsScale(); + } else { + setGraphicsMode(getGraphicsModeIdByName(ConfMan.get("gfx_mode"))); + } + } + _videoMode.screenWidth = w; _videoMode.screenHeight = h; diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.h b/backends/graphics/surfacesdl/surfacesdl-graphics.h index e93cf410ea..62a4a38d3e 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.h +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.h @@ -190,6 +190,8 @@ protected: /** Hardware screen */ SDL_Surface *_hwscreen; + virtual int getGraphicsModeScale(int mode) const override; + #if SDL_VERSION_ATLEAST(2, 0, 0) /* SDL2 features a different API for 2D graphics. We create a wrapper * around this API to keep the code paths as close as possible. */ -- cgit v1.2.3