[Scummvm-git-logs] scummvm master -> af8fa6a82e3792585fe659266e8d7824170a3f19
djsrv
dservilla at gmail.com
Wed Aug 12 21:27:59 UTC 2020
This automated email contains information about 5 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
baacf3c1ab DIRECTOR: Replace SeekableSubReadStreamEndian
61a02b7606 DIRECTOR: Implement DCR getResource
9ae219aff1 DIRECTOR: More gracefully handle missing BITD
d846db8da6 DIRECTOR: Fix loading KEY* from Shockwave movies
af8fa6a82e DIRECTOR: Fix Shockwave chunk dumping
Commit: baacf3c1ab6f5d6bb7738f0d05bcca6a44eef328
https://github.com/scummvm/scummvm/commit/baacf3c1ab6f5d6bb7738f0d05bcca6a44eef328
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-12T17:26:55-04:00
Commit Message:
DIRECTOR: Replace SeekableSubReadStreamEndian
Use the superclass SeekableReadStreamEndian.
Changed paths:
engines/director/archive.cpp
engines/director/archive.h
engines/director/cast.cpp
engines/director/cast.h
engines/director/cursor.cpp
engines/director/director.h
engines/director/frame.cpp
engines/director/frame.h
engines/director/lingo/lingo-bytecode.cpp
engines/director/lingo/lingo.h
engines/director/movie.cpp
engines/director/movie.h
engines/director/resource.cpp
engines/director/score.cpp
engines/director/score.h
engines/director/sound.cpp
engines/director/sound.h
engines/director/stxt.cpp
engines/director/stxt.h
diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index 831663285f..e564ad40c1 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -103,11 +103,11 @@ bool Archive::hasResource(uint32 tag, const Common::String &resName) const {
return false;
}
-Common::SeekableSubReadStreamEndian *Archive::getFirstResource(uint32 tag) {
+Common::SeekableReadStreamEndian *Archive::getFirstResource(uint32 tag) {
return getResource(tag, getResourceIDList(tag)[0]);
}
-Common::SeekableSubReadStreamEndian *Archive::getResource(uint32 tag, uint16 id) {
+Common::SeekableReadStreamEndian *Archive::getResource(uint32 tag, uint16 id) {
if (!_types.contains(tag))
error("Archive::getResource(): Archive does not contain '%s' %d", tag2str(tag), id);
@@ -279,7 +279,7 @@ void MacArchive::readTags() {
}
}
-Common::SeekableSubReadStreamEndian *MacArchive::getResource(uint32 tag, uint16 id) {
+Common::SeekableReadStreamEndian *MacArchive::getResource(uint32 tag, uint16 id) {
assert(_resFork);
Common::SeekableReadStream *stream = _resFork->getResource(tag, id);
@@ -359,7 +359,7 @@ bool RIFFArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
return true;
}
-Common::SeekableSubReadStreamEndian *RIFFArchive::getResource(uint32 tag, uint16 id) {
+Common::SeekableReadStreamEndian *RIFFArchive::getResource(uint32 tag, uint16 id) {
if (!_types.contains(tag))
error("RIFFArchive::getResource(): Archive does not contain '%s' %d", tag2str(tag), id);
@@ -527,7 +527,7 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
// Parse the CAS*, if present
if (hasResource(MKTAG('C', 'A', 'S', '*'), -1)) {
- Common::SeekableSubReadStreamEndian *casStream = getFirstResource(MKTAG('C', 'A', 'S', '*'));
+ Common::SeekableReadStreamEndian *casStream = getFirstResource(MKTAG('C', 'A', 'S', '*'));
readCast(*casStream);
delete casStream;
}
@@ -538,14 +538,14 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
return false;
}
// Parse the KEY*
- Common::SeekableSubReadStreamEndian *keyStream = getFirstResource(MKTAG('K', 'E', 'Y', '*'), true);
+ Common::SeekableReadStreamEndian *keyStream = getFirstResource(MKTAG('K', 'E', 'Y', '*'), true);
readKeyTable(*keyStream);
delete keyStream;
return true;
}
-bool RIFXArchive::readMemoryMap(Common::SeekableSubReadStreamEndian &stream, uint32 moreOffset) {
+bool RIFXArchive::readMemoryMap(Common::SeekableReadStreamEndian &stream, uint32 moreOffset) {
if (stream.readUint32() != MKTAG('i', 'm', 'a', 'p'))
return false;
@@ -606,7 +606,7 @@ bool RIFXArchive::readMemoryMap(Common::SeekableSubReadStreamEndian &stream, uin
return true;
}
-bool RIFXArchive::readAfterburnerMap(Common::SeekableSubReadStreamEndian &stream, uint32 moreOffset) {
+bool RIFXArchive::readAfterburnerMap(Common::SeekableReadStreamEndian &stream, uint32 moreOffset) {
uint32 start, end;
// File version
@@ -752,7 +752,7 @@ bool RIFXArchive::readAfterburnerMap(Common::SeekableSubReadStreamEndian &stream
return true;
}
-void RIFXArchive::readCast(Common::SeekableSubReadStreamEndian &casStream) {
+void RIFXArchive::readCast(Common::SeekableReadStreamEndian &casStream) {
uint castTag = MKTAG('C', 'A', 'S', 't');
uint casSize = casStream.size() / 4;
@@ -772,7 +772,7 @@ void RIFXArchive::readCast(Common::SeekableSubReadStreamEndian &casStream) {
debugC(2, kDebugLoading, "]");
}
-void RIFXArchive::readKeyTable(Common::SeekableSubReadStreamEndian &keyStream) {
+void RIFXArchive::readKeyTable(Common::SeekableReadStreamEndian &keyStream) {
uint16 entrySize = keyStream.readUint16(); // Should always be 12 (3 uint32's)
uint16 entrySize2 = keyStream.readUint16();
uint32 entryCount = keyStream.readUint32(); // There are more entries than actually used
@@ -791,19 +791,19 @@ void RIFXArchive::readKeyTable(Common::SeekableSubReadStreamEndian &keyStream) {
}
}
-Common::SeekableSubReadStreamEndian *RIFXArchive::getFirstResource(uint32 tag) {
+Common::SeekableReadStreamEndian *RIFXArchive::getFirstResource(uint32 tag) {
return getResource(tag, getResourceIDList(tag)[0], false);
}
-Common::SeekableSubReadStreamEndian *RIFXArchive::getFirstResource(uint32 tag, bool fileEndianness) {
+Common::SeekableReadStreamEndian *RIFXArchive::getFirstResource(uint32 tag, bool fileEndianness) {
return getResource(tag, getResourceIDList(tag)[0], fileEndianness);
}
-Common::SeekableSubReadStreamEndian *RIFXArchive::getResource(uint32 tag, uint16 id) {
+Common::SeekableReadStreamEndian *RIFXArchive::getResource(uint32 tag, uint16 id) {
return getResource(tag, id, false);
}
-Common::SeekableSubReadStreamEndian *RIFXArchive::getResource(uint32 tag, uint16 id, bool fileEndianness) {
+Common::SeekableReadStreamEndian *RIFXArchive::getResource(uint32 tag, uint16 id, bool fileEndianness) {
if (!_types.contains(tag))
error("RIFXArchive::getResource(): Archive does not contain '%s' %d", tag2str(tag), id);
diff --git a/engines/director/archive.h b/engines/director/archive.h
index 61bf52efcc..64032ae23e 100644
--- a/engines/director/archive.h
+++ b/engines/director/archive.h
@@ -25,7 +25,7 @@
namespace Common {
class MacResManager;
-class SeekableSubReadStreamEndian;
+class SeekableReadStreamEndian;
class SeekableReadStream;
}
@@ -63,8 +63,8 @@ public:
bool hasResource(uint32 tag, int id) const;
bool hasResource(uint32 tag, const Common::String &resName) const;
- virtual Common::SeekableSubReadStreamEndian *getResource(uint32 tag, uint16 id);
- virtual Common::SeekableSubReadStreamEndian *getFirstResource(uint32 tag);
+ virtual Common::SeekableReadStreamEndian *getResource(uint32 tag, uint16 id);
+ virtual Common::SeekableReadStreamEndian *getFirstResource(uint32 tag);
virtual Resource getResourceDetail(uint32 tag, uint16 id);
uint32 getOffset(uint32 tag, uint16 id) const;
uint16 findResourceID(uint32 tag, const Common::String &resName) const;
@@ -92,7 +92,7 @@ public:
void close() override;
bool openFile(const Common::String &fileName) override;
bool openStream(Common::SeekableReadStream *stream, uint32 startOffset = 0) override;
- Common::SeekableSubReadStreamEndian *getResource(uint32 tag, uint16 id) override;
+ Common::SeekableReadStreamEndian *getResource(uint32 tag, uint16 id) override;
private:
Common::MacResManager *_resFork;
@@ -106,7 +106,7 @@ public:
~RIFFArchive() override {}
bool openStream(Common::SeekableReadStream *stream, uint32 startOffset = 0) override;
- Common::SeekableSubReadStreamEndian *getResource(uint32 tag, uint16 id) override;
+ Common::SeekableReadStreamEndian *getResource(uint32 tag, uint16 id) override;
uint32 _startOffset;
};
@@ -117,17 +117,17 @@ public:
~RIFXArchive() override;
bool openStream(Common::SeekableReadStream *stream, uint32 startOffset = 0) override;
- Common::SeekableSubReadStreamEndian *getFirstResource(uint32 tag) override;
- virtual Common::SeekableSubReadStreamEndian *getFirstResource(uint32 tag, bool fileEndianness);
- Common::SeekableSubReadStreamEndian *getResource(uint32 tag, uint16 id) override;
- virtual Common::SeekableSubReadStreamEndian *getResource(uint32 tag, uint16 id, bool fileEndianness);
+ Common::SeekableReadStreamEndian *getFirstResource(uint32 tag) override;
+ virtual Common::SeekableReadStreamEndian *getFirstResource(uint32 tag, bool fileEndianness);
+ Common::SeekableReadStreamEndian *getResource(uint32 tag, uint16 id) override;
+ virtual Common::SeekableReadStreamEndian *getResource(uint32 tag, uint16 id, bool fileEndianness);
Resource getResourceDetail(uint32 tag, uint16 id) override;
private:
- bool readMemoryMap(Common::SeekableSubReadStreamEndian &stream, uint32 moreOffset);
- bool readAfterburnerMap(Common::SeekableSubReadStreamEndian &stream, uint32 moreOffset);
- void readCast(Common::SeekableSubReadStreamEndian &casStream);
- void readKeyTable(Common::SeekableSubReadStreamEndian &keyStream);
+ bool readMemoryMap(Common::SeekableReadStreamEndian &stream, uint32 moreOffset);
+ bool readAfterburnerMap(Common::SeekableReadStreamEndian &stream, uint32 moreOffset);
+ void readCast(Common::SeekableReadStreamEndian &casStream);
+ void readKeyTable(Common::SeekableReadStreamEndian &keyStream);
protected:
uint32 _rifxType;
diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 78efb80a37..8e673193f2 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -208,7 +208,7 @@ bool Cast::loadArchive() {
debugC(2, kDebugLoading, "CLUT resource not found, using default Mac palette");
} else {
for (uint i = 0; i < clutList.size(); i++) {
- Common::SeekableSubReadStreamEndian *pal = _castArchive->getResource(MKTAG('C', 'L', 'U', 'T'), clutList[i]);
+ Common::SeekableReadStreamEndian *pal = _castArchive->getResource(MKTAG('C', 'L', 'U', 'T'), clutList[i]);
debugC(2, kDebugLoading, "****** Loading Palette CLUT, #%d", clutList[i]);
PaletteV4 p = loadPalette(*pal);
@@ -218,7 +218,7 @@ bool Cast::loadArchive() {
}
// Configuration Information
- Common::SeekableSubReadStreamEndian *r = nullptr;
+ Common::SeekableReadStreamEndian *r = nullptr;
if (_castArchive->hasResource(MKTAG('V', 'W', 'C', 'F'), -1)) {
loadConfig(*(r = _castArchive->getFirstResource(MKTAG('V', 'W', 'C', 'F'))));
delete r;
@@ -284,7 +284,7 @@ bool Cast::loadArchive() {
debugC(2, kDebugLoading, "****** Loading %d CASt resources", cast.size());
for (Common::Array<uint16>::iterator iterator = cast.begin(); iterator != cast.end(); ++iterator) {
- Common::SeekableSubReadStreamEndian *stream = _castArchive->getResource(MKTAG('C', 'A', 'S', 't'), *iterator);
+ Common::SeekableReadStreamEndian *stream = _castArchive->getResource(MKTAG('C', 'A', 'S', 't'), *iterator);
Resource res = _castArchive->getResourceDetail(MKTAG('C', 'A', 'S', 't'), *iterator);
loadCastData(*stream, res.castId, &res);
delete stream;
@@ -378,7 +378,7 @@ uint16 humanVersion(uint16 ver) {
return 200;
}
-void Cast::loadConfig(Common::SeekableSubReadStreamEndian &stream) {
+void Cast::loadConfig(Common::SeekableReadStreamEndian &stream) {
debugC(1, kDebugLoading, "****** Loading Config VWCF");
if (debugChannelSet(5, kDebugLoading))
@@ -607,7 +607,7 @@ void Cast::loadSoundCasts() {
tag = soundCast->_children[0].tag;
}
- Common::SeekableSubReadStreamEndian *sndData = NULL;
+ Common::SeekableReadStreamEndian *sndData = NULL;
switch (tag) {
case MKTAG('S', 'N', 'D', ' '):
@@ -659,7 +659,7 @@ void Cast::loadDigitalVideoCasts() {
tag = digitalVideoCast->_children[0].tag;
}
- Common::SeekableSubReadStreamEndian *videoData = NULL;
+ Common::SeekableReadStreamEndian *videoData = NULL;
switch (tag) {
case MKTAG('M', 'o', 'o', 'V'):
@@ -690,7 +690,7 @@ void Cast::loadDigitalVideoCasts() {
}
-PaletteV4 Cast::loadPalette(Common::SeekableSubReadStreamEndian &stream) {
+PaletteV4 Cast::loadPalette(Common::SeekableReadStreamEndian &stream) {
uint16 steps = stream.size() / 6;
uint16 index = (steps * 3) - 1;
byte *_palette = new byte[index + 1];
@@ -717,7 +717,7 @@ PaletteV4 Cast::loadPalette(Common::SeekableSubReadStreamEndian &stream) {
return PaletteV4(0, _palette, steps);
}
-void Cast::loadCastDataVWCR(Common::SeekableSubReadStreamEndian &stream) {
+void Cast::loadCastDataVWCR(Common::SeekableReadStreamEndian &stream) {
debugC(1, kDebugLoading, "****** Loading CastMember rects VWCR. start: %d, end: %d", _castArrayStart, _castArrayEnd);
_loadedCast = new Common::HashMap<int, CastMember *>();
@@ -798,7 +798,7 @@ static void readEditInfo(EditInfo *info, Common::ReadStreamEndian *stream) {
}
}
-void Cast::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id, Resource *res) {
+void Cast::loadCastData(Common::SeekableReadStreamEndian &stream, uint16 id, Resource *res) {
// IDs are stored as relative to the start of the cast array.
id += _castArrayStart;
@@ -963,7 +963,7 @@ struct LingoContextEntry {
LingoContextEntry::LingoContextEntry(int32 i, int16 n)
: index(i), nextUnused(n), unused(false) {}
-void Cast::loadLingoContext(Common::SeekableSubReadStreamEndian &stream) {
+void Cast::loadLingoContext(Common::SeekableReadStreamEndian &stream) {
if (_vm->getVersion() >= 400) {
debugC(1, kDebugCompile, "Add V4 script context");
@@ -988,7 +988,7 @@ void Cast::loadLingoContext(Common::SeekableSubReadStreamEndian &stream) {
/* uint16 flags = */ stream.readUint16();
int16 firstUnused = stream.readSint16();
- Common::SeekableSubReadStreamEndian *r;
+ Common::SeekableReadStreamEndian *r;
debugC(2, kDebugLoading, "****** Loading Lnam resource (%d)", nameTableId);
_lingoArchive->addNamesV4(*(r = _castArchive->getResource(MKTAG('L','n','a','m'), nameTableId)));
delete r;
@@ -1050,7 +1050,7 @@ void Cast::loadLingoContext(Common::SeekableSubReadStreamEndian &stream) {
}
}
-void Cast::loadScriptText(Common::SeekableSubReadStreamEndian &stream) {
+void Cast::loadScriptText(Common::SeekableReadStreamEndian &stream) {
/*uint32 unk1 = */ stream.readUint32();
uint32 strLen = stream.readUint32();
/*uin32 dataLen = */ stream.readUint32();
@@ -1097,7 +1097,7 @@ void Cast::dumpScript(const char *script, ScriptType type, uint16 id) {
out.close();
}
-void Cast::loadCastInfo(Common::SeekableSubReadStreamEndian &stream, uint16 id) {
+void Cast::loadCastInfo(Common::SeekableReadStreamEndian &stream, uint16 id) {
if (!_loadedCast->contains(id))
return;
@@ -1193,7 +1193,7 @@ void Cast::loadCastInfo(Common::SeekableSubReadStreamEndian &stream, uint16 id)
_castsInfo[id] = ci;
}
-void Cast::loadFontMap(Common::SeekableSubReadStreamEndian &stream) {
+void Cast::loadFontMap(Common::SeekableReadStreamEndian &stream) {
if (stream.size() == 0)
return;
diff --git a/engines/director/cast.h b/engines/director/cast.h
index 0a932fcf6d..15fa8bf562 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -28,7 +28,7 @@
namespace Common {
class ReadStreamEndian;
struct Rect;
- class SeekableSubReadStreamEndian;
+ class SeekableReadStreamEndian;
}
namespace Director {
@@ -56,11 +56,11 @@ public:
Archive *getArchive() const { return _castArchive; };
Common::String getMacName() const { return _macName; }
- void loadConfig(Common::SeekableSubReadStreamEndian &stream);
- void loadCastDataVWCR(Common::SeekableSubReadStreamEndian &stream);
- void loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id, Resource *res);
- void loadCastInfo(Common::SeekableSubReadStreamEndian &stream, uint16 id);
- void loadLingoContext(Common::SeekableSubReadStreamEndian &stream);
+ void loadConfig(Common::SeekableReadStreamEndian &stream);
+ void loadCastDataVWCR(Common::SeekableReadStreamEndian &stream);
+ void loadCastData(Common::SeekableReadStreamEndian &stream, uint16 id, Resource *res);
+ void loadCastInfo(Common::SeekableReadStreamEndian &stream, uint16 id);
+ void loadLingoContext(Common::SeekableReadStreamEndian &stream);
void loadCastChildren();
void loadSoundCasts();
@@ -78,9 +78,9 @@ public:
void dumpScript(const char *script, ScriptType type, uint16 id);
private:
- PaletteV4 loadPalette(Common::SeekableSubReadStreamEndian &stream);
- void loadScriptText(Common::SeekableSubReadStreamEndian &stream);
- void loadFontMap(Common::SeekableSubReadStreamEndian &stream);
+ PaletteV4 loadPalette(Common::SeekableReadStreamEndian &stream);
+ void loadScriptText(Common::SeekableReadStreamEndian &stream);
+ void loadFontMap(Common::SeekableReadStreamEndian &stream);
Common::String getString(Common::String str);
public:
diff --git a/engines/director/cursor.cpp b/engines/director/cursor.cpp
index ed90be9d70..fc087d6ab2 100644
--- a/engines/director/cursor.cpp
+++ b/engines/director/cursor.cpp
@@ -132,7 +132,7 @@ void Cursor::readFromResource(int resourceId) {
_keyColor = 0xff;
for (Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator it = g_director->_openResFiles.begin(); it != g_director->_openResFiles.end(); ++it) {
- Common::SeekableSubReadStreamEndian *cursorStream;
+ Common::SeekableReadStreamEndian *cursorStream;
cursorStream = ((MacArchive *)it->_value)->getResource(MKTAG('C', 'U', 'R', 'S'), resourceId);
if (!cursorStream)
diff --git a/engines/director/director.h b/engines/director/director.h
index 57fc52c288..2916f52da8 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -39,7 +39,7 @@
namespace Common {
class MacResManager;
class SeekableReadStream;
-class SeekableSubReadStreamEndian;
+class SeekableReadStreamEndian;
}
namespace Graphics {
diff --git a/engines/director/frame.cpp b/engines/director/frame.cpp
index 5b4e116f7c..cb65819590 100644
--- a/engines/director/frame.cpp
+++ b/engines/director/frame.cpp
@@ -105,7 +105,7 @@ Frame::~Frame() {
delete _sprites[i];
}
-void Frame::readChannel(Common::SeekableSubReadStreamEndian &stream, uint16 offset, uint16 size) {
+void Frame::readChannel(Common::SeekableReadStreamEndian &stream, uint16 offset, uint16 size) {
if (offset >= 32) {
if (size <= 16)
readSprite(stream, offset, size);
@@ -381,7 +381,7 @@ void Frame::readChannels(Common::ReadStreamEndian *stream) {
}
}
-void Frame::readMainChannels(Common::SeekableSubReadStreamEndian &stream, uint16 offset, uint16 size) {
+void Frame::readMainChannels(Common::SeekableReadStreamEndian &stream, uint16 offset, uint16 size) {
uint16 finishPosition = offset + size;
while (offset < finishPosition) {
@@ -452,7 +452,7 @@ void Frame::readMainChannels(Common::SeekableSubReadStreamEndian &stream, uint16
debugC(1, kDebugLoading, "Frame::readChannels(): %d %d %d %d %d %d %d %d %d %d %d", _actionId, _soundType1, _transDuration, _transChunkSize, _tempo, _transType, _sound1, _skipFrameFlag, _blend, _sound2, _soundType2);
}
-void Frame::readPaletteInfo(Common::SeekableSubReadStreamEndian &stream) {
+void Frame::readPaletteInfo(Common::SeekableReadStreamEndian &stream) {
_palette.firstColor = stream.readByte();
_palette.lastColor = stream.readByte();
_palette.flags = stream.readByte();
@@ -461,7 +461,7 @@ void Frame::readPaletteInfo(Common::SeekableSubReadStreamEndian &stream) {
stream.skip(8); // unknown
}
-void Frame::readSprite(Common::SeekableSubReadStreamEndian &stream, uint16 offset, uint16 size) {
+void Frame::readSprite(Common::SeekableReadStreamEndian &stream, uint16 offset, uint16 size) {
uint16 spritePosition = (offset - 32) / 16;
uint16 spriteStart = spritePosition * 16 + 32;
diff --git a/engines/director/frame.h b/engines/director/frame.h
index ddc3e9862f..0fc999f08e 100644
--- a/engines/director/frame.h
+++ b/engines/director/frame.h
@@ -85,17 +85,17 @@ public:
Score *getScore() const { return _score; }
void readChannels(Common::ReadStreamEndian *stream);
- void readChannel(Common::SeekableSubReadStreamEndian &stream, uint16 offset, uint16 size);
+ void readChannel(Common::SeekableReadStreamEndian &stream, uint16 offset, uint16 size);
void executeImmediateScripts();
private:
- void readPaletteInfo(Common::SeekableSubReadStreamEndian &stream);
- void readSprite(Common::SeekableSubReadStreamEndian &stream, uint16 offset, uint16 size);
- void readMainChannels(Common::SeekableSubReadStreamEndian &stream, uint16 offset, uint16 size);
+ void readPaletteInfo(Common::SeekableReadStreamEndian &stream);
+ void readSprite(Common::SeekableReadStreamEndian &stream, uint16 offset, uint16 size);
+ void readMainChannels(Common::SeekableReadStreamEndian &stream, uint16 offset, uint16 size);
Image::ImageDecoder *getImageFrom(uint16 spriteId);
- Common::String readTextStream(Common::SeekableSubReadStreamEndian *textStream, TextCastMember *textCast);
+ Common::String readTextStream(Common::SeekableReadStreamEndian *textStream, TextCastMember *textCast);
public:
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index 6e6503b3ee..8995423f12 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -836,7 +836,7 @@ void LC::cb_zeropush() {
g_lingo->push(d);
}
-ScriptContext *Lingo::compileLingoV4(Common::SeekableSubReadStreamEndian &stream, LingoArchive *archive, const Common::String &archName) {
+ScriptContext *Lingo::compileLingoV4(Common::SeekableReadStreamEndian &stream, LingoArchive *archive, const Common::String &archName) {
if (stream.size() < 0x5c) {
warning("Lscr header too small");
return nullptr;
@@ -1480,7 +1480,7 @@ ScriptContext *Lingo::compileLingoV4(Common::SeekableSubReadStreamEndian &stream
return sc;
}
-void LingoArchive::addCodeV4(Common::SeekableSubReadStreamEndian &stream, uint16 lctxIndex, const Common::String &archName) {
+void LingoArchive::addCodeV4(Common::SeekableReadStreamEndian &stream, uint16 lctxIndex, const Common::String &archName) {
ScriptContext *ctx = g_lingo->compileLingoV4(stream, this, archName);
if (ctx) {
lctxContexts[lctxIndex] = ctx;
@@ -1488,7 +1488,7 @@ void LingoArchive::addCodeV4(Common::SeekableSubReadStreamEndian &stream, uint16
}
}
-void LingoArchive::addNamesV4(Common::SeekableSubReadStreamEndian &stream) {
+void LingoArchive::addNamesV4(Common::SeekableReadStreamEndian &stream) {
debugC(1, kDebugCompile, "Add V4 script name index");
if (stream.size() < 0x14) {
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 7081073f65..321bb49a0e 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -32,7 +32,7 @@ namespace Audio {
class AudioStream;
}
namespace Common {
-class SeekableSubReadStreamEndian;
+class SeekableReadStreamEndian;
}
namespace Director {
@@ -218,8 +218,8 @@ struct LingoArchive {
Common::String getName(uint16 id);
void addCode(const char *code, ScriptType type, uint16 id, const char *scriptName = nullptr);
- void addCodeV4(Common::SeekableSubReadStreamEndian &stream, uint16 lctxIndex, const Common::String &archName);
- void addNamesV4(Common::SeekableSubReadStreamEndian &stream);
+ void addCodeV4(Common::SeekableReadStreamEndian &stream, uint16 lctxIndex, const Common::String &archName);
+ void addNamesV4(Common::SeekableReadStreamEndian &stream);
};
struct RepeatBlock {
@@ -237,7 +237,7 @@ public:
ScriptContext *compileAnonymous(const char *code);
ScriptContext *compileLingo(const char *code, LingoArchive *archive, ScriptType type, uint16 id, const Common::String &scriptName, bool anonyomous = false);
- ScriptContext *compileLingoV4(Common::SeekableSubReadStreamEndian &stream, LingoArchive *archive, const Common::String &archName);
+ ScriptContext *compileLingoV4(Common::SeekableReadStreamEndian &stream, LingoArchive *archive, const Common::String &archName);
void executeHandler(const Common::String &name);
void executeScript(ScriptType type, uint16 id);
void printStack(const char *s, uint pc);
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index d812ecf741..ac66eb10fd 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -90,14 +90,14 @@ void Movie::setArchive(Archive *archive) {
// Frame Labels
if (archive->hasResource(MKTAG('V', 'W', 'L', 'B'), -1)) {
- Common::SeekableSubReadStreamEndian *r;
+ Common::SeekableReadStreamEndian *r;
_score->loadLabels(*(r = archive->getFirstResource(MKTAG('V', 'W', 'L', 'B'))));
delete r;
}
}
bool Movie::loadArchive() {
- Common::SeekableSubReadStreamEndian *r = nullptr;
+ Common::SeekableReadStreamEndian *r = nullptr;
// File Info
if (_movieArchive->hasResource(MKTAG('V', 'W', 'F', 'I'), -1)) {
@@ -160,7 +160,7 @@ Common::Rect Movie::readRect(Common::ReadStreamEndian &stream) {
return rect;
}
-InfoEntries Movie::loadInfoEntries(Common::SeekableSubReadStreamEndian &stream) {
+InfoEntries Movie::loadInfoEntries(Common::SeekableReadStreamEndian &stream) {
uint32 offset = stream.pos();
offset += stream.readUint32();
@@ -200,7 +200,7 @@ InfoEntries Movie::loadInfoEntries(Common::SeekableSubReadStreamEndian &stream)
return res;
}
-void Movie::loadFileInfo(Common::SeekableSubReadStreamEndian &stream) {
+void Movie::loadFileInfo(Common::SeekableReadStreamEndian &stream) {
debugC(2, kDebugLoading, "****** Loading FileInfo VWFI");
InfoEntries fileInfo = Movie::loadInfoEntries(stream);
diff --git a/engines/director/movie.h b/engines/director/movie.h
index cca70445f4..8164b547c8 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -26,7 +26,7 @@
namespace Common {
struct Event;
class ReadStreamEndian;
-class SeekableSubReadStreamEndian;
+class SeekableReadStreamEndian;
}
namespace Director {
@@ -87,7 +87,7 @@ public:
~Movie();
static Common::Rect readRect(Common::ReadStreamEndian &stream);
- static InfoEntries loadInfoEntries(Common::SeekableSubReadStreamEndian &stream);
+ static InfoEntries loadInfoEntries(Common::SeekableReadStreamEndian &stream);
bool loadArchive();
void setArchive(Archive *archive);
@@ -123,7 +123,7 @@ public:
void registerEvent(LEvent event, int targetId = 0);
private:
- void loadFileInfo(Common::SeekableSubReadStreamEndian &stream);
+ void loadFileInfo(Common::SeekableReadStreamEndian &stream);
void queueSpriteEvent(LEvent event, int eventId, int spriteId);
void queueFrameEvent(LEvent event, int eventId);
diff --git a/engines/director/resource.cpp b/engines/director/resource.cpp
index d7040fd416..a8f912de17 100644
--- a/engines/director/resource.cpp
+++ b/engines/director/resource.cpp
@@ -97,7 +97,7 @@ void Window::probeProjector(const Common::String &movie) {
if (archive->hasResource(MKTAG('v', 'e', 'r', 's'), -1)) {
Common::Array<uint16> vers = archive->getResourceIDList(MKTAG('v', 'e', 'r', 's'));
for (Common::Array<uint16>::iterator iterator = vers.begin(); iterator != vers.end(); ++iterator) {
- Common::SeekableSubReadStreamEndian *vvers = archive->getResource(MKTAG('v', 'e', 'r', 's'), *iterator);
+ Common::SeekableReadStreamEndian *vvers = archive->getResource(MKTAG('v', 'e', 'r', 's'), *iterator);
Common::MacResManager::MacVers *v = Common::MacResManager::parseVers(vvers);
debug(0, "Detected vers %d.%d %s.%d region %d '%s' '%s'", v->majorVer, v->minorVer, v->devStr.c_str(),
@@ -120,7 +120,7 @@ void Window::probeProjector(const Common::String &movie) {
if (_currentMovie)
_currentMovie->setArchive(archive);
- Common::SeekableSubReadStreamEndian *name = archive->getResource(MKTAG('S', 'T', 'R', '#'), 0);
+ Common::SeekableReadStreamEndian *name = archive->getResource(MKTAG('S', 'T', 'R', '#'), 0);
int num = name->readUint16();
if (num != 1) {
warning("Incorrect number of strings in Projector file");
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index ef260ff6a4..c8d6328218 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -624,7 +624,7 @@ void Score::playSoundChannel(uint16 frameId) {
sound->playCastMember(frame->_sound2, 2, false);
}
-void Score::loadFrames(Common::SeekableSubReadStreamEndian &stream) {
+void Score::loadFrames(Common::SeekableReadStreamEndian &stream) {
debugC(1, kDebugLoading, "****** Loading frames VWSC");
//stream.hexdump(stream.size());
@@ -758,7 +758,7 @@ void Score::setSpriteCasts() {
}
}
-void Score::loadLabels(Common::SeekableSubReadStreamEndian &stream) {
+void Score::loadLabels(Common::SeekableReadStreamEndian &stream) {
if (debugChannelSet(5, kDebugLoading)) {
debug("Score::loadLabels()");
stream.hexdump(stream.size());
@@ -802,7 +802,7 @@ int Score::compareLabels(const void *a, const void *b) {
return ((const Label *)a)->number - ((const Label *)b)->number;
}
-void Score::loadActions(Common::SeekableSubReadStreamEndian &stream) {
+void Score::loadActions(Common::SeekableReadStreamEndian &stream) {
debugC(2, kDebugLoading, "****** Loading Actions VWAC");
uint16 count = stream.readUint16() + 1;
diff --git a/engines/director/score.h b/engines/director/score.h
index b1c6239c74..3c3a64e004 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -35,7 +35,7 @@ namespace Graphics {
namespace Common {
class ReadStreamEndian;
- class SeekableSubReadStreamEndian;
+ class SeekableReadStreamEndian;
}
namespace Director {
@@ -67,9 +67,9 @@ public:
Movie *getMovie() const { return _movie; }
- void loadFrames(Common::SeekableSubReadStreamEndian &stream);
- void loadLabels(Common::SeekableSubReadStreamEndian &stream);
- void loadActions(Common::SeekableSubReadStreamEndian &stream);
+ void loadFrames(Common::SeekableReadStreamEndian &stream);
+ void loadLabels(Common::SeekableReadStreamEndian &stream);
+ void loadActions(Common::SeekableReadStreamEndian &stream);
static int compareLabels(const void *a, const void *b);
uint16 getLabel(Common::String &label);
diff --git a/engines/director/sound.cpp b/engines/director/sound.cpp
index 637cfcdaae..818e9df5dc 100644
--- a/engines/director/sound.cpp
+++ b/engines/director/sound.cpp
@@ -249,7 +249,7 @@ SNDDecoder::~SNDDecoder() {
}
}
-bool SNDDecoder::loadStream(Common::SeekableSubReadStreamEndian &stream) {
+bool SNDDecoder::loadStream(Common::SeekableReadStreamEndian &stream) {
if (_data) {
free(_data);
_data = nullptr;
@@ -289,7 +289,7 @@ bool SNDDecoder::loadStream(Common::SeekableSubReadStreamEndian &stream) {
return true;
}
-bool SNDDecoder::processCommands(Common::SeekableSubReadStreamEndian &stream) {
+bool SNDDecoder::processCommands(Common::SeekableReadStreamEndian &stream) {
uint16 cmdCount = stream.readUint16();
for (uint16 i = 0; i < cmdCount; i++) {
uint16 cmd = stream.readUint16();
@@ -305,7 +305,7 @@ bool SNDDecoder::processCommands(Common::SeekableSubReadStreamEndian &stream) {
return true;
}
-bool SNDDecoder::processBufferCommand(Common::SeekableSubReadStreamEndian &stream) {
+bool SNDDecoder::processBufferCommand(Common::SeekableReadStreamEndian &stream) {
if (_data) {
warning("SNDDecoder: Already read data");
return false;
diff --git a/engines/director/sound.h b/engines/director/sound.h
index 3d3aa542ef..6d7e3a03c6 100644
--- a/engines/director/sound.h
+++ b/engines/director/sound.h
@@ -102,9 +102,9 @@ public:
SNDDecoder();
~SNDDecoder();
- bool loadStream(Common::SeekableSubReadStreamEndian &stream);
- bool processCommands(Common::SeekableSubReadStreamEndian &stream);
- bool processBufferCommand(Common::SeekableSubReadStreamEndian &stream);
+ bool loadStream(Common::SeekableReadStreamEndian &stream);
+ bool processCommands(Common::SeekableReadStreamEndian &stream);
+ bool processBufferCommand(Common::SeekableReadStreamEndian &stream);
Audio::RewindableAudioStream *getAudioStream(DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
private:
diff --git a/engines/director/stxt.cpp b/engines/director/stxt.cpp
index 319cb381ba..dbec705993 100644
--- a/engines/director/stxt.cpp
+++ b/engines/director/stxt.cpp
@@ -27,7 +27,7 @@
namespace Director {
-Stxt::Stxt(Cast *cast, Common::SeekableSubReadStreamEndian &textStream) : _cast(cast) {
+Stxt::Stxt(Cast *cast, Common::SeekableReadStreamEndian &textStream) : _cast(cast) {
// TODO: Side effects on textStream make this a little hard to understand in context?
_textType = kTextTypeFixed;
diff --git a/engines/director/stxt.h b/engines/director/stxt.h
index d2f19f08b6..94e82298cb 100644
--- a/engines/director/stxt.h
+++ b/engines/director/stxt.h
@@ -47,7 +47,7 @@ struct FontStyle {
class Stxt {
public:
- Stxt(Cast *cast, Common::SeekableSubReadStreamEndian &textStream);
+ Stxt(Cast *cast, Common::SeekableReadStreamEndian &textStream);
public:
Cast *_cast;
Commit: 61a02b7606a7a56e1cb90aa8bdc9e658cfe84786
https://github.com/scummvm/scummvm/commit/61a02b7606a7a56e1cb90aa8bdc9e658cfe84786
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-12T17:26:55-04:00
Commit Message:
DIRECTOR: Implement DCR getResource
Changed paths:
engines/director/archive.cpp
diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index e564ad40c1..3597099497 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -24,6 +24,7 @@
#include "common/file.h"
#include "common/substream.h"
#include "common/macresman.h"
+#include "common/memstream.h"
#include "director/director.h"
#include "director/archive.h"
@@ -813,10 +814,29 @@ Common::SeekableReadStreamEndian *RIFXArchive::getResource(uint32 tag, uint16 id
error("RIFXArchive::getResource(): Archive does not contain '%s' %d", tag2str(tag), id);
const Resource &res = resMap[id];
+ bool bigEndian = fileEndianness ? _isBigEndian : true;
+
+ if (_rifxType == MKTAG('F', 'G', 'D', 'M') || _rifxType == MKTAG('F', 'G', 'D', 'C')) {
+ if (res.offset == -1) {
+ return new Common::MemoryReadStreamEndian(_ilsData[id], res.uncompSize, bigEndian, DisposeAfterUse::NO);
+ } else {
+ _stream->seek(res.offset + 5);
+ unsigned long actualUncompLength = res.uncompSize;
+ Common::SeekableReadStreamEndian *stream = readZlibData(*_stream, res.size, &actualUncompLength, _isBigEndian);
+ if (!stream) {
+ warning("RIFXArchive::getResource(): Could not uncompress '%s' %d", tag2str(tag), id);
+ return nullptr;
+ }
+ if (res.uncompSize != actualUncompLength) {
+ warning("RIFXArchive::getResource(): For '%s' %d expected uncompressed length %d but got length %lu",
+ tag2str(tag), id, res.uncompSize, actualUncompLength);
+ }
+ return stream;
+ }
+ }
uint32 offset = res.offset + 8;
uint32 size = res.size;
- bool bigEndian = fileEndianness ? _isBigEndian : true;
return new Common::SeekableSubReadStreamEndian(_stream, offset, offset + size, bigEndian, DisposeAfterUse::NO);
}
Commit: 9ae219aff190eec95cce231403ecfb9b18fa0e52
https://github.com/scummvm/scummvm/commit/9ae219aff190eec95cce231403ecfb9b18fa0e52
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-12T17:26:55-04:00
Commit Message:
DIRECTOR: More gracefully handle missing BITD
Changed paths:
engines/director/cast.cpp
diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 8e673193f2..34bf4bca7d 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -519,14 +519,16 @@ void Cast::loadCastChildren() {
Image::ImageDecoder *img = NULL;
Common::SeekableReadStream *pic = NULL;
- if (_vm->getVersion() >= 400 && bitmapCast->_children.size() > 0) {
- imgId = bitmapCast->_children[0].index;
- tag = bitmapCast->_children[0].tag;
-
- if (_castArchive->hasResource(tag, imgId))
- pic = _castArchive->getResource(tag, imgId);
- else if (sharedCast && sharedCast->getArchive()->hasResource(tag, imgId))
- pic = sharedCast->getArchive()->getResource(tag, imgId);
+ if (_vm->getVersion() >= 400) {
+ if (bitmapCast->_children.size() > 0) {
+ imgId = bitmapCast->_children[0].index;
+ tag = bitmapCast->_children[0].tag;
+
+ if (_castArchive->hasResource(tag, imgId))
+ pic = _castArchive->getResource(tag, imgId);
+ else if (sharedCast && sharedCast->getArchive()->hasResource(tag, imgId))
+ pic = sharedCast->getArchive()->getResource(tag, imgId);
+ }
} else {
if (_loadedCast->contains(imgId)) {
bitmapCast->_tag = tag = ((BitmapCastMember *)_loadedCast->getVal(imgId))->_tag;
Commit: d846db8da6b34cc53c8b92ab4a1f5d6c598f644a
https://github.com/scummvm/scummvm/commit/d846db8da6b34cc53c8b92ab4a1f5d6c598f644a
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-12T17:26:55-04:00
Commit Message:
DIRECTOR: Fix loading KEY* from Shockwave movies
Changed paths:
engines/director/archive.cpp
diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index 3597099497..f11a7ceffe 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -781,14 +781,19 @@ void RIFXArchive::readKeyTable(Common::SeekableReadStreamEndian &keyStream) {
debugC(2, kDebugLoading, "KEY*: entrySize: %d entrySize2: %d entryCount: %d usedCount: %d", entrySize, entrySize2, entryCount, usedCount);
+ ResourceMap &castResMap = _types[MKTAG('C', 'A', 'S', 't')];
+
for (uint16 i = 0; i < usedCount; i++) {
uint32 childIndex = keyStream.readUint32();
uint32 parentIndex = keyStream.readUint32();
uint32 childTag = keyStream.readUint32();
debugC(2, kDebugLoading, "KEY*: childIndex: %d parentIndex: %d childTag: %s", childIndex, parentIndex, tag2str(childTag));
- if (childIndex < _resources.size() && parentIndex < _resources.size())
- _resources[parentIndex]->children.push_back(*_resources[childIndex]);
+ if (castResMap.contains(parentIndex)) {
+ castResMap[parentIndex].children.push_back(_types[childTag][childIndex]);
+ } else if (castResMap.contains(childIndex)) { // sometimes parent and child index are reversed...
+ castResMap[childIndex].children.push_back(_types[childTag][parentIndex]);
+ }
}
}
Commit: af8fa6a82e3792585fe659266e8d7824170a3f19
https://github.com/scummvm/scummvm/commit/af8fa6a82e3792585fe659266e8d7824170a3f19
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-12T17:26:55-04:00
Commit Message:
DIRECTOR: Fix Shockwave chunk dumping
Changed paths:
engines/director/archive.cpp
diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index f11a7ceffe..84c73b0404 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -496,14 +496,19 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
Common::DumpFile out;
for (uint i = 0; i < _resources.size(); i++) {
- stream->seek(_resources[i]->offset);
+ if ((_rifxType == MKTAG('F', 'G', 'D', 'M') || _rifxType == MKTAG('F', 'G', 'D', 'C')) && _resources[i]->index < 3) {
+ // This is in the initial load segment and can't be read like a normal chunk.
+ continue;
+ }
+
+ Common::SeekableReadStreamEndian *resStream = getResource(_resources[i]->tag, _resources[i]->index);
uint32 len = _resources[i]->size;
if (dataSize < _resources[i]->size) {
free(data);
- data = (byte *)malloc(_resources[i]->size);
- dataSize = _resources[i]->size;
+ data = (byte *)malloc(resStream->size());
+ dataSize = resStream->size();
}
Common::String prepend;
if (_pathName.size() != 0)
@@ -511,8 +516,8 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
else
prepend = "stream";
- Common::String filename = Common::String::format("./dumps/%s-%s-%d", prepend.c_str(), tag2str(_resources[i]->tag), i);
- stream->read(data, len);
+ Common::String filename = Common::String::format("./dumps/%s-%s-%d", prepend.c_str(), tag2str(_resources[i]->tag), _resources[i]->index);
+ resStream->read(data, len);
if (!out.open(filename, true)) {
warning("RIFXArchive::openStream(): Can not open dump file %s", filename.c_str());
@@ -523,6 +528,7 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
out.flush();
out.close();
+ delete resStream;
}
}
More information about the Scummvm-git-logs
mailing list