[Scummvm-cvs-logs] SF.net SVN: scummvm:[53628] scummvm/trunk/engines/saga

h00ligan at users.sourceforge.net h00ligan at users.sourceforge.net
Wed Oct 20 00:29:53 CEST 2010


Revision: 53628
          http://scummvm.svn.sourceforge.net/scummvm/?rev=53628&view=rev
Author:   h00ligan
Date:     2010-10-19 22:29:53 +0000 (Tue, 19 Oct 2010)

Log Message:
-----------
SAGA: SAGA: replace SpriteList "::realloc" with Common::Array

Modified Paths:
--------------
    scummvm/trunk/engines/saga/actor.cpp
    scummvm/trunk/engines/saga/actor.h
    scummvm/trunk/engines/saga/actor_walk.cpp
    scummvm/trunk/engines/saga/interface.cpp
    scummvm/trunk/engines/saga/puzzle.cpp
    scummvm/trunk/engines/saga/resource_res.cpp
    scummvm/trunk/engines/saga/sprite.cpp
    scummvm/trunk/engines/saga/sprite.h

Modified: scummvm/trunk/engines/saga/actor.cpp
===================================================================
--- scummvm/trunk/engines/saga/actor.cpp	2010-10-19 21:40:24 UTC (rev 53627)
+++ scummvm/trunk/engines/saga/actor.cpp	2010-10-19 22:29:53 UTC (rev 53628)
@@ -48,8 +48,8 @@
 ActorData::~ActorData() {
 	if (!_shareFrames)
 		free(_frames);
-	freeSpriteList();
 }
+
 void ActorData::saveState(Common::OutSaveFile *out) {
 	uint i = 0;
 	CommonObjectData::saveState(out);
@@ -151,10 +151,6 @@
 	_walkStepsPoints[_walkStepsCount++] = point;
 }
 
