From a2b4d637dbd70f084e1bda94d67f5b197a5d2a21 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 22 Mar 2017 03:02:58 +0200 Subject: FULLPIPE: Change _staticsName to be a Common::String --- engines/fullpipe/statics.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) (limited to 'engines/fullpipe/statics.cpp') diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index bc66ebf40b..e87cf02a42 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -420,7 +420,7 @@ Statics *StaticANIObject::getStaticsById(int itemId) { Statics *StaticANIObject::getStaticsByName(char *name) { for (uint i = 0; i < _staticsList.size(); i++) - if (!strcmp(_staticsList[i]->_staticsName, name)) + if (_staticsList[i]->_staticsName == name) return _staticsList[i]; return 0; @@ -1430,12 +1430,10 @@ Common::Point *StaticANIObject::calcStepLen(Common::Point *p) { Statics::Statics() { _staticsId = 0; _picture = 0; - _staticsName = 0; } Statics::~Statics() { delete _picture; - free(_staticsName); } Statics::Statics(Statics *src, bool reverse) : DynamicPhase(src, reverse) { @@ -1443,13 +1441,9 @@ Statics::Statics(Statics *src, bool reverse) : DynamicPhase(src, reverse) { if (reverse) { _staticsId ^= 0x4000; - int newlen = strlen(src->_staticsName) + strlen(sO_MirroredTo) + 1; - _staticsName = (char *)calloc(newlen, 1); - - snprintf(_staticsName, newlen, "%s%s", sO_MirroredTo, src->_staticsName); + _staticsName = sO_MirroredTo + src->_staticsName; } else { - _staticsName = (char *)calloc(strlen(src->_staticsName) + 1, 1); - strncpy(_staticsName, src->_staticsName, strlen(src->_staticsName) + 1); + _staticsName = src->_staticsName; } _memfilename = (char *)calloc(strlen(src->_memfilename) + 1, 1); @@ -1466,7 +1460,7 @@ bool Statics::load(MfcArchive &file) { _staticsId = file.readUint16LE(); _staticsName = file.readPascalString(); - debugC(7, kDebugLoading, "statics: <%s> id: %d (%x)", transCyrillic((byte *)_staticsName), _staticsId, _staticsId); + debugC(7, kDebugLoading, "statics: <%s> id: %d (%x)", transCyrillic((byte *)_staticsName.c_str()), _staticsId, _staticsId); _picture = new Picture(); _picture->load(file); -- cgit v1.2.3 From 93e93b56405cc395e723cd43e7ed0008173eab18 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 22 Mar 2017 03:10:32 +0200 Subject: FULLPIPE: Use Common::String with _memfilename and loadFile() There are several calls to loadFile() with _memfilename, which is why these two changes are interconnected --- engines/fullpipe/statics.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'engines/fullpipe/statics.cpp') diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index e87cf02a42..25aef988b5 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -1446,8 +1446,7 @@ Statics::Statics(Statics *src, bool reverse) : DynamicPhase(src, reverse) { _staticsName = src->_staticsName; } - _memfilename = (char *)calloc(strlen(src->_memfilename) + 1, 1); - strncpy(_memfilename, src->_memfilename, strlen(src->_memfilename) + 1); + _memfilename = src->_memfilename; _picture = new Picture(); } @@ -2236,8 +2235,7 @@ DynamicPhase::DynamicPhase(DynamicPhase *src, bool reverse) { _mfield_8 = src->_mfield_8; _mflags = src->_mflags; - _memfilename = (char *)calloc(strlen(src->_memfilename) + 1, 1); - strncpy(_memfilename, src->_memfilename, strlen(src->_memfilename) + 1); + _memfilename = src->_memfilename; _dataSize = src->_dataSize; _mfield_10 = src->_mfield_10; _libHandle = src->_libHandle; -- cgit v1.2.3 From 728b23af2ad939e3da920a41b85730689a1aa71f Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 22 Mar 2017 04:07:33 +0200 Subject: FULLPIPE: Change transCyrillic() to accept a Common::String --- engines/fullpipe/statics.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'engines/fullpipe/statics.cpp') diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index 25aef988b5..5dee183aff 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -605,7 +605,7 @@ void StaticANIObject::draw() { Common::Point point; Common::Rect rect; - debugC(6, kDebugDrawing, "StaticANIObject::draw() (%s) [%d] [%d, %d]", transCyrillic((byte *)_objectName), _id, _ox, _oy); + debugC(6, kDebugDrawing, "StaticANIObject::draw() (%s) [%d] [%d, %d]", transCyrillic(_objectName), _id, _ox, _oy); if (_shadowsOn && g_fp->_currentScene && g_fp->_currentScene->_shadows && (getCurrDimensions(point)->x != 1 || getCurrDimensions(point)->y != 1)) { @@ -665,7 +665,7 @@ void StaticANIObject::draw() { } void StaticANIObject::draw2() { - debugC(6, kDebugDrawing, "StatciANIObject::draw2(): id: (%s) %d [%d, %d]", transCyrillic((byte *)_objectName), _id, _ox, _oy); + debugC(6, kDebugDrawing, "StatciANIObject::draw2(): id: (%s) %d [%d, %d]", transCyrillic(_objectName), _id, _ox, _oy); if ((_flags & 4) && (_flags & 0x10)) { if (_movement) { @@ -790,7 +790,7 @@ Common::Point *StaticANIObject::getSomeXY(Common::Point &p) { void StaticANIObject::update(int counterdiff) { int mqid; - debugC(6, kDebugAnimation, "StaticANIObject::update() (%s) [%d] [%d, %d] fl: %x", transCyrillic((byte *)_objectName), _id, _ox, _oy, _flags); + debugC(6, kDebugAnimation, "StaticANIObject::update() (%s) [%d] [%d, %d] fl: %x", transCyrillic(_objectName), _id, _ox, _oy, _flags); if (_flags & 2) { _messageNum--; @@ -1300,7 +1300,7 @@ bool StaticANIObject::startAnim(int movementId, int messageQueueId, int dynPhase if (_flags & 0x80) return false; - debugC(4, kDebugAnimation, "StaticANIObject::startAnim(%d, %d, %d) (%s [%d]) [%d, %d]", movementId, messageQueueId, dynPhaseIdx, transCyrillic((byte *)_objectName), _id, _ox, _oy); + debugC(4, kDebugAnimation, "StaticANIObject::startAnim(%d, %d, %d) (%s [%d]) [%d, %d]", movementId, messageQueueId, dynPhaseIdx, transCyrillic(_objectName), _id, _ox, _oy); if (_messageQueueId) { updateGlobalMessageQueue(messageQueueId, _id); @@ -1459,7 +1459,7 @@ bool Statics::load(MfcArchive &file) { _staticsId = file.readUint16LE(); _staticsName = file.readPascalString(); - debugC(7, kDebugLoading, "statics: <%s> id: %d (%x)", transCyrillic((byte *)_staticsName.c_str()), _staticsId, _staticsId); + debugC(7, kDebugLoading, "statics: <%s> id: %d (%x)", transCyrillic(_staticsName), _staticsId, _staticsId); _picture = new Picture(); _picture->load(file); -- cgit v1.2.3 From f3e81b5f17872186f7c67a551876dd78f268865c Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 22 Mar 2017 04:11:49 +0200 Subject: FULLPIPE: Use Common::String in all scene object names --- engines/fullpipe/statics.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'engines/fullpipe/statics.cpp') diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index 5dee183aff..5c83114e10 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -452,7 +452,7 @@ int StaticANIObject::getMovementIdById(int itemId) { Movement *StaticANIObject::getMovementByName(char *name) { for (uint i = 0; i < _movements.size(); i++) - if (!strcmp(_movements[i]->_objectName, name)) + if (_movements[i]->_objectName == name) return _movements[i]; return 0; @@ -681,7 +681,7 @@ void StaticANIObject::draw2() { } MovTable *StaticANIObject::countMovements() { - GameVar *preloadSubVar = g_fp->getGameLoaderGameVar()->getSubVarByName(getName())->getSubVarByName("PRELOAD"); + GameVar *preloadSubVar = g_fp->getGameLoaderGameVar()->getSubVarByName(getName().c_str())->getSubVarByName("PRELOAD"); if (!preloadSubVar || preloadSubVar->getSubVarsCount() == 0) return 0; @@ -695,7 +695,7 @@ MovTable *StaticANIObject::countMovements() { movTable->movs[i] = 2; for (GameVar *sub = preloadSubVar->_subVars; sub; sub = sub->_nextVarObj) { - if (scumm_stricmp(_movements[i]->getName(), sub->_varName) == 0) { + if (scumm_stricmp(_movements[i]->getName().c_str(), sub->_varName.c_str()) == 0) { movTable->movs[i] = 1; break; } @@ -706,7 +706,7 @@ MovTable *StaticANIObject::countMovements() { } void StaticANIObject::setSpeed(int speed) { - GameVar *var = g_fp->getGameLoaderGameVar()->getSubVarByName(getName())->getSubVarByName("SpeedUp"); + GameVar *var = g_fp->getGameLoaderGameVar()->getSubVarByName(getName().c_str())->getSubVarByName("SpeedUp"); if (!var) return; -- cgit v1.2.3 From 93982b2ca9b67cd143f603f516570e269f28fa32 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 22 Mar 2017 04:32:23 +0200 Subject: FULLPIPE: Change more object-related functions to use Common::String --- engines/fullpipe/statics.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'engines/fullpipe/statics.cpp') diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index 5c83114e10..5032ca719f 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -418,7 +418,7 @@ Statics *StaticANIObject::getStaticsById(int itemId) { return 0; } -Statics *StaticANIObject::getStaticsByName(char *name) { +Statics *StaticANIObject::getStaticsByName(Common::String &name) { for (uint i = 0; i < _staticsList.size(); i++) if (_staticsList[i]->_staticsName == name) return _staticsList[i]; @@ -450,7 +450,7 @@ int StaticANIObject::getMovementIdById(int itemId) { return 0; } -Movement *StaticANIObject::getMovementByName(char *name) { +Movement *StaticANIObject::getMovementByName(Common::String &name) { for (uint i = 0; i < _movements.size(); i++) if (_movements[i]->_objectName == name) return _movements[i]; @@ -681,7 +681,7 @@ void StaticANIObject::draw2() { } MovTable *StaticANIObject::countMovements() { - GameVar *preloadSubVar = g_fp->getGameLoaderGameVar()->getSubVarByName(getName().c_str())->getSubVarByName("PRELOAD"); + GameVar *preloadSubVar = g_fp->getGameLoaderGameVar()->getSubVarByName(getName())->getSubVarByName("PRELOAD"); if (!preloadSubVar || preloadSubVar->getSubVarsCount() == 0) return 0; @@ -706,7 +706,7 @@ MovTable *StaticANIObject::countMovements() { } void StaticANIObject::setSpeed(int speed) { - GameVar *var = g_fp->getGameLoaderGameVar()->getSubVarByName(getName().c_str())->getSubVarByName("SpeedUp"); + GameVar *var = g_fp->getGameLoaderGameVar()->getSubVarByName(getName())->getSubVarByName("SpeedUp"); if (!var) return; -- cgit v1.2.3 From 2649e2b1fc9d0ab0d5d648602f3d6b936e94dbdb Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 22 Mar 2017 04:50:37 +0200 Subject: FULLPIPE: Change genFileName() and loadFile() to use Common::String --- engines/fullpipe/statics.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'engines/fullpipe/statics.cpp') diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index 5032ca719f..8806ce9d05 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -223,7 +223,7 @@ bool StaticANIObject::load(MfcArchive &file) { for (int i = 0; i < count; i++) { int movNum = file.readUint16LE(); - char *movname = genFileName(_id, movNum, "mov"); + Common::String movname = genFileName(_id, movNum, "mov"); Common::SeekableReadStream *f = g_fp->_currArchive->createReadStreamForMember(movname); @@ -236,7 +236,6 @@ bool StaticANIObject::load(MfcArchive &file) { _movements.push_back(mov); delete f; - free(movname); } Common::Point pt; -- cgit v1.2.3 From 808e465e7e684df6b3f4d5ef56633e2dcca2d94e Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 22 Mar 2017 22:58:22 +0200 Subject: FULLPIPE: _data is unused in the Statics and DynamicPhase classes --- engines/fullpipe/statics.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'engines/fullpipe/statics.cpp') diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index 8806ce9d05..e77398287a 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -1428,7 +1428,8 @@ Common::Point *StaticANIObject::calcStepLen(Common::Point *p) { Statics::Statics() { _staticsId = 0; - _picture = 0; + _picture = nullptr; + _data = nullptr; } Statics::~Statics() { @@ -1474,7 +1475,6 @@ void Statics::init() { freePixelData(); // TODO: properly dispose old _bitmap _bitmap = reversed; - // _data = ... // useless? } } @@ -2199,6 +2199,7 @@ DynamicPhase::DynamicPhase() { _field_7E = 0; _dynFlags = 0; _someY = 0; + _data = nullptr; } DynamicPhase::~DynamicPhase() { @@ -2217,7 +2218,6 @@ DynamicPhase::DynamicPhase(DynamicPhase *src, bool reverse) { src->init(); _bitmap = src->_bitmap->reverseImage(); - _data = _bitmap->_pixels; _dataSize = src->_dataSize; if (g_fp->_currArchive) { -- cgit v1.2.3 From 8bc03c87c519350344c53ca2e5573d5a6e54368a Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 22 Mar 2017 23:02:52 +0200 Subject: FULLPIPE: Fix corruption in flipped bitmaps The TODO in the code in question should be reviewed, but the call to freePixelData() unconditionally deleted the original bitmap, which is not correct --- engines/fullpipe/statics.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'engines/fullpipe/statics.cpp') diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index e77398287a..58dd00e72a 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -1472,8 +1472,9 @@ void Statics::init() { if (_staticsId & 0x4000) { Bitmap *reversed = _bitmap->reverseImage(); - freePixelData(); // TODO: properly dispose old _bitmap + // Enabling the call below causes corruption in flipped bitmaps + //freePixelData(); _bitmap = reversed; } } -- cgit v1.2.3 From 3e515890e86e924f7fa270acec0de6462a2bc0d1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 22 Mar 2017 23:05:38 +0200 Subject: FULLPIPE: Plug a memory leak in _dynamicPhases Free the pixel data of each entry in the _dynamicPhases array before emptying it --- engines/fullpipe/statics.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'engines/fullpipe/statics.cpp') diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index 58dd00e72a..447b78a3e1 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -1538,6 +1538,10 @@ Movement::~Movement() { if (_updateFlag1) _dynamicPhases.remove_at(0); + // FIXME: At this point, the last entry in _dynamicPhases is invalid + for (uint i = 0; i < _dynamicPhases.size() - 1; i++) + _dynamicPhases[i]->freePixelData(); + _dynamicPhases.clear(); } -- cgit v1.2.3