diff options
author | Andrei Karas <akaras@inbox.ru> | 2014-01-28 00:30:51 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2014-01-28 23:35:20 +0300 |
commit | a0b2deb4192bddad4d061f5d5df86411a437f01f (patch) | |
tree | 4739472959d83045eac4d7f7ddf3dc265d37b45c | |
parent | 226202ff807dc860991af0d6665ef9e9b48c1bed (diff) | |
download | manaplus-a0b2deb4192bddad4d061f5d5df86411a437f01f.tar.gz manaplus-a0b2deb4192bddad4d061f5d5df86411a437f01f.tar.bz2 manaplus-a0b2deb4192bddad4d061f5d5df86411a437f01f.tar.xz manaplus-a0b2deb4192bddad4d061f5d5df86411a437f01f.zip |
add support for screen scale in OpenGL modes.
-rw-r--r-- | src/client.cpp | 25 | ||||
-rw-r--r-- | src/client.h | 4 | ||||
-rw-r--r-- | src/defaults.cpp | 1 | ||||
-rw-r--r-- | src/eventsmanager.cpp | 2 | ||||
-rw-r--r-- | src/graphicsmanager.cpp | 15 | ||||
-rw-r--r-- | src/gui/gui.cpp | 6 | ||||
-rw-r--r-- | src/gui/sdlinput.cpp | 47 | ||||
-rw-r--r-- | src/gui/widgets/tabs/setup_video.cpp | 32 | ||||
-rw-r--r-- | src/render/graphics.cpp | 48 | ||||
-rw-r--r-- | src/render/graphics.h | 29 | ||||
-rw-r--r-- | src/render/mobileopenglgraphics.cpp | 28 | ||||
-rw-r--r-- | src/render/normalopenglgraphics.cpp | 27 | ||||
-rw-r--r-- | src/render/nullopenglgraphics.cpp | 9 | ||||
-rw-r--r-- | src/render/openglgraphicsdef.hpp | 4 | ||||
-rw-r--r-- | src/render/safeopenglgraphics.cpp | 28 | ||||
-rw-r--r-- | src/render/sdl2graphics.cpp | 14 | ||||
-rw-r--r-- | src/render/sdl2graphics.h | 1 | ||||
-rw-r--r-- | src/render/sdl2softwaregraphics.cpp | 9 | ||||
-rw-r--r-- | src/render/sdl2softwaregraphics.h | 1 | ||||
-rw-r--r-- | src/render/sdlgraphics.cpp | 12 | ||||
-rw-r--r-- | src/render/sdlgraphics.h | 1 | ||||
-rw-r--r-- | src/render/surfacegraphics.h | 1 |
22 files changed, 231 insertions, 113 deletions
diff --git a/src/client.cpp b/src/client.cpp index 13835c938..82652e433 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -2798,25 +2798,30 @@ bool Client::isTmw() const return false; } -void Client::resizeVideo(int width, int height, const bool always) +void Client::resizeVideo(int actualWidth, + int actualHeight, + const bool always) { // Keep a minimum size. This isn't adhered to by the actual window, but // it keeps some window positions from getting messed up. - width = std::max(470, width); - height = std::max(320, height); + actualWidth = std::max(470, actualWidth); + actualHeight = std::max(320, actualHeight); if (!mainGraphics) return; - if (!always && mainGraphics->mWidth == width - && mainGraphics->mHeight == height) + if (!always + && mainGraphics->mActualWidth == actualWidth + && mainGraphics->mActualHeight == actualHeight) { return; } - touchManager.resize(width, height); - - if (mainGraphics->resizeScreen(width, height)) + if (mainGraphics->resizeScreen(actualWidth, actualHeight)) { + const int width = mainGraphics->mWidth; + const int height = mainGraphics->mHeight; + touchManager.resize(width, height); + if (gui) gui->videoResized(); @@ -2852,8 +2857,8 @@ void Client::resizeVideo(int width, int height, const bool always) if (gui) gui->draw(); - config.setValue("screenwidth", width); - config.setValue("screenheight", height); + config.setValue("screenwidth", actualWidth); + config.setValue("screenheight", actualHeight); } } diff --git a/src/client.h b/src/client.h index 7a88c6734..82bb4be15 100644 --- a/src/client.h +++ b/src/client.h @@ -311,7 +311,9 @@ public: void writePacketLimits(const std::string &packetLimitsName) const; - void resizeVideo(int width, int height, const bool always = false); + void resizeVideo(int actualWidth, + int actualHeight, + const bool always); bool limitPackets(const int type) A_WARN_UNUSED; diff --git a/src/defaults.cpp b/src/defaults.cpp index 9362473fd..4e8a2246a 100644 --- a/src/defaults.cpp +++ b/src/defaults.cpp @@ -356,6 +356,7 @@ DefaultsData* getConfigDefaults() AddDEF("showmotd", false); AddDEF("playMapAnimations", true); AddDEF("usepets", true); + AddDEF("scale", 1); return configData; } diff --git a/src/eventsmanager.cpp b/src/eventsmanager.cpp index 6c102bdc1..237e7bf68 100644 --- a/src/eventsmanager.cpp +++ b/src/eventsmanager.cpp @@ -77,7 +77,7 @@ bool EventsManager::handleCommonEvents(const SDL_Event &event) return true; #else case SDL_VIDEORESIZE: - client->resizeVideo(event.resize.w, event.resize.h); + client->resizeVideo(event.resize.w, event.resize.h, false); return true; case SDL_ACTIVEEVENT: handleActive(event); diff --git a/src/graphicsmanager.cpp b/src/graphicsmanager.cpp index 552f5a018..0a7f78eb6 100644 --- a/src/graphicsmanager.cpp +++ b/src/graphicsmanager.cpp @@ -377,8 +377,19 @@ void GraphicsManager::setVideoMode() int height = config.getIntValue("screenheight"); #endif + int scale = 1; + if (mainGraphics->allowScale()) + { + if (!scale) + scale = 1; + scale = config.getIntValue("scale"); + if (width / scale < 470 || height / scale < 320) + scale = 1; + logger->log("set scale: %d", scale); + } + // Try to set the desired video mode - if (!mainGraphics->setVideoMode(width, height, bpp, + if (!mainGraphics->setVideoMode(width, height, scale, bpp, fullscreen, hwaccel, enableResize, noFrame)) { logger->log(strprintf("Couldn't set %dx%dx%d video mode: %s", @@ -396,7 +407,7 @@ void GraphicsManager::setVideoMode() config.setValueInt("screenwidth", oldWidth); config.setValueInt("screenheight", oldHeight); config.setValue("screen", oldFullscreen == 1); - if (!mainGraphics->setVideoMode(oldWidth, oldHeight, bpp, + if (!mainGraphics->setVideoMode(oldWidth, oldHeight, scale, bpp, oldFullscreen, hwaccel, enableResize, noFrame)) { logger->safeError(strprintf("Couldn't restore %dx%dx%d " diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index d016c0aa3..dcd4d82ea 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -942,5 +942,9 @@ void Gui::removeDragged(gcn::Widget *widget) uint32_t Gui::getMouseState(int *const x, int *const y) const { - return SDL_GetMouseState(x, y); + const uint32_t res = SDL_GetMouseState(x, y); + const int scale = mainGraphics->getScale(); + (*x) /= scale; + (*y) /= scale; + return res; } diff --git a/src/gui/sdlinput.cpp b/src/gui/sdlinput.cpp index 653806491..193a35dfe 100644 --- a/src/gui/sdlinput.cpp +++ b/src/gui/sdlinput.cpp @@ -81,6 +81,8 @@ #include "input/inputmanager.h" +#include "render/graphics.h" + #ifdef USE_SDL2 #include "gui/gui.h" #endif @@ -210,14 +212,19 @@ void SDLInput::pushInput(const SDL_Event &event) #endif case SDL_MOUSEBUTTONDOWN: + { mMouseDown = true; - mouseInput.setX(event.button.x); - mouseInput.setY(event.button.y); + const int scale = mainGraphics->getScale(); + const int x = event.button.x / scale; + const int y = event.button.y / scale; + mouseInput.setX(x); + mouseInput.setY(y); #ifdef ANDROID #ifdef USE_SDL2 - mouseInput.setReal(event.button.x, event.button.y); + mouseInput.setReal(x, y); #else - mouseInput.setReal(event.button.realx, event.button.realy); + mouseInput.setReal(event.button.realx / scale, + event.button.realy / scale); #endif #endif mouseInput.setButton(convertMouseButton(event.button.button)); @@ -233,16 +240,21 @@ void SDLInput::pushInput(const SDL_Event &event) mouseInput.setTimeStamp(SDL_GetTicks()); mMouseInputQueue.push(mouseInput); break; - + } case SDL_MOUSEBUTTONUP: + { mMouseDown = false; - mouseInput.setX(event.button.x); - mouseInput.setY(event.button.y); + const int scale = mainGraphics->getScale(); + const int x = event.button.x / scale; + const int y = event.button.y / scale; + mouseInput.setX(x); + mouseInput.setY(y); #ifdef ANDROID #ifdef USE_SDL2 - mouseInput.setReal(event.button.x, event.button.y); + mouseInput.setReal(x, y); #else - mouseInput.setReal(event.button.realx, event.button.realy); + mouseInput.setReal(event.button.realx / scale, + event.button.realy / scale); #endif #endif mouseInput.setButton(convertMouseButton(event.button.button)); @@ -250,15 +262,20 @@ void SDLInput::pushInput(const SDL_Event &event) mouseInput.setTimeStamp(SDL_GetTicks()); mMouseInputQueue.push(mouseInput); break; - + } case SDL_MOUSEMOTION: - mouseInput.setX(event.motion.x); - mouseInput.setY(event.motion.y); + { + const int scale = mainGraphics->getScale(); + const int x = event.motion.x / scale; + const int y = event.motion.y / scale; + mouseInput.setX(x); + mouseInput.setY(y); #ifdef ANDROID #ifdef USE_SDL2 - mouseInput.setReal(event.motion.x, event.motion.y); + mouseInput.setReal(x, y); #else - mouseInput.setReal(event.motion.realx, event.motion.realy); + mouseInput.setReal(event.motion.realx / scale, + event.motion.realy / scale); #endif #endif mouseInput.setButton(gcn::MouseInput::EMPTY); @@ -266,7 +283,7 @@ void SDLInput::pushInput(const SDL_Event &event) mouseInput.setTimeStamp(SDL_GetTicks()); mMouseInputQueue.push(mouseInput); break; - + } #ifndef USE_SDL2 case SDL_ACTIVEEVENT: /* diff --git a/src/gui/widgets/tabs/setup_video.cpp b/src/gui/widgets/tabs/setup_video.cpp index feebb774a..c977318e6 100644 --- a/src/gui/widgets/tabs/setup_video.cpp +++ b/src/gui/widgets/tabs/setup_video.cpp @@ -122,8 +122,8 @@ ModeListModel::ModeListModel() : addCustomMode("1280x1024"); addCustomMode("1400x900"); addCustomMode("1500x990"); - addCustomMode(toString(mainGraphics->mWidth).append("x") - .append(toString(mainGraphics->mHeight))); + addCustomMode(toString(mainGraphics->mActualWidth).append("x") + .append(toString(mainGraphics->mActualHeight))); std::sort(mVideoModes.begin(), mVideoModes.end(), &modeSorter); mVideoModes.push_back("custom"); @@ -243,8 +243,9 @@ Setup_Video::Setup_Video(const Widget2 *const widget) : mFpsCheckBox->setSelected(mFps > 0); // Pre-select the current video mode. - const std::string videoMode = toString(mainGraphics->mWidth).append("x") - .append(toString(mainGraphics->mHeight)); + const std::string videoMode = toString( + mainGraphics->mActualWidth).append("x").append( + toString(mainGraphics->mActualHeight)); mModeList->setSelected(mModeListModel->getIndexOf(videoMode)); mModeList->setActionEventId("videomode"); @@ -428,11 +429,11 @@ void Setup_Video::cancel() config.setValue("screen", mFullScreenEnabled); // Set back to the current video mode. - std::string videoMode = toString(mainGraphics->mWidth).append("x") - .append(toString(mainGraphics->mHeight)); + std::string videoMode = toString(mainGraphics->mActualWidth).append("x") + .append(toString(mainGraphics->mActualHeight)); mModeList->setSelected(mModeListModel->getIndexOf(videoMode)); - config.setValue("screenwidth", mainGraphics->mWidth); - config.setValue("screenheight", mainGraphics->mHeight); + config.setValue("screenwidth", mainGraphics->mActualWidth); + config.setValue("screenheight", mainGraphics->mActualHeight); config.setValue("customcursor", mCustomCursorEnabled); config.setValue("opengl", static_cast<int>(mOpenGLEnabled)); @@ -474,18 +475,19 @@ void Setup_Video::action(const gcn::ActionEvent &event) if (!width || !height) return; - if (width != mainGraphics->mWidth || height != mainGraphics->mHeight) + if (width != mainGraphics->mActualWidth + || height != mainGraphics->mActualHeight) { #if defined(WIN32) || defined(__APPLE__) || defined(ANDROID) if (intToRenderType(config.getIntValue("opengl")) == RENDER_SOFTWARE) { - client->resizeVideo(width, height); + client->resizeVideo(width, height, false); } else { - if (width < mainGraphics->mWidth - || height < mainGraphics->mHeight) + if (width < mainGraphics->mActualWidth + || height < mainGraphics->mActualHeight) { // TRANSLATORS: video settings warning new OkDialog(_("Screen Resolution Changed"), @@ -505,13 +507,13 @@ void Setup_Video::action(const gcn::ActionEvent &event) } #else mainGraphics->setWindowSize(width, height); - client->resizeVideo(width, height); + client->resizeVideo(width, height, false); #endif } config.setValue("oldscreen", config.getBoolValue("screen")); - config.setValue("oldscreenwidth", mainGraphics->mWidth); - config.setValue("oldscreenheight", mainGraphics->mHeight); + config.setValue("oldscreenwidth", mainGraphics->mActualWidth); + config.setValue("oldscreenheight", mainGraphics->mActualHeight); config.setValue("screenwidth", width); config.setValue("screenheight", height); } diff --git a/src/render/graphics.cpp b/src/render/graphics.cpp index c88892cc4..27682f1f0 100644 --- a/src/render/graphics.cpp +++ b/src/render/graphics.cpp @@ -51,6 +51,8 @@ Graphics::Graphics() : gcn::Graphics(), mWidth(0), mHeight(0), + mActualWidth(0), + mActualHeight(0), mWindow(nullptr), #ifdef USE_SDL2 mRenderer(nullptr), @@ -72,6 +74,7 @@ Graphics::Graphics() : mName("Unknown"), mStartFreeMem(0), mSync(false), + mScale(1), mColor(), mColor2() { @@ -105,21 +108,28 @@ void Graphics::setSync(const bool sync) mSync = sync; } -void Graphics::setMainFlags(const int w, const int h, const int bpp, - const bool fs, const bool hwaccel, - const bool resize, const bool noFrame) +void Graphics::setMainFlags(const int w, const int h, + const int scale, + const int bpp, + const bool fs, + const bool hwaccel, + const bool resize, + const bool noFrame) { logger->log("graphics backend: %s", getName().c_str()); logger->log("Setting video mode %dx%d %s", w, h, fs ? "fullscreen" : "windowed"); - mWidth = w; - mHeight = h; + mWidth = w / scale; + mHeight = h / scale; mBpp = bpp; mFullscreen = fs; mHWAccel = hwaccel; mEnableResize = resize; mNoFrame = noFrame; + mScale = scale; + mActualWidth = w; + mActualHeight = h; } int Graphics::getOpenGLFlags() const @@ -161,7 +171,8 @@ bool Graphics::setOpenGLMode() { #ifdef USE_OPENGL SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - if (!(mWindow = graphicsManager.createWindow(mWidth, mHeight, + if (!(mWindow = graphicsManager.createWindow( + mActualWidth, mActualHeight, mBpp, getOpenGLFlags()))) { mRect.w = 0; @@ -173,15 +184,16 @@ bool Graphics::setOpenGLMode() int w1 = 0; int h1 = 0; SDL_GetWindowSize(mWindow, &w1, &h1); - mRect.w = w1; - mRect.h = h1; + mRect.w = w1 / mScale; + mRect.h = h1 / mScale; mGLContext = SDL_GL_CreateContext(mWindow); #else // USE_SDL2 - mRect.w = static_cast<uint16_t>(mWindow->w); - mRect.h = static_cast<uint16_t>(mWindow->h); + mRect.w = static_cast<uint16_t>(mWindow->w / mScale); + mRect.h = static_cast<uint16_t>(mWindow->h / mScale); + #endif // USE_SDL2 #ifdef __APPLE__ @@ -196,7 +208,7 @@ bool Graphics::setOpenGLMode() graphicsManager.logVersion(); // Setup OpenGL - glViewport(0, 0, mWidth, mHeight); + glViewport(0, 0, mActualWidth, mActualHeight); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); int gotDoubleBuffer = 0; SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &gotDoubleBuffer); @@ -374,7 +386,7 @@ bool Graphics::setFullscreen(const bool fs) if (mFullscreen == fs) return true; - return setVideoMode(mWidth, mHeight, mBpp, fs, mHWAccel, + return setVideoMode(mActualWidth, mActualHeight, mScale, mBpp, fs, mHWAccel, mEnableResize, mNoFrame); } @@ -386,10 +398,10 @@ bool Graphics::resizeScreen(const int width, const int height) #ifdef USE_SDL2 _endDraw(); - mRect.w = width; - mRect.h = height; - mWidth = width; - mHeight = height; + mRect.w = width / mScale; + mRect.h = height / mScale; + mWidth = width / mScale; + mHeight = height / mScale; #ifdef USE_OPENGL // +++ probably this way will not work in windows/mac @@ -409,14 +421,14 @@ bool Graphics::resizeScreen(const int width, const int height) _endDraw(); - const bool success = setVideoMode(width, height, mBpp, + const bool success = setVideoMode(width, height, mScale, mBpp, mFullscreen, mHWAccel, mEnableResize, mNoFrame); // If it didn't work, try to restore the previous size. If that didn't // work either, bail out (but then we're in deep trouble). if (!success) { - if (!setVideoMode(prevWidth, prevHeight, mBpp, + if (!setVideoMode(prevWidth, prevHeight, mScale, mBpp, mFullscreen, mHWAccel, mEnableResize, mNoFrame)) { return false; diff --git a/src/render/graphics.h b/src/render/graphics.h index 82ef32fea..adf1b97c4 100644 --- a/src/render/graphics.h +++ b/src/render/graphics.h @@ -127,9 +127,13 @@ class Graphics : public gcn::Graphics /** * Try to create a window with the given settings. */ - virtual bool setVideoMode(const int w, const int h, const int bpp, - const bool fs, const bool hwaccel, - const bool resize, const bool noFrame) = 0; + virtual bool setVideoMode(const int w, const int h, + const int scale, + const int bpp, + const bool fs, + const bool hwaccel, + const bool resize, + const bool noFrame) = 0; /** * Set fullscreen mode. @@ -341,8 +345,16 @@ class Graphics : public gcn::Graphics virtual void completeCache() = 0; + int getScale() const + { return mScale; } + + virtual bool allowScale() const + { return false; } + int mWidth; int mHeight; + int mActualWidth; + int mActualHeight; protected: /** @@ -350,9 +362,13 @@ class Graphics : public gcn::Graphics */ Graphics(); - void setMainFlags(const int w, const int h, const int bpp, - const bool fs, const bool hwaccel, - const bool resize, const bool noFrame); + void setMainFlags(const int w, const int h, + const int scale, + const int bpp, + const bool fs, + const bool hwaccel, + const bool resize, + const bool noFrame); int getOpenGLFlags() const A_WARN_UNUSED; @@ -386,6 +402,7 @@ class Graphics : public gcn::Graphics std::string mName; int mStartFreeMem; bool mSync; + int mScale; gcn::Color mColor; gcn::Color mColor2; }; diff --git a/src/render/mobileopenglgraphics.cpp b/src/render/mobileopenglgraphics.cpp index d273e9f65..82bf04dc8 100644 --- a/src/render/mobileopenglgraphics.cpp +++ b/src/render/mobileopenglgraphics.cpp @@ -120,11 +120,14 @@ void MobileOpenGLGraphics::initArrays() } bool MobileOpenGLGraphics::setVideoMode(const int w, const int h, - const int bpp, const bool fs, - const bool hwaccel, const bool resize, + const int scale, + const int bpp, + const bool fs, + const bool hwaccel, + const bool resize, const bool noFrame) { - setMainFlags(w, h, bpp, fs, hwaccel, resize, noFrame); + setMainFlags(w, h, scale, bpp, fs, hwaccel, resize, noFrame); return setOpenGLMode(); } @@ -842,10 +845,12 @@ void MobileOpenGLGraphics::_beginDraw() #ifdef ANDROID glOrthof(0.0, static_cast<float>(mRect.w), - static_cast<float>(mRect.h), 0.0, -1.0, 1.0); + static_cast<float>(mRect.h), + 0.0, -1.0, 1.0); #else glOrtho(0.0, static_cast<double>(mRect.w), - static_cast<double>(mRect.h), 0.0, -1.0, 1.0); + static_cast<double>(mRect.h), + 0.0, -1.0, 1.0); #endif glMatrixMode(GL_MODELVIEW); @@ -969,9 +974,10 @@ bool MobileOpenGLGraphics::pushClipArea(gcn::Rectangle area) glTranslatef(static_cast<GLfloat>(transX), static_cast<GLfloat>(transY), 0); } - glScissor(clipArea.x, mRect.h - clipArea.y - clipArea.height, - clipArea.width, clipArea.height); - + glScissor(clipArea.x * mScale, + (mRect.h - clipArea.y - clipArea.height) * mScale, + clipArea.width * mScale, + clipArea.height * mScale); return result; } @@ -997,8 +1003,10 @@ void MobileOpenGLGraphics::popClipArea() glTranslatef(static_cast<GLfloat>(transX), static_cast<GLfloat>(transY), 0); } - glScissor(clipArea.x, mRect.h - clipArea.y - clipArea.height, - clipArea.width, clipArea.height); + glScissor(clipArea.x * mScale, + (mRect.h - clipArea.y - clipArea.height) * mScale, + clipArea.width * mScale, + clipArea.height * mScale); } #ifdef ANDROID diff --git a/src/render/normalopenglgraphics.cpp b/src/render/normalopenglgraphics.cpp index 5b7abd895..e8e1a2116 100644 --- a/src/render/normalopenglgraphics.cpp +++ b/src/render/normalopenglgraphics.cpp @@ -140,11 +140,14 @@ void NormalOpenGLGraphics::initArrays() } bool NormalOpenGLGraphics::setVideoMode(const int w, const int h, - const int bpp, const bool fs, - const bool hwaccel, const bool resize, + const int scale, + const int bpp, + const bool fs, + const bool hwaccel, + const bool resize, const bool noFrame) { - setMainFlags(w, h, bpp, fs, hwaccel, resize, noFrame); + setMainFlags(w, h, scale, bpp, fs, hwaccel, resize, noFrame); return setOpenGLMode(); } @@ -1103,10 +1106,12 @@ void NormalOpenGLGraphics::_beginDraw() const int h = mRect.h; #ifdef ANDROID - glOrthof(0.0, static_cast<float>(w), static_cast<float>(h), + glOrthof(0.0, static_cast<float>(w), + static_cast<float>(h), 0.0, -1.0, 1.0); #else - glOrtho(0.0, static_cast<double>(w), static_cast<double>(h), + glOrtho(0.0, static_cast<double>(w), + static_cast<double>(h), 0.0, -1.0, 1.0); #endif @@ -1229,8 +1234,10 @@ bool NormalOpenGLGraphics::pushClipArea(gcn::Rectangle area) glTranslatef(static_cast<GLfloat>(transX), static_cast<GLfloat>(transY), 0); } - glScissor(clipArea.x, mRect.h - clipArea.y - clipArea.height, - clipArea.width, clipArea.height); + glScissor(clipArea.x * mScale, + (mRect.h - clipArea.y - clipArea.height) * mScale, + clipArea.width * mScale, + clipArea.height * mScale); return result; } @@ -1257,8 +1264,10 @@ void NormalOpenGLGraphics::popClipArea() glTranslatef(static_cast<GLfloat>(transX), static_cast<GLfloat>(transY), 0); } - glScissor(clipArea.x, mRect.h - clipArea.y - clipArea.height, - clipArea.width, clipArea.height); + glScissor(clipArea.x * mScale, + (mRect.h - clipArea.y - clipArea.height) * mScale, + clipArea.width * mScale, + clipArea.height * mScale); } void NormalOpenGLGraphics::drawPoint(int x, int y) diff --git a/src/render/nullopenglgraphics.cpp b/src/render/nullopenglgraphics.cpp index 2f1a59976..3ea1e4182 100644 --- a/src/render/nullopenglgraphics.cpp +++ b/src/render/nullopenglgraphics.cpp @@ -83,11 +83,14 @@ void NullOpenGLGraphics::initArrays() } bool NullOpenGLGraphics::setVideoMode(const int w, const int h, - const int bpp, const bool fs, - const bool hwaccel, const bool resize, + const int scale, + const int bpp, + const bool fs, + const bool hwaccel, + const bool resize, const bool noFrame) { - setMainFlags(w, h, bpp, fs, hwaccel, resize, noFrame); + setMainFlags(w, h, scale, bpp, fs, hwaccel, resize, noFrame); return setOpenGLMode(); } diff --git a/src/render/openglgraphicsdef.hpp b/src/render/openglgraphicsdef.hpp index 9f6d9d319..6654254cb 100644 --- a/src/render/openglgraphicsdef.hpp +++ b/src/render/openglgraphicsdef.hpp @@ -21,6 +21,7 @@ */ bool setVideoMode(const int w, const int h, + const int scalle, const int bpp, const bool fs, const bool hwaccel, @@ -141,6 +142,9 @@ void completeCache() override final; + bool allowScale() const override final + { return true; } + static void bindTexture(const GLenum target, const GLuint texture); static GLuint mLastImage; diff --git a/src/render/safeopenglgraphics.cpp b/src/render/safeopenglgraphics.cpp index c6e8c1f30..bf9334655 100644 --- a/src/render/safeopenglgraphics.cpp +++ b/src/render/safeopenglgraphics.cpp @@ -53,11 +53,15 @@ SafeOpenGLGraphics::~SafeOpenGLGraphics() { } -bool SafeOpenGLGraphics::setVideoMode(const int w, const int h, const int bpp, - const bool fs, const bool hwaccel, - const bool resize, const bool noFrame) +bool SafeOpenGLGraphics::setVideoMode(const int w, const int h, + const int scale, + const int bpp, + const bool fs, + const bool hwaccel, + const bool resize, + const bool noFrame) { - setMainFlags(w, h, bpp, fs, hwaccel, resize, noFrame); + setMainFlags(w, h, scale, bpp, fs, hwaccel, resize, noFrame); return setOpenGLMode(); } @@ -436,7 +440,8 @@ void SafeOpenGLGraphics::_beginDraw() glLoadIdentity(); glOrtho(0.0, static_cast<double>(mRect.w), - static_cast<double>(mRect.h), 0.0, -1.0, 1.0); + static_cast<double>(mRect.h), + 0.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); @@ -537,9 +542,10 @@ bool SafeOpenGLGraphics::pushClipArea(gcn::Rectangle area) glPushMatrix(); glTranslatef(static_cast<GLfloat>(transX + clipArea.xOffset), static_cast<GLfloat>(transY + clipArea.yOffset), 0); - glScissor(clipArea.x, mRect.h - clipArea.y - clipArea.height, - clipArea.width, clipArea.height); - + glScissor(clipArea.x * mScale, + (mRect.h - clipArea.y - clipArea.height) * mScale, + clipArea.width * mScale, + clipArea.height * mScale); return result; } @@ -552,8 +558,10 @@ void SafeOpenGLGraphics::popClipArea() glPopMatrix(); const gcn::ClipRectangle &clipArea = mClipStack.top(); - glScissor(clipArea.x, mRect.h - clipArea.y - clipArea.height, - clipArea.width, clipArea.height); + glScissor(clipArea.x * mScale, + (mRect.h - clipArea.y - clipArea.height) * mScale, + clipArea.width * mScale, + clipArea.height * mScale); } void SafeOpenGLGraphics::drawPoint(int x, int y) diff --git a/src/render/sdl2graphics.cpp b/src/render/sdl2graphics.cpp index 96e05c8f6..97f231d08 100644 --- a/src/render/sdl2graphics.cpp +++ b/src/render/sdl2graphics.cpp @@ -718,11 +718,15 @@ void SDLGraphics::drawLine(int x1, int y1, int x2, int y2) SDL_RenderDrawLines(mRenderer, points, 2); } -bool SDLGraphics::setVideoMode(const int w, const int h, const int bpp, - const bool fs, const bool hwaccel, - const bool resize, const bool noFrame) -{ - setMainFlags(w, h, bpp, fs, hwaccel, resize, noFrame); +bool SDLGraphics::setVideoMode(const int w, const int h, + const int scale, + const int bpp, + const bool fs, + const bool hwaccel, + const bool resize, + const bool noFrame) +{ + setMainFlags(w, h, scale, bpp, fs, hwaccel, resize, noFrame); if (!(mWindow = graphicsManager.createWindow(w, h, bpp, getSoftwareFlags()))) diff --git a/src/render/sdl2graphics.h b/src/render/sdl2graphics.h index 5f1e8ac1c..c4e0d74a7 100644 --- a/src/render/sdl2graphics.h +++ b/src/render/sdl2graphics.h @@ -129,6 +129,7 @@ class SDLGraphics final : public Graphics void drawLine(int x1, int y1, int x2, int y2) override final; bool setVideoMode(const int w, const int h, + const int scale, const int bpp, const bool fs, const bool hwaccel, diff --git a/src/render/sdl2softwaregraphics.cpp b/src/render/sdl2softwaregraphics.cpp index 95c8f08b1..088aba98c 100644 --- a/src/render/sdl2softwaregraphics.cpp +++ b/src/render/sdl2softwaregraphics.cpp @@ -1468,11 +1468,14 @@ void SDL2SoftwareGraphics::drawLine(int x1, int y1, int x2, int y2) } bool SDL2SoftwareGraphics::setVideoMode(const int w, const int h, - const int bpp, const bool fs, - const bool hwaccel, const bool resize, + const int scale, + const int bpp, + const bool fs, + const bool hwaccel, + const bool resize, const bool noFrame) { - setMainFlags(w, h, bpp, fs, hwaccel, resize, noFrame); + setMainFlags(w, h, scale, bpp, fs, hwaccel, resize, noFrame); if (!(mWindow = graphicsManager.createWindow(w, h, bpp, getSoftwareFlags()))) diff --git a/src/render/sdl2softwaregraphics.h b/src/render/sdl2softwaregraphics.h index 295118067..3ac6cb212 100644 --- a/src/render/sdl2softwaregraphics.h +++ b/src/render/sdl2softwaregraphics.h @@ -129,6 +129,7 @@ class SDL2SoftwareGraphics final : public Graphics void drawLine(int x1, int y1, int x2, int y2) override final; bool setVideoMode(const int w, const int h, + const int scale, const int bpp, const bool fs, const bool hwaccel, diff --git a/src/render/sdlgraphics.cpp b/src/render/sdlgraphics.cpp index 964f2d25a..e0e22cac9 100644 --- a/src/render/sdlgraphics.cpp +++ b/src/render/sdlgraphics.cpp @@ -1465,11 +1465,15 @@ void SDLGraphics::drawLine(int x1, int y1, int x2, int y2) // other cases not implimented } -bool SDLGraphics::setVideoMode(const int w, const int h, const int bpp, - const bool fs, const bool hwaccel, - const bool resize, const bool noFrame) +bool SDLGraphics::setVideoMode(const int w, const int h, + const int scale, + const int bpp, + const bool fs, + const bool hwaccel, + const bool resize, + const bool noFrame) { - setMainFlags(w, h, bpp, fs, hwaccel, resize, noFrame); + setMainFlags(w, h, scale, bpp, fs, hwaccel, resize, noFrame); if (!(mWindow = graphicsManager.createWindow(w, h, bpp, getSoftwareFlags()))) diff --git a/src/render/sdlgraphics.h b/src/render/sdlgraphics.h index 53a139612..17b54db92 100644 --- a/src/render/sdlgraphics.h +++ b/src/render/sdlgraphics.h @@ -129,6 +129,7 @@ class SDLGraphics final : public Graphics void drawLine(int x1, int y1, int x2, int y2) override final; bool setVideoMode(const int w, const int h, + const int scale, const int bpp, const bool fs, const bool hwaccel, diff --git a/src/render/surfacegraphics.h b/src/render/surfacegraphics.h index 3b0c639da..c3e6cb2ee 100644 --- a/src/render/surfacegraphics.h +++ b/src/render/surfacegraphics.h @@ -172,6 +172,7 @@ class SurfaceGraphics final : public Graphics { } bool setVideoMode(const int w A_UNUSED, const int h A_UNUSED, + const int scale A_UNUSED, const int bpp A_UNUSED, const bool fs A_UNUSED, const bool hwaccel A_UNUSED, const bool resize A_UNUSED, |