aboutsummaryrefslogtreecommitdiff
path: root/engines/fullpipe/statics.cpp
diff options
context:
space:
mode:
authorColin Snover2017-11-16 10:31:59 -0600
committerEugene Sandulenko2017-11-18 22:35:12 +0100
commit715d4bd76ab749b88f888ea8196ce252de6140ad (patch)
treee781ceb72a4061dbd2cc4c96cd921c1aaf60737e /engines/fullpipe/statics.cpp
parent6a13592633a6a4cf935409edd1c5504ef7dfa75e (diff)
downloadscummvm-rg350-715d4bd76ab749b88f888ea8196ce252de6140ad.tar.gz
scummvm-rg350-715d4bd76ab749b88f888ea8196ce252de6140ad.tar.bz2
scummvm-rg350-715d4bd76ab749b88f888ea8196ce252de6140ad.zip
FULLPIPE: Fix memory leaks, ownership issues with various point lists
Diffstat (limited to 'engines/fullpipe/statics.cpp')
-rw-r--r--engines/fullpipe/statics.cpp146
1 files changed, 56 insertions, 90 deletions
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp
index 8c2807fb08..c1daea0c64 100644
--- a/engines/fullpipe/statics.cpp
+++ b/engines/fullpipe/statics.cpp
@@ -35,56 +35,37 @@
namespace Fullpipe {
StepArray::StepArray() {
- _points = 0;
- _maxPointIndex = 0;
_currPointIndex = 0;
- _pointsCount = 0;
- _isEos = 0;
-}
-
-StepArray::~StepArray() {
- if (_pointsCount) {
- for (int i = 0; i < _pointsCount; i++)
- delete _points[i];
-
- free(_points);
-
- _points = 0;
- }
+ _isEos = false;
}
void StepArray::clear() {
_currPointIndex = 0;
- _maxPointIndex = 0;
- _isEos = 0;
-
- for (int i = 0; i < _pointsCount; i++) {
- _points[i]->x = 0;
- _points[i]->y = 0;
- }
+ _isEos = false;
+ _points.clear();
}
Common::Point StepArray::getCurrPoint() const {
- if (_isEos || _points == 0) {
+ if (_isEos || !_points.size()) {
return Common::Point();
}
- return Common::Point(_points[_currPointIndex]->x,
- _points[_currPointIndex]->y);
+ return Common::Point(_points[_currPointIndex].x,
+ _points[_currPointIndex].y);
}
Common::Point StepArray::getPoint(int index, int offset) const {
if (index == -1)
index = _currPointIndex;
- if (index + offset > _maxPointIndex - 1)
- offset = _maxPointIndex - index;
+ if (index + offset > getPointsCount() - 1)
+ offset = getPointsCount() - index;
Common::Point point;
while (offset >= 1) {
- point.x += _points[index]->x;
- point.y += _points[index]->y;
+ point.x += _points[index].x;
+ point.y += _points[index].y;
index++;
offset--;
@@ -94,33 +75,18 @@ Common::Point StepArray::getPoint(int index, int offset) const {
}
bool StepArray::gotoNextPoint() {
- if (_currPointIndex < _maxPointIndex - 1) {
+ if (_currPointIndex < getPointsCount() - 1) {
_currPointIndex++;
return true;
} else {
- _isEos = 1;
+ _isEos = true;
return false;
}
}
-void StepArray::insertPoints(Common::Point **points, int pointsCount) {
- if (_currPointIndex + pointsCount >= _pointsCount) {
- _points = (Common::Point **)realloc(_points, sizeof(Common::Point *) * (_pointsCount + pointsCount));
-
- if (!_points) {
- error("Out of memory at StepArray::insertPoints()");
- }
-
- for(int i = 0; i < pointsCount; i++)
- _points[_pointsCount + i] = new Common::Point;
-
- _pointsCount += pointsCount;
- }
-
- _maxPointIndex = _currPointIndex + pointsCount;
-
- for (int i = 0; i < pointsCount; i++)
- *_points[_currPointIndex + i] = *points[i];
+void StepArray::insertPoints(const PointList &points) {
+ _points.resize(_currPointIndex + points.size());
+ Common::copy(points.begin(), points.end(), _points.begin() + _currPointIndex);
}
StaticANIObject::StaticANIObject() {
@@ -179,7 +145,7 @@ StaticANIObject::StaticANIObject(StaticANIObject *src) : GameObject(src) {
_objtype = kObjTypeStaticANIObject;
for (uint i = 0; i < src->_staticsList.size(); i++)
- _staticsList.push_back(new Statics(*src->_staticsList[i], false));
+ _staticsList.push_back(new Statics(src->_staticsList[i], false));
_movement = 0;
_statics = 0;
@@ -427,7 +393,7 @@ Movement *StaticANIObject::getMovementById(int itemId) {
return 0;
}
-int StaticANIObject::getMovementIdById(int itemId) {
+int StaticANIObject::getMovementIdById(int itemId) const {
for (uint i = 0; i < _movements.size(); i++) {
Movement *mov = _movements[i];
@@ -581,7 +547,7 @@ Statics *StaticANIObject::addReverseStatics(Statics *st) {
Statics *res = getStaticsById(st->_staticsId ^ 0x4000);
if (!res) {
- res = new Statics(*st, true);
+ res = new Statics(st, true);
_staticsList.push_back(res);
}
@@ -1169,7 +1135,7 @@ void StaticANIObject::playIdle() {
adjustSomeXY();
}
-void StaticANIObject::startAnimSteps(int movementId, int messageQueueId, int x, int y, Common::Point **points, int pointsCount, int someDynamicPhaseIndex) {
+void StaticANIObject::startAnimSteps(int movementId, int messageQueueId, int x, int y, const PointList &points, int someDynamicPhaseIndex) {
Movement *mov = 0;
if (!(_flags & 0x80)) {
@@ -1205,7 +1171,7 @@ void StaticANIObject::startAnimSteps(int movementId, int messageQueueId, int x,
_movement->gotoFirstFrame();
_stepArray.clear();
- _stepArray.insertPoints(points, pointsCount);
+ _stepArray.insertPoints(points);
if (!(_flags & 0x40)) {
if (!_movement->_currDynamicPhaseIndex) {
@@ -1393,17 +1359,17 @@ Statics::Statics() {
_data = nullptr;
}
-Statics::Statics(Statics &src, bool reverse) : DynamicPhase(src, reverse) {
- _staticsId = src._staticsId;
+Statics::Statics(Statics *src, bool reverse) : DynamicPhase(src, reverse) {
+ _staticsId = src->_staticsId;
if (reverse) {
_staticsId ^= 0x4000;
- _staticsName = sO_MirroredTo + src._staticsName;
+ _staticsName = sO_MirroredTo + src->_staticsName;
} else {
- _staticsName = src._staticsName;
+ _staticsName = src->_staticsName;
}
- _memfilename = src._memfilename;
+ _memfilename = src->_memfilename;
}
bool Statics::load(MfcArchive &file) {
@@ -1582,7 +1548,7 @@ Movement::Movement(Movement *src, int *oldIdxs, int newSize, StaticANIObject *an
src->setDynamicPhaseIndex(i);
if (i < newSize - 1)
- _dynamicPhases.push_back(new DynamicPhase(*src->_currDynamicPhase, 0));
+ _dynamicPhases.push_back(new DynamicPhase(src->_currDynamicPhase, 0));
_framePosOffsets[i].x = src->_framePosOffsets[i].x;
_framePosOffsets[i].y = src->_framePosOffsets[i].y;
@@ -2106,18 +2072,18 @@ DynamicPhase::DynamicPhase() {
_data = nullptr;
}
-DynamicPhase::DynamicPhase(DynamicPhase &src, bool reverse) {
- _field_7C = src._field_7C;
+DynamicPhase::DynamicPhase(DynamicPhase *src, bool reverse) {
+ _field_7C = src->_field_7C;
_field_7E = 0;
debugC(1, kDebugAnimation, "DynamicPhase::DynamicPhase(src, %d)", reverse);
if (reverse) {
- if (!src._bitmap)
- src.init();
+ if (!src->_bitmap)
+ src->init();
- _bitmap.reset(src._bitmap->reverseImage());
- _dataSize = src._dataSize;
+ _bitmap.reset(src->_bitmap->reverseImage());
+ _dataSize = src->_dataSize;
if (g_fp->_currArchive) {
_mfield_14 = 0;
@@ -2126,45 +2092,45 @@ DynamicPhase::DynamicPhase(DynamicPhase &src, bool reverse) {
_mflags |= 1;
- _someX = src._someX;
- _someY = src._someY;
+ _someX = src->_someX;
+ _someY = src->_someY;
} else {
- _mfield_14 = src._mfield_14;
- _mfield_8 = src._mfield_8;
- _mflags = src._mflags;
+ _mfield_14 = src->_mfield_14;
+ _mfield_8 = src->_mfield_8;
+ _mflags = src->_mflags;
- _memfilename = src._memfilename;
- _dataSize = src._dataSize;
- _mfield_10 = src._mfield_10;
- _libHandle = src._libHandle;
+ _memfilename = src->_memfilename;
+ _dataSize = src->_dataSize;
+ _mfield_10 = src->_mfield_10;
+ _libHandle = src->_libHandle;
- if (src._bitmap) {
+ if (src->_bitmap) {
_field_54 = 1;
- _bitmap.reset(src._bitmap->reverseImage(false));
+ _bitmap.reset(src->_bitmap->reverseImage(false));
}
- _someX = src._someX;
- _someY = src._someY;
+ _someX = src->_someX;
+ _someY = src->_someY;
}
- _rect = src._rect;
+ _rect = src->_rect;
- _width = src._width;
- _height = src._height;
- _field_7C = src._field_7C;
+ _width = src->_width;
+ _height = src->_height;
+ _field_7C = src->_field_7C;
- if (src.getExCommand())
- _exCommand = src.getExCommand()->createClone();
+ if (src->getExCommand())
+ _exCommand = src->getExCommand()->createClone();
else
_exCommand = 0;
- _initialCountdown = src._initialCountdown;
- _field_6A = src._field_6A;
- _dynFlags = src._dynFlags;
+ _initialCountdown = src->_initialCountdown;
+ _field_6A = src->_field_6A;
+ _dynFlags = src->_dynFlags;
- setPaletteData(src.getPaletteData());
+ setPaletteData(src->getPaletteData());
- copyMemoryObject2(src);
+ copyMemoryObject2(*src);
}
bool DynamicPhase::load(MfcArchive &file) {