[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