GRIM: Don't cache the bitmaps in ResourceLoader. Bump savegame version to 12

This commit is contained in:
Giulio Camuffo 2011-05-08 18:39:28 +02:00
parent 513f310072
commit a02740f77d
8 changed files with 14 additions and 56 deletions

View file

@ -132,8 +132,7 @@ Bitmap::~Bitmap() {
g_driver->destroyBitmap(this); g_driver->destroyBitmap(this);
} }
if (g_resourceloader) g_grim->killBitmap(this);
g_resourceloader->uncacheBitmap(this);
} }
#define GET_BIT do { bit = bitstr_value & 1; \ #define GET_BIT do { bit = bitstr_value & 1; \

View file

@ -1305,6 +1305,7 @@ void GrimEngine::restoreBitmaps(SaveGame *state) {
int32 id = state->readLEUint32(); int32 id = state->readLEUint32();
const char *fname = state->readCharString(); const char *fname = state->readCharString();
Bitmap *b = g_resourceloader->loadBitmap(fname); Bitmap *b = g_resourceloader->loadBitmap(fname);
killBitmap(b);
b->setNumber(state->readLESint32()); b->setNumber(state->readLESint32());
b->setX(state->readLESint32()); b->setX(state->readLESint32());
b->setY(state->readLESint32()); b->setY(state->readLESint32());
@ -1740,12 +1741,11 @@ void GrimEngine::registerBitmap(Bitmap *bitmap) {
void GrimEngine::killBitmap(Bitmap *b) { void GrimEngine::killBitmap(Bitmap *b) {
_bitmaps.erase(b->getId()); _bitmaps.erase(b->getId());
delete b;
} }
void GrimEngine::killBitmaps() { void GrimEngine::killBitmaps() {
while (!_bitmaps.empty()) { while (!_bitmaps.empty()) {
killBitmap(_bitmaps.begin()->_value); delete _bitmaps.begin()->_value;
} }
} }

View file

@ -55,7 +55,6 @@ void L1_GetImage() {
} }
const char *bitmapName = lua_getstring(nameObj); const char *bitmapName = lua_getstring(nameObj);
Bitmap *b = g_resourceloader->loadBitmap(bitmapName); Bitmap *b = g_resourceloader->loadBitmap(bitmapName);
g_grim->registerBitmap(b);
lua_pushusertag(b->getId(), MKTAG('V','B','U','F')); lua_pushusertag(b->getId(), MKTAG('V','B','U','F'));
} }

View file

