diff options
author | Benjamin Haisch | 2009-06-18 08:22:52 +0000 |
---|---|---|
committer | Willem Jan Palenstijn | 2011-11-20 22:43:07 +0100 |
commit | ce7febcd70092ce0015e952af6dbfaae23bed22d (patch) | |
tree | a7772c9b72de65662cf094eb0dc9e2d85a7083df /engines/toltecs/resource.cpp | |
parent | af7e1c16833c2fb3df5c6079262d1e18d7959365 (diff) | |
download | scummvm-rg350-ce7febcd70092ce0015e952af6dbfaae23bed22d.tar.gz scummvm-rg350-ce7febcd70092ce0015e952af6dbfaae23bed22d.tar.bz2 scummvm-rg350-ce7febcd70092ce0015e952af6dbfaae23bed22d.zip |
TOLTECS: Reworked the ArchiveReader and ResourceCache classes.
ResourceCache needs more work since resources are never freed (which is bad).
Diffstat (limited to 'engines/toltecs/resource.cpp')
-rw-r--r-- | engines/toltecs/resource.cpp | 77 |
1 files changed, 21 insertions, 56 deletions
diff --git a/engines/toltecs/resource.cpp b/engines/toltecs/resource.cpp index 9449fdf73b..aaff6e340c 100644 --- a/engines/toltecs/resource.cpp +++ b/engines/toltecs/resource.cpp @@ -44,11 +44,16 @@ ArchiveReader::ArchiveReader() { } ArchiveReader::~ArchiveReader() { + delete[] _offsets; } void ArchiveReader::openArchive(const char *filename) { open(filename); - for (uint i = 0; i < 10000; i++) + uint32 firstOffs = readUint32LE(); + uint count = firstOffs / 4; + _offsets = new uint32[count]; + _offsets[0] = firstOffs; + for (uint i = 1; i < count; i++) _offsets[i] = readUint32LE(); } @@ -91,70 +96,30 @@ void ArchiveReader::dump(uint resIndex, const char *prefix) { /* ResourceCache */ ResourceCache::ResourceCache(ToltecsEngine *vm) : _vm(vm) { - - _base = new byte[kMaxCacheSize]; - _bytesUsed = 0; - - memset(_cache, 0, sizeof(_cache)); - _cacheCount = 0; - - _curItemOffset = 0; - _curItemSize = 0; - } ResourceCache::~ResourceCache() { - delete[] _base; + // TODO: Delete resources } -byte *ResourceCache::load(uint resIndex) { - byte *data = NULL; - if (existsItem(resIndex)) { +Resource *ResourceCache::load(uint resIndex) { + ResourceMap::iterator item = _cache.find(resIndex); + if (item != _cache.end()) { debug(1, "ResourceCache::load(%d) From cache", resIndex); - data = _base + _curItemOffset; + return (*item)._value; } else { debug(1, "ResourceCache::load(%d) From disk", resIndex); - uint32 size = _vm->_arc->openResource(resIndex); - data = addItem(resIndex, size); - _vm->_arc->read(data, size); - _vm->_arc->closeResource(); - } - return data; -} - -bool ResourceCache::existsItem(uint resIndex) { - for (uint i = 0; i < _cacheCount; i++) { - if (_cache[i].resIndex == resIndex) { - _curItemOffset = _cache[i].offset; - _curItemSize = _cache[i].size; - return true; - } - } - return false; -} -byte *ResourceCache::addItem(uint resIndex, uint32 size) { - - checkCapacity(size); - - _curItemOffset = _bytesUsed; - _curItemSize = size; - - _cache[_cacheCount].resIndex = resIndex; - _cache[_cacheCount].offset = _curItemOffset; - _cache[_cacheCount].size = _curItemSize; - _cacheCount++; - - _bytesUsed += size; - - return _base + _curItemOffset; - -} - -void ResourceCache::checkCapacity(uint32 size) { - if (_cacheCount > kMaxCacheItems || _bytesUsed + size > kMaxCacheSize) { - _cacheCount = 0; - _bytesUsed = 0; + Resource *resItem = new Resource(); + resItem->size = _vm->_arc->openResource(resIndex); + resItem->data = new byte[resItem->size]; + _vm->_arc->read(resItem->data, resItem->size); + _vm->_arc->closeResource(); + + _cache[resIndex] = resItem; + + return resItem; + } } |