aboutsummaryrefslogtreecommitdiff
path: root/backends
diff options
context:
space:
mode:
authorThierry Crozat2016-10-16 18:42:40 +0100
committerGitHub2016-10-16 18:42:40 +0100
commit5151bd99dd8bc342a1367c558892d5486826941c (patch)
tree290e6458cbfc728f5415cff213dc813913f17bc9 /backends
parentabc4656cc00f11091210213058a883718442b7b7 (diff)
parentaa39a6ce4b2285d1308eb4607bdd53d317304661 (diff)
downloadscummvm-rg350-5151bd99dd8bc342a1367c558892d5486826941c.tar.gz
scummvm-rg350-5151bd99dd8bc342a1367c558892d5486826941c.tar.bz2
scummvm-rg350-5151bd99dd8bc342a1367c558892d5486826941c.zip
Merge pull request #847 from criezy/sdl-filtering
Add graphics linear filtering feature
Diffstat (limited to 'backends')
-rw-r--r--backends/graphics/opengl/opengl-graphics.cpp43
-rw-r--r--backends/graphics/opengl/opengl-graphics.h9
-rw-r--r--backends/graphics/openglsdl/openglsdl-graphics.cpp40
-rw-r--r--backends/graphics/surfacesdl/surfacesdl-graphics.cpp87
-rw-r--r--backends/graphics/surfacesdl/surfacesdl-graphics.h11
5 files changed, 139 insertions, 51 deletions
diff --git a/backends/graphics/opengl/opengl-graphics.cpp b/backends/graphics/opengl/opengl-graphics.cpp
index 41f35e29eb..a0882347b5 100644
--- a/backends/graphics/opengl/opengl-graphics.cpp
+++ b/backends/graphics/opengl/opengl-graphics.cpp
@@ -82,6 +82,7 @@ bool OpenGLGraphicsManager::hasFeature(OSystem::Feature f) {
switch (f) {
case OSystem::kFeatureAspectRatioCorrection:
case OSystem::kFeatureCursorPalette:
+ case OSystem::kFeatureFilteringMode:
return true;
case OSystem::kFeatureOverlaySupportsAlpha:
@@ -99,6 +100,20 @@ void OpenGLGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) {
_currentState.aspectRatioCorrection = enable;
break;
+ case OSystem::kFeatureFilteringMode:
+ assert(_transactionMode != kTransactionNone);
+ _currentState.filtering = enable;
+
+ if (_gameScreen) {
+ _gameScreen->enableLinearFiltering(enable);
+ }
+
+ if (_cursor) {
+ _cursor->enableLinearFiltering(enable);
+ }
+
+ break;
+
case OSystem::kFeatureCursorPalette:
_cursorPaletteEnabled = enable;
updateCursorPalette();
@@ -114,6 +129,9 @@ bool OpenGLGraphicsManager::getFeatureState(OSystem::Feature f) {
case OSystem::kFeatureAspectRatioCorrection:
return _currentState.aspectRatioCorrection;
+ case OSystem::kFeatureFilteringMode:
+ return _currentState.filtering;
+
case OSystem::kFeatureCursorPalette:
return _cursorPaletteEnabled;
@@ -125,8 +143,7 @@ bool OpenGLGraphicsManager::getFeatureState(OSystem::Feature f) {
namespace {
const OSystem::GraphicsMode glGraphicsModes[] = {
- { "opengl_linear", _s("OpenGL"), GFX_LINEAR },
- { "opengl_nearest", _s("OpenGL (No filtering)"), GFX_NEAREST },
+ { "opengl", _s("OpenGL"), GFX_OPENGL },
{ nullptr, nullptr, 0 }
};
@@ -137,25 +154,15 @@ const OSystem::GraphicsMode *OpenGLGraphicsManager::getSupportedGraphicsModes()
}
int OpenGLGraphicsManager::getDefaultGraphicsMode() const {
- return GFX_LINEAR;
+ return GFX_OPENGL;
}
bool OpenGLGraphicsManager::setGraphicsMode(int mode) {
assert(_transactionMode != kTransactionNone);
switch (mode) {
- case GFX_LINEAR:
- case GFX_NEAREST:
+ case GFX_OPENGL:
_currentState.graphicsMode = mode;
-
- if (_gameScreen) {
- _gameScreen->enableLinearFiltering(mode == GFX_LINEAR);
- }
-
- if (_cursor) {
- _cursor->enableLinearFiltering(mode == GFX_LINEAR);
- }
-
return true;
default:
@@ -250,6 +257,10 @@ OSystem::TransactionError OpenGLGraphicsManager::endGFXTransaction() {
transactionError |= OSystem::kTransactionModeSwitchFailed;
}
+ if (_oldState.filtering != _currentState.filtering) {
+ transactionError |= OSystem::kTransactionFilteringFailed;
+ }
+
// Roll back to the old state.
_currentState = _oldState;
_transactionMode = kTransactionRollback;
@@ -286,7 +297,7 @@ OSystem::TransactionError OpenGLGraphicsManager::endGFXTransaction() {
}
_gameScreen->allocate(_currentState.gameWidth, _currentState.gameHeight);
- _gameScreen->enableLinearFiltering(_currentState.graphicsMode == GFX_LINEAR);
+ _gameScreen->enableLinearFiltering(_currentState.filtering);
// We fill the screen to all black or index 0 for CLUT8.
#ifdef USE_RGB_COLOR
if (_currentState.gameFormat.bytesPerPixel == 1) {
@@ -660,7 +671,7 @@ void OpenGLGraphicsManager::setMouseCursor(const void *buf, uint w, uint h, int
}
_cursor = createSurface(textureFormat, true);
assert(_cursor);
- _cursor->enableLinearFiltering(_currentState.graphicsMode == GFX_LINEAR);
+ _cursor->enableLinearFiltering(_currentState.filtering);
}
_cursorKeyColor = keycolor;
diff --git a/backends/graphics/opengl/opengl-graphics.h b/backends/graphics/opengl/opengl-graphics.h
index 7900f06fb7..01672f4f5c 100644
--- a/backends/graphics/opengl/opengl-graphics.h
+++ b/backends/graphics/opengl/opengl-graphics.h
@@ -50,8 +50,7 @@ class Shader;
#endif
enum {
- GFX_LINEAR = 0,
- GFX_NEAREST = 1
+ GFX_OPENGL = 0
};
class OpenGLGraphicsManager : virtual public GraphicsManager {
@@ -213,7 +212,7 @@ private:
#ifdef USE_RGB_COLOR
gameFormat(),
#endif
- aspectRatioCorrection(false), graphicsMode(GFX_LINEAR) {
+ aspectRatioCorrection(false), graphicsMode(GFX_OPENGL), filtering(true) {
}
bool valid;
@@ -224,6 +223,7 @@ private:
#endif
bool aspectRatioCorrection;
int graphicsMode;
+ bool filtering;
bool operator==(const VideoState &right) {
return gameWidth == right.gameWidth && gameHeight == right.gameHeight
@@ -231,7 +231,8 @@ private:
&& gameFormat == right.gameFormat
#endif
&& aspectRatioCorrection == right.aspectRatioCorrection
- && graphicsMode == right.graphicsMode;
+ && graphicsMode == right.graphicsMode
+ && filtering == right.filtering;
}
bool operator!=(const VideoState &right) {
diff --git a/backends/graphics/openglsdl/openglsdl-graphics.cpp b/backends/graphics/openglsdl/openglsdl-graphics.cpp
index f6ae25c4ee..042cd49099 100644
--- a/backends/graphics/openglsdl/openglsdl-graphics.cpp
+++ b/backends/graphics/openglsdl/openglsdl-graphics.cpp
@@ -735,38 +735,13 @@ bool OpenGLSdlGraphicsManager::notifyEvent(const Common::Event &event) {
return true;
} else if (event.kbd.keycode == Common::KEYCODE_f) {
- // Ctrl+Alt+f toggles the graphics modes.
-
- // We are crazy we will allow the OpenGL base class to
- // introduce new graphics modes like shaders for special
- // filtering. If some other OpenGL subclass needs this,
- // we can think of refactoring this.
- int mode = getGraphicsMode();
- const OSystem::GraphicsMode *supportedModes = getSupportedGraphicsModes();
- const OSystem::GraphicsMode *modeDesc = nullptr;
-
- // Search the current mode.
- for (; supportedModes->name; ++supportedModes) {
- if (supportedModes->id == mode) {
- modeDesc = supportedModes;
- break;
- }
- }
- assert(modeDesc);
-
- // Try to use the next mode in the list.
- ++modeDesc;
- if (!modeDesc->name) {
- modeDesc = getSupportedGraphicsModes();
- }
-
- // Never ever try to resize the window when we simply want to
- // switch the graphics mode. This assures that the window size
- // does not change.
+ // Never ever try to resize the window when we simply want to enable or disable filtering.
+ // This assures that the window size does not change.
_ignoreLoadVideoMode = true;
+ // Ctrl+Alt+f toggles filtering on/off
beginGFXTransaction();
- setGraphicsMode(modeDesc->id);
+ setFeatureState(OSystem::kFeatureFilteringMode, !getFeatureState(OSystem::kFeatureFilteringMode));
endGFXTransaction();
// Make sure we do not ignore the next resize. This
@@ -774,8 +749,11 @@ bool OpenGLSdlGraphicsManager::notifyEvent(const Common::Event &event) {
assert(!_ignoreLoadVideoMode);
#ifdef USE_OSD
- const Common::String osdMsg = Common::String::format(_("Graphics mode: %s"), _(modeDesc->description));
- displayMessageOnOSD(osdMsg.c_str());
+ if (getFeatureState(OSystem::kFeatureFilteringMode)) {
+ displayMessageOnOSD(_("Filtering enabled"));
+ } else {
+ displayMessageOnOSD(_("Filtering disabled"));
+ }
#endif
return true;
diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
index 46e243c945..90d079d151 100644
--- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
+++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
@@ -190,6 +190,10 @@ SurfaceSdlGraphicsManager::SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSou
#else
_videoMode.fullscreen = true;
#endif
+
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ _videoMode.filtering = ConfMan.getBool("filtering");
+#endif
}
SurfaceSdlGraphicsManager::~SurfaceSdlGraphicsManager() {
@@ -227,6 +231,9 @@ bool SurfaceSdlGraphicsManager::hasFeature(OSystem::Feature f) {
return
(f == OSystem::kFeatureFullscreenMode) ||
(f == OSystem::kFeatureAspectRatioCorrection) ||
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ (f == OSystem::kFeatureFilteringMode) ||
+#endif
(f == OSystem::kFeatureCursorPalette) ||
(f == OSystem::kFeatureIconifyWindow);
}
@@ -239,6 +246,11 @@ void SurfaceSdlGraphicsManager::setFeatureState(OSystem::Feature f, bool enable)
case OSystem::kFeatureAspectRatioCorrection:
setAspectRatioCorrection(enable);
break;
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ case OSystem::kFeatureFilteringMode:
+ setFilteringMode(enable);
+ break;
+#endif
case OSystem::kFeatureCursorPalette:
_cursorPaletteDisabled = !enable;
blitCursor();
@@ -263,6 +275,10 @@ bool SurfaceSdlGraphicsManager::getFeatureState(OSystem::Feature f) {
return _videoMode.fullscreen;
case OSystem::kFeatureAspectRatioCorrection:
return _videoMode.aspectRatioCorrection;
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ case OSystem::kFeatureFilteringMode:
+ return _videoMode.filtering;
+#endif
case OSystem::kFeatureCursorPalette:
return !_cursorPaletteDisabled;
default:
@@ -297,6 +313,9 @@ void SurfaceSdlGraphicsManager::beginGFXTransaction() {
_transactionDetails.needUpdatescreen = false;
_transactionDetails.normal1xScaler = false;
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ _transactionDetails.needTextureUpdate = false;
+#endif
#ifdef USE_RGB_COLOR
_transactionDetails.formatChanged = false;
#endif
@@ -323,6 +342,12 @@ OSystem::TransactionError SurfaceSdlGraphicsManager::endGFXTransaction() {
_videoMode.mode = _oldVideoMode.mode;
_videoMode.scaleFactor = _oldVideoMode.scaleFactor;
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ } else if (_videoMode.filtering != _oldVideoMode.filtering) {
+ errors |= OSystem::kTransactionFilteringFailed;
+
+ _videoMode.filtering = _oldVideoMode.filtering;
+#endif
#ifdef USE_RGB_COLOR
} else if (_videoMode.format != _oldVideoMode.format) {
errors |= OSystem::kTransactionFormatNotSupported;
@@ -342,6 +367,9 @@ OSystem::TransactionError SurfaceSdlGraphicsManager::endGFXTransaction() {
if (_videoMode.fullscreen == _oldVideoMode.fullscreen &&
_videoMode.aspectRatioCorrection == _oldVideoMode.aspectRatioCorrection &&
_videoMode.mode == _oldVideoMode.mode &&
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ _videoMode.filtering == _oldVideoMode.filtering &&
+#endif
_videoMode.screenWidth == _oldVideoMode.screenWidth &&
_videoMode.screenHeight == _oldVideoMode.screenHeight) {
@@ -395,6 +423,12 @@ OSystem::TransactionError SurfaceSdlGraphicsManager::endGFXTransaction() {
if (_transactionDetails.needUpdatescreen)
internUpdateScreen();
}
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ } else if (_transactionDetails.needTextureUpdate) {
+ setGraphicsModeIntern();
+ recreateScreenTexture();
+ internUpdateScreen();
+#endif
} else if (_transactionDetails.needUpdatescreen) {
setGraphicsModeIntern();
internUpdateScreen();
@@ -1267,6 +1301,20 @@ void SurfaceSdlGraphicsManager::setAspectRatioCorrection(bool enable) {
}
}
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+void SurfaceSdlGraphicsManager::setFilteringMode(bool enable) {
+ Common::StackLock lock(_graphicsMutex);
+
+ if (_oldVideoMode.setup && _oldVideoMode.filtering == enable)
+ return;
+
+ if (_transactionMode == kTransactionActive) {
+ _videoMode.filtering = enable;
+ _transactionDetails.needTextureUpdate = true;
+ }
+}
+#endif
+
void SurfaceSdlGraphicsManager::copyRectToScreen(const void *buf, int pitch, int x, int y, int w, int h) {
assert(_transactionMode == kTransactionNone);
assert(buf);
@@ -2302,6 +2350,25 @@ bool SurfaceSdlGraphicsManager::handleScalerHotkeys(Common::KeyCode key) {
internUpdateScreen();
return true;
}
+
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ // Ctrl-Alt-f toggles filtering
+ if (key == 'f') {
+ beginGFXTransaction();
+ setFeatureState(OSystem::kFeatureFilteringMode, !_videoMode.filtering);
+ endGFXTransaction();
+#ifdef USE_OSD
+ if (getFeatureState(OSystem::kFeatureFilteringMode)) {
+ displayMessageOnOSD(_("Filtering enabled"));
+ } else {
+ displayMessageOnOSD(_("Filtering disabled"));
+ }
+#endif
+ _forceFull = true;
+ internUpdateScreen();
+ return true;
+ }
+#endif
int newMode = -1;
int factor = _videoMode.scaleFactor - 1;
@@ -2375,6 +2442,10 @@ bool SurfaceSdlGraphicsManager::isScalerHotkey(const Common::Event &event) {
if (keyValue >= ARRAYSIZE(s_gfxModeSwitchTable))
return false;
}
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ if (event.kbd.keycode == 'f')
+ return true;
+#endif
return (isScaleKey || event.kbd.keycode == 'a');
}
return false;
@@ -2519,6 +2590,20 @@ void SurfaceSdlGraphicsManager::setWindowResolution(int width, int height) {
_forceFull = true;
}
+void SurfaceSdlGraphicsManager::recreateScreenTexture() {
+ if (!_renderer)
+ return;
+
+ SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, _videoMode.filtering ? "linear" : "nearest");
+
+ SDL_Texture *oldTexture = _screenTexture;
+ _screenTexture = SDL_CreateTexture(_renderer, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STREAMING, _videoMode.hardwareWidth, _videoMode.hardwareHeight);
+ if (_screenTexture)
+ SDL_DestroyTexture(oldTexture);
+ else
+ _screenTexture = oldTexture;
+}
+
SDL_Surface *SurfaceSdlGraphicsManager::SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags) {
deinitializeRenderer();
@@ -2542,6 +2627,8 @@ SDL_Surface *SurfaceSdlGraphicsManager::SDL_SetVideoMode(int width, int height,
SDL_GetWindowSize(_window->getSDLWindow(), &_windowWidth, &_windowHeight);
setWindowResolution(_windowWidth, _windowHeight);
+
+ SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, _videoMode.filtering ? "linear" : "nearest");
_screenTexture = SDL_CreateTexture(_renderer, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STREAMING, width, height);
if (!_screenTexture) {
diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.h b/backends/graphics/surfacesdl/surfacesdl-graphics.h
index 82f4a33d8e..975cbfe27b 100644
--- a/backends/graphics/surfacesdl/surfacesdl-graphics.h
+++ b/backends/graphics/surfacesdl/surfacesdl-graphics.h
@@ -198,6 +198,7 @@ protected:
int _windowWidth, _windowHeight;
void deinitializeRenderer();
void setWindowResolution(int width, int height);
+ void recreateScreenTexture();
SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags);
void SDL_UpdateRects(SDL_Surface *screen, int numrects, SDL_Rect *rects);
@@ -237,6 +238,9 @@ protected:
bool needHotswap;
bool needUpdatescreen;
bool normal1xScaler;
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ bool needTextureUpdate;
+#endif
#ifdef USE_RGB_COLOR
bool formatChanged;
#endif
@@ -250,6 +254,10 @@ protected:
bool aspectRatioCorrection;
AspectRatio desiredAspectRatio;
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ bool filtering;
+#endif
+
int mode;
int scaleFactor;
@@ -383,6 +391,9 @@ protected:
virtual void setFullscreenMode(bool enable);
virtual void setAspectRatioCorrection(bool enable);
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ virtual void setFilteringMode(bool enable);
+#endif
virtual int effectiveScreenHeight() const;