diff --git a/engines/grim/bitmap.cpp b/engines/grim/bitmap.cpp index 947da467747..f94c41fede6 100644 --- a/engines/grim/bitmap.cpp +++ b/engines/grim/bitmap.cpp @@ -132,8 +132,7 @@ Bitmap::~Bitmap() { g_driver->destroyBitmap(this); } - if (g_resourceloader) - g_resourceloader->uncacheBitmap(this); + g_grim->killBitmap(this); } #define GET_BIT do { bit = bitstr_value & 1; \ diff --git a/engines/grim/grim.cpp b/engines/grim/grim.cpp index 5a04b864e3c..f92990fff0b 100644 --- a/engines/grim/grim.cpp +++ b/engines/grim/grim.cpp @@ -1305,6 +1305,7 @@ void GrimEngine::restoreBitmaps(SaveGame *state) { int32 id = state->readLEUint32(); const char *fname = state->readCharString(); Bitmap *b = g_resourceloader->loadBitmap(fname); + killBitmap(b); b->setNumber(state->readLESint32()); b->setX(state->readLESint32()); b->setY(state->readLESint32()); @@ -1740,12 +1741,11 @@ void GrimEngine::registerBitmap(Bitmap *bitmap) { void GrimEngine::killBitmap(Bitmap *b) { _bitmaps.erase(b->getId()); - delete b; } void GrimEngine::killBitmaps() { while (!_bitmaps.empty()) { - killBitmap(_bitmaps.begin()->_value); + delete _bitmaps.begin()->_value; } } diff --git a/engines/grim/lua_v1_graphics.cpp b/engines/grim/lua_v1_graphics.cpp index c97c70931c1..f1f7a67bd5e 100644 --- a/engines/grim/lua_v1_graphics.cpp +++ b/engines/grim/lua_v1_graphics.cpp @@ -55,7 +55,6 @@ void L1_GetImage() { } const char *bitmapName = lua_getstring(nameObj); Bitmap *b = g_resourceloader->loadBitmap(bitmapName); - g_grim->registerBitmap(b); lua_pushusertag(b->getId(), MKTAG('V','B','U','F')); } diff --git a/engines/grim/primitives.cpp b/engines/grim/primitives.cpp index 139a7134c39..31ae64c51bf 100644 --- a/engines/grim/primitives.cpp +++ b/engines/grim/primitives.cpp @@ -53,8 +53,7 @@ void PrimitiveObject::saveState(SaveGame *savedState) const { savedState->writeLEUint32(_filled); if (_bitmap) { - savedState->writeLEUint32(1); - savedState->writeCharString(_bitmap->getFilename()); + savedState->writeLEUint32(_bitmap->getId()); } else { savedState->writeLEUint32(0); } @@ -76,13 +75,7 @@ bool PrimitiveObject::restoreState(SaveGame *savedState) { _filled = savedState->readLEUint32(); - if (savedState->readLEUint32()) { - const char *name = savedState->readCharString(); - _bitmap = g_resourceloader->getBitmap(name); - delete[] name; - } else { - _bitmap = NULL; - } + _bitmap = g_grim->getBitmap(savedState->readLEUint32()); _p1.x = savedState->readLEUint32(); _p1.y = savedState->readLEUint32(); diff --git a/engines/grim/resource.cpp b/engines/grim/resource.cpp index 018c5819ab4..22de014ab23 100644 --- a/engines/grim/resource.cpp +++ b/engines/grim/resource.cpp @@ -103,7 +103,6 @@ ResourceLoader::~ResourceLoader() { } clearList(_labs); clearList(_materials); - clearList(_bitmaps); clearList(_models); clearList(_colormaps); clearList(_keyframeAnims); @@ -222,6 +221,8 @@ Bitmap *ResourceLoader::loadBitmap(const char *filename) { } Bitmap *result = new Bitmap(filename, b->getData(), b->getLen()); + if (result) + g_grim->registerBitmap(result); return result; } @@ -376,10 +377,6 @@ void ResourceLoader::uncacheMaterial(Material *mat) { _materials.remove(mat); } -void ResourceLoader::uncacheBitmap(Bitmap *bitmap) { - _bitmaps.remove(bitmap); -} - void ResourceLoader::uncacheModel(Model *m) { _models.remove(m); } @@ -411,20 +408,6 @@ MaterialPtr ResourceLoader::getMaterial(const char *fname, CMap *c) { return loadMaterial(fname, c); } -BitmapPtr ResourceLoader::getBitmap(const char *fname) { - for (Common::List::const_iterator i = _bitmaps.begin(); i != _bitmaps.end(); ++i) { - Bitmap *b = *i; - if (strcmp(fname, b->getFilename()) == 0) { - return b; - } - } - - Bitmap *b = loadBitmap(fname); - if (b) - _bitmaps.push_back(b); - return b; -} - ModelPtr ResourceLoader::getModel(const char *fname, CMap *c) { for (Common::List::const_iterator i = _models.begin(); i != _models.end(); ++i) { Model *m = *i; diff --git a/engines/grim/resource.h b/engines/grim/resource.h index 7c2477dfc0b..725bd197667 100644 --- a/engines/grim/resource.h +++ b/engines/grim/resource.h @@ -74,14 +74,12 @@ public: int getFileLength(const char *filename) const; MaterialPtr getMaterial(const char *filename, CMap *c); - BitmapPtr getBitmap(const char *fname); ModelPtr getModel(const char *fname, CMap *c); CMapPtr getColormap(const char *fname); KeyframeAnimPtr getKeyframe(const char *fname); FontPtr getFont(const char *fname); LipSyncPtr getLipSync(const char *fname); void uncacheMaterial(Material *m); - void uncacheBitmap(Bitmap *bitmap); void uncacheModel(Model *m); void uncacheColormap(CMap *c); void uncacheKeyframe(KeyframeAnim *kf); @@ -108,7 +106,6 @@ private: int32 _cacheMemorySize; Common::List _materials; - Common::List _bitmaps; Common::List _models; Common::List _colormaps; Common::List _keyframeAnims; diff --git a/engines/grim/savegame.cpp b/engines/grim/savegame.cpp index 852eaac94b7..48fb43e9b49 100644 --- a/engines/grim/savegame.cpp +++ b/engines/grim/savegame.cpp @@ -35,7 +35,7 @@ namespace Grim { #define SAVEGAME_HEADERTAG 'RSAV' #define SAVEGAME_FOOTERTAG 'ESAV' -#define SAVEGAME_VERSION 11 +#define SAVEGAME_VERSION 12 // Constructor. Should create/open a saved game SaveGame::SaveGame(const char *filename, bool saving) : diff --git a/engines/grim/scene.cpp b/engines/grim/scene.cpp index 21575f08741..7b5eabdde2a 100644 --- a/engines/grim/scene.cpp +++ b/engines/grim/scene.cpp @@ -160,16 +160,14 @@ void Scene::saveState(SaveGame *savedState) const { //bkgndBm if (set._bkgndBm) { - savedState->writeLEUint32(1); - savedState->writeCharString(set._bkgndBm->getFilename()); + savedState->writeLEUint32(set._bkgndBm->getId()); } else { savedState->writeLEUint32(0); } //bkgndZBm if (set._bkgndZBm) { - savedState->writeLEUint32(1); - savedState->writeCharString(set._bkgndZBm->getFilename()); + savedState->writeLEUint32(set._bkgndZBm->getId()); } else { savedState->writeLEUint32(0); } @@ -243,19 +241,8 @@ bool Scene::restoreState(SaveGame *savedState) { set._name = savedState->readString(); - if (savedState->readLEUint32()) { - const char *fname = savedState->readCharString(); - set._bkgndBm = g_resourceloader->getBitmap(fname); - } else { - set._bkgndBm = NULL; - } - - if (savedState->readLEUint32()) { - const char *fname = savedState->readCharString(); - set._bkgndZBm = g_resourceloader->getBitmap(fname); - } else { - set._bkgndZBm = NULL; - } + set._bkgndBm = g_grim->getBitmap(savedState->readLEUint32()); + set._bkgndZBm = g_grim->getBitmap(savedState->readLEUint32()); set._pos = savedState->readVector3d(); set._interest = savedState->readVector3d(); @@ -305,7 +292,7 @@ void Scene::Setup::load(TextSplitter &ts) { _name = buf; ts.scanString(" background %256s", 1, buf); - _bkgndBm = g_resourceloader->getBitmap(buf); + _bkgndBm = g_resourceloader->loadBitmap(buf); if (!_bkgndBm) { if (gDebugLevel == DEBUG_BITMAPS || gDebugLevel == DEBUG_ERROR || gDebugLevel == DEBUG_ALL) warning("Unable to load scene bitmap: %s\n", buf); @@ -321,7 +308,7 @@ void Scene::Setup::load(TextSplitter &ts) { ts.scanString(" zbuffer %256s", 1, buf); // Don't even try to load if it's the "none" bitmap if (strcmp(buf, ".lbm") != 0) { - _bkgndZBm = g_resourceloader->getBitmap(buf); + _bkgndZBm = g_resourceloader->loadBitmap(buf); if (gDebugLevel == DEBUG_BITMAPS || gDebugLevel == DEBUG_NORMAL || gDebugLevel == DEBUG_ALL) printf("Loading scene z-buffer bitmap: %s\n", buf); }