[Scummvm-cvs-logs] scummvm master -> 4af034a7a991d12ea062b90548fd4c7339d5b527

bluegr md5 at scummvm.org
Wed Oct 12 01:53:15 CEST 2011


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
4af034a7a9 SCI: Added proper handling of duplicate items in kAddScreenItem


Commit: 4af034a7a991d12ea062b90548fd4c7339d5b527
    https://github.com/scummvm/scummvm/commit/4af034a7a991d12ea062b90548fd4c7339d5b527
Author: Filippos Karapetis (md5 at scummvm.org)
Date: 2011-10-11T16:44:16-07:00

Commit Message:
SCI: Added proper handling of duplicate items in kAddScreenItem

- Items that are being readded to the scene should be updated instead
- Added a findScreenItem() call to simplify the code slightly

Changed paths:
    engines/sci/engine/kgraphics.cpp
    engines/sci/graphics/frameout.cpp
    engines/sci/graphics/frameout.h



diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp
index 5c33db0..c60c0a4 100644
--- a/engines/sci/engine/kgraphics.cpp
+++ b/engines/sci/engine/kgraphics.cpp
@@ -1287,7 +1287,10 @@ reg_t kCantBeHere32(EngineState *s, int argc, reg_t *argv) {
 }
 
 reg_t kAddScreenItem(EngineState *s, int argc, reg_t *argv) {
-	g_sci->_gfxFrameout->kernelAddScreenItem(argv[0]);
+	if (g_sci->_gfxFrameout->findScreenItem(argv[0]) == NULL)
+		g_sci->_gfxFrameout->kernelAddScreenItem(argv[0]);
+	else
+		g_sci->_gfxFrameout->kernelUpdateScreenItem(argv[0]);
 	return s->r_acc;
 }
 
diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp
index 17b4b01..9d15c82 100644
--- a/engines/sci/graphics/frameout.cpp
+++ b/engines/sci/graphics/frameout.cpp
@@ -235,36 +235,45 @@ void GfxFrameout::kernelUpdateScreenItem(reg_t object) {
 	if (!_segMan->isObject(object))
 		return;
 
-	for (FrameoutList::iterator listIterator = _screenItems.begin(); listIterator != _screenItems.end(); listIterator++) {
-		FrameoutEntry *itemEntry = *listIterator;
-
-		if (itemEntry->object == object) {
-			itemEntry->viewId = readSelectorValue(_segMan, object, SELECTOR(view));
-			itemEntry->loopNo = readSelectorValue(_segMan, object, SELECTOR(loop));
-			itemEntry->celNo = readSelectorValue(_segMan, object, SELECTOR(cel));
-			itemEntry->x = readSelectorValue(_segMan, object, SELECTOR(x));
-			itemEntry->y = readSelectorValue(_segMan, object, SELECTOR(y));
-			itemEntry->z = readSelectorValue(_segMan, object, SELECTOR(z));
-			itemEntry->priority = readSelectorValue(_segMan, object, SELECTOR(priority));
-			if (readSelectorValue(_segMan, object, SELECTOR(fixPriority)) == 0)
-				itemEntry->priority = itemEntry->y;
-
-			itemEntry->signal = readSelectorValue(_segMan, object, SELECTOR(signal));
-			itemEntry->scaleX = readSelectorValue(_segMan, object, SELECTOR(scaleX));
-			itemEntry->scaleY = readSelectorValue(_segMan, object, SELECTOR(scaleY));
-			return;
-		}
+	FrameoutEntry *itemEntry = findScreenItem(object);
+	if (!itemEntry) {
+		warning("kernelUpdateScreenItem: invalid object %04x:%04x", PRINT_REG(object));
+		return;
 	}
+
+	itemEntry->viewId = readSelectorValue(_segMan, object, SELECTOR(view));
+	itemEntry->loopNo = readSelectorValue(_segMan, object, SELECTOR(loop));
+	itemEntry->celNo = readSelectorValue(_segMan, object, SELECTOR(cel));
+	itemEntry->x = readSelectorValue(_segMan, object, SELECTOR(x));
+	itemEntry->y = readSelectorValue(_segMan, object, SELECTOR(y));
+	itemEntry->z = readSelectorValue(_segMan, object, SELECTOR(z));
+	itemEntry->priority = readSelectorValue(_segMan, object, SELECTOR(priority));
+	if (readSelectorValue(_segMan, object, SELECTOR(fixPriority)) == 0)
+		itemEntry->priority = itemEntry->y;
+
+	itemEntry->signal = readSelectorValue(_segMan, object, SELECTOR(signal));
+	itemEntry->scaleX = readSelectorValue(_segMan, object, SELECTOR(scaleX));
+	itemEntry->scaleY = readSelectorValue(_segMan, object, SELECTOR(scaleY));
 }
 
 void GfxFrameout::kernelDeleteScreenItem(reg_t object) {
+	FrameoutEntry *itemEntry = findScreenItem(object);
+	if (!itemEntry) {
+		warning("kernelDeleteScreenItem: invalid object %04x:%04x", PRINT_REG(object));
+		return;
+	}
+
+	_screenItems.remove(itemEntry);
+}
+
+FrameoutEntry *GfxFrameout::findScreenItem(reg_t object) {
 	for (FrameoutList::iterator listIterator = _screenItems.begin(); listIterator != _screenItems.end(); listIterator++) {
 		FrameoutEntry *itemEntry = *listIterator;
-		if (itemEntry->object == object) {
-			_screenItems.remove(itemEntry);
-			return;
-		}
+		if (itemEntry->object == object)
+			return itemEntry;
 	}
+
+	return NULL;
 }
 
 int16 GfxFrameout::kernelGetHighPlanePri() {
diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h
index 4e0f312..3176db2 100644
--- a/engines/sci/graphics/frameout.h
+++ b/engines/sci/graphics/frameout.h
@@ -93,6 +93,7 @@ public:
 	void kernelAddScreenItem(reg_t object);
 	void kernelUpdateScreenItem(reg_t object);
 	void kernelDeleteScreenItem(reg_t object);
+	FrameoutEntry *findScreenItem(reg_t object);
 	int16 kernelGetHighPlanePri();
 	void kernelAddPicAt(reg_t planeObj, GuiResourceId pictureId, int16 pictureX, int16 pictureY);
 	void kernelFrameout();






More information about the Scummvm-git-logs mailing list