From e4029f6f0e5aa9dc679ce875fb7625c564c69144 Mon Sep 17 00:00:00 2001 From: Andrew Kurushin Date: Tue, 19 Oct 2010 22:29:53 +0000 Subject: SAGA: SAGA: replace SpriteList "::realloc" with Common::Array svn-id: r53628 --- engines/saga/actor.cpp | 23 +++++++++--------- engines/saga/actor.h | 1 - engines/saga/actor_walk.cpp | 2 +- engines/saga/interface.cpp | 17 +++---------- engines/saga/puzzle.cpp | 4 ++-- engines/saga/resource_res.cpp | 6 ++--- engines/saga/sprite.cpp | 56 ++++++++++++++++--------------------------- engines/saga/sprite.h | 35 +++++++++++++-------------- 8 files changed, 56 insertions(+), 88 deletions(-) diff --git a/engines/saga/actor.cpp b/engines/saga/actor.cpp index 70ca8b5fef..0dfe2294b5 100644 --- a/engines/saga/actor.cpp +++ b/engines/saga/actor.cpp @@ -48,8 +48,8 @@ ActorData::ActorData() { ActorData::~ActorData() { if (!_shareFrames) free(_frames); - freeSpriteList(); } + void ActorData::saveState(Common::OutSaveFile *out) { uint i = 0; CommonObjectData::saveState(out); @@ -151,10 +151,6 @@ void ActorData::addWalkStepPoint(const Point &point) { _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::freeActorList() { } 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 @@ void Actor::loadActorSpriteList(ActorData *actor) { 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 @@ bool Actor::getSpriteParams(CommonObjectData *commonObjectData, int &frameNumber 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); diff --git a/engines/saga/actor.h b/engines/saga/actor.h index 7073adcdcc..7b287177ff 100644 --- a/engines/saga/actor.h +++ b/engines/saga/actor.h @@ -396,7 +396,6 @@ public: void cycleWrap(int cycleLimit); void addWalkStepPoint(const Point &point); - void freeSpriteList(); }; struct ProtagStateData { diff --git a/engines/saga/actor_walk.cpp b/engines/saga/actor_walk.cpp index 21643ac1de..589bc89c85 100644 --- a/engines/saga/actor_walk.cpp +++ b/engines/saga/actor_walk.cpp @@ -199,7 +199,7 @@ void Actor::updateActorsScene(int actorsEntrance) { for (i = 0; i < _actorsCount; i++) { actor = _actors[i]; actor->_inScene = false; - actor->_spriteList.freeMem(); + actor->_spriteList.clear(); if (actor->_disabled) { continue; } diff --git a/engines/saga/interface.cpp b/engines/saga/interface.cpp index 8d89a6fbdb..362d4ffdc0 100644 --- a/engines/saga/interface.cpp +++ b/engines/saga/interface.cpp @@ -197,7 +197,7 @@ Interface::Interface(SagaEngine *vm) : _vm(vm) { } else { _optionPanel.buttons = NULL; _optionPanel.buttonsCount = 0; - _optionPanel.sprites.spriteCount = 0; + _optionPanel.sprites.clear(); } #ifdef ENABLE_IHNM @@ -353,17 +353,6 @@ Interface::~Interface() { 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::setStatusText(const char *text, int statusColor) { } void Interface::loadScenePortraits(int resourceId) { - _scenePortraits.freeMem(); + _scenePortraits.clear(); _vm->_sprite->loadList(resourceId, _scenePortraits); } @@ -847,7 +836,7 @@ void Interface::draw() { // 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); diff --git a/engines/saga/puzzle.cpp b/engines/saga/puzzle.cpp index 73839eb6ea..af81c3c670 100644 --- a/engines/saga/puzzle.cpp +++ b/engines/saga/puzzle.cpp @@ -172,7 +172,7 @@ void Puzzle::initPieces() { _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 @@ void Puzzle::dropPiece(Point mousePt) { if (newy < boxy) newy = PUZZLE_Y_OFFSET; - spI = &(spriteList->infoList[_puzzlePiece]); + spI = &((*spriteList)[_puzzlePiece]); if (newx + spI->width > boxw) newx = boxw - spI->width ; diff --git a/engines/saga/resource_res.cpp b/engines/saga/resource_res.cpp index 8546030241..848d14436a 100644 --- a/engines/saga/resource_res.cpp +++ b/engines/saga/resource_res.cpp @@ -139,7 +139,7 @@ void Resource_RES::loadGlobalResources(int chapter, int actorsEntrance) { } 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 @@ void Resource_RES::loadGlobalResources(int chapter, int actorsEntrance) { _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); diff --git a/engines/saga/sprite.cpp b/engines/saga/sprite.cpp index a62f7c57eb..184e728552 100644 --- a/engines/saga/sprite.cpp +++ b/engines/saga/sprite.cpp @@ -78,12 +78,6 @@ Sprite::Sprite(SagaEngine *vm) : _vm(vm) { 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 @@ void Sprite::loadList(int resourceId, SpriteList &spriteList) { uint16 oldSpriteCount; uint16 newSpriteCount; uint16 spriteCount; - int i; + uint i; int outputLength, inputLength; uint32 offset; const byte *spritePointer; @@ -112,22 +106,15 @@ void Sprite::loadList(int resourceId, SpriteList &spriteList) { 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.spriteCount = newSpriteCount; + spriteList.resize(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 @@ void Sprite::loadList(int resourceId, SpriteList &spriteList) { 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 @@ void Sprite::loadList(int resourceId, SpriteList &spriteList) { 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 @@ void Sprite::loadList(int resourceId, SpriteList &spriteList) { 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 @@ void Sprite::loadList(int resourceId, SpriteList &spriteList) { } } 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 @@ void Sprite::drawClip(const Point &spritePointer, int width, int height, const b _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 @@ void Sprite::draw(SpriteList &spriteList, int32 spriteNumber, const Point &scree 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 @@ void Sprite::draw(SpriteList &spriteList, int32 spriteNumber, const Rect &screen 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 @@ bool Sprite::hitTest(SpriteList &spriteList, int spriteNumber, const Point &scre 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; diff --git a/engines/saga/sprite.h b/engines/saga/sprite.h index b7365fd28f..f429d1f4e8 100644 --- a/engines/saga/sprite.h +++ b/engines/saga/sprite.h @@ -36,31 +36,28 @@ namespace Saga { #define DECODE_BUF_LEN 64000 struct SpriteInfo { - byte *decodedBuffer; + Common::Array 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 { +// int spriteListResourceId; +}; + class Sprite { public: @@ -73,19 +70,19 @@ public: ~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); -- cgit v1.2.3