aboutsummaryrefslogtreecommitdiff
path: root/engines/toon/toon.cpp
diff options
context:
space:
mode:
authorSylvain Dupont2010-11-13 02:44:34 +0000
committerSylvain Dupont2010-11-13 02:44:34 +0000
commita373bd4a5385dd251298ad41ca1701bec2331197 (patch)
treea01284eb1a796251c1cbb12a876f9b09fb308c90 /engines/toon/toon.cpp
parent420c2c9ff2087ce8878dacc4bdb0df3d67e89e34 (diff)
downloadscummvm-rg350-a373bd4a5385dd251298ad41ca1701bec2331197.tar.gz
scummvm-rg350-a373bd4a5385dd251298ad41ca1701bec2331197.tar.bz2
scummvm-rg350-a373bd4a5385dd251298ad41ca1701bec2331197.zip
TOON: Fix more memory leaks
Mainly leaks in audio and animations svn-id: r54223
Diffstat (limited to 'engines/toon/toon.cpp')
-rw-r--r--engines/toon/toon.cpp38
1 files changed, 35 insertions, 3 deletions
diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp
index 37b4f242d8..e91a895fd3 100644
--- a/engines/toon/toon.cpp
+++ b/engines/toon/toon.cpp
@@ -829,8 +829,12 @@ ToonEngine::~ToonEngine() {
delete _resources;
delete _animationManager;
delete _moviePlayer;
- delete _mainSurface;
+ if(_mainSurface) {
+ _mainSurface->free();
+ delete _mainSurface;
+ }
+
delete[] _finalPalette;
delete[] _backupPalette;
delete[] _additionalPalette1;
@@ -859,6 +863,20 @@ ToonEngine::~ToonEngine() {
delete _pathFinding;
+
+ for (int32 i = 0; i < 64; i++) {
+ if (_sceneAnimations[i]._active) {
+ // see if one character shares this instance
+ for (int32 c = 0; c < 32; c++) {
+ if (_characters[c] && _characters[c]->getAnimationInstance() == _sceneAnimations[i]._animInstance) {
+ _characters[c]->setAnimationInstance(0);
+ }
+ }
+ delete _sceneAnimations[i]._originalAnimInstance;
+ delete _sceneAnimations[i]._animation;
+ }
+ }
+
for (int32 i = 0; i < 32; i++)
delete _characters[i];
@@ -869,6 +887,7 @@ ToonEngine::~ToonEngine() {
delete _inventoryIconSlots;
//delete _genericTexts;
delete _audioManager;
+ delete _gameState;
unloadToonDat();
@@ -1642,8 +1661,18 @@ void ToonEngine::exitScene() {
delete _sceneAnimations[i]._animation;
_sceneAnimations[i]._active = false;
_animationManager->removeInstance(_sceneAnimations[i]._animInstance);
- _sceneAnimations[i]._animInstance = 0;
- _sceneAnimations[i]._animation = 0;
+
+ // see if one character shares this instance
+ for (int32 c = 0; c < 32; c++) {
+ if (_characters[c] && _characters[c]->getAnimationInstance() == _sceneAnimations[i]._animInstance) {
+ _characters[c]->setAnimationInstance(NULL);
+ }
+ }
+
+ delete _sceneAnimations[i]._originalAnimInstance;
+ _sceneAnimations[i]._animInstance = NULL;
+ _sceneAnimations[i]._animation = NULL;
+ _sceneAnimations[i]._originalAnimInstance = NULL;
}
}
for (int32 i = 0; i < 64; i++) {
@@ -4557,6 +4586,8 @@ char **ToonEngine::loadTextsVariants(Common::File &in) {
res[0] += DATAALIGNMENT;
} else {
in.read(pos, entryLen);
+ free(pos);
+ continue;
}
pos += DATAALIGNMENT;
@@ -4637,6 +4668,7 @@ void SceneAnimation::load(ToonEngine *vm, Common::ReadStream *stream) {
_animInstance = vm->getAnimationManager()->createNewInstance(kAnimationScene);
_animInstance->load(stream);
vm->getAnimationManager()->addInstance(_animInstance);
+ _originalAnimInstance = _animInstance;
}
// load animation if any