From fed093879282fac03c4fdcaa0aac519de468f1e1 Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Tue, 26 Jan 2010 20:10:12 +0100 Subject: Fixed crash when failing to switch to fullscreen/windowed The setup page tries to restore the previous video mode by calling setFullscreen again after it has failed. However, the setFullscreen function assumed a valid mode was set (it referenced mScreen). This would then crash. Worked around by remembering the parameters passed to setVideoMode, and using those in setFullscreen. Besides fixing a potential crash, this also fixes switching between fullscreen and windowed on Maemo 5. Probably trying to keep the color depth the same was what made it fail (which is not necessary anyway). --- src/graphics.cpp | 21 ++++++++++++++------- src/graphics.h | 6 +++++- 2 files changed, 19 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/graphics.cpp b/src/graphics.cpp index 14a2b852..f7f49e81 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -28,7 +28,12 @@ #include "resources/imageloader.h" Graphics::Graphics(): - mScreen(0) + mScreen(0), + mWidth(0), + mHeight(0), + mBpp(0), + mFullscreen(false), + mHWAccel(false) { } @@ -46,6 +51,9 @@ bool Graphics::setVideoMode(int w, int h, int bpp, bool fs, bool hwaccel) int displayFlags = SDL_ANYFORMAT; + mWidth = w; + mHeight = h; + mBpp = bpp; mFullscreen = fs; mHWAccel = hwaccel; @@ -101,18 +109,17 @@ bool Graphics::setFullscreen(bool fs) if (mFullscreen == fs) return true; - return setVideoMode(mScreen->w, mScreen->h, - mScreen->format->BitsPerPixel, fs, mHWAccel); + return setVideoMode(mWidth, mHeight, mBpp, fs, mHWAccel); } int Graphics::getWidth() const { - return mScreen->w; + return mWidth; } int Graphics::getHeight() const { - return mScreen->h; + return mHeight; } bool Graphics::drawImage(Image *image, int x, int y) @@ -163,8 +170,8 @@ bool Graphics::drawImage(Image *image, int srcX, int srcY, int dstX, int dstY, int width, int height, bool) { // Check that preconditions for blitting are met. - if (!mScreen || !image) return false; - if (!image->mSDLSurface) return false; + if (!mScreen || !image || !image->mSDLSurface) + return false; dstX += mClipStack.top().xOffset; dstY += mClipStack.top().yOffset; diff --git a/src/graphics.h b/src/graphics.h index b8e87af1..b9b2b1d5 100644 --- a/src/graphics.h +++ b/src/graphics.h @@ -195,7 +195,11 @@ class Graphics : public gcn::SDLGraphics protected: SDL_Surface *mScreen; - bool mFullscreen, mHWAccel; + int mWidth; + int mHeight; + int mBpp; + bool mFullscreen; + bool mHWAccel; }; extern Graphics *graphics; -- cgit v1.2.3-70-g09d2