@ -53,8 +53,7 @@ void PrimitiveObject::saveState(SaveGame *savedState) const {
savedState->writeLEUint32(_filled); savedState->writeLEUint32(_filled);
if (_bitmap) { if (_bitmap) {
savedState->writeLEUint32(1); savedState->writeLEUint32(_bitmap->getId());
savedState->writeCharString(_bitmap->getFilename());
} else { } else {
savedState->writeLEUint32(0); savedState->writeLEUint32(0);
} }
@ -76,13 +75,7 @@ bool PrimitiveObject::restoreState(SaveGame *savedState) {
_filled = savedState->readLEUint32(); _filled = savedState->readLEUint32();
if (savedState->readLEUint32()) { _bitmap = g_grim->getBitmap(savedState->readLEUint32());
const char *name = savedState->readCharString();
_bitmap = g_resourceloader->getBitmap(name);
delete[] name;
} else {
_bitmap = NULL;
}
_p1.x = savedState->readLEUint32(); _p1.x = savedState->readLEUint32();
_p1.y = savedState->readLEUint32(); _p1.y = savedState->readLEUint32();

View file

@ -103,7 +103,6 @@ ResourceLoader::~ResourceLoader() {
} }
clearList(_labs); clearList(_labs);
clearList(_materials); clearList(_materials);
clearList(_bitmaps);
clearList(_models); clearList(_models);
clearList(_colormaps); clearList(_colormaps);
clearList(_keyframeAnims); clearList(_keyframeAnims);
@ -222,6 +221,8 @@ Bitmap *ResourceLoader::loadBitmap(const char *filename) {
} }
Bitmap *result = new Bitmap(filename, b->getData(), b->getLen()); Bitmap *result = new Bitmap(filename, b->getData(), b->getLen());
if (result)
g_grim->registerBitmap(result);
return result; return result;
} }
@ -376,10 +377,6 @@ void ResourceLoader::uncacheMaterial(Material *mat) {
_materials.remove(mat); _materials.remove(mat);
} }
void ResourceLoader::uncacheBitmap(Bitmap *bitmap) {
_bitmaps.remove(bitmap);
}
void ResourceLoader::uncacheModel(Model *m) { void ResourceLoader::uncacheModel(Model *m) {
_models.remove(m); _models.remove(m);
} }
@ -411,20 +408,6 @@ MaterialPtr ResourceLoader::getMaterial(const char *fname, CMap *c) {
return loadMaterial(fname, c); return loadMaterial(fname, c);
} }
BitmapPtr ResourceLoader::getBitmap(const char *fname) {
for (Common::List<Bitmap *>::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) { ModelPtr ResourceLoader::getModel(const char *fname, CMap *c) {
for (Common::List<Model *>::const_iterator i = _models.begin(); i != _models.end(); ++i) { for (Common::List<Model *>::const_iterator i = _models.begin(); i != _models.end(); ++i) {
Model *m = *i; Model *m = *i;

View file

@ -74,14 +74,12 @@ public:
int getFileLength(const char *filename) const; int getFileLength(const char *filename) const;
MaterialPtr getMaterial(const char *filename, CMap *c); MaterialPtr getMaterial(const char *filename, CMap *c);
BitmapPtr getBitmap(const char *fname);
ModelPtr getModel(const char *fname, CMap *c); ModelPtr getModel(const char *fname, CMap *c);
CMapPtr getColormap(const char *fname); CMapPtr getColormap(const char *fname);
KeyframeAnimPtr getKeyframe(const char *fname); KeyframeAnimPtr getKeyframe(const char *fname);
FontPtr getFont(const char *fname); FontPtr getFont(const char *fname);
LipSyncPtr getLipSync(const char *fname); LipSyncPtr getLipSync(const char *fname);
void uncacheMaterial(Material *m); void uncacheMaterial(Material *m);
void uncacheBitmap(Bitmap *bitmap);
void uncacheModel(Model *m); void uncacheModel(Model *m);
void uncacheColormap(CMap *c); void uncacheColormap(CMap *c);
void uncacheKeyframe(KeyframeAnim *kf); void uncacheKeyframe(KeyframeAnim *kf);
@ -108,7 +106,6 @@ private:
int32 _cacheMemorySize; int32 _cacheMemorySize;
Common::List<Material *> _materials; Common::List<Material *> _materials;
Common::List<Bitmap *> _bitmaps;
Common::List<Model *> _models; Common::List<Model *> _models;
Common::List<CMap *> _colormaps; Common::List<CMap *> _colormaps;
Common::List<KeyframeAnim *> _keyframeAnims; Common::List<KeyframeAnim *> _keyframeAnims;

View file

@ -35,7 +35,7 @@ namespace Grim {
#define SAVEGAME_HEADERTAG 'RSAV' #define SAVEGAME_HEADERTAG 'RSAV'
#define SAVEGAME_FOOTERTAG 'ESAV' #define SAVEGAME_FOOTERTAG 'ESAV'
#define SAVEGAME_VERSION 11 #define SAVEGAME_VERSION 12
// Constructor. Should create/open a saved game // Constructor. Should create/open a saved game
SaveGame::SaveGame(const char *filename, bool saving) : SaveGame::SaveGame(const char *filename, bool saving) :

View file

@ -160,16 +160,14 @@ void Scene::saveState(SaveGame *savedState) const {
//bkgndBm //bkgndBm
if (set._bkgndBm) { if (set._bkgndBm) {
savedState->writeLEUint32(1); savedState->writeLEUint32(set._bkgndBm->getId());
savedState->writeCharString(set._bkgndBm->getFilename());
} else { } else {
savedState->writeLEUint32(0); savedState->writeLEUint32(0);
} }
//bkgndZBm //bkgndZBm
if (set._bkgndZBm) { if (set._bkgndZBm) {
savedState->writeLEUint32(1); savedState->writeLEUint32(set._bkgndZBm->getId());
savedState->writeCharString(set._bkgndZBm->getFilename());
} else { } else {
savedState->writeLEUint32(0); savedState->writeLEUint32(0);
} }
@ -243,19 +241,8 @@ bool Scene::restoreState(SaveGame *savedState) {
set._name = savedState->readString(); set._name = savedState->readString();
if (savedState->readLEUint32()) { set._bkgndBm = g_grim->getBitmap(savedState->readLEUint32());
const char *fname = savedState->readCharString(); set._bkgndZBm = g_grim->getBitmap(savedState->readLEUint32());
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._pos = savedState->readVector3d(); set._pos = savedState->readVector3d();
set._interest = savedState->readVector3d(); set._interest = savedState->readVector3d();
@ -305,7 +292,7 @@ void Scene::Setup::load(TextSplitter &ts) {
_name = buf; _name = buf;
ts.scanString(" background %256s", 1, buf); ts.scanString(" background %256s", 1, buf);
_bkgndBm = g_resourceloader->getBitmap(buf); _bkgndBm = g_resourceloader->loadBitmap(buf);
if (!_bkgndBm) { if (!_bkgndBm) {
if (gDebugLevel == DEBUG_BITMAPS || gDebugLevel == DEBUG_ERROR || gDebugLevel == DEBUG_ALL) if (gDebugLevel == DEBUG_BITMAPS || gDebugLevel == DEBUG_ERROR || gDebugLevel == DEBUG_ALL)
warning("Unable to load scene bitmap: %s\n", buf); 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); ts.scanString(" zbuffer %256s", 1, buf);
// Don't even try to load if it's the "none" bitmap // Don't even try to load if it's the "none" bitmap
if (strcmp(buf, "<none>.lbm") != 0) { if (strcmp(buf, "<none>.lbm") != 0) {
_bkgndZBm = g_resourceloader->getBitmap(buf); _bkgndZBm = g_resourceloader->loadBitmap(buf);
if (gDebugLevel == DEBUG_BITMAPS || gDebugLevel == DEBUG_NORMAL || gDebugLevel == DEBUG_ALL) if (gDebugLevel == DEBUG_BITMAPS || gDebugLevel == DEBUG_NORMAL || gDebugLevel == DEBUG_ALL)
printf("Loading scene z-buffer bitmap: %s\n", buf); printf("Loading scene z-buffer bitmap: %s\n", buf);
} }