aboutsummaryrefslogtreecommitdiff
path: root/engines/toltecs/resource.cpp
diff options
context:
space:
mode:
authorBenjamin Haisch2009-06-18 08:22:52 +0000
committerWillem Jan Palenstijn2011-11-20 22:43:07 +0100
commitce7febcd70092ce0015e952af6dbfaae23bed22d (patch)
treea7772c9b72de65662cf094eb0dc9e2d85a7083df /engines/toltecs/resource.cpp
parentaf7e1c16833c2fb3df5c6079262d1e18d7959365 (diff)
downloadscummvm-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.cpp77
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;
+
}
}