aboutsummaryrefslogtreecommitdiff
path: root/backends/sdl
diff options
context:
space:
mode:
authorMax Horn2003-06-22 11:55:40 +0000
committerMax Horn2003-06-22 11:55:40 +0000
commit11ff7fe9a347efe37e2bd8fefca7e8c130f81af0 (patch)
tree037c8edce6a559e5816b7733727305ff66cc49cf /backends/sdl
parentfa184730af2f2be094aa9f37cd3abf58d10f79ea (diff)
downloadscummvm-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.cpp44
-rw-r--r--backends/sdl/sdl-common.h6
-rw-r--r--backends/sdl/sdl.cpp34
-rw-r--r--backends/sdl/sdl_gl.cpp53
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();
}