From 512435893b14e942f342e69a2b17c9a499ccf3a0 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 18 May 2010 15:16:53 +0000 Subject: Started simplifying and removing a lot of unused code from the SAGA Mac resource loader, to be ultimately replaced by the common Mac resource loader svn-id: r49082 --- engines/saga/resource_rsc.cpp | 95 ++++++++++++------------------------------- 1 file changed, 25 insertions(+), 70 deletions(-) diff --git a/engines/saga/resource_rsc.cpp b/engines/saga/resource_rsc.cpp index 7d5753ea07..b07741436b 100644 --- a/engines/saga/resource_rsc.cpp +++ b/engines/saga/resource_rsc.cpp @@ -39,22 +39,10 @@ namespace Saga { -struct MacResMap { - int16 resAttr; - int16 typeOffset; - int16 nameOffset; - int16 numTypes; -}; - struct MacResource { int16 id; - int16 nameOffset; - byte attr; int32 dataOffset; - byte name[255]; - MacResource() : id(0), nameOffset(0), attr(0), dataOffset(0) { - name[0] = 0; - } + MacResource() : id(0), dataOffset(0) {} }; class MacResourceArray : public Common::Array { @@ -62,11 +50,10 @@ class MacResourceArray : public Common::Array { struct MacResType { uint32 id; - int16 items; int16 maxItemId; int16 offset; MacResourceArray resources; - MacResType() : id(0), items(0), maxItemId(0), offset(0) { + MacResType() : id(0), maxItemId(0), offset(0) { } }; @@ -76,98 +63,66 @@ class MacResTypeArray : public Common::Array { #define ID_MIDI MKID_BE('Midi') bool ResourceContext_RSC::loadMac() { - int32 macDataSize, macDataSizePad; - int32 macResSize, macResSizePad; - int32 macResOffset; + int32 macDataSize, macResSizePad, macResOffset; + uint32 macMapOffset, macDataOffset; - uint32 macMapLength; - uint32 macDataLength; - uint32 macMapOffset; - uint32 macDataOffset; - - MacResMap macResMap; MacResTypeArray macResTypes; - byte macNameLen; bool notSagaContext = false; - if (_fileSize < RSC_MIN_FILESIZE + MAC_BINARY_HEADER_SIZE) { + // Sanity check + if (_fileSize < RSC_MIN_FILESIZE + MAC_BINARY_HEADER_SIZE) return false; - } - if (_file.readByte() != 0) { - return false; - } - _file.readByte(); //MAX Name Len - _file.seek(74); - if (_file.readByte() != 0) { - return false; - } _file.seek(82); - if (_file.readByte() != 0) { + if (_file.readByte() != 0) return false; - } macDataSize = _file.readSint32BE(); - macResSize = _file.readSint32BE(); - macDataSizePad = (((macDataSize + 127) >> 7) << 7); - macResSizePad = (((macResSize + 127) >> 7) << 7); + macResOffset = MAC_BINARY_HEADER_SIZE + (((macDataSize + 127) >> 7) << 7); - macResOffset = MAC_BINARY_HEADER_SIZE + macDataSizePad; + macResSizePad = (((_file.readSint32BE() + 127) >> 7) << 7); _file.seek(macResOffset); macDataOffset = _file.readUint32BE() + macResOffset; macMapOffset = _file.readUint32BE() + macResOffset; - macDataLength = _file.readUint32BE(); - macMapLength = _file.readUint32BE(); + // Used for sanity checks + uint32 macDataLength = _file.readUint32BE(); + uint32 macMapLength = _file.readUint32BE(); if (macDataOffset >= (uint)_fileSize || macMapOffset >= (uint)_fileSize || - macDataLength + macMapLength > (uint)_fileSize) { + macDataLength + macMapLength > (uint)_fileSize) return false; - } _file.seek(macMapOffset + 22); - macResMap.resAttr = _file.readUint16BE(); - macResMap.typeOffset = _file.readUint16BE(); - macResMap.nameOffset = _file.readUint16BE(); - macResMap.numTypes = _file.readUint16BE(); - macResMap.numTypes++; + _file.readUint16BE(); // resAttr + int16 typeOffset = _file.readUint16BE(); + _file.readUint16BE(); // nameOffset + int16 numTypes = _file.readUint16BE() + 1; + macResTypes.resize(numTypes); - _file.seek(macMapOffset + macResMap.typeOffset + 2); - - macResTypes.resize(macResMap.numTypes); + _file.seek(macMapOffset + typeOffset + 2); for (MacResTypeArray::iterator k = macResTypes.begin(); k != macResTypes.end(); ++k) { k->id = _file.readUint32BE(); - k->items = _file.readUint16BE(); + int16 items = _file.readUint16BE() + 1; + k->resources.resize(items); k->offset = _file.readUint16BE(); - k->items++; - k->resources.resize(k->items); } for (MacResTypeArray::iterator k = macResTypes.begin(); k != macResTypes.end(); ++k) { - _file.seek(k->offset + macMapOffset + macResMap.typeOffset); + _file.seek(k->offset + macMapOffset + typeOffset); for (MacResourceArray::iterator j = k->resources.begin(); j != k->resources.end(); ++j) { j->id = _file.readUint16BE(); - j->nameOffset = _file.readUint16BE(); + _file.readUint16BE(); // nameOffset j->dataOffset = _file.readUint32BE(); - macResSize = _file.readUint32BE(); + _file.readUint32BE(); // macResSize - j->attr = j->dataOffset >> 24; j->dataOffset &= 0xFFFFFF; - if (j->id > k->maxItemId) { + if (j->id > k->maxItemId) k->maxItemId = j->id; - } - } - - for (MacResourceArray::iterator j = k->resources.begin(); j != k->resources.end(); ++j) { - if (j->nameOffset != -1) { - _file.seek(j->nameOffset + macMapOffset + macResMap.nameOffset); - macNameLen = _file.readByte(); - _file.read(j->name, macNameLen); - } } } -- cgit v1.2.3