diff options
| -rw-r--r-- | engines/sci/graphics/controls.cpp | 18 | ||||
| -rw-r--r-- | engines/sci/graphics/paint16.cpp | 19 | ||||
| -rw-r--r-- | engines/sci/graphics/paint16.h | 1 | 
3 files changed, 37 insertions, 1 deletions
| diff --git a/engines/sci/graphics/controls.cpp b/engines/sci/graphics/controls.cpp index 2570b4cb33..80670020df 100644 --- a/engines/sci/graphics/controls.cpp +++ b/engines/sci/graphics/controls.cpp @@ -251,7 +251,15 @@ int GfxControls::getPicNotValid() {  }  void GfxControls::kernelDrawButton(Common::Rect rect, reg_t obj, const char *text, int16 fontId, int16 style, bool hilite) { +	int16 sci0EarlyPen, sci0EarlyBack;  	if (!hilite) { +		if (getSciVersion() == SCI_VERSION_0_EARLY) { +			// SCI0early actually used hardcoded green/black buttons instead of using the port colors +			sci0EarlyPen = _ports->_curPort->penClr; +			sci0EarlyBack = _ports->_curPort->backClr; +			_ports->penColor(0); +			_ports->backColor(2); +		}  		rect.grow(1);  		_paint16->eraseRect(rect);  		_paint16->frameRect(rect); @@ -266,8 +274,16 @@ void GfxControls::kernelDrawButton(Common::Rect rect, reg_t obj, const char *tex  			rect.grow(1);  			_paint16->bitsShow(rect);  		} +		if (getSciVersion() == SCI_VERSION_0_EARLY) { +			_ports->penColor(sci0EarlyPen); +			_ports->backColor(sci0EarlyBack); +		}  	} else { -		_paint16->invertRect(rect); +		// SCI0early used xor to invert button rectangles resulting in pink/white buttons +		if (getSciVersion() == SCI_VERSION_0_EARLY) +			_paint16->invertRectViaXOR(rect); +		else +			_paint16->invertRect(rect);  		_paint16->bitsShow(rect);  	}  } diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 90c68c4e5f..a769ca4314 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -182,6 +182,25 @@ void GfxPaint16::invertRect(const Common::Rect &rect) {  	_ports->_curPort->penMode = oldpenmode;  } +// used in SCI0early exclusively +void GfxPaint16::invertRectViaXOR(const Common::Rect &rect) { +	Common::Rect r = rect; +	int16 x, y; +	byte curVisual; + +	r.clip(_ports->_curPort->rect); +	if (r.isEmpty()) // nothing to invert +		return; + +	_ports->offsetRect(r); +	for (y = r.top; y < r.bottom; y++) { +		for (x = r.left; x < r.right; x++) { +			curVisual = _screen->getVisual(x, y); +			_screen->putPixel(x, y, SCI_SCREEN_MASK_VISUAL, curVisual ^ 0x0f, 0, 0); +		} +	} +} +  void GfxPaint16::eraseRect(const Common::Rect &rect) {  	fillRect(rect, SCI_SCREEN_MASK_VISUAL, _ports->_curPort->backClr);  } diff --git a/engines/sci/graphics/paint16.h b/engines/sci/graphics/paint16.h index f962c6e02a..b18c879387 100644 --- a/engines/sci/graphics/paint16.h +++ b/engines/sci/graphics/paint16.h @@ -60,6 +60,7 @@ public:  	void clearScreen(byte color = 255);  	void invertRect(const Common::Rect &rect); +	void invertRectViaXOR(const Common::Rect &rect);  	void eraseRect(const Common::Rect &rect);  	void paintRect(const Common::Rect &rect);  	void fillRect(const Common::Rect &rect, int16 drawFlags, byte clrPen, byte clrBack = 0, byte bControl = 0); | 
