aboutsummaryrefslogtreecommitdiff
path: root/engines/composer/resource.cpp
diff options
context:
space:
mode:
authorAlyssa Milburn2011-11-04 22:38:33 +0100
committerAlyssa Milburn2011-11-04 22:38:33 +0100
commit1c1eed784a0eb029b5db75aecf4cfed1c4e80e83 (patch)
treec5da5b2a76a91848fd8fad117b19205e42befb60 /engines/composer/resource.cpp
parentdbbfca37a2e99ee350a1b70ce8ee9728988b0b85 (diff)
downloadscummvm-rg350-1c1eed784a0eb029b5db75aecf4cfed1c4e80e83.tar.gz
scummvm-rg350-1c1eed784a0eb029b5db75aecf4cfed1c4e80e83.tar.bz2
scummvm-rg350-1c1eed784a0eb029b5db75aecf4cfed1c4e80e83.zip
COMPOSER: Add support for V1 pipes.
Diffstat (limited to 'engines/composer/resource.cpp')
-rw-r--r--engines/composer/resource.cpp61
1 files changed, 60 insertions, 1 deletions
diff --git a/engines/composer/resource.cpp b/engines/composer/resource.cpp
index b40bdb379b..ce2661f0d0 100644
--- a/engines/composer/resource.cpp
+++ b/engines/composer/resource.cpp
@@ -252,8 +252,10 @@ Pipe::Pipe(Common::SeekableReadStream *stream) {
_offset = 0;
_stream = stream;
_anim = NULL;
+}
- nextFrame();
+Pipe::~Pipe() {
+ delete _stream;
}
void Pipe::nextFrame() {
@@ -334,4 +336,61 @@ Common::SeekableReadStream *Pipe::getResource(uint32 tag, uint16 id, bool buffer
return new Common::MemoryReadStream(buffer, size, DisposeAfterUse::YES);
}
+OldPipe::OldPipe(Common::SeekableReadStream *stream) : Pipe(stream), _currFrame(0) {
+ uint32 tag = _stream->readUint32BE();
+ if (tag != ID_PIPE)
+ error("invalid tag for pipe (%08x)", tag);
+
+ _numFrames = _stream->readUint32LE();
+ uint16 scriptCount = _stream->readUint16LE();
+ _scripts.reserve(scriptCount);
+ for (uint i = 0; i < scriptCount; i++)
+ _scripts.push_back(_stream->readUint16LE());
+
+ _offset = _stream->pos();
+}
+
+void OldPipe::nextFrame() {
+ if (_currFrame >= _numFrames)
+ return;
+
+ _stream->seek(_offset, SEEK_SET);
+
+ uint32 tag = _stream->readUint32BE();
+ if (tag != ID_FRME)
+ error("invalid tag for pipe (%08x)", tag);
+
+ uint16 spriteCount = _stream->readUint16LE();
+ uint32 spriteSize = _stream->readUint32LE();
+ uint32 audioSize = _stream->readUint32LE();
+
+ Common::Array<uint16> spriteIds;
+ Common::Array<PipeResourceEntry> spriteEntries;
+ for (uint i = 0; i < spriteCount; i++) {
+ spriteIds.push_back(_stream->readUint16LE());
+ PipeResourceEntry entry;
+ entry.size = _stream->readUint32LE();
+ entry.offset = _stream->readUint32LE();
+ spriteEntries.push_back(entry);
+ }
+
+ uint32 spriteDataOffset = _stream->pos();
+ _stream->skip(spriteSize);
+
+ ResourceMap &spriteResMap = _types[ID_BMAP];
+ spriteResMap.clear();
+ for (uint i = 0; i < spriteIds.size(); i++) {
+ PipeResourceEntry &entry = spriteEntries[i];
+ entry.offset += spriteDataOffset;
+ spriteResMap[spriteIds[i]].entries.push_back(entry);
+ }
+
+ // FIXME
+ uint32 audioDataOffset = _stream->pos();
+ _stream->skip(audioSize);
+
+ _offset = _stream->pos();
+ _currFrame++;
+}
+
} // End of namespace Composer