diff options
author | Max Horn | 2003-06-22 11:55:40 +0000 |
---|---|---|
committer | Max Horn | 2003-06-22 11:55:40 +0000 |
commit | 11ff7fe9a347efe37e2bd8fefca7e8c130f81af0 (patch) | |
tree | 037c8edce6a559e5816b7733727305ff66cc49cf /backends/sdl | |
parent | fa184730af2f2be094aa9f37cd3abf58d10f79ea (diff) | |
download | scummvm-rg350-11ff7fe9a347efe37e2bd8fefca7e8c130f81af0.tar.gz scummvm-rg350-11ff7fe9a347efe37e2bd8fefca7e8c130f81af0.tar.bz2 scummvm-rg350-11ff7fe9a347efe37e2bd8fefca7e8c130f81af0.zip |
Patch #757827: Aspect-ratio correction
svn-id: r8605
Diffstat (limited to 'backends/sdl')
-rw-r--r-- | backends/sdl/sdl-common.cpp | 44 | ||||
-rw-r--r-- | backends/sdl/sdl-common.h | 6 | ||||
-rw-r--r-- | backends/sdl/sdl.cpp | 34 | ||||
-rw-r--r-- | backends/sdl/sdl_gl.cpp | 53 |
4 files changed, 87 insertions, 50 deletions
diff --git a/backends/sdl/sdl-common.cpp b/backends/sdl/sdl-common.cpp index 1095d4b68f..cd3b99430c 100644 --- a/backends/sdl/sdl-common.cpp +++ b/backends/sdl/sdl-common.cpp @@ -41,22 +41,23 @@ #define JOY_BUT_SPACE 4 #define JOY_BUT_F5 5 -OSystem *OSystem_SDL_create(int gfx_mode, bool full_screen) { - return OSystem_SDL_Common::create(gfx_mode, full_screen); +OSystem *OSystem_SDL_create(int gfx_mode, bool full_screen, bool aspect_ratio) { + return OSystem_SDL_Common::create(gfx_mode, full_screen, aspect_ratio); } -OSystem *OSystem_SDL_Common::create(int gfx_mode, bool full_screen) { +OSystem *OSystem_SDL_Common::create(int gfx_mode, bool full_screen, bool aspect_ratio) { OSystem_SDL_Common *syst = OSystem_SDL_Common::create_intern(); - syst->init_intern(gfx_mode, full_screen); + syst->init_intern(gfx_mode, full_screen, aspect_ratio); return syst; } -void OSystem_SDL_Common::init_intern(int gfx_mode, bool full_screen) { +void OSystem_SDL_Common::init_intern(int gfx_mode, bool full_screen, bool aspect_ratio) { _mode = gfx_mode; _full_screen = full_screen; + _adjustAspectRatio = aspect_ratio; if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER | SDL_INIT_JOYSTICK) ==-1) { error("Could not initialize SDL: %s.\n", SDL_GetError()); @@ -129,6 +130,10 @@ void OSystem_SDL_Common::init_size(uint w, uint h) { _screenWidth = w; _screenHeight = h; + + if (h != 200) + _adjustAspectRatio = false; + CKSUM_NUM = (_screenWidth * _screenHeight / (8 * 8)); if (_dirty_checksums) free(_dirty_checksums); @@ -576,20 +581,18 @@ bool OSystem_SDL_Common::poll_event(Event *event) { } } - // Ctr-Alt-a will change aspect ratio in OpenGL backend + // Ctr-Alt-a will change aspect ratio if (b == (KBD_CTRL|KBD_ALT) && ev.key.keysym.sym=='a') { - Property prop; - prop.gfx_mode = 11; - property(PROP_SET_GFX_MODE, &prop); - break; + property(PROP_TOGGLE_ASPECT_RATIO, NULL); + break; } // Ctr-Alt-b will change bilinear filtering in OpenGL backend if (b == (KBD_CTRL|KBD_ALT) && ev.key.keysym.sym=='b') { - Property prop; - prop.gfx_mode = 12; - property(PROP_SET_GFX_MODE, &prop); - break; + Property prop; + prop.gfx_mode = GFX_BILINEAR; + property(PROP_SET_GFX_MODE, &prop); + break; } #ifdef QTOPIA @@ -698,6 +701,8 @@ bool OSystem_SDL_Common::poll_event(Event *event) { event->mouse.x /= _scaleFactor; event->mouse.y /= _scaleFactor; + if (_adjustAspectRatio) + event->mouse.y = aspect2Real(event->mouse.y); return true; case SDL_MOUSEBUTTONDOWN: @@ -718,6 +723,9 @@ bool OSystem_SDL_Common::poll_event(Event *event) { event->mouse.x /= _scaleFactor; event->mouse.y /= _scaleFactor; + if (_adjustAspectRatio) + event->mouse.y = aspect2Real(event->mouse.y); + return true; case SDL_MOUSEBUTTONUP: @@ -731,6 +739,10 @@ bool OSystem_SDL_Common::poll_event(Event *event) { event->mouse.y = ev.button.y; event->mouse.x /= _scaleFactor; event->mouse.y /= _scaleFactor; + + if (_adjustAspectRatio) + event->mouse.y = aspect2Real(event->mouse.y); + return true; case SDL_JOYBUTTONDOWN: @@ -835,6 +847,10 @@ bool OSystem_SDL_Common::poll_event(Event *event) { event->mouse.y = km.y; event->mouse.x /= _scaleFactor; event->mouse.y /= _scaleFactor; + + if (_adjustAspectRatio) + event->mouse.y = aspect2Real(event->mouse.y); + return true; case SDL_VIDEOEXPOSE: diff --git a/backends/sdl/sdl-common.h b/backends/sdl/sdl-common.h index c5e6847ffa..9c4bf91ab7 100644 --- a/backends/sdl/sdl-common.h +++ b/backends/sdl/sdl-common.h @@ -123,7 +123,7 @@ public: virtual int16 RGBToColor(uint8 r, uint8 g, uint8 b); virtual void colorToRGB(int16 color, uint8 &r, uint8 &g, uint8 &b); - static OSystem *create(int gfx_mode, bool full_screen); + static OSystem *create(int gfx_mode, bool full_screenm, bool aspect_ratio); protected: OSystem_SDL_Common(); @@ -131,7 +131,7 @@ protected: static OSystem_SDL_Common *create_intern(); - void init_intern(int gfx_mode, bool full_screen); + void init_intern(int gfx_mode, bool full_screen, bool aspect_ratio); // unseen game screen SDL_Surface *_screen; @@ -142,6 +142,8 @@ protected: int _tmpScreenWidth; bool _overlayVisible; + bool _adjustAspectRatio; + // CD Audio SDL_CD *_cdrom; int cd_track, cd_num_loops, cd_start_frame, cd_end_frame; diff --git a/backends/sdl/sdl.cpp b/backends/sdl/sdl.cpp index 2caa4d2d67..ecb00cd2d8 100644 --- a/backends/sdl/sdl.cpp +++ b/backends/sdl/sdl.cpp @@ -147,12 +147,13 @@ normal_mode:; // // Create the surface that contains the scaled graphics in 16 bit mode // - _hwscreen = SDL_SetVideoMode(_screenWidth * _scaleFactor, _screenHeight * _scaleFactor, 16, + + _hwscreen = SDL_SetVideoMode(_screenWidth * _scaleFactor, (_adjustAspectRatio ? 240 : _screenHeight) * _scaleFactor, 16, _full_screen ? (SDL_FULLSCREEN|SDL_SWSURFACE) : SDL_SWSURFACE ); if (_hwscreen == NULL) error("_hwscreen failed"); - + // // Create the surface used for the graphics in 16 bit before scaling, and also the overlay // @@ -192,7 +193,7 @@ void OSystem_SDL::unload_gfx_mode() { SDL_FreeSurface(_hwscreen); _hwscreen = NULL; } - + if (_tmpscreen) { free(_tmpscreen->pixels); SDL_FreeSurface(_tmpscreen); @@ -281,7 +282,7 @@ void OSystem_SDL::update_screen() { uint32 srcPitch, dstPitch; SDL_Rect *last_rect = _dirty_rect_list + _num_dirty_rects; - if (_scaler_proc == Normal1x) { + if (_scaler_proc == Normal1x && !_adjustAspectRatio) { SDL_Surface *target = _overlayVisible ? _tmpscreen : _screen; for (r = _dirty_rect_list; r != last_rect; ++r) { dst = *r; @@ -314,23 +315,32 @@ void OSystem_SDL::update_screen() { for (r = _dirty_rect_list; r != last_rect; ++r) { register int dst_y = r->y + _currentShakePos; register int dst_h = 0; + register int orig_dst_y = 0; + if (dst_y < _screenHeight) { dst_h = r->h; if (dst_h > _screenHeight - dst_y) dst_h = _screenHeight - dst_y; - dst_y *= _scaleFactor; + dst_y *= _scaleFactor; - _scaler_proc((byte *)_tmpscreen->pixels + (r->x * 2 + 2) + (r->y + 1) * srcPitch, srcPitch, + if (_adjustAspectRatio) { + orig_dst_y = dst_y; + dst_y = real2Aspect(dst_y); + } + + _scaler_proc((byte *)_tmpscreen->pixels + (r->x * 2 + 2) + (r->y + 1) * srcPitch, srcPitch, (byte *)_hwscreen->pixels + r->x * 2 * _scaleFactor + dst_y * dstPitch, dstPitch, r->w, dst_h); } - + r->x *= _scaleFactor; r->y = dst_y; r->w *= _scaleFactor; r->h = dst_h * _scaleFactor; - } + if (_adjustAspectRatio && orig_dst_y / _scaleFactor < _screenHeight) + r->h = stretch200To240((uint8 *) _hwscreen->pixels, dstPitch, r->w, r->h, r->x, r->y, orig_dst_y); + } SDL_UnlockSurface(_tmpscreen); SDL_UnlockSurface(_hwscreen); } @@ -339,7 +349,7 @@ void OSystem_SDL::update_screen() { // This is necessary if shaking is active. if (_forceFull) { _dirty_rect_list[0].y = 0; - _dirty_rect_list[0].h = _screenHeight * _scaleFactor; + _dirty_rect_list[0].h = (_adjustAspectRatio ? 240 : _screenHeight) * _scaleFactor; } // Finally, blit all our changes to the screen @@ -374,6 +384,12 @@ uint32 OSystem_SDL::property(int param, Property *value) { hotswap_gfx_mode(); return 1; + } else if (param == PROP_TOGGLE_ASPECT_RATIO) { + if (_screenHeight == 200) { + assert(_hwscreen != 0); + _adjustAspectRatio ^= true; + hotswap_gfx_mode(); + } } return OSystem_SDL_Common::property(param, value); diff --git a/backends/sdl/sdl_gl.cpp b/backends/sdl/sdl_gl.cpp index d29029ddfe..949baf7b1d 100644 --- a/backends/sdl/sdl_gl.cpp +++ b/backends/sdl/sdl_gl.cpp @@ -54,7 +54,6 @@ protected: int _glFlags; int _glScreenStart; bool _glBilinearFilter; - bool _glAspectRatio; bool _usingOpenGL; SDL_Surface *tmpSurface; // Used for black rectangles blitting SDL_Rect tmpBlackRect; // Black rectangle at end of the GL screen @@ -79,7 +78,6 @@ OSystem_SDL_OpenGL::OSystem_SDL_OpenGL() { _glScreenStart = 0; _glBilinearFilter = true; - _glAspectRatio = false; _usingOpenGL = false; // false => Switch to filters used in the sdl.cpp version _glBottomOfTexture = 256; // height is always 256 // 640x480 resolution @@ -165,7 +163,7 @@ void OSystem_SDL_OpenGL::load_gfx_mode() { case GFX_NORMAL: normal_mode:; - _scaleFactor = 1; + _scaleFactor = _usingOpenGL ? 2 : 1; _scaler_proc = Normal1x; break; default: @@ -199,8 +197,7 @@ normal_mode:; fb2gl.init(_glWindow.w, _glWindow.h, 0, _glScreenStart? 15: 70, _glFlags); - } - else { // SDL backend + } else { // SDL backend _hwscreen = SDL_SetVideoMode(_screenWidth * _scaleFactor, _screenHeight * _scaleFactor, 16, _full_screen ? (SDL_FULLSCREEN|SDL_SWSURFACE) : SDL_SWSURFACE @@ -234,8 +231,7 @@ normal_mode:; Gmask, Bmask, Amask); - } - else { // SDL backend + } else { // SDL backend _tmpscreen = SDL_CreateRGBSurfaceFrom(tmp_screen, _tmpScreenWidth, _screenHeight + 3, @@ -346,8 +342,7 @@ void OSystem_SDL_OpenGL::update_screen() { SDL_FillRect(tmpSurface, &blackrect, 0); fb2gl.blit16(tmpSurface, 1, &blackrect, 0, 0); - } - else { // SDL backend + } else { // SDL backend SDL_Rect blackrect = {0, 0, _screenWidth * _scaleFactor, _newShakePos * _scaleFactor}; SDL_FillRect(_hwscreen, &blackrect, 0); } @@ -545,9 +540,30 @@ uint32 OSystem_SDL_OpenGL::property(int param, Property *value) { #endif return 1; - } - else if (param == PROP_SET_GFX_MODE) { + } else if (param == PROP_TOGGLE_ASPECT_RATIO) { + if (!_usingOpenGL) { + _usingOpenGL = true; + _mode = GFX_NORMAL; + hotswap_gfx_mode(); + } + + _adjustAspectRatio ^= true; + if (_adjustAspectRatio) { + // Don't use the whole screen (black borders) + fb2gl.init(0, 0, 0, 15, _glFlags); + _glScreenStart = 20; + SDL_FillRect(tmpSurface, &tmpBlackRect, 0); + fb2gl.blit16(tmpSurface, 1, &tmpBlackRect, 0, 0); + } else { + // Use the whole screen + fb2gl.init(0, 0, 0, 70, _glFlags); + _glScreenStart = 0; + } + SDL_Rect full = {0, 0, _screenWidth, _screenHeight}; + fb2gl.blit16(_tmpscreen, 1, &full, 0, _glScreenStart); + fb2gl.display(); + } else if (param == PROP_SET_GFX_MODE) { if (value->gfx_mode > 10) { // OpenGL modes if (!_usingOpenGL) { @@ -562,20 +578,6 @@ uint32 OSystem_SDL_OpenGL::property(int param, Property *value) { _glBilinearFilter ^= true; fb2gl.setBilinearMode(_glBilinearFilter); break; - case GFX_ASPECTRATIO: - _glAspectRatio ^= true; - if (_glAspectRatio) { - // Don't use the whole screen (black borders) - fb2gl.init(0, 0, 0, 15, _glFlags); - _glScreenStart = 20; - SDL_FillRect(tmpSurface, &tmpBlackRect, 0); - fb2gl.blit16(tmpSurface, 1, &tmpBlackRect, 0, 0); - } else { - // Use the whole screen - fb2gl.init(0, 0, 0, 70, _glFlags); - _glScreenStart = 0; - } - break; default: // SDL backend if (value->gfx_mode >= 10) return 0; @@ -589,6 +591,7 @@ uint32 OSystem_SDL_OpenGL::property(int param, Property *value) { }; if (_usingOpenGL) { + SDL_Rect full = {0, 0, _screenWidth, _screenHeight}; fb2gl.blit16(_tmpscreen, 1, &full, 0, _glScreenStart); fb2gl.display(); } |