diff options
Diffstat (limited to 'backends/graphics')
| -rw-r--r-- | backends/graphics/sdl/sdl-graphics.cpp | 155 | ||||
| -rw-r--r-- | backends/graphics/sdl/sdl-graphics.h | 39 | 
2 files changed, 171 insertions, 23 deletions
diff --git a/backends/graphics/sdl/sdl-graphics.cpp b/backends/graphics/sdl/sdl-graphics.cpp index 3a45255786..295448811d 100644 --- a/backends/graphics/sdl/sdl-graphics.cpp +++ b/backends/graphics/sdl/sdl-graphics.cpp @@ -24,6 +24,7 @@   */  #include "backends/graphics/sdl/sdl-graphics.h" +#include "common/config-manager.h"  #include "common/mutex.h"  #include "common/util.h"  #ifdef USE_RGB_COLOR @@ -85,6 +86,150 @@ static const int s_gfxModeSwitchTable[][4] = {  static int cursorStretch200To240(uint8 *buf, uint32 pitch, int width, int height, int srcX, int srcY, int origSrcY);  #endif +AspectRatio::AspectRatio(int w, int h) { +	// TODO : Validation and so on... +	// Currently, we just ensure the program don't instantiate non-supported aspect ratios +	_kw = w; +	_kh = h; +} + +#if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) && defined(USE_SCALERS) +static const size_t AR_COUNT = 4; +static const char*       desiredAspectRatioAsStrings[AR_COUNT] = {            "auto",            "4/3",            "16/9",            "16/10" }; +static const AspectRatio desiredAspectRatios[AR_COUNT]         = { AspectRatio(0, 0), AspectRatio(4,3), AspectRatio(16,9), AspectRatio(16,10) }; + +static AspectRatio getDesiredAspectRatio() { +	//TODO : We could parse an arbitrary string, if we code enough proper validation +	Common::String desiredAspectRatio = ConfMan.get("desired_screen_aspect_ratio"); + +	for (size_t i = 0; i < AR_COUNT; i++) { +		assert(desiredAspectRatioAsStrings[i] != NULL); + +		if (!scumm_stricmp(desiredAspectRatio.c_str(), desiredAspectRatioAsStrings[i])) { +			return desiredAspectRatios[i]; +		} +	} +	// TODO : Report a warning +	return AspectRatio(0, 0); +} +#endif + +SdlGraphicsManager::SdlGraphicsManager() +	: +#ifdef USE_OSD +	_osdSurface(0), _osdAlpha(SDL_ALPHA_TRANSPARENT), _osdFadeStartTime(0), +#endif +	_hwscreen(0), _screen(0), _tmpscreen(0), +#ifdef USE_RGB_COLOR +	_screenFormat(Graphics::PixelFormat::createFormatCLUT8()), +	_cursorFormat(Graphics::PixelFormat::createFormatCLUT8()), +#endif +	_overlayVisible(false), +	_overlayscreen(0), _tmpscreen2(0), +	_scalerProc(0), _modeChanged(false), _screenChangeCount(0), +	_mouseVisible(false), _mouseNeedsRedraw(false), _mouseData(0), _mouseSurface(0), +	_mouseOrigSurface(0), _cursorTargetScale(1), _cursorPaletteDisabled(true), +	_currentShakePos(0), _newShakePos(0), +	_paletteDirtyStart(0), _paletteDirtyEnd(0), +	_screenIsLocked(false), +	_graphicsMutex(0), _transactionMode(kTransactionNone) { + +	if (SDL_InitSubSystem(SDL_INIT_VIDEO) == -1) { +		error("Could not initialize SDL: %s", SDL_GetError()); +	} + +	// allocate palette storage +	_currentPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256); +	_cursorPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256); + +	_mouseBackup.x = _mouseBackup.y = _mouseBackup.w = _mouseBackup.h = 0; + +	memset(&_mouseCurState, 0, sizeof(_mouseCurState)); + +	_graphicsMutex = g_system->createMutex(); + +#ifdef _WIN32_WCE +	if (ConfMan.hasKey("use_GDI") && ConfMan.getBool("use_GDI")) { +		SDL_VideoInit("windib", 0); +		sdlFlags ^= SDL_INIT_VIDEO; +	} +#endif + +	SDL_ShowCursor(SDL_DISABLE); + +	memset(&_oldVideoMode, 0, sizeof(_oldVideoMode)); +	memset(&_videoMode, 0, sizeof(_videoMode)); +	memset(&_transactionDetails, 0, sizeof(_transactionDetails)); + +#if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) && defined(USE_SCALERS) +	_videoMode.mode = GFX_DOUBLESIZE; +	_videoMode.scaleFactor = 2; +	_videoMode.aspectRatioCorrection = ConfMan.getBool("aspect_ratio"); +	_videoMode.desiredAspectRatio = getDesiredAspectRatio(); +	_scalerProc = Normal2x; +#else // for small screen platforms +	_videoMode.mode = GFX_NORMAL; +	_videoMode.scaleFactor = 1; +	_videoMode.aspectRatioCorrection = false; +	_scalerProc = Normal1x; +#endif +	_scalerType = 0; + +#if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) +	_videoMode.fullscreen = ConfMan.getBool("fullscreen"); +#else +	_videoMode.fullscreen = true; +#endif +} + +SdlGraphicsManager::~SdlGraphicsManager() { +	unloadGFXMode(); +	g_system->deleteMutex(_graphicsMutex); + +	free(_currentPalette); +	free(_cursorPalette); +	free(_mouseData); +} + +bool SdlGraphicsManager::hasFeature(OSystem::Feature f) { +	return +		(f == OSystem::kFeatureFullscreenMode) || +		(f == OSystem::kFeatureAspectRatioCorrection) || +		(f == OSystem::kFeatureAutoComputeDirtyRects) || +		(f == OSystem::kFeatureCursorHasPalette) || +		(f == OSystem::kFeatureIconifyWindow); +} + +void SdlGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) { +	switch (f) { +	case OSystem::kFeatureFullscreenMode: +		setFullscreenMode(enable); +		break; +	case OSystem::kFeatureAspectRatioCorrection: +		setAspectRatioCorrection(enable); +		break; +	case OSystem::kFeatureIconifyWindow: +		if (enable) +			SDL_WM_IconifyWindow(); +		break; +	default: +		break; +	} +} + +bool SdlGraphicsManager::getFeatureState(OSystem::Feature f) { +	assert (_transactionMode == kTransactionNone); + +	switch (f) { +	case OSystem::kFeatureFullscreenMode: +		return _videoMode.fullscreen; +	case OSystem::kFeatureAspectRatioCorrection: +		return _videoMode.aspectRatioCorrection; +	default: +		return false; +	} +} +  const OSystem::GraphicsMode *SdlGraphicsManager::getSupportedGraphicsModes() const {  	return s_supportedGraphicsModes;  } @@ -1645,14 +1790,6 @@ static int cursorStretch200To240(uint8 *buf, uint32 pitch, int width, int height  }  #endif -// Move to events -/*void SdlGraphicsManager::toggleMouseGrab() { -	if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF) -		SDL_WM_GrabInput(SDL_GRAB_ON); -	else -		SDL_WM_GrabInput(SDL_GRAB_OFF); -}*/ -  void SdlGraphicsManager::undrawMouse() {  	const int x = _mouseBackup.x;  	const int y = _mouseBackup.y; @@ -1883,7 +2020,7 @@ bool SdlGraphicsManager::handleScalerHotkeys(const SDL_KeyboardEvent &key) {  #ifdef USE_OSD  		if (_osdSurface) {  			const char *newScalerName = 0; -			const GraphicsMode *g = getSupportedGraphicsModes(); +			const OSystem::GraphicsMode *g = getSupportedGraphicsModes();  			while (g->name) {  				if (g->id == _videoMode.mode) {  					newScalerName = g->description; diff --git a/backends/graphics/sdl/sdl-graphics.h b/backends/graphics/sdl/sdl-graphics.h index 9310eb3d8c..13ce5af5dc 100644 --- a/backends/graphics/sdl/sdl-graphics.h +++ b/backends/graphics/sdl/sdl-graphics.h @@ -36,6 +36,11 @@  #include <SDL.h>  #endif +#if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) +// Uncomment this to enable the 'on screen display' code. +#define USE_OSD	1 +#endif +  enum {  	GFX_NORMAL = 0,  	GFX_DOUBLESIZE = 1, @@ -68,14 +73,13 @@ public:  	SdlGraphicsManager();  	~SdlGraphicsManager(); -	bool hasGraphicsFeature(OSystem::Feature f); -	void setGraphicsFeatureState(OSystem::Feature f, bool enable); -	bool getGraphicsFeatureState(OSystem::Feature f); +	bool hasFeature(OSystem::Feature f); +	void setFeatureState(OSystem::Feature f, bool enable); +	bool getFeatureState(OSystem::Feature f);  	const OSystem::GraphicsMode *getSupportedGraphicsModes() const;  	int getDefaultGraphicsMode() const;  	bool setGraphicsMode(int mode); -	bool setGraphicsMode(const char *name);  	int getGraphicsMode() const;  #ifdef USE_RGB_COLOR @@ -116,6 +120,23 @@ public:  	}  	virtual int getScreenChangeID() const { return _screenChangeCount; } +#ifdef USE_OSD +	void displayMessageOnOSD(const char *msg); +#endif + +	// Accessed from OSystem_SDL::pollEvent for EVENT_SCREEN_CHANGED +	// The way this event works should be changed +	bool _modeChanged; + +	// Accessed from OSystem_SDL::dispatchSDLEvent +	// A function here for toggling it should be made for this +	bool _forceFull; + +	bool handleScalerHotkeys(const SDL_KeyboardEvent &key); // Move this? +	bool isScalerHotkey(const Common::Event &event); // Move this? + +	void setMousePos(int x, int y); +  protected:  #ifdef USE_OSD  	SDL_Surface *_osdSurface; @@ -187,7 +208,6 @@ protected:  	virtual void setGraphicsModeIntern(); // overloaded by CE backend  	/** Force full redraw on next updateScreen */ -	bool _forceFull;  	ScalerProc *_scalerProc;  	int _scalerType;  	int _transactionMode; @@ -195,8 +215,6 @@ protected:  	bool _screenIsLocked;  	Graphics::Surface _framebuffer; -	/** Current video mode flags (see DF_* constants) */ -	bool _modeChanged;  	int _screenChangeCount;  	enum { @@ -208,8 +226,6 @@ protected:  	SDL_Rect _dirtyRectList[NUM_DIRTY_RECT];  	int _numDirtyRects; -	void setMousePos(int x, int y); -  	struct MousePos {  		// The mouse position, using either virtual (game) or real  		// (overlay) coordinates. @@ -288,11 +304,6 @@ protected:  	virtual bool saveScreenshot(const char *filename); // overloaded by CE backend  	int effectiveScreenHeight() const; - -	void setupIcon(); - -	bool handleScalerHotkeys(const SDL_KeyboardEvent &key); // Move to events? -	bool isScalerHotkey(const Common::Event &event); // Move to events?  };  | 
