OPENGLSDL: Move stretch mode handling into OpenGLGraphicsManager

This commit is contained in:
Cameron Cawley 2019-06-22 13:17:19 +01:00 committed by Filippos Karapetis
parent c57b2cc148
commit 16f8c024d1
4 changed files with 67 additions and 62 deletions

View file

@ -54,7 +54,7 @@ namespace OpenGL {
OpenGLGraphicsManager::OpenGLGraphicsManager()
: _currentState(), _oldState(), _transactionMode(kTransactionNone), _screenChangeID(1 << (sizeof(int) * 8 - 2)),
_pipeline(nullptr),
_pipeline(nullptr), _stretchMode(STRETCH_FIT),
_defaultFormat(), _defaultFormatAlpha(),
_gameScreen(nullptr), _gameScreenShakeOffset(0), _overlay(nullptr),
_cursor(nullptr),
@ -88,6 +88,7 @@ bool OpenGLGraphicsManager::hasFeature(OSystem::Feature f) const {
case OSystem::kFeatureAspectRatioCorrection:
case OSystem::kFeatureCursorPalette:
case OSystem::kFeatureFilteringMode:
case OSystem::kFeatureStretchMode:
return true;
case OSystem::kFeatureOverlaySupportsAlpha:
@ -234,6 +235,54 @@ Common::List<Graphics::PixelFormat> OpenGLGraphicsManager::getSupportedFormats()
}
#endif
namespace {
const OSystem::GraphicsMode glStretchModes[] = {
{"center", _s("Center"), STRETCH_CENTER},
{"pixel-perfect", _s("Pixel-perfect scaling"), STRETCH_INTEGRAL},
{"fit", _s("Fit to window"), STRETCH_FIT},
{"stretch", _s("Stretch to window"), STRETCH_STRETCH},
{nullptr, nullptr, 0}
};
} // End of anonymous namespace
const OSystem::GraphicsMode *OpenGLGraphicsManager::getSupportedStretchModes() const {
return glStretchModes;
}
int OpenGLGraphicsManager::getDefaultStretchMode() const {
return STRETCH_FIT;
}
bool OpenGLGraphicsManager::setStretchMode(int mode) {
assert(getTransactionMode() != kTransactionNone);
if (mode == _stretchMode)
return true;
// Check this is a valid mode
const OSystem::GraphicsMode *sm = getSupportedStretchModes();
bool found = false;
while (sm->name) {
if (sm->id == mode) {
found = true;
break;
}
sm++;
}
if (!found) {
warning("unknown stretch mode %d", mode);
return false;
}
_stretchMode = mode;
return true;
}
int OpenGLGraphicsManager::getStretchMode() const {
return _stretchMode;
}
void OpenGLGraphicsManager::beginGFXTransaction() {
assert(_transactionMode == kTransactionNone);

View file

@ -75,6 +75,11 @@ public:
virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const override;
#endif
virtual const OSystem::GraphicsMode *getSupportedStretchModes() const override;
virtual int getDefaultStretchMode() const override;
virtual bool setStretchMode(int mode) override;
virtual int getStretchMode() const override;
virtual void beginGFXTransaction() override;
virtual OSystem::TransactionError endGFXTransaction() override;
@ -229,6 +234,11 @@ private:
*/
int _screenChangeID;
/**
* The current stretch mode.
*/
int _stretchMode;
protected:
/**
* Set up the requested video mode. This takes parameters which describe

View file

@ -39,7 +39,7 @@ OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager(uint desktopWidth, uint deskt
#else
_lastVideoModeLoad(0),
#endif
_graphicsScale(2), _stretchMode(STRETCH_FIT), _ignoreLoadVideoMode(false), _gotResize(false), _wantsFullScreen(false), _ignoreResizeEvents(0),
_graphicsScale(2), _ignoreLoadVideoMode(false), _gotResize(false), _wantsFullScreen(false), _ignoreResizeEvents(0),
_desiredFullscreenWidth(0), _desiredFullscreenHeight(0) {
// Setup OpenGL attributes for SDL
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
@ -218,7 +218,6 @@ void OpenGLSdlGraphicsManager::deactivateManager() {
bool OpenGLSdlGraphicsManager::hasFeature(OSystem::Feature f) const {
switch (f) {
case OSystem::kFeatureFullscreenMode:
case OSystem::kFeatureStretchMode:
case OSystem::kFeatureIconifyWindow:
return true;
@ -267,54 +266,6 @@ bool OpenGLSdlGraphicsManager::getFeatureState(OSystem::Feature f) const {
}
}
namespace {
const OSystem::GraphicsMode sdlGlStretchModes[] = {
{"center", _s("Center"), STRETCH_CENTER},
{"pixel-perfect", _s("Pixel-perfect scaling"), STRETCH_INTEGRAL},
{"fit", _s("Fit to window"), STRETCH_FIT},
{"stretch", _s("Stretch to window"), STRETCH_STRETCH},
{nullptr, nullptr, 0}
};
} // End of anonymous namespace
const OSystem::GraphicsMode *OpenGLSdlGraphicsManager::getSupportedStretchModes() const {
return sdlGlStretchModes;
}
int OpenGLSdlGraphicsManager::getDefaultStretchMode() const {
return STRETCH_FIT;
}
bool OpenGLSdlGraphicsManager::setStretchMode(int mode) {
assert(getTransactionMode() != kTransactionNone);
if (mode == _stretchMode)
return true;
// Check this is a valid mode
const OSystem::GraphicsMode *sm = sdlGlStretchModes;
bool found = false;
while (sm->name) {
if (sm->id == mode) {
found = true;
break;
}
sm++;
}
if (!found) {
warning("unknown stretch mode %d", mode);
return false;
}
_stretchMode = mode;
return true;
}
int OpenGLSdlGraphicsManager::getStretchMode() const {
return _stretchMode;
}
void OpenGLSdlGraphicsManager::initSize(uint w, uint h, const Graphics::PixelFormat *format) {
// HACK: This is stupid but the SurfaceSDL backend defaults to 2x. This
// assures that the launcher (which requests 320x200) has a reasonable
@ -705,24 +656,25 @@ bool OpenGLSdlGraphicsManager::notifyEvent(const Common::Event &event) {
// Ctrl+Alt+s cycles through stretch mode
int index = 0;
const OSystem::GraphicsMode *sm = sdlGlStretchModes;
const OSystem::GraphicsMode *stretchModes = getSupportedStretchModes();
const OSystem::GraphicsMode *sm = stretchModes;
while (sm->name) {
if (sm->id == _stretchMode)
if (sm->id == getStretchMode())
break;
sm++;
index++;
}
index++;
if (!sdlGlStretchModes[index].name)
if (!stretchModes[index].name)
index = 0;
beginGFXTransaction();
setStretchMode(sdlGlStretchModes[index].id);
setStretchMode(stretchModes[index].id);
endGFXTransaction();
#ifdef USE_OSD
Common::String message = Common::String::format("%s: %s",
_("Stretch mode"),
_(sdlGlStretchModes[index].description)
_(stretchModes[index].description)
);
displayMessageOnOSD(message.c_str());
#endif

View file

@ -43,11 +43,6 @@ public:
virtual void setFeatureState(OSystem::Feature f, bool enable) override;
virtual bool getFeatureState(OSystem::Feature f) const override;
virtual const OSystem::GraphicsMode *getSupportedStretchModes() const override;
virtual int getDefaultStretchMode() const override;
virtual bool setStretchMode(int mode) override;
virtual int getStretchMode() const override;
virtual void initSize(uint w, uint h, const Graphics::PixelFormat *format) override;
virtual void updateScreen() override;
@ -84,7 +79,6 @@ private:
uint _lastRequestedWidth;
uint _lastRequestedHeight;
uint _graphicsScale;
int _stretchMode;
bool _ignoreLoadVideoMode;
bool _gotResize;