-void ActorData::freeSpriteList() {
-	_spriteList.freeMem();
-}
-
 static int commonObjectCompare(const CommonObjectDataPointer& obj1, const CommonObjectDataPointer& obj2) {
 	int p1 = obj1->_location.y - obj1->_location.z;
 	int p2 = obj2->_location.y - obj2->_location.z;
@@ -393,13 +389,15 @@
 }
 
 void Actor::loadActorSpriteList(ActorData *actor) {
-	int lastFrame = 0;
+	uint lastFrame = 0;
+	uint curFrameIndex;
 	int resourceId = actor->_spriteListResourceId;
 
 	for (int i = 0; i < actor->_framesCount; i++) {
 		for (int orient = 0; orient < ACTOR_DIRECTIONS_COUNT; orient++) {
-			if (actor->_frames[i].directions[orient].frameIndex > lastFrame) {
-				lastFrame = actor->_frames[i].directions[orient].frameIndex;
+			curFrameIndex = actor->_frames[i].directions[orient].frameIndex;
+			if (curFrameIndex > lastFrame) {
+				lastFrame = curFrameIndex;
 			}
 		}
 	}
@@ -410,7 +408,7 @@
 
 	if (_vm->getGameId() == GID_ITE) {
 		if (actor->_flags & kExtended) {
-			while ((lastFrame >= actor->_spriteList.spriteCount)) {
+			while ((lastFrame >= actor->_spriteList.size())) {
 				resourceId++;
 				debug(9, "Appending to actor sprite list %d", resourceId);
 				_vm->_sprite->loadList(resourceId, actor->_spriteList);
@@ -1126,19 +1124,20 @@
 		ActorData *actor = (ActorData *)commonObjectData;
 		spriteList = &(actor->_spriteList);
 		frameNumber = actor->_frameNumber;
-		if (spriteList->infoList == NULL)
+		if (spriteList->empty()) {
 			loadActorSpriteList(actor);
+		}
 
 	} else if (validObjId(commonObjectData->_id)) {
 		spriteList = &_vm->_sprite->_mainSprites;
 		frameNumber = commonObjectData->_spriteListResourceId;
 	}
 
-	if (spriteList->spriteCount == 0) {
+	if (spriteList->empty()) {
 		return false;
 	}
 
-	if ((frameNumber < 0) || (spriteList->spriteCount <= frameNumber)) {
+	if ((frameNumber < 0) || (spriteList->size() <= uint(frameNumber))) {
 		debug(1, "Actor::getSpriteParams frameNumber invalid for %s id 0x%X (%d)",
 				validObjId(commonObjectData->_id) ? "object" : "actor",
 				commonObjectData->_id, frameNumber);

Modified: scummvm/trunk/engines/saga/actor.h
===================================================================
--- scummvm/trunk/engines/saga/actor.h	2010-10-19 21:40:24 UTC (rev 53627)
+++ scummvm/trunk/engines/saga/actor.h	2010-10-19 22:29:53 UTC (rev 53628)
@@ -396,7 +396,6 @@
 
 	void cycleWrap(int cycleLimit);
 	void addWalkStepPoint(const Point &point);
-	void freeSpriteList();
 };
 
 struct ProtagStateData {

Modified: scummvm/trunk/engines/saga/actor_walk.cpp
===================================================================
--- scummvm/trunk/engines/saga/actor_walk.cpp	2010-10-19 21:40:24 UTC (rev 53627)
+++ scummvm/trunk/engines/saga/actor_walk.cpp	2010-10-19 22:29:53 UTC (rev 53628)
@@ -199,7 +199,7 @@
 	for (i = 0; i < _actorsCount; i++) {
 		actor = _actors[i];
 		actor->_inScene = false;
-		actor->_spriteList.freeMem();
+		actor->_spriteList.clear();
 		if (actor->_disabled) {
 			continue;
 		}

Modified: scummvm/trunk/engines/saga/interface.cpp
===================================================================
--- scummvm/trunk/engines/saga/interface.cpp	2010-10-19 21:40:24 UTC (rev 53627)
+++ scummvm/trunk/engines/saga/interface.cpp	2010-10-19 22:29:53 UTC (rev 53628)
@@ -197,7 +197,7 @@
 	} else {
 		_optionPanel.buttons = NULL;
 		_optionPanel.buttonsCount = 0;
-		_optionPanel.sprites.spriteCount = 0;
+		_optionPanel.sprites.clear();
 	}
 
 #ifdef ENABLE_IHNM
@@ -353,17 +353,6 @@
 	free(_quitPanel.image);
 	free(_loadPanel.image);
 	free(_savePanel.image);
-
-	_mainPanel.sprites.freeMem();
-	_conversePanel.sprites.freeMem();
-	_optionPanel.sprites.freeMem();
-	_quitPanel.sprites.freeMem();
-	_loadPanel.sprites.freeMem();
-	_savePanel.sprites.freeMem();
-	_protectPanel.sprites.freeMem();
-
-	_defPortraits.freeMem();
-	_scenePortraits.freeMem();
 }
 
 void Interface::saveReminderCallback(void *refCon) {
@@ -768,7 +757,7 @@
 }
 
 void Interface::loadScenePortraits(int resourceId) {
-	_scenePortraits.freeMem();
+	_scenePortraits.clear();
 
 	_vm->_sprite->loadList(resourceId, _scenePortraits);
 }
@@ -847,7 +836,7 @@
 		// can tell this is what the original engine does. And it keeps
 		// ITE from crashing when entering the Elk King's court.
 
-		if (_rightPortrait >= _scenePortraits.spriteCount)
+		if (_rightPortrait >= _scenePortraits.size())
 			_rightPortrait = 0;
 
 		_vm->_sprite->draw(_scenePortraits, _rightPortrait, rightPortraitPoint, 256);

Modified: scummvm/trunk/engines/saga/puzzle.cpp
===================================================================
--- scummvm/trunk/engines/saga/puzzle.cpp	2010-10-19 21:40:24 UTC (rev 53627)
+++ scummvm/trunk/engines/saga/puzzle.cpp	2010-10-19 22:29:53 UTC (rev 53628)
@@ -172,7 +172,7 @@
 	_vm->_actor->getSpriteParams(puzzle, frameNumber, spriteList);
 
 	for (int i = 0; i < PUZZLE_PIECES; i++) {
-		spI = &(spriteList->infoList[i]);
+		spI = &((*spriteList)[i]);
 		_pieceInfo[i].offX = (byte)(spI->width >> 1);
 		_pieceInfo[i].offY = (byte)(spI->height >> 1);
 
@@ -347,7 +347,7 @@
 		if (newy < boxy)
 			newy = PUZZLE_Y_OFFSET;
 
-		spI = &(spriteList->infoList[_puzzlePiece]);
+		spI = &((*spriteList)[_puzzlePiece]);
 
 		if (newx + spI->width > boxw)
 			newx = boxw - spI->width ;

Modified: scummvm/trunk/engines/saga/resource_res.cpp
===================================================================
--- scummvm/trunk/engines/saga/resource_res.cpp	2010-10-19 21:40:24 UTC (rev 53627)
+++ scummvm/trunk/engines/saga/resource_res.cpp	2010-10-19 22:29:53 UTC (rev 53628)
@@ -139,7 +139,7 @@
 	}
 	free(resourcePointer);
 
-	_vm->_interface->_defPortraits.freeMem();
+	_vm->_interface->_defPortraits.clear();
 	_vm->_sprite->loadList(_metaResource.protagFaceSpritesID, _vm->_interface->_defPortraits);
 
 	_vm->_actor->_actorsStrings.freeMem();
@@ -148,10 +148,10 @@
 	_vm->loadStrings(_vm->_actor->_actorsStrings, resourcePointer, resourceLength);
 	free(resourcePointer);
 
-	_vm->_sprite->_inventorySprites.freeMem();
+	_vm->_sprite->_inventorySprites.clear();
 	_vm->_sprite->loadList(_metaResource.inventorySpritesID, _vm->_sprite->_inventorySprites);
 
-	_vm->_sprite->_mainSprites.freeMem();
+	_vm->_sprite->_mainSprites.clear();
 	_vm->_sprite->loadList(_metaResource.mainSpritesID, _vm->_sprite->_mainSprites);
 
 	_vm->_actor->loadObjList(_metaResource.objectCount, _metaResource.objectsResourceID);

Modified: scummvm/trunk/engines/saga/sprite.cpp
===================================================================
--- scummvm/trunk/engines/saga/sprite.cpp	2010-10-19 21:40:24 UTC (rev 53627)
+++ scummvm/trunk/engines/saga/sprite.cpp	2010-10-19 22:29:53 UTC (rev 53628)
@@ -78,12 +78,6 @@
 
 Sprite::~Sprite() {
 	debug(8, "Shutting down sprite subsystem...");
-	_mainSprites.freeMem();
-	if (_vm->getGameId() == GID_IHNM) {
-		_inventorySprites.freeMem();
-		_arrowSprites.freeMem();
-		_saveReminderSprites.freeMem();
-	}
 	free(_decodeBuf);
 }
 
@@ -94,7 +88,7 @@
 	uint16 oldSpriteCount;
 	uint16 newSpriteCount;
 	uint16 spriteCount;
-	int i;
+	uint i;
 	int outputLength, inputLength;
 	uint32 offset;
 	const byte *spritePointer;
@@ -112,22 +106,15 @@
 
 	debug(9, "Sprites: %d", spriteCount);
 
-	oldSpriteCount = spriteList.spriteCount;
-	newSpriteCount = spriteList.spriteCount + spriteCount;
+	oldSpriteCount = spriteList.size();
+	newSpriteCount = oldSpriteCount + spriteCount;
 
-	SpriteInfo *tmp = (SpriteInfo *)realloc(spriteList.infoList, newSpriteCount * sizeof(*spriteList.infoList));
-	if ((tmp != NULL) || (newSpriteCount == 0)) {
-		spriteList.infoList = tmp;
-	} else {
-		error("Sprite::loadList(): Error while reallocating memory");
-	}
+	spriteList.resize(newSpriteCount);
 
-	spriteList.spriteCount = newSpriteCount;
-
 	bool bigHeader = _vm->getGameId() == GID_IHNM || _vm->isMacResources();
 
-	for (i = oldSpriteCount; i < spriteList.spriteCount; i++) {
-		spriteInfo = &spriteList.infoList[i];
+	for (i = oldSpriteCount; i < spriteList.size(); i++) {
+		spriteInfo = &spriteList[i];
 		if (bigHeader)
 			offset = readS.readUint32();
 		else
@@ -136,7 +123,7 @@
 		if (offset >= spriteListLength) {
 			// ITE Mac demos throw this warning
 			warning("Sprite::loadList offset exceeded");
-			spriteList.spriteCount = i;
+			spriteList.resize(i);
 			return;
 		}
 
@@ -167,10 +154,8 @@
 		outputLength = spriteInfo->width * spriteInfo->height;
 		inputLength = spriteListLength - (spriteDataPointer - spriteListData);
 		decodeRLEBuffer(spriteDataPointer, inputLength, outputLength);
-		spriteInfo->decodedBuffer = (byte *) malloc(outputLength);
-		if (spriteInfo->decodedBuffer == NULL) {
-			memoryError("Sprite::loadList");
-		}
+		spriteInfo->decodedBuffer.resize(outputLength);
+		byte *dst = spriteInfo->getBuffer();
 
 #ifdef ENABLE_IHNM
 		// IHNM sprites are upside-down, for reasons which i can only
@@ -179,7 +164,6 @@
 
 		if (_vm->getGameId() == GID_IHNM) {
 			byte *src = _decodeBuf + spriteInfo->width * (spriteInfo->height - 1);
-			byte *dst = spriteInfo->decodedBuffer;
 
 			for (int j = 0; j < spriteInfo->height; j++) {
 				memcpy(dst, src, spriteInfo->width);
@@ -188,36 +172,36 @@
 			}
 		} else
 #endif
-			memcpy(spriteInfo->decodedBuffer, _decodeBuf, outputLength);
+			memcpy(dst, _decodeBuf, outputLength);
 	}
 
 	free(spriteListData);
 }
 
-void Sprite::getScaledSpriteBuffer(SpriteList &spriteList, int spriteNumber, int scale, int &width, int &height, int &xAlign, int &yAlign, const byte *&buffer) {
+void Sprite::getScaledSpriteBuffer(SpriteList &spriteList, uint spriteNumber, int scale, int &width, int &height, int &xAlign, int &yAlign, const byte *&buffer) {
 	SpriteInfo *spriteInfo;
 
-	if (spriteList.spriteCount <= spriteNumber) {
+	if (spriteList.size() <= spriteNumber) {
 		// this can occur in IHNM while loading a saved game from chapter 1-5 when being in the end chapter
-		warning("spriteList.spriteCount <= spriteNumber");
+		warning("spriteList.size() <= spriteNumber");
 		return;
 	}
 
-	spriteInfo = &spriteList.infoList[spriteNumber];
+	spriteInfo = &spriteList[spriteNumber];
 
 	if (scale < 256) {
 		xAlign = (spriteInfo->xAlign * scale) >> 8;
 		yAlign = (spriteInfo->yAlign * scale) >> 8;
 		height = (spriteInfo->height * scale + 0x7f) >> 8;
 		width = (spriteInfo->width * scale + 0x7f) >> 8;
-		scaleBuffer(spriteInfo->decodedBuffer, spriteInfo->width, spriteInfo->height, scale);
+		scaleBuffer(spriteInfo->getBuffer(), spriteInfo->width, spriteInfo->height, scale);
 		buffer = _decodeBuf;
 	} else {
 		xAlign = spriteInfo->xAlign;
 		yAlign = spriteInfo->yAlign;
 		height = spriteInfo->height;
 		width = spriteInfo->width;
-		buffer = spriteInfo->decodedBuffer;
+		buffer = spriteInfo->getBuffer();
 	}
 }
 
@@ -272,7 +256,7 @@
 		_vm->_render->addDirtyRect(Common::Rect(x1, y1, x2, y2));
 }
 
-void Sprite::draw(SpriteList &spriteList, int32 spriteNumber, const Point &screenCoord, int scale, bool clipToScene) {
+void Sprite::draw(SpriteList &spriteList, uint spriteNumber, const Point &screenCoord, int scale, bool clipToScene) {
 	const byte *spriteBuffer = NULL;
 	int width  = 0;
 	int height = 0;
@@ -288,7 +272,7 @@
 	drawClip(spritePointer, width, height, spriteBuffer, clipToScene);
 }
 
-void Sprite::draw(SpriteList &spriteList, int32 spriteNumber, const Rect &screenRect, int scale, bool clipToScene) {
+void Sprite::draw(SpriteList &spriteList, uint spriteNumber, const Rect &screenRect, int scale, bool clipToScene) {
 	const byte *spriteBuffer = NULL;
 	int width  = 0;
 	int height = 0;
@@ -312,7 +296,7 @@
 	drawClip(spritePointer, width, height, spriteBuffer, clipToScene);
 }
 
-bool Sprite::hitTest(SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, const Point &testPoint) {
+bool Sprite::hitTest(SpriteList &spriteList, uint spriteNumber, const Point &screenCoord, int scale, const Point &testPoint) {
 	const byte *spriteBuffer = NULL;
 	int i, j;
 	const byte *srcRowPointer;
@@ -339,7 +323,7 @@
 	return *srcRowPointer != 0;
 }
 
-void Sprite::drawOccluded(SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, int depth) {
+void Sprite::drawOccluded(SpriteList &spriteList, uint spriteNumber, const Point &screenCoord, int scale, int depth) {
 	const byte *spriteBuffer = NULL;
 	int x, y;
 	byte *destRowPointer;

Modified: scummvm/trunk/engines/saga/sprite.h
===================================================================
--- scummvm/trunk/engines/saga/sprite.h	2010-10-19 21:40:24 UTC (rev 53627)
+++ scummvm/trunk/engines/saga/sprite.h	2010-10-19 22:29:53 UTC (rev 53628)
@@ -36,32 +36,29 @@
 #define DECODE_BUF_LEN 64000
 
 struct SpriteInfo {
-	byte *decodedBuffer;
+	Common::Array<byte> decodedBuffer;
 	int width;
 	int height;
 	int xAlign;
 	int yAlign;
-};
 
-struct SpriteList {
-	int spriteListResourceId;
-	int spriteCount;
-	SpriteInfo *infoList;
-
-	void freeMem() {
-		for (int i = 0; i < spriteCount; i++) {
-			free(infoList[i].decodedBuffer);
+	byte * getBuffer() {
+		if (decodedBuffer.empty()) {
+			return NULL;
+		} else {
+			return &decodedBuffer.front();
 		}
-		free(infoList);
-		memset(this, 0, sizeof(*this));
 	}
 
-	SpriteList() {
-		memset(this, 0, sizeof(*this));
+	SpriteInfo() : width(0), height(0), xAlign(0), yAlign(0) {
 	}
 };
 
+class SpriteList : public Common::Array<SpriteInfo> {
+//	int spriteListResourceId;
+};
 
+
 class Sprite {
 public:
 	SpriteList _mainSprites;
@@ -73,19 +70,19 @@
 	~Sprite();
 
 	// draw scaled sprite using background scene mask
-	void drawOccluded(SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, int depth);
+	void drawOccluded(SpriteList &spriteList, uint spriteNumber, const Point &screenCoord, int scale, int depth);
 
 	// draw scaled sprite using background scene mask
-	void draw(SpriteList &spriteList, int32 spriteNumber, const Point &screenCoord, int scale, bool clipToScene = false);
+	void draw(SpriteList &spriteList, uint spriteNumber, const Point &screenCoord, int scale, bool clipToScene = false);
 
 	// main function
 	void drawClip(const Point &spritePointer, int width, int height, const byte *spriteBuffer, bool clipToScene = false);
 
-	void draw(SpriteList &spriteList, int32 spriteNumber, const Rect &screenRect, int scale, bool clipToScene = false);
+	void draw(SpriteList &spriteList, uint spriteNumber, const Rect &screenRect, int scale, bool clipToScene = false);
 
 	void loadList(int resourceId, SpriteList &spriteList); // load or append spriteList
-	bool hitTest(SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, const Point &testPoint);
-	void getScaledSpriteBuffer(SpriteList &spriteList, int spriteNumber, int scale, int &width, int &height, int &xAlign, int &yAlign, const byte *&buffer);
+	bool hitTest(SpriteList &spriteList, uint spriteNumber, const Point &screenCoord, int scale, const Point &testPoint);
+	void getScaledSpriteBuffer(SpriteList &spriteList, uint spriteNumber, int scale, int &width, int &height, int &xAlign, int &yAlign, const byte *&buffer);
 
 private:
 	void decodeRLEBuffer(const byte *inputBuffer, size_t inLength, size_t outLength);


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