diff options
| author | Colin Snover | 2017-11-16 10:31:59 -0600 | 
|---|---|---|
| committer | Eugene Sandulenko | 2017-11-18 22:35:12 +0100 | 
| commit | 715d4bd76ab749b88f888ea8196ce252de6140ad (patch) | |
| tree | e781ceb72a4061dbd2cc4c96cd921c1aaf60737e /engines/fullpipe/statics.cpp | |
| parent | 6a13592633a6a4cf935409edd1c5504ef7dfa75e (diff) | |
| download | scummvm-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.cpp | 146 | 
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) { | 
