diff options
| -rw-r--r-- | engines/sci/engine/kgraphics.cpp | 14 | ||||
| -rw-r--r-- | engines/sci/gui/gui.cpp | 68 | ||||
| -rw-r--r-- | engines/sci/gui/gui.h | 1 | ||||
| -rw-r--r-- | engines/sci/gui/gui_gfx.cpp | 114 | ||||
| -rw-r--r-- | engines/sci/gui/gui_gfx.h | 7 | ||||
| -rw-r--r-- | engines/sci/gui/gui_palette.cpp | 2 | ||||
| -rw-r--r-- | engines/sci/gui/gui_windowmgr.cpp | 20 | ||||
| -rw-r--r-- | engines/sci/gui32/gui32.cpp | 9 | ||||
| -rw-r--r-- | engines/sci/gui32/gui32.h | 1 | 
9 files changed, 160 insertions, 76 deletions
| diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 71bab481f3..82e4e94063 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -51,7 +51,10 @@ namespace Sci {  // Graph subfunctions  enum {  	K_GRAPH_GET_COLORS_NR = 2, +	// 3 - SET PALETTE VIA RESOURCE  	K_GRAPH_DRAW_LINE = 4, +	// 5 - NOP +	// 6 - DRAW PATTERN  	K_GRAPH_SAVE_BOX = 7,  	K_GRAPH_RESTORE_BOX = 8,  	K_GRAPH_FILL_BOX_BACKGROUND = 9, @@ -649,14 +652,9 @@ reg_t kGraph(EngineState *s, int argc, reg_t *argv) {  		break;  	case K_GRAPH_UPDATE_BOX: { - -		debugC(2, kDebugLevelGraphics, "update_box(%d, %d, %d, %d)\n", argv[1].toSint16(), argv[2].toSint16(), argv[3].toSint16(), argv[4].toSint16()); - -		area.x += s->port->zone.x; -		area.y += s->port->zone.y; - -		// FIXME: Change to class calling -		//gfxop_update_box(s->gfx_state, area); +		rect = Common::Rect(x, y, x1, y1); +		s->_gui->graphUpdateBox(rect); +		break;  	}  	break; diff --git a/engines/sci/gui/gui.cpp b/engines/sci/gui/gui.cpp index 2e70447929..b1638d2480 100644 --- a/engines/sci/gui/gui.cpp +++ b/engines/sci/gui/gui.cpp @@ -245,8 +245,8 @@ void SciGui::display(const char *text, int argc, reg_t *argv) {  	if (bgcolor != -1)  		_gfx->FillRect(rect, SCI_SCREEN_MASK_VISUAL, bgcolor, 0, 0);  	_gfx->TextBox(text, 0, rect, align, -1); -//	if (_picNotValid == 0 && bRedraw) -//		_gfx->ShowBits(rect, 1); +	if (!_screen->_picNotValid && bRedraw) +		_gfx->BitsShow(rect);  	// restoring port and cursor pos  	GuiPort *currport = _gfx->GetPort();  	uint16 tTop = currport->curTop; @@ -254,8 +254,6 @@ void SciGui::display(const char *text, int argc, reg_t *argv) {  	*currport = oldPort;  	currport->curTop = tTop;  	currport->curLeft = tLeft; - -	_screen->copyToScreen();  }  void SciGui::textSize(const char *text, int16 font, int16 maxWidth, int16 *textWidth, int16 *textHeight) { @@ -282,8 +280,7 @@ void SciGui::drawStatus(const char *text, int16 colorPen, int16 colorBack) {  	_gfx->MoveTo(0, 1);  	_gfx->Draw_String(text);  	_gfx->SetPort(oldPort); -	// _gfx->ShowBits(*_theMenuBar, 1); -	_gfx->BitsShow(_gfx->_menuRect, SCI_SCREEN_MASK_VISUAL); +	_gfx->BitsShow(_gfx->_menuRect);  }  void SciGui::drawMenuBar() { @@ -299,21 +296,18 @@ void SciGui::drawPicture(GuiResourceId pictureId, int16 animationNr, bool mirror  	if (_windowMgr->isFrontWindow(_windowMgr->_picWind)) {  		_gfx->drawPicture(pictureId, animationNr, mirroredFlag, addToFlag, EGApaletteNo); +		_screen->_picNotValid = 1;  	} else {  		_windowMgr->BeginUpdate(_windowMgr->_picWind);  		_gfx->drawPicture(pictureId, animationNr, mirroredFlag, addToFlag, EGApaletteNo);  		_windowMgr->EndUpdate(_windowMgr->_picWind);  	} -	_screen->copyToScreen(); -  	_gfx->SetPort(oldPort); -	_screen->_picNotValid = true;  }  void SciGui::drawCel(GuiResourceId viewId, GuiViewLoopNo loopNo, GuiViewCelNo celNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo) {  	_gfx->drawCel(viewId, loopNo, celNo, leftPos, topPos, priority, paletteNo);  	_palette->setOnScreen(); -	_screen->copyToScreen();  }  void SciGui::drawControlButton(Common::Rect rect, reg_t obj, const char *text, int16 fontId, int16 style, bool hilite) { @@ -325,17 +319,17 @@ void SciGui::drawControlButton(Common::Rect rect, reg_t obj, const char *text, i  		_gfx->TextFace(style & 1 ? 0 : 1);  		_gfx->TextBox(text, 0, rect, 1, fontId);  		_gfx->TextFace(0); -		if (style & 8) { // selected -			rect.grow(1); +		rect.grow(1); +		if (style & 8) // selected  			_gfx->FrameRect(rect); +		if (!_screen->_picNotValid) { +			rect.grow(1); +			_gfx->BitsShow(rect);  		}  	} else {  		_gfx->InvertRect(rect); +		_gfx->BitsShow(rect);  	} - -	Common::Rect screenRect = rect; -	screenRect.grow(2); -	_gfx->BitsShow(screenRect, SCI_SCREEN_MASK_VISUAL);  }  void SciGui::drawControlText(Common::Rect rect, reg_t obj, const char *text, int16 fontId, int16 mode, int16 style, bool hilite) { @@ -347,13 +341,13 @@ void SciGui::drawControlText(Common::Rect rect, reg_t obj, const char *text, int  		if (style & 8) { // selected  			_gfx->FrameRect(rect);  		} +		rect.grow(1); +		if (!_screen->_picNotValid) +			_gfx->BitsShow(rect);  	} else {  		_gfx->InvertRect(rect); +		_gfx->BitsShow(rect);  	} - -	Common::Rect screenRect = rect; -	screenRect.grow(1); -	_gfx->BitsShow(screenRect, SCI_SCREEN_MASK_VISUAL);  }  void SciGui::drawControlTextEdit(Common::Rect rect, reg_t obj, const char *text, int16 fontId, int16 mode, int16 style, int16 cursorPos, int16 maxChars, bool hilite) { @@ -371,7 +365,10 @@ void SciGui::drawControlTextEdit(Common::Rect rect, reg_t obj, const char *text,  		rect.grow(-1);  		_gfx->TexteditCursorDraw(rect, text, cursorPos);  		_gfx->SetFont(oldFontId); +		rect.grow(1);  	} +	if (!_screen->_picNotValid) +		_gfx->BitsShow(rect);  }  void SciGui::drawControlIcon(Common::Rect rect, reg_t obj, GuiResourceId viewId, GuiViewLoopNo loopNo, GuiViewCelNo celNo, int16 style, bool hilite) { @@ -382,9 +379,8 @@ void SciGui::drawControlIcon(Common::Rect rect, reg_t obj, GuiResourceId viewId,  		}  	} else {  		_gfx->InvertRect(rect); +		_gfx->BitsShow(rect);  	} - -	_gfx->BitsShow(rect, SCI_SCREEN_MASK_VISUAL);  }  void SciGui::drawControlList(Common::Rect rect, reg_t obj, int16 maxChars, int16 count, const char **entries, GuiResourceId fontId, int16 style, int16 upperPos, int16 cursorPos, bool isAlias, bool hilite) { @@ -394,7 +390,8 @@ void SciGui::drawControlList(Common::Rect rect, reg_t obj, int16 maxChars, int16  		if (isAlias && (style & 8)) {  			_gfx->FrameRect(rect);  		} -		_gfx->BitsShow(rect, SCI_SCREEN_MASK_VISUAL); +		if (!_screen->_picNotValid) +			_gfx->BitsShow(rect);  	}  } @@ -410,22 +407,18 @@ void SciGui::editControl(reg_t controlObject, reg_t eventObject) {  void SciGui::graphFillBoxForeground(Common::Rect rect) {  	_gfx->PaintRect(rect); -	_screen->copyRectToScreen(rect);  }  void SciGui::graphFillBoxBackground(Common::Rect rect) {  	_gfx->EraseRect(rect); -	_screen->copyRectToScreen(rect);  }  void SciGui::graphFillBox(Common::Rect rect, uint16 colorMask, int16 color, int16 priority, int16 control) {  	_gfx->FillRect(rect, colorMask, color, priority, control); -	_screen->copyRectToScreen(rect);  }  void SciGui::graphDrawLine(Common::Point startPoint, Common::Point endPoint, int16 color, int16 priority, int16 control) {  	_gfx->drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y, color, priority, control); -	_screen->copyToScreen();  }  reg_t SciGui::graphSaveBox(Common::Rect rect, uint16 flags) { @@ -434,9 +427,13 @@ reg_t SciGui::graphSaveBox(Common::Rect rect, uint16 flags) {  void SciGui::graphRestoreBox(reg_t handle) {  	_gfx->BitsRestore(handle); -	_screen->copyToScreen();  } +void SciGui::graphUpdateBox(Common::Rect rect) { +	_gfx->BitsShow(rect); +} + +  void SciGui::paletteSet(int resourceNo, int flags) {     _palette->setFromResource(resourceNo, flags);  } @@ -484,10 +481,8 @@ void SciGui::animate(reg_t listReference, bool cycle, int argc, reg_t *argv) {  	if (listReference.isNull()) {  		_gfx->AnimateDisposeLastCast(); -		if (_screen->_picNotValid) { -			//(this->*ShowPic)(_showMap, _showStyle); -			_screen->_picNotValid = false; -		} +		if (_screen->_picNotValid) +			_gfx->ShowPic();  		return;  	} @@ -513,12 +508,10 @@ void SciGui::animate(reg_t listReference, bool cycle, int argc, reg_t *argv) {  	_gfx->AnimateDrawCels();  	if (_screen->_picNotValid) { -		//(this->*ShowPic)(_showMap, _showStyle); -		_screen->_picNotValid = false; +		_gfx->ShowPic();  	} -	//_gfx->AnimateUpdateScreen(); -	_screen->copyToScreen(); +	_gfx->AnimateUpdateScreen(old_picNotValid);  	_gfx->AnimateRestoreAndDelete(argc, argv);  	_gfx->SetPort(oldPort); @@ -586,7 +579,8 @@ void SciGui::setCursorShape(GuiResourceId cursorId) {  }  void SciGui::setCursorPos(Common::Point pos) { -	// No adjustment of position needed, directly forwarding to SciGui::moveCursor() +	pos.y += _gfx->GetPort()->top; +	pos.x += _gfx->GetPort()->left;  	moveCursor(pos);  } diff --git a/engines/sci/gui/gui.h b/engines/sci/gui/gui.h index 9aa1ea4308..9e859201fc 100644 --- a/engines/sci/gui/gui.h +++ b/engines/sci/gui/gui.h @@ -82,6 +82,7 @@ public:  	virtual void graphDrawLine(Common::Point startPoint, Common::Point endPoint, int16 color, int16 priority, int16 control);  	virtual reg_t graphSaveBox(Common::Rect rect, uint16 flags);  	virtual void graphRestoreBox(reg_t handle); +	virtual void graphUpdateBox(Common::Rect rect);  	virtual void paletteSet(int resourceNo, int flags);  	virtual int16 paletteFind(int r, int g, int b); diff --git a/engines/sci/gui/gui_gfx.cpp b/engines/sci/gui/gui_gfx.cpp index 82ce4b7778..e061e09eea 100644 --- a/engines/sci/gui/gui_gfx.cpp +++ b/engines/sci/gui/gui_gfx.cpp @@ -533,7 +533,7 @@ void SciGuiGfx::ShowText(const char *text, int16 from, int16 len, GuiResourceId  	rect.left = _curPort->curLeft;  	DrawText(text, from, len, orgFontId, orgPenColor);  	rect.right = _curPort->curLeft; -	BitsShow(rect, SCI_SCREEN_MASK_VISUAL); +	BitsShow(rect);  }  // Draws a text in rect. @@ -581,14 +581,13 @@ void SciGuiGfx::TextBox(const char *text, int16 bshow, const Common::Rect &rect,  }  // Update (part of) screen -void SciGuiGfx::BitsShow(const Common::Rect &r, uint16 screenMask) { +void SciGuiGfx::BitsShow(const Common::Rect &r) {  	Common::Rect rect(r.left, r.top, r.right, r.bottom);  	rect.clip(_curPort->rect);  	if (rect.isEmpty()) // nothing to show  		return;  	OffsetRect(rect); -	assert((screenMask & 0x8000) == 0);  	_screen->copyRectToScreen(rect);  } @@ -720,10 +719,11 @@ void SciGuiGfx::drawPicture(GuiResourceId pictureId, int16 animationNr, bool mir  	picture->draw(animationNr, mirroredFlag, addToFlag, paletteId);  } +// This one is the only one that updates screen!  void SciGuiGfx::drawCel(GuiResourceId viewId, GuiViewLoopNo loopNo, GuiViewCelNo celNo, uint16 leftPos, uint16 topPos, byte priority, uint16 paletteNo) {  	SciGuiView *view = new SciGuiView(_s->resMan, _screen, _palette, viewId); -	Common::Rect rect(0, 0); -	Common::Rect clipRect(0, 0); +	Common::Rect rect; +	Common::Rect clipRect;  	if (view) {  		rect.left = leftPos;  		rect.top = topPos; @@ -737,12 +737,40 @@ void SciGuiGfx::drawCel(GuiResourceId viewId, GuiViewLoopNo loopNo, GuiViewCelNo  		Common::Rect clipRectTranslated = clipRect;  		OffsetRect(clipRectTranslated);  		view->draw(rect, clipRect, clipRectTranslated, loopNo, celNo, priority, paletteNo); +		if (!_screen->_picNotValid) +			BitsShow(rect); +	} +} + +// This version of drawCel is not supposed to call BitsShow()! +void SciGuiGfx::drawCel(GuiResourceId viewId, GuiViewLoopNo loopNo, GuiViewCelNo celNo, Common::Rect celRect, byte priority, uint16 paletteNo) { +	SciGuiView *view = new SciGuiView(_s->resMan, _screen, _palette, viewId); +	Common::Rect clipRect; +	if (view) { +		clipRect = celRect; +		clipRect.clip(_curPort->rect); +		if (clipRect.isEmpty()) // nothing to draw +			return; -		//if (_picNotValid == 0) -		//	_gfx->ShowBits(rect, 1); +		Common::Rect clipRectTranslated = clipRect; +		OffsetRect(clipRectTranslated); +		view->draw(celRect, clipRect, clipRectTranslated, loopNo, celNo, priority, paletteNo);  	}  } +// This version of drawCel is not supposed to call BitsShow()! +void SciGuiGfx::drawCel(SciGuiView *view, GuiViewLoopNo loopNo, GuiViewCelNo celNo, Common::Rect celRect, byte priority, uint16 paletteNo) { +	Common::Rect clipRect; +	clipRect = celRect; +	clipRect.clip(_curPort->rect); +	if (clipRect.isEmpty()) // nothing to draw +		return; + +	Common::Rect clipRectTranslated = clipRect; +	OffsetRect(clipRectTranslated); +	view->draw(celRect, clipRect, clipRectTranslated, loopNo, celNo, priority, paletteNo); +} +  const char controlListUpArrow[2]	= { 0x18, 0 };  const char controlListDownArrow[2]	= { 0x19, 0 }; @@ -810,7 +838,7 @@ void SciGuiGfx::TexteditCursorDraw (Common::Rect rect, const char *text, uint16  		_texteditCursorRect.bottom = _texteditCursorRect.top + _font->getHeight();  		_texteditCursorRect.right = _texteditCursorRect.left + (text[curPos] == 0 ? 1 : CharWidth(text[curPos]));  		InvertRect(_texteditCursorRect); -		BitsShow(_texteditCursorRect, SCI_SCREEN_MASK_VISUAL); +		BitsShow(_texteditCursorRect);  		_texteditCursorVisible = true;  		TexteditSetBlinkTime();  	} @@ -819,7 +847,7 @@ void SciGuiGfx::TexteditCursorDraw (Common::Rect rect, const char *text, uint16  void SciGuiGfx::TexteditCursorErase() {  	if (_texteditCursorVisible) {  		InvertRect(_texteditCursorRect); -		BitsShow(_texteditCursorRect, SCI_SCREEN_MASK_VISUAL); +		BitsShow(_texteditCursorRect);  		_texteditCursorVisible = false;  	}  	TexteditSetBlinkTime(); @@ -854,8 +882,10 @@ void SciGuiGfx::TexteditChange(reg_t controlObject, reg_t eventObject) {  			eventKey = GET_SEL32V(eventObject, message);  			switch (eventKey) {  			case SCI_K_BACKSPACE: -				cursorPos--; text.deleteChar(cursorPos); -				textChanged = true; +				if (cursorPos > 0) { +					cursorPos--; text.deleteChar(cursorPos); +					textChanged = true; +				}  				break;  			case SCI_K_DELETE:  				text.deleteChar(cursorPos); @@ -898,7 +928,7 @@ void SciGuiGfx::TexteditChange(reg_t controlObject, reg_t eventObject) {  		TexteditCursorErase();  		EraseRect(rect);  		TextBox(text.c_str(), 0, rect, 0, fontId); -		BitsShow(rect, SCI_SCREEN_MASK_VISUAL); +		BitsShow(rect);  		SetFont(fontId);  		rect.top--;  		TexteditCursorDraw(rect, text.c_str(), cursorPos); @@ -908,7 +938,7 @@ void SciGuiGfx::TexteditChange(reg_t controlObject, reg_t eventObject) {  	} else {  		if (g_system->getMillis() >= _texteditBlinkTime) {  			InvertRect(_texteditCursorRect); -			BitsShow(_texteditCursorRect, SCI_SCREEN_MASK_VISUAL); +			BitsShow(_texteditCursorRect);  			_texteditCursorVisible = !_texteditCursorVisible;  			TexteditSetBlinkTime();  		} @@ -999,6 +1029,14 @@ int16 SciGuiGfx::PriorityToCoordinate(byte priority) {  	return _priorityBottom;  } +void SciGuiGfx::ShowPic() { +	// TODO: Implement animations +	warning("ShowPic animation not implemented"); +	_palette->setOnScreen(); +	_screen->copyToScreen(); +	_screen->_picNotValid = 0; +} +  void SciGuiGfx::AnimateDisposeLastCast() {  	// FIXME  	//if (!_lastCast->first.isNull()) @@ -1202,7 +1240,7 @@ void SciGuiGfx::AnimateUpdate() {  		if (signal & SCI_ANIMATE_SIGNAL_ALWAYSUPDATE) {  			// draw corresponding cel -			drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect.left, listEntry->celRect.top, listEntry->priority, listEntry->paletteNo); +			drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo);  			listEntry->showBitsFlag = true;  			signal &= 0xFFFF ^ (SCI_ANIMATE_SIGNAL_STOPUPDATE | SCI_ANIMATE_SIGNAL_VIEWUPDATED | SCI_ANIMATE_SIGNAL_NOUPDATE | SCI_ANIMATE_SIGNAL_FORCEUPDATE); @@ -1246,7 +1284,7 @@ void SciGuiGfx::AnimateUpdate() {  		if (signal & SCI_ANIMATE_SIGNAL_NOUPDATE && !(signal & SCI_ANIMATE_SIGNAL_HIDDEN)) {  			// draw corresponding cel -			drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect.left, listEntry->celRect.top, listEntry->priority, listEntry->paletteNo); +			drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo);  			listEntry->showBitsFlag = true;  			if ((signal & SCI_ANIMATE_SIGNAL_IGNOREACTOR) == 0) { @@ -1280,7 +1318,7 @@ void SciGuiGfx::AnimateDrawCels() {  			PUT_SEL32(curObject, underBits, bitsHandle);  			// draw corresponding cel -			drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect.left, listEntry->celRect.top, listEntry->priority, listEntry->paletteNo); +			drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo);  			listEntry->showBitsFlag = true;  			if (signal & SCI_ANIMATE_SIGNAL_REMOVEVIEW) { @@ -1303,6 +1341,46 @@ void SciGuiGfx::AnimateDrawCels() {  	}  } +void SciGuiGfx::AnimateUpdateScreen(byte oldPicNotValid) { +	SegManager *segMan = _s->_segMan; +	GuiAnimateEntry *listEntry; +	uint16 signal; +	GuiAnimateList::iterator listIterator; +	GuiAnimateList::iterator listEnd = _animateList.end(); + +	listIterator = _animateList.begin(); +	while (listIterator != listEnd) { +		listEntry = *listIterator; +		signal = listEntry->signal; + +		if (listEntry->showBitsFlag || !(signal & (SCI_ANIMATE_SIGNAL_REMOVEVIEW | SCI_ANIMATE_SIGNAL_NOUPDATE) || +										!(signal & SCI_ANIMATE_SIGNAL_REMOVEVIEW) && signal & SCI_ANIMATE_SIGNAL_NOUPDATE && oldPicNotValid)) { +// TODO: code finish +//			rect = (Common::Rect *)&cobj[_objOfs[7]]; +//			rect1 = (Common::Rect *)&cobj[_objOfs[8]]; +// +//			Common::Rect ro(rect->left, rect->top, rect->right, rect->bottom); +//			ro.clip(*rect1); +// +//			if (!ro.isEmpty()) { +//				ro = *rect;  +//				ro.extend(*rect1); +//			} else { +//				_gfx->ShowBits(*rect, _showMap); +//			//	ro = *rect1; +//			//} +//			//*rect  = *rect1; +//			_gfx->ShowBits(ro, _showMap); +			if (signal & SCI_ANIMATE_SIGNAL_HIDDEN) { +				listEntry->signal |= SCI_ANIMATE_SIGNAL_REMOVEVIEW; +			} +		} + +		listIterator++; +	} +	_screen->copyToScreen(); +} +  void SciGuiGfx::AnimateRestoreAndDelete(int argc, reg_t *argv) {  	SegManager *segMan = _s->_segMan;  	reg_t curObject; @@ -1360,7 +1438,7 @@ void SciGuiGfx::AddToPicDrawCels(List *list) {  		view->getCelRect(listEntry->loopNo, listEntry->celNo, listEntry->x, listEntry->y, listEntry->priority, &listEntry->celRect);  		// draw corresponding cel -		drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect.left, listEntry->celRect.top, listEntry->priority, listEntry->paletteNo); +		drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo);  		if ((listEntry->signal & SCI_ANIMATE_SIGNAL_IGNOREACTOR) == 0) {  			listEntry->celRect.top = CLIP<int16>(PriorityToCoordinate(listEntry->priority) - 1, listEntry->celRect.top, listEntry->celRect.bottom - 1);  			FillRect(listEntry->celRect, SCI_SCREEN_MASK_CONTROL, 0, 0, 15); @@ -1378,7 +1456,7 @@ void SciGuiGfx::AddToPicDrawView(GuiResourceId viewId, GuiViewLoopNo loopNo, Gui  	// Create rect according to coordinates and given cel  	view->getCelRect(loopNo, celNo, leftPos, topPos, priority, &celRect); -	drawCel(viewId, loopNo, celNo, celRect.left, celRect.top, priority, 0); +	drawCel(view, loopNo, celNo, celRect, priority, 0);  }  bool SciGuiGfx::CanBeHereCheckRectList(reg_t checkObject, Common::Rect checkRect, List *list) { diff --git a/engines/sci/gui/gui_gfx.h b/engines/sci/gui/gui_gfx.h index 096137374f..24e143128c 100644 --- a/engines/sci/gui/gui_gfx.h +++ b/engines/sci/gui/gui_gfx.h @@ -101,7 +101,7 @@ public:  		DrawText(str, 0, (int16)strlen(str), orgFontId, orgPenColor);  	}  	void TextBox(const char *str, int16 bshow, const Common::Rect &rect, int16 align, GuiResourceId fontId); -	void BitsShow(const Common::Rect &r, uint16 flags); +	void BitsShow(const Common::Rect &r);  	GuiMemoryHandle BitsSave(const Common::Rect &rect, byte screenFlags);  	void BitsRestore(GuiMemoryHandle memoryHandle);  	void BitsFree(GuiMemoryHandle memoryHandle); @@ -111,6 +111,8 @@ public:  	void drawPicture(GuiResourceId pictureId, int16 animationNr, bool mirroredFlag, bool addToFlag, GuiResourceId paletteId);  	void drawCel(GuiResourceId viewId, GuiViewLoopNo loopNo, GuiViewCelNo celNo, uint16 leftPos, uint16 topPos, byte priority, uint16 paletteNo); +	void drawCel(GuiResourceId viewId, GuiViewLoopNo loopNo, GuiViewCelNo celNo, Common::Rect celRect, byte priority, uint16 paletteNo); +	void drawCel(SciGuiView *view, GuiViewLoopNo loopNo, GuiViewCelNo celNo, Common::Rect celRect, byte priority, uint16 paletteNo);  	void drawListControl(Common::Rect rect, reg_t obj, int16 maxChars, int16 count, const char **entries, GuiResourceId fontId, int16 upperPos, int16 cursorPos, bool isAlias);  	void TexteditCursorDraw (Common::Rect rect, const char *text, uint16 curPos);  	void TexteditCursorErase(); @@ -123,12 +125,15 @@ public:  	byte CoordinateToPriority(int16 y);  	int16 PriorityToCoordinate(byte priority); +	void ShowPic(); +  	void AnimateDisposeLastCast();  	void AnimateInvoke(List *list, int argc, reg_t *argv);  	void AnimateMakeSortedList(List *list);  	void AnimateFill(byte &oldPicNotValid);  	void AnimateUpdate();  	void AnimateDrawCels(); +	void AnimateUpdateScreen(byte oldPicNotValid);  	void AnimateRestoreAndDelete(int argc, reg_t *argv);  	void AddToPicDrawCels(List *list);  	void AddToPicDrawView(GuiResourceId viewId, GuiViewLoopNo loopNo, GuiViewCelNo celNo, int16 leftPos, int16 topPos, int16 priority, int16 control); diff --git a/engines/sci/gui/gui_palette.cpp b/engines/sci/gui/gui_palette.cpp index 2e2ae650ae..32c29f16ea 100644 --- a/engines/sci/gui/gui_palette.cpp +++ b/engines/sci/gui/gui_palette.cpp @@ -191,7 +191,7 @@ void SciGuiPalette::set(GuiPalette *sciPal, int16 flag) {  	if (flag == 2 || sciPal->timestamp != systime) {  		merge(sciPal, &_sysPalette, flag);  		sciPal->timestamp = _sysPalette.timestamp; -		if (_screen->_picNotValid == 0 && systime != _sysPalette.timestamp) +		if (!_screen->_picNotValid && systime != _sysPalette.timestamp)  			setOnScreen();  	}  } diff --git a/engines/sci/gui/gui_windowmgr.cpp b/engines/sci/gui/gui_windowmgr.cpp index 46f3895a84..908c645d94 100644 --- a/engines/sci/gui/gui_windowmgr.cpp +++ b/engines/sci/gui/gui_windowmgr.cpp @@ -151,6 +151,9 @@ GuiWindow *SciGuiWindowMgr::NewWindow(const Common::Rect &dims, const Common::Re  			r.bottom++;  		}  	} + +	// FIXME: it seems as if shadows may result in the window getting moved one upwards +	//         so that the shadow is visible (lsl5)  	pwnd->dims = r;  	const Common::Rect *wmprect = &_wmgrPort->rect; @@ -160,24 +163,19 @@ GuiWindow *SciGuiWindowMgr::NewWindow(const Common::Rect &dims, const Common::Re  		pwnd->dims.moveTo(pwnd->dims.left, wmprect->top);  	if (wmprect->bottom < pwnd->dims.bottom) -		pwnd->dims.moveTo(pwnd->dims.left, wmprect->bottom -				- pwnd->dims.bottom + pwnd->dims.top); +		pwnd->dims.moveTo(pwnd->dims.left, wmprect->bottom - pwnd->dims.bottom + pwnd->dims.top);  	if (wmprect->right < pwnd->dims.right) -		pwnd->dims.moveTo(wmprect->right + pwnd->dims.left -				- pwnd->dims.right, pwnd->dims.top); +		pwnd->dims.moveTo(wmprect->right + pwnd->dims.left - pwnd->dims.right, pwnd->dims.top);  	if (wmprect->left > pwnd->dims.left)  		pwnd->dims.moveTo(wmprect->left, pwnd->dims.top); -	pwnd->rect.moveTo(pwnd->rect.left + pwnd->dims.left - oldleft, -			pwnd->rect.top + pwnd->dims.top - oldtop); +	pwnd->rect.moveTo(pwnd->rect.left + pwnd->dims.left - oldleft, pwnd->rect.top + pwnd->dims.top - oldtop);  	if (restoreRect == 0)  		pwnd->restoreRect = pwnd->dims; -	// CHECKME: Is this 'kTransparent' check necessary? -	// The shadow is already drawn if !(wndStyle & (kUser | kNoFrame)). -	if (!(pwnd->wndStyle & (SCI_WINDOWMGR_STYLE_TRANSPARENT | SCI_WINDOWMGR_STYLE_USER | SCI_WINDOWMGR_STYLE_NOFRAME))) { +	if (!(pwnd->wndStyle & (SCI_WINDOWMGR_STYLE_USER | SCI_WINDOWMGR_STYLE_NOFRAME))) {  		// The shadow is drawn slightly outside the window.  		// Enlarge restoreRect to cover that.  		pwnd->restoreRect.bottom++; @@ -240,7 +238,7 @@ void SciGuiWindowMgr::DrawWindow(GuiWindow *pWnd) {  		if (!(wndStyle & SCI_WINDOWMGR_STYLE_TRANSPARENT))  			_gfx->FillRect(r, SCI_SCREEN_MASK_VISUAL, pWnd->backClr); -		_gfx->BitsShow(pWnd->dims, SCI_SCREEN_MASK_VISUAL); +		_gfx->BitsShow(pWnd->restoreRect);  	}  	_gfx->SetPort(oldport);  } @@ -250,7 +248,7 @@ void SciGuiWindowMgr::DisposeWindow(GuiWindow *pWnd, int16 arg2) {  	_gfx->BitsRestore(pWnd->hSaved1);  	_gfx->BitsRestore(pWnd->hSaved2);  	if (arg2) -		_gfx->BitsShow(pWnd->restoreRect, SCI_SCREEN_MASK_VISUAL); +		_gfx->BitsShow(pWnd->restoreRect);  //	else  //		g_sci->ReAnimate(&pwnd->dims);  	_windowList.remove(pWnd); diff --git a/engines/sci/gui32/gui32.cpp b/engines/sci/gui32/gui32.cpp index c635262dd1..54fb64d148 100644 --- a/engines/sci/gui32/gui32.cpp +++ b/engines/sci/gui32/gui32.cpp @@ -952,6 +952,15 @@ void SciGui32::graphRestoreBox(reg_t handle) {  	graph_restore_box(s, handle);  } +void SciGui32::graphUpdateBox(Common::Rect rect) { +	rect_t area = gfx_rect(rect.left, rect.top, rect.width(), rect.height()); + +	area.x += s->port->zone.x; +	area.y += s->port->zone.y; + +	gfxop_update_box(s->gfx_state, area); +} +  void SciGui32::paletteSet(int resourceNo, int flags) {  	//warning("STUB");  } diff --git a/engines/sci/gui32/gui32.h b/engines/sci/gui32/gui32.h index fb2a1e3143..7060dcaa95 100644 --- a/engines/sci/gui32/gui32.h +++ b/engines/sci/gui32/gui32.h @@ -73,6 +73,7 @@ public:  	void graphDrawLine(Common::Point startPoint, Common::Point endPoint, int16 color, int16 priority, int16 control);  	reg_t graphSaveBox(Common::Rect rect, uint16 flags);  	void graphRestoreBox(reg_t handle); +	void graphUpdateBox(Common::Rect);  	void paletteSet(int resourceNo, int flags);  	int16 paletteFind(int r, int g, int b); | 
