[Scummvm-git-logs] scummvm master -> cfe4820e6afc798b6553ee9c28f57b4f8aa03ab9
djsrv
dservilla at gmail.com
Wed Aug 12 16:28:16 UTC 2020
This automated email contains information about 7 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
f8e8a3ff38 DIRECTOR: Fix CAS*, KEY* error handling
28ca9065d4 DIRECTOR: Validate uncompressed chunk length
045b5e08b2 DIRECTOR: Fix ABMP length
2f367c1911 DIRECTOR: Adjust ABMP offsets
760e89ae11 DIRECTOR: Load ILS
f3a179a873 COMMON: Add dispose arg to MemoryReadStreamEndian
cfe4820e6a DIRECTOR: Dispose uncompressed data after use
Commit: f8e8a3ff38329758330a5b25f906cc24d70a5897
https://github.com/scummvm/scummvm/commit/f8e8a3ff38329758330a5b25f906cc24d70a5897
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-12T10:26:54-04:00
Commit Message:
DIRECTOR: Fix CAS*, KEY* error handling
Need to check hasResource
Changed paths:
engines/director/archive.cpp
diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index ceac52db15..10a6b35f69 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -523,22 +523,22 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
}
}
- Common::SeekableSubReadStreamEndian *casRes = getFirstResource(MKTAG('C', 'A', 'S', '*'));
// Parse the CAS*, if present
- if (casRes) {
- readCast(*casRes);
- delete casRes;
+ if (hasResource(MKTAG('C', 'A', 'S', '*'), -1)) {
+ Common::SeekableSubReadStreamEndian *casStream = getFirstResource(MKTAG('C', 'A', 'S', '*'));
+ readCast(*casStream);
+ delete casStream;
}
- Common::SeekableSubReadStreamEndian *keyRes = getFirstResource(MKTAG('K', 'E', 'Y', '*'), true);
// A KEY* must be present
- if (!keyRes) {
+ if (!hasResource(MKTAG('K', 'E', 'Y', '*'), -1)) {
warning("No 'KEY*' resource present");
return false;
}
// Parse the KEY*
- readKeyTable(*keyRes);
- delete keyRes;
+ Common::SeekableSubReadStreamEndian *keyStream = getFirstResource(MKTAG('K', 'E', 'Y', '*'), true);
+ readKeyTable(*keyStream);
+ delete keyStream;
return true;
}
Commit: 28ca9065d40de19da0e598986073d2a50ef78640
https://github.com/scummvm/scummvm/commit/28ca9065d40de19da0e598986073d2a50ef78640
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-12T10:38:45-04:00
Commit Message:
DIRECTOR: Validate uncompressed chunk length
Changed paths:
engines/director/archive.cpp
engines/director/util.cpp
engines/director/util.h
diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index 10a6b35f69..8d4d4c3692 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -640,15 +640,19 @@ bool RIFXArchive::readAfterburnerMap(Common::SeekableSubReadStreamEndian &stream
}
uint32 abmpLength = readVarInt(stream);
uint32 abmpCompressionType = readVarInt(stream);
- uint32 abmpUncompLength = readVarInt(stream);
- debug(3, "ABMP: length: %d compressionType: %d uncompressedLength: %d",
+ unsigned long abmpUncompLength = readVarInt(stream);
+ unsigned long abmpActualUncompLength = abmpUncompLength;
+ debug(3, "ABMP: length: %d compressionType: %d uncompressedLength: %lu",
abmpLength, abmpCompressionType, abmpUncompLength);
- Common::SeekableReadStreamEndian *abmpStream = readZlibData(stream, abmpLength, abmpUncompLength, _isBigEndian);
+ Common::SeekableReadStreamEndian *abmpStream = readZlibData(stream, abmpLength, &abmpActualUncompLength, _isBigEndian);
if (!abmpStream) {
warning("RIFXArchive::readAfterburnerMap(): Could not uncompress ABMP");
return false;
}
+ if (abmpUncompLength != abmpActualUncompLength) {
+ warning("ABMP: Expected uncompressed length %lu but got length %lu", abmpUncompLength, abmpActualUncompLength);
+ }
if (ConfMan.getBool("dump_scripts")) {
Common::DumpFile out;
diff --git a/engines/director/util.cpp b/engines/director/util.cpp
index 57c0537b7f..18856fc88c 100644
--- a/engines/director/util.cpp
+++ b/engines/director/util.cpp
@@ -671,20 +671,20 @@ uint32 readVarInt(Common::SeekableReadStream &stream) {
return val;
}
-Common::SeekableReadStreamEndian *readZlibData(Common::SeekableReadStream &stream, unsigned long len, unsigned long outLen, bool bigEndian) {
+Common::SeekableReadStreamEndian *readZlibData(Common::SeekableReadStream &stream, unsigned long len, unsigned long *outLen, bool bigEndian) {
#ifdef USE_ZLIB
byte *in = (byte *)malloc(len);
- byte *out = (byte *)malloc(outLen);
+ byte *out = (byte *)malloc(*outLen);
stream.read(in, len);
- if (!Common::uncompress(out, &outLen, in, len)) {
+ if (!Common::uncompress(out, outLen, in, len)) {
free(in);
free(out);
return nullptr;
}
free(in);
- return new Common::MemoryReadStreamEndian(out, outLen, bigEndian);
+ return new Common::MemoryReadStreamEndian(out, *outLen, bigEndian);
# else
return nullptr;
# endif
diff --git a/engines/director/util.h b/engines/director/util.h
index 7be84db5b3..009291e33d 100644
--- a/engines/director/util.h
+++ b/engines/director/util.h
@@ -78,7 +78,7 @@ private:
uint32 readVarInt(Common::SeekableReadStream &stream);
-Common::SeekableReadStreamEndian *readZlibData(Common::SeekableReadStream &stream, unsigned long len, unsigned long outLen, bool bigEndian);
+Common::SeekableReadStreamEndian *readZlibData(Common::SeekableReadStream &stream, unsigned long len, unsigned long *outLen, bool bigEndian);
} // End of namespace Director
Commit: 045b5e08b2d6d2468e92795941be22647c4fe23e
https://github.com/scummvm/scummvm/commit/045b5e08b2d6d2468e92795941be22647c4fe23e
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-12T12:12:57-04:00
Commit Message:
DIRECTOR: Fix ABMP length
Changed paths:
engines/director/archive.cpp
diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index 8d4d4c3692..ad470f07d0 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -639,13 +639,14 @@ bool RIFXArchive::readAfterburnerMap(Common::SeekableSubReadStreamEndian &stream
return false;
}
uint32 abmpLength = readVarInt(stream);
+ uint32 abmpEnd = stream.pos() + abmpLength;
uint32 abmpCompressionType = readVarInt(stream);
unsigned long abmpUncompLength = readVarInt(stream);
unsigned long abmpActualUncompLength = abmpUncompLength;
debug(3, "ABMP: length: %d compressionType: %d uncompressedLength: %lu",
abmpLength, abmpCompressionType, abmpUncompLength);
- Common::SeekableReadStreamEndian *abmpStream = readZlibData(stream, abmpLength, &abmpActualUncompLength, _isBigEndian);
+ Common::SeekableReadStreamEndian *abmpStream = readZlibData(stream, abmpEnd - stream.pos(), &abmpActualUncompLength, _isBigEndian);
if (!abmpStream) {
warning("RIFXArchive::readAfterburnerMap(): Could not uncompress ABMP");
return false;
Commit: 2f367c19118d09fdb8bd1134328fd521f3e69e46
https://github.com/scummvm/scummvm/commit/2f367c19118d09fdb8bd1134328fd521f3e69e46
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-12T12:14:00-04:00
Commit Message:
DIRECTOR: Adjust ABMP offsets
Changed paths:
engines/director/archive.cpp
engines/director/archive.h
diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index ad470f07d0..de2ca2743b 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -574,7 +574,7 @@ bool RIFXArchive::readMemoryMap(Common::SeekableSubReadStreamEndian &stream, uin
for (uint32 i = 0; i < resCount; i++) {
uint32 tag = stream.readUint32();
uint32 size = stream.readUint32();
- uint32 offset = stream.readUint32() + moreOffset;
+ int32 offset = stream.readUint32() + moreOffset;
uint16 flags = stream.readUint16();
uint16 unk1 = stream.readUint16();
uint32 nextFreeResourceId = stream.readUint32(); // for free resources, the next id, flag like for imap and mmap resources
@@ -685,7 +685,9 @@ bool RIFXArchive::readAfterburnerMap(Common::SeekableSubReadStreamEndian &stream
for (uint32 i = 0; i < resCount; i++) {
uint32 resId = readVarInt(*abmpStream);
- uint32 offset = readVarInt(*abmpStream);
+ int32 offset = readVarInt(*abmpStream);
+ if (offset >= 0)
+ offset += moreOffset + abmpEnd;
uint32 compSize = readVarInt(*abmpStream);
uint32 uncompSize = readVarInt(*abmpStream);
uint32 compressionType = readVarInt(*abmpStream);
diff --git a/engines/director/archive.h b/engines/director/archive.h
index dd44a44e00..f582a7c258 100644
--- a/engines/director/archive.h
+++ b/engines/director/archive.h
@@ -35,7 +35,7 @@ namespace Director {
struct Resource {
uint32 index;
- uint32 offset;
+ int32 offset;
uint32 size;
uint32 uncompSize;
uint32 compressionType;
Commit: 760e89ae11a994528d245617357e054adb008551
https://github.com/scummvm/scummvm/commit/760e89ae11a994528d245617357e054adb008551
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-12T12:14:56-04:00
Commit Message:
DIRECTOR: Load ILS
Changed paths:
engines/director/archive.cpp
engines/director/archive.h
diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index de2ca2743b..831663285f 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -397,6 +397,8 @@ RIFXArchive::RIFXArchive() : Archive() {
}
RIFXArchive::~RIFXArchive() {
+ for (Common::HashMap<uint32, byte *>::iterator it = _ilsData.begin(); it != _ilsData.end(); it++)
+ free(it->_value);
}
bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOffset) {
@@ -683,6 +685,7 @@ bool RIFXArchive::readAfterburnerMap(Common::SeekableSubReadStreamEndian &stream
debug(3, "ABMP: unk1: %d unk2: %d resCount: %d",
abmpUnk1, abmpUnk2, resCount);
+ Common::HashMap<uint32, Resource *> resourceMap;
for (uint32 i = 0; i < resCount; i++) {
uint32 resId = readVarInt(*abmpStream);
int32 offset = readVarInt(*abmpStream);
@@ -704,14 +707,49 @@ bool RIFXArchive::readAfterburnerMap(Common::SeekableSubReadStreamEndian &stream
res.compressionType = compressionType;
res.tag = tag;
_resources.push_back(&res);
+ resourceMap[resId] = &res;
}
delete abmpStream;
- // TODO: read ILS
+ // Initial load segment
+ if (!resourceMap.contains(2)) {
+ warning("RIFXArchive::readAfterburnerMap(): Map has no entry for ILS");
+ return false;
+ }
+ if (stream.readUint32() != MKTAG('F', 'G', 'E', 'I')) {
+ warning("RIFXArchive::readAfterburnerMap(): FGEI expected but not found");
+ return false;
+ }
- // FIXME: return true when done
- return false;
+ Resource *ilsRes = resourceMap[2];
+ uint32 ilsUnk1 = readVarInt(stream);
+ debug(3, "ILS: length: %d unk1: %d", ilsRes->size, ilsUnk1);
+ uint32 ilsLength = ilsRes->size;
+ unsigned long ilsActualUncompLength = ilsRes->uncompSize;
+ Common::SeekableReadStreamEndian *ilsStream = readZlibData(stream, ilsLength, &ilsActualUncompLength, _isBigEndian);
+ if (!ilsStream) {
+ warning("RIFXArchive::readAfterburnerMap(): Could not uncompress FGEI");
+ return false;
+ }
+ if (ilsRes->uncompSize != ilsActualUncompLength) {
+ warning("ILS: Expected uncompressed length %d but got length %lu", ilsRes->uncompSize, ilsActualUncompLength);
+ }
+
+ while (ilsStream->pos() < ilsStream->size()) {
+ uint32 resId = readVarInt(*ilsStream);
+ Resource *res = resourceMap[resId];
+
+ debug(3, "Loading ILS resource %d: '%s', %d bytes", resId, tag2str(res->tag), res->size);
+
+ byte *data = (byte *)malloc(res->size);
+ ilsStream->read(data, res->size);
+ _ilsData[resId] = data;
+ }
+
+ delete ilsStream;
+
+ return true;
}
void RIFXArchive::readCast(Common::SeekableSubReadStreamEndian &casStream) {
diff --git a/engines/director/archive.h b/engines/director/archive.h
index f582a7c258..61bf52efcc 100644
--- a/engines/director/archive.h
+++ b/engines/director/archive.h
@@ -132,6 +132,7 @@ private:
protected:
uint32 _rifxType;
Common::Array<Resource *> _resources;
+ Common::HashMap<uint32, byte *> _ilsData;
};
} // End of namespace Director
Commit: f3a179a8737551199f0cd5faf4c731bccae6dc0f
https://github.com/scummvm/scummvm/commit/f3a179a8737551199f0cd5faf4c731bccae6dc0f
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-12T12:23:43-04:00
Commit Message:
COMMON: Add dispose arg to MemoryReadStreamEndian
Changed paths:
common/memstream.h
diff --git a/common/memstream.h b/common/memstream.h
index 00ae80950c..f4f0fdc1a4 100644
--- a/common/memstream.h
+++ b/common/memstream.h
@@ -80,8 +80,8 @@ public:
*/
class MemoryReadStreamEndian : public MemoryReadStream, public SeekableReadStreamEndian {
public:
- MemoryReadStreamEndian(const byte *buf, uint32 len, bool bigEndian)
- : MemoryReadStream(buf, len), SeekableReadStreamEndian(bigEndian), ReadStreamEndian(bigEndian) {}
+ MemoryReadStreamEndian(const byte *buf, uint32 len, bool bigEndian, DisposeAfterUse::Flag disposeMemory = DisposeAfterUse::NO)
+ : MemoryReadStream(buf, len, disposeMemory), SeekableReadStreamEndian(bigEndian), ReadStreamEndian(bigEndian) {}
int32 pos() const { return MemoryReadStream::pos(); }
int32 size() const { return MemoryReadStream::size(); }
Commit: cfe4820e6afc798b6553ee9c28f57b4f8aa03ab9
https://github.com/scummvm/scummvm/commit/cfe4820e6afc798b6553ee9c28f57b4f8aa03ab9
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-12T12:24:43-04:00
Commit Message:
DIRECTOR: Dispose uncompressed data after use
Changed paths:
engines/director/util.cpp
diff --git a/engines/director/util.cpp b/engines/director/util.cpp
index 18856fc88c..70055c14b6 100644
--- a/engines/director/util.cpp
+++ b/engines/director/util.cpp
@@ -684,7 +684,7 @@ Common::SeekableReadStreamEndian *readZlibData(Common::SeekableReadStream &strea
}
free(in);
- return new Common::MemoryReadStreamEndian(out, *outLen, bigEndian);
+ return new Common::MemoryReadStreamEndian(out, *outLen, bigEndian, DisposeAfterUse::YES);
# else
return nullptr;
# endif
More information about the Scummvm-git-logs
mailing list