aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorAndrew Kurushin2010-10-19 22:29:53 +0000
committerAndrew Kurushin2010-10-19 22:29:53 +0000
commite4029f6f0e5aa9dc679ce875fb7625c564c69144 (patch)
tree7a1510db216ad36d78e637cbef959b54614ab90e /engines
parentbfb0986cd4f73e564384f513daeba9e7938dcb4d (diff)
downloadscummvm-rg350-e4029f6f0e5aa9dc679ce875fb7625c564c69144.tar.gz
scummvm-rg350-e4029f6f0e5aa9dc679ce875fb7625c564c69144.tar.bz2
scummvm-rg350-e4029f6f0e5aa9dc679ce875fb7625c564c69144.zip
SAGA: SAGA: replace SpriteList "::realloc" with Common::Array
svn-id: r53628
Diffstat (limited to 'engines')
-rw-r--r--engines/saga/actor.cpp23
-rw-r--r--engines/saga/actor.h1
-rw-r--r--engines/saga/actor_walk.cpp2
-rw-r--r--engines/saga/interface.cpp17
-rw-r--r--engines/saga/puzzle.cpp4
-rw-r--r--engines/saga/resource_res.cpp6
-rw-r--r--engines/saga/sprite.cpp56
-rw-r--r--engines/saga/sprite.h35
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<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:
@@ -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);