diff options
| author | Jody Northup | 2009-06-05 23:59:40 +0000 | 
|---|---|---|
| committer | Jody Northup | 2009-06-05 23:59:40 +0000 | 
| commit | d65bbe1d7a5efbcf04831dbb68a45ca833db1ae1 (patch) | |
| tree | 9061e150b7671af93508c1017381e8d7ba3cad3d | |
| parent | ccee18a489ece14c499c4e0c43aeb7fc216451fb (diff) | |
| download | scummvm-rg350-d65bbe1d7a5efbcf04831dbb68a45ca833db1ae1.tar.gz scummvm-rg350-d65bbe1d7a5efbcf04831dbb68a45ca833db1ae1.tar.bz2 scummvm-rg350-d65bbe1d7a5efbcf04831dbb68a45ca833db1ae1.zip | |
Fixes ScummEngine_v70he::setDefaultCursor to work in 16-bit, using a temporary hack.
svn-id: r41204
| -rw-r--r-- | engines/scumm/cursor.cpp | 29 | ||||
| -rw-r--r-- | graphics/cursorman.cpp | 29 | ||||
| -rw-r--r-- | graphics/cursorman.h | 40 | ||||
| -rw-r--r-- | gui/GuiManager.cpp | 8 | ||||
| -rw-r--r-- | gui/ThemeEngine.cpp | 4 | 
5 files changed, 101 insertions, 9 deletions
| diff --git a/engines/scumm/cursor.cpp b/engines/scumm/cursor.cpp index 3710956b74..5ec9e63e32 100644 --- a/engines/scumm/cursor.cpp +++ b/engines/scumm/cursor.cpp @@ -112,7 +112,7 @@ void ScummEngine_v6::setCursorTransparency(int a) {  void ScummEngine::updateCursor() {  	int transColor = (_game.heversion >= 80) ? 5 : 255; -	if (_game.features & GF_16BIT_COLOR && _hePalettes) { +	if (_game.features & GF_16BIT_COLOR) {  		//HACK Had to make a second method to avoid many, many linker errors from other engines  		//this requires ENABLE_16BIT to be defined in the Scumm project, again, because I #ifdef'ed  		//the method's definition and declaration in cursorman.h  @@ -176,8 +176,13 @@ void ScummEngine_v70he::setDefaultCursor() {  	static const byte palette[] = {0,    0,    0,    0,  								   0xff, 0xff, 0xff, 0,  								   0,    0,    0,    0}; - -	memset(_grabbedCursor, 5, sizeof(_grabbedCursor)); +	 +	if (_bitDepth == 2) { +		for (i = 0; i < 1024; i++) +			WRITE_UINT16(_grabbedCursor + i * 2, 5); +	} else { +		memset(_grabbedCursor, 5, sizeof(_grabbedCursor)); +	}  	_cursor.hotspotX = _cursor.hotspotY = 2;  	src = default_he_cursor; @@ -190,10 +195,16 @@ void ScummEngine_v70he::setDefaultCursor() {  		for (j = 0; j < 32; j++) {  			switch ((p & (0x3 << 14)) >> 14) {  				case 1: -					_grabbedCursor[32 * i + j] = 0xfe; +					if (_bitDepth == 2) +						WRITE_UINT16(_grabbedCursor + 64 * i + j * 2, get16BitColor(palette[4], palette[5], palette[6])); +					else +						_grabbedCursor[32 * i + j] = 0xfe;  					break;  				case 2: -					_grabbedCursor[32 * i + j] = 0xfd; +					if (_bitDepth == 2) +						WRITE_UINT16(_grabbedCursor + 64 * i + j * 2, get16BitColor(palette[0], palette[1], palette[2])); +					else +						_grabbedCursor[32 * i + j] = 0xfd;  					break;  				default:  					break; @@ -205,9 +216,11 @@ void ScummEngine_v70he::setDefaultCursor() {  		}  	} -	// Since white color position is not guaranteed -	// we setup our own palette if supported by backend -	CursorMan.replaceCursorPalette(palette, 0xfd, 3); +	if (_bitDepth == 1) { +		// Since white color position is not guaranteed +		// we setup our own palette if supported by backend +		CursorMan.replaceCursorPalette(palette, 0xfd, 3); +	}  	updateCursor();  } diff --git a/graphics/cursorman.cpp b/graphics/cursorman.cpp index 84578a3911..5fe58314b3 100644 --- a/graphics/cursorman.cpp +++ b/graphics/cursorman.cpp @@ -56,6 +56,33 @@ bool CursorManager::showMouse(bool visible) {  	// Should work, even if there's just a dummy cursor on the stack.  	return g_system->showMouse(visible);  } +#ifdef ENABLE_16BIT +void CursorManager::pushCursor16(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint16 keycolor, int targetScale) { +	Cursor16 *cur = new Cursor16(buf, w, h, hotspotX, hotspotY, keycolor, targetScale); + +	cur->_visible = isVisible(); +	_cursor16Stack.push(cur); + +	if (buf) { +		g_system->setMouseCursor16(cur->_data, w, h, hotspotX, hotspotY, keycolor, targetScale); +	} +} + +void CursorManager::popCursor16() { +	if (_cursor16Stack.empty()) +		return; + +	Cursor16 *cur = _cursor16Stack.pop(); +	delete cur; + +	if (!_cursorStack.empty()) { +		cur = _cursor16Stack.top(); +		g_system->setMouseCursor16(cur->_data, cur->_width, cur->_height, cur->_hotspotX, cur->_hotspotY, cur->_keycolor, cur->_targetScale); +	} + +	g_system->showMouse(isVisible()); +} +#endif  void CursorManager::pushCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor, int targetScale) {  	Cursor *cur = new Cursor(buf, w, h, hotspotX, hotspotY, keycolor, targetScale); @@ -104,7 +131,7 @@ void CursorManager::popAllCursors() {  //HACK Made a separate method to avoid massive linker errors on every engine  void CursorManager::replaceCursor16(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint16 keycolor, int targetScale) {  	if (_cursorStack.empty()) { -		pushCursor(buf, w, h, hotspotX, hotspotY, keycolor, targetScale); +		pushCursor16(buf, w, h, hotspotX, hotspotY, keycolor, targetScale);  		return;  	} diff --git a/graphics/cursorman.h b/graphics/cursorman.h index 8ad42fe0d4..b54ef31439 100644 --- a/graphics/cursorman.h +++ b/graphics/cursorman.h @@ -64,6 +64,13 @@ public:  	 */  	void popCursor(); +#ifdef ENABLE_16BIT +	//HACK This is such a incredible hack +	//I really need to make the one method  +	//work under multiple bitdepths +	void pushCursor16(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint16 keycolor = 65535, int targetScale = 1); +	void popCursor16(); +#endif  	/**  	 * Replace the current cursor on the stack. If the stack is empty, the  	 * cursor is pushed instead. It's a slightly more optimized way of @@ -137,7 +144,37 @@ public:  private:  	friend class Common::Singleton<SingletonBaseType>;  	CursorManager(); +#ifdef ENABLE_16BIT +	struct Cursor16 { +		byte *_data; +		bool _visible; +		uint _width; +		uint _height; +		int _hotspotX; +		int _hotspotY; +		uint16 _keycolor; +		byte _targetScale; + +		uint _size; +		Cursor16(const byte *data, uint w, uint h, int hotspotX, int hotspotY, uint16 keycolor = 65535, int targetScale = 1) { +			_size = w * h * 2; +			_data = new byte[_size]; +			if (data && _data) +				memcpy(_data, data, _size); +			_width = w; +			_height = h; +			_hotspotX = hotspotX; +			_hotspotY = hotspotY; +			_keycolor = keycolor; +			_targetScale = targetScale; +		} + +		~Cursor16() { +			delete[] _data; +		} +	}; +#endif  	struct Cursor {  		byte *_data;  		bool _visible; @@ -197,6 +234,9 @@ private:  	};  	Common::Stack<Cursor *> _cursorStack; +#ifdef ENABLE_16BIT +	Common::Stack<Cursor16 *> _cursor16Stack; +#endif  	Common::Stack<Palette *> _cursorPaletteStack;  }; diff --git a/gui/GuiManager.cpp b/gui/GuiManager.cpp index cf8b7b2d9d..bb988edc78 100644 --- a/gui/GuiManager.cpp +++ b/gui/GuiManager.cpp @@ -135,8 +135,12 @@ bool GuiManager::loadNewTheme(Common::String id, ThemeEngine::GraphicsMode gfx)  	delete _theme;  	if (_useStdCursor) { +#ifdef ENABLE_16BIT +		CursorMan.popCursor16(); +#else  		CursorMan.popCursorPalette();  		CursorMan.popCursor(); +#endif  	}  	// @@ -382,8 +386,12 @@ void GuiManager::saveState() {  void GuiManager::restoreState() {  	if (_useStdCursor) { +#ifdef ENABLE_16BIT +		CursorMan.popCursor16(); +#else  		CursorMan.popCursor();  		CursorMan.popCursorPalette(); +#endif  	}  	_system->updateScreen(); diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index fe93a1f7d6..c8d960f014 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -462,8 +462,12 @@ void ThemeEngine::disable() {  	_system->hideOverlay();  	if (_useCursor) { +#ifdef ENABLE_16BIT +		CursorMan.popCursor16(); +#else  		CursorMan.popCursorPalette();  		CursorMan.popCursor(); +#endif  	}  	_enabled = false; | 
