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

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Sat Oct 23 21:23:07 CEST 2010


Revision: 53744
          http://scummvm.svn.sourceforge.net/scummvm/?rev=53744&view=rev
Author:   thebluegr
Date:     2010-10-23 19:23:07 +0000 (Sat, 23 Oct 2010)

Log Message:
-----------
SCI2/SCI2.1: Some changes to the screen drawing code.

- Implemented kernelUpdateScreenITem
- Changed the list of screen items to be a list of FrameoutEntry entries,
so that it doesn't get recreated on every frame

Modified Paths:
--------------
    scummvm/trunk/engines/sci/graphics/frameout.cpp
    scummvm/trunk/engines/sci/graphics/frameout.h

Modified: scummvm/trunk/engines/sci/graphics/frameout.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/frameout.cpp	2010-10-23 19:19:06 UTC (rev 53743)
+++ scummvm/trunk/engines/sci/graphics/frameout.cpp	2010-10-23 19:23:07 UTC (rev 53744)
@@ -130,6 +130,15 @@
 			it->planeBack = readSelectorValue(_segMan, object, SELECTOR(back));
 
 			sortPlanes();
+
+			// Update the items in the plane
+			for (FrameoutList::iterator listIterator = _screenItems.begin(); listIterator != _screenItems.end(); listIterator++) {
+				reg_t itemPlane = readSelector(_segMan, (*listIterator)->object, SELECTOR(plane));
+				if (object == itemPlane) {
+					kernelUpdateScreenItem((*listIterator)->object);
+				}
+			}
+
 			return;
 		}
 	}
@@ -186,17 +195,50 @@
 }
 
 void GfxFrameout::kernelAddScreenItem(reg_t object) {
-	_screenItems.push_back(object);
+	// Ignore invalid items
+	if (!_segMan->isObject(object))
+		return;
+
+	FrameoutEntry *itemEntry = new FrameoutEntry();
+	itemEntry->object = object;
+	itemEntry->givenOrderNr = _screenItems.size();
+	_screenItems.push_back(itemEntry);
+
+	kernelUpdateScreenItem(object);
 }
 
 void GfxFrameout::kernelUpdateScreenItem(reg_t object) {
-	// TODO
+	// Ignore invalid items
+	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;
+		}
+	}
 }
 
 void GfxFrameout::kernelDeleteScreenItem(reg_t object) {
-	for (uint32 itemNr = 0; itemNr < _screenItems.size(); itemNr++) {
-		if (_screenItems[itemNr] == object) {
-			_screenItems.remove_at(itemNr);
+	for (FrameoutList::iterator listIterator = _screenItems.begin(); listIterator != _screenItems.end(); listIterator++) {
+		FrameoutEntry *itemEntry = *listIterator;
+		if (itemEntry->object == object) {
+			_screenItems.remove(itemEntry);
 			return;
 		}
 	}
@@ -252,11 +294,6 @@
 void GfxFrameout::kernelFrameout() {
 	_palette->palVaryUpdate();
 
-	// Allocate enough space for all screen items
-	// TODO: Modify _screenItems to hold FrameoutEntry entries instead.
-	// Creating and destroying this in kernelFrameout() is overkill!
-	FrameoutEntry *itemData = new FrameoutEntry[_screenItems.size()];
-
 	for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); it++) {
 		reg_t planeObject = it->object;
 		uint16 planeLastPriority = it->lastPriority;
@@ -280,43 +317,14 @@
 		_coordAdjuster->pictureSetDisplayArea(it->planeRect);
 		_palette->drewPicture(planeMainPictureId);
 
-		// Fill our itemlist for this plane
-		int16 itemCount = 0;
-		FrameoutEntry *itemEntry = itemData;
 		FrameoutList itemList;
 
-		for (uint32 itemNr = 0; itemNr < _screenItems.size(); itemNr++) {
-			reg_t itemObject = _screenItems[itemNr];
-
-			// Remove any invalid items
-			if (!_segMan->isObject(itemObject)) {
-				_screenItems.remove_at(itemNr);
-				itemNr--;
-				continue;
-			}
-
-			reg_t itemPlane = readSelector(_segMan, itemObject, SELECTOR(plane));
+		// Copy screen items of the current frame to the list of items to be drawn
+		for (FrameoutList::iterator listIterator = _screenItems.begin(); listIterator != _screenItems.end(); listIterator++) {
+			reg_t itemPlane = readSelector(_segMan, (*listIterator)->object, SELECTOR(plane));
 			if (planeObject == itemPlane) {
-				// Found an item on current plane
-				itemEntry->viewId = readSelectorValue(_segMan, itemObject, SELECTOR(view));
-				itemEntry->loopNo = readSelectorValue(_segMan, itemObject, SELECTOR(loop));
-				itemEntry->celNo = readSelectorValue(_segMan, itemObject, SELECTOR(cel));
-				itemEntry->x = readSelectorValue(_segMan, itemObject, SELECTOR(x));
-				itemEntry->y = readSelectorValue(_segMan, itemObject, SELECTOR(y));
-				itemEntry->z = readSelectorValue(_segMan, itemObject, SELECTOR(z));
-				itemEntry->priority = readSelectorValue(_segMan, itemObject, SELECTOR(priority));
-				if (readSelectorValue(_segMan, itemObject, SELECTOR(fixPriority)) == 0)
-					itemEntry->priority = itemEntry->y;
-
-				itemEntry->signal = readSelectorValue(_segMan, itemObject, SELECTOR(signal));
-				itemEntry->scaleX = readSelectorValue(_segMan, itemObject, SELECTOR(scaleX));
-				itemEntry->scaleY = readSelectorValue(_segMan, itemObject, SELECTOR(scaleY));
-				itemEntry->object = itemObject;
-				itemEntry->givenOrderNr = itemNr;
-
-				itemList.push_back(itemEntry);
-				itemEntry++;
-				itemCount++;
+				kernelUpdateScreenItem((*listIterator)->object);	// TODO: Why is this necessary?
+				itemList.push_back(*listIterator);
 			}
 		}
 
@@ -348,13 +356,10 @@
 		// Now sort our itemlist
 		Common::sort(itemList.begin(), itemList.end(), sortHelper);
 
-		// Now display itemlist
-		itemEntry = itemData;
-
 //		warning("Plane %s", _segMan->getObjectName(planeObject));
 
 		for (FrameoutList::iterator listIterator = itemList.begin(); listIterator != itemList.end(); listIterator++) {
-			itemEntry = *listIterator;
+			FrameoutEntry *itemEntry = *listIterator;
 
 			if (itemEntry->object.isNull()) {
 				// Picture cel data
@@ -530,7 +535,6 @@
 		}
 	}
 
-	delete[] itemData;
 	_screen->copyToScreen();
 
 	g_sci->getEngineState()->_throttleTrigger = true;

Modified: scummvm/trunk/engines/sci/graphics/frameout.h
===================================================================
--- scummvm/trunk/engines/sci/graphics/frameout.h	2010-10-23 19:19:06 UTC (rev 53743)
+++ scummvm/trunk/engines/sci/graphics/frameout.h	2010-10-23 19:23:07 UTC (rev 53744)
@@ -109,7 +109,7 @@
 	GfxScreen *_screen;
 	GfxPaint32 *_paint32;
 
-	Common::Array<reg_t> _screenItems;
+	Common::List<FrameoutEntry *> _screenItems;
 	PlaneList _planes;
 	PlanePictureList _planePictures;
 


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