[Scummvm-cvs-logs] SF.net SVN: scummvm:[44780] scummvm/trunk/engines/sci/gui

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Thu Oct 8 12:02:26 CEST 2009


Revision: 44780
          http://scummvm.svn.sourceforge.net/scummvm/?rev=44780&view=rev
Author:   m_kiewitz
Date:     2009-10-08 10:02:26 +0000 (Thu, 08 Oct 2009)

Log Message:
-----------
SCI/newgui: kAnimate SciGuiGfx::AnimateFill implemented

Modified Paths:
--------------
    scummvm/trunk/engines/sci/gui/gui.cpp
    scummvm/trunk/engines/sci/gui/gui_gfx.cpp
    scummvm/trunk/engines/sci/gui/gui_gfx.h
    scummvm/trunk/engines/sci/gui/gui_view.h

Modified: scummvm/trunk/engines/sci/gui/gui.cpp
===================================================================
--- scummvm/trunk/engines/sci/gui/gui.cpp	2009-10-08 09:33:20 UTC (rev 44779)
+++ scummvm/trunk/engines/sci/gui/gui.cpp	2009-10-08 10:02:26 UTC (rev 44780)
@@ -377,7 +377,7 @@
 }
 
 void SciGui::animate(reg_t listReference, bool cycle, int argc, reg_t *argv) {
-	bool old_picNotValid = _screen->_picNotValid;
+	byte old_picNotValid = _screen->_picNotValid;
 
 	if (listReference.isNull()) {
 		_gfx->AnimateDisposeLastCast();
@@ -398,7 +398,7 @@
 	GuiPort *oldPort = _gfx->SetPort((GuiPort *)_windowMgr->_picWind);
 	_gfx->AnimateDisposeLastCast();
 
-	_gfx->AnimateFill();
+	_gfx->AnimateFill(list, old_picNotValid);
 
 	// _gfx->AnimateSort();
 	if (old_picNotValid) {

Modified: scummvm/trunk/engines/sci/gui/gui_gfx.cpp
===================================================================
--- scummvm/trunk/engines/sci/gui/gui_gfx.cpp	2009-10-08 09:33:20 UTC (rev 44779)
+++ scummvm/trunk/engines/sci/gui/gui_gfx.cpp	2009-10-08 10:02:26 UTC (rev 44780)
@@ -1068,7 +1068,15 @@
 }
 
 enum {
-	SCI_ANIMATE_SIGNAL_FROZEN       = 0x0100
+	SCI_ANIMATE_MASK_STOPUPDATE    = 0x0001,
+	SCI_ANIMATE_MASK_VIEWUPDATED   = 0x0002,
+	SCI_ANIMATE_MASK_NOUPDATE      = 0x0004,
+	SCI_ANIMATE_MASK_HIDDEN        = 0x0008,
+	SCI_ANIMATE_MASK_FIXEDPRIORITY = 0x0010,
+	SCI_ANIMATE_MASK_ALWAYSUPDATE  = 0x0020,
+	SCI_ANIMATE_MASK_FORCEUPDATE   = 0x0040,
+	SCI_ANIMATE_MASK_REMOVEVIEW    = 0x0080,
+	SCI_ANIMATE_MASK_FROZEN        = 0x0100
 };
 
 void SciGuiGfx::AnimateInvoke(List *list, int argc, reg_t *argv) {
@@ -1076,12 +1084,13 @@
 	reg_t curAddress = list->first;
 	Node *curNode = _s->_segMan->lookupNode(curAddress);
 	reg_t curObject;
-	uint16 signal;
+	uint16 mask;
 
 	while (curNode) {
 		curObject = curNode->value;
-		signal = GET_SEL32V(curObject, signal);
-		if (!(signal & SCI_ANIMATE_SIGNAL_FROZEN)) {
+		mask = GET_SEL32V(curObject, signal);
+		if (!(mask & SCI_ANIMATE_MASK_FROZEN)) {
+			// Call .doit method of that object
 			invoke_selector(_s, curObject, _s->_kernel->_selectorCache.doit, kContinueOnInvalidSelector, argv, argc, __FILE__, __LINE__, 0);
 			// Lookup node again, since the nodetable it was in may have been reallocated
 			curNode = _s->_segMan->lookupNode(curAddress);
@@ -1091,7 +1100,66 @@
 	}
 }
 
-void SciGuiGfx::AnimateFill() {
+void SciGuiGfx::AnimateFill(List *list, byte &old_picNotValid) {
+	SegManager *segMan = _s->_segMan;
+	reg_t curAddress = list->first;
+	Node *curNode = _s->_segMan->lookupNode(curAddress);
+	reg_t curObject;
+	SciGuiView *view = NULL;
+	GuiResourceId viewId;
+	GuiViewLoopNo loopNo;
+	GuiViewCelNo celNo;
+	int16 x, y, priority;
+	uint16 mask;
+
+	while (curNode) {
+		curObject = curNode->value;
+
+		// Get cel data...
+		viewId = GET_SEL32V(curObject, view);
+		loopNo = GET_SEL32V(curObject, loop);
+		celNo = GET_SEL32V(curObject, cel);
+		x = GET_SEL32V(curObject, x);
+		y = GET_SEL32V(curObject, y);
+		priority = GET_SEL32V(curObject, priority);
+		mask = GET_SEL32V(curObject, signal);
+
+		// Get the corresponding view
+		view = new SciGuiView(_s->resMan, _screen, _palette, viewId);
+		
+		// adjust loop and cel, if any of those is invalid
+		if (loopNo >= view->getLoopCount()) {
+			loopNo = 0;
+			PUT_SEL32V(curObject, loop, loopNo);
+		}
+		if (celNo >= view->getCelCount(loopNo)) {
+			celNo = 0;
+			PUT_SEL32V(curObject, cel, celNo);
+		}
+
+		// FIXME: this code doesnt seem to do anything useful?!?!
+		// rect = (Common::Rect *)&cobj[_objOfs[8]];
+		// res->getCelRect(curLoop, curCel, x, y, z, rect);
+		if (!(mask & SCI_ANIMATE_MASK_FIXEDPRIORITY))
+			PUT_SEL32V(curObject, priority, 0); // CoordPri(y) FIXME
+		
+		if (mask & SCI_ANIMATE_MASK_NOUPDATE) {
+			if (mask & (SCI_ANIMATE_MASK_FORCEUPDATE | SCI_ANIMATE_MASK_VIEWUPDATED)
+				|| (mask & SCI_ANIMATE_MASK_HIDDEN && !(mask & SCI_ANIMATE_MASK_REMOVEVIEW))
+				|| (!(mask & SCI_ANIMATE_MASK_HIDDEN) && mask & SCI_ANIMATE_MASK_REMOVEVIEW)
+				|| (mask & SCI_ANIMATE_MASK_ALWAYSUPDATE))
+				old_picNotValid++;
+			mask &= 0xFFFF ^ SCI_ANIMATE_MASK_STOPUPDATE;
+		} else {
+			if (mask & SCI_ANIMATE_MASK_STOPUPDATE || mask & SCI_ANIMATE_MASK_ALWAYSUPDATE)
+				old_picNotValid++;
+			mask &= 0xFFFF ^ SCI_ANIMATE_MASK_FORCEUPDATE;
+		}
+		PUT_SEL32V(curObject, signal, mask);
+
+		curAddress = curNode->succ;
+		curNode = _s->_segMan->lookupNode(curAddress);
+	}
 }
 
 Common::List<GuiAnimateList> *SciGuiGfx::AnimateMakeSortedList(List *list) {

Modified: scummvm/trunk/engines/sci/gui/gui_gfx.h
===================================================================
--- scummvm/trunk/engines/sci/gui/gui_gfx.h	2009-10-08 09:33:20 UTC (rev 44779)
+++ scummvm/trunk/engines/sci/gui/gui_gfx.h	2009-10-08 10:02:26 UTC (rev 44780)
@@ -106,7 +106,7 @@
 	int16 onControl(uint16 screenMask, Common::Rect rect);
 	void AnimateDisposeLastCast();
 	void AnimateInvoke(List *list, int argc, reg_t *argv);
-	void AnimateFill();
+	void AnimateFill(List *list, byte &oldPicNotValid);
 	Common::List<GuiAnimateList> *AnimateMakeSortedList(List *list);
 	void AnimateUpdate();
 	void AnimateDrawCels();

Modified: scummvm/trunk/engines/sci/gui/gui_view.h
===================================================================
--- scummvm/trunk/engines/sci/gui/gui_view.h	2009-10-08 09:33:20 UTC (rev 44779)
+++ scummvm/trunk/engines/sci/gui/gui_view.h	2009-10-08 10:02:26 UTC (rev 44780)
@@ -59,6 +59,7 @@
 	byte *getBitmap(GuiViewLoopNo loopNo, GuiViewCelNo celNo);
 	void draw(Common::Rect rect, Common::Rect clipRect, Common::Rect clipRectTranslated, GuiViewLoopNo loopNo, GuiViewCelNo celNo, byte priority, uint16 paletteNo);
 	uint16 getLoopCount() const { return _loopCount; }
+	uint16 getCelCount(GuiViewLoopNo loopNo) { return _loop[loopNo].celCount; }
 	GuiPalette *getPalette();
 
 private:


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list