diff --git a/backends/graphics/openglsdl/openglsdl-graphics.cpp b/backends/graphics/openglsdl/openglsdl-graphics.cpp index 5ed0bdd43c2..6db83bcb3f6 100644 --- a/backends/graphics/openglsdl/openglsdl-graphics.cpp +++ b/backends/graphics/openglsdl/openglsdl-graphics.cpp @@ -46,9 +46,9 @@ #include "graphics/opengl/context.h" -OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager(SdlEventSource *sdlEventSource, SdlWindow *window) +OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager(SdlEventSource *sdlEventSource, SdlWindow *window, const Capabilities &capabilities) : - ResVmSdlGraphicsManager(sdlEventSource, window), + ResVmSdlGraphicsManager(sdlEventSource, window, capabilities), #if SDL_VERSION_ATLEAST(2, 0, 0) _glContext(nullptr), #endif diff --git a/backends/graphics/openglsdl/openglsdl-graphics.h b/backends/graphics/openglsdl/openglsdl-graphics.h index 7d2f27cafc9..2dcd66cb2b7 100644 --- a/backends/graphics/openglsdl/openglsdl-graphics.h +++ b/backends/graphics/openglsdl/openglsdl-graphics.h @@ -47,7 +47,7 @@ */ class OpenGLSdlGraphicsManager : public ResVmSdlGraphicsManager { public: - OpenGLSdlGraphicsManager(SdlEventSource *sdlEventSource, SdlWindow *window); + OpenGLSdlGraphicsManager(SdlEventSource *sdlEventSource, SdlWindow *window, const Capabilities &capabilities); virtual ~OpenGLSdlGraphicsManager(); virtual bool hasFeature(OSystem::Feature f); diff --git a/backends/graphics/sdl/resvm-sdl-graphics.cpp b/backends/graphics/sdl/resvm-sdl-graphics.cpp index 1504a79ce96..26d450f6e1f 100644 --- a/backends/graphics/sdl/resvm-sdl-graphics.cpp +++ b/backends/graphics/sdl/resvm-sdl-graphics.cpp @@ -32,7 +32,7 @@ static const OSystem::GraphicsMode s_supportedGraphicsModes[] = { {0, 0, 0} }; -ResVmSdlGraphicsManager::ResVmSdlGraphicsManager(SdlEventSource *source, SdlWindow *window) : +ResVmSdlGraphicsManager::ResVmSdlGraphicsManager(SdlEventSource *source, SdlWindow *window, const Capabilities &capabilities) : SdlGraphicsManager(source, window), _fullscreen(false), _lockAspectRatio(true), @@ -43,8 +43,6 @@ ResVmSdlGraphicsManager::ResVmSdlGraphicsManager(SdlEventSource *source, SdlWind _capabilities(capabilities) { ConfMan.registerDefault("fullscreen_res", "desktop"); ConfMan.registerDefault("aspect_ratio", true); - - detectDesktopResolution(); } ResVmSdlGraphicsManager::~ResVmSdlGraphicsManager() { @@ -131,26 +129,10 @@ bool ResVmSdlGraphicsManager::canUsePreferredResolution(GameRenderTarget gameRen } } -void ResVmSdlGraphicsManager::detectDesktopResolution() { -#if SDL_VERSION_ATLEAST(2, 0, 0) - SDL_DisplayMode di; - if (SDL_GetCurrentDisplayMode(0, &di) != 0) { - warning("Error: %s", SDL_GetError()); - g_system->quit(); - } - _desktopW = di.w; - _desktopH = di.h; -#else - const SDL_VideoInfo *vi = SDL_GetVideoInfo(); - _desktopW = vi->current_w; - _desktopH = vi->current_h; -#endif -} - Common::Rect ResVmSdlGraphicsManager::getPreferredFullscreenResolution() { // Default to the desktop resolution ... - uint preferredWidth = _desktopW; - uint preferredHeight = _desktopH; + uint preferredWidth = _capabilities.desktopWidth; + uint preferredHeight = _capabilities.desktopHeight; // ... unless the user has set a resolution in the configuration file const Common::String &fsres = ConfMan.get("fullscreen_res"); diff --git a/backends/graphics/sdl/resvm-sdl-graphics.h b/backends/graphics/sdl/resvm-sdl-graphics.h index f56bfc611bd..8d2cfcf088b 100644 --- a/backends/graphics/sdl/resvm-sdl-graphics.h +++ b/backends/graphics/sdl/resvm-sdl-graphics.h @@ -39,7 +39,13 @@ class SdlEventSource; */ class ResVmSdlGraphicsManager : public SdlGraphicsManager, public Common::EventObserver { public: - ResVmSdlGraphicsManager(SdlEventSource *source, SdlWindow *window); + struct Capabilities { + uint desktopWidth, desktopHeight; + + Capabilities() : desktopWidth(0), desktopHeight(0) {} + }; + + ResVmSdlGraphicsManager(SdlEventSource *source, SdlWindow *window, const Capabilities &capabilities); virtual ~ResVmSdlGraphicsManager(); // SdlGraphicsManager API @@ -98,9 +104,7 @@ public: bool notifyEvent(const Common::Event &event) override; protected: - uint _desktopW, _desktopH; - - void detectDesktopResolution(); + const Capabilities &_capabilities; bool _fullscreen; bool _lockAspectRatio; diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp index bf60173187a..f667d36ac25 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp @@ -44,9 +44,9 @@ #include "graphics/pixelbuffer.h" #include "gui/EventRecorder.h" -SurfaceSdlGraphicsManager::SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSource, SdlWindow *window) +SurfaceSdlGraphicsManager::SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSource, SdlWindow *window, const Capabilities &capabilities) : - ResVmSdlGraphicsManager(sdlEventSource, window), + ResVmSdlGraphicsManager(sdlEventSource, window, capabilities), #if SDL_VERSION_ATLEAST(2, 0, 0) _renderer(nullptr), _screenTexture(nullptr), #endif diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.h b/backends/graphics/surfacesdl/surfacesdl-graphics.h index 300754b75d9..12a7255373c 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.h +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.h @@ -41,7 +41,7 @@ */ class SurfaceSdlGraphicsManager : public ResVmSdlGraphicsManager { public: - SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSource, SdlWindow *window); + SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSource, SdlWindow *window, const Capabilities &capabilities); virtual ~SurfaceSdlGraphicsManager(); virtual bool hasFeature(OSystem::Feature f); diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index f3f86bab6b4..23368a109ae 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -165,6 +165,8 @@ void OSystem_SDL::initBackend() { // is not active by this point. debug(1, "Using SDL Video Driver \"%s\"", sdlDriverName); + detectDesktopResolution(); + // Create the default event source, in case a custom backend // manager didn't provide one yet. if (_eventSource == 0) @@ -172,7 +174,7 @@ void OSystem_SDL::initBackend() { if (_graphicsManager == 0) { if (_graphicsManager == 0) { - _graphicsManager = new SurfaceSdlGraphicsManager(_eventSource, _window); + _graphicsManager = new SurfaceSdlGraphicsManager(_eventSource, _window, _capabilities); } } @@ -218,6 +220,26 @@ void OSystem_SDL::initBackend() { dynamic_cast(_graphicsManager)->activateManager(); } +// ResidualVM specific code +void OSystem_SDL::detectDesktopResolution() { +#if SDL_VERSION_ATLEAST(2, 0, 0) + SDL_DisplayMode displayMode; + if (!SDL_GetDesktopDisplayMode(0, &displayMode)) { + _capabilities.desktopWidth = displayMode.w; + _capabilities.desktopHeight = displayMode.h; + } +#else + // Query the desktop resolution. We simply hope nothing tried to change + // the resolution so far. + const SDL_VideoInfo *videoInfo = SDL_GetVideoInfo(); + if (videoInfo && videoInfo->current_w > 0 && videoInfo->current_h > 0) { + _capabilities.desktopWidth = videoInfo->current_w; + _capabilities.desktopHeight = videoInfo->current_h; + } +#endif +} +// End of ResidualVM specific code + #if defined(USE_TASKBAR) void OSystem_SDL::engineInit() { // Add the started engine to the list of recent tasks @@ -299,9 +321,9 @@ void OSystem_SDL::setupScreen(uint screenW, uint screenH, bool fullscreen, bool delete _graphicsManager; if (accel3d) { - _graphicsManager = sdlGraphicsManager = new OpenGLSdlGraphicsManager(_eventSource, _window); + _graphicsManager = sdlGraphicsManager = new OpenGLSdlGraphicsManager(_eventSource, _window, _capabilities); } else { - _graphicsManager = sdlGraphicsManager = new SurfaceSdlGraphicsManager(_eventSource, _window); + _graphicsManager = sdlGraphicsManager = new SurfaceSdlGraphicsManager(_eventSource, _window, _capabilities); } sdlGraphicsManager->activateManager(); } diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 88b21947fbc..7837ae76fd8 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -30,6 +30,7 @@ #include "backends/events/sdl/sdl-events.h" #include "backends/log/log.h" #include "backends/platform/sdl/sdl-window.h" +#include "backends/graphics/sdl/resvm-sdl-graphics.h" #include "common/array.h" @@ -104,6 +105,12 @@ protected: */ SdlWindow *_window; + // ResidualVM specific code + // Graphics capabilities + void detectDesktopResolution(); + ResVmSdlGraphicsManager::Capabilities _capabilities; + // End of ResidualVM specific code + virtual Common::EventSource *getDefaultEventSource() { return _eventSource; } /**