diff options
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();  		} | 
