diff options
author | Alyssa Milburn | 2011-11-04 22:38:33 +0100 |
---|---|---|
committer | Alyssa Milburn | 2011-11-04 22:38:33 +0100 |
commit | 1c1eed784a0eb029b5db75aecf4cfed1c4e80e83 (patch) | |
tree | c5da5b2a76a91848fd8fad117b19205e42befb60 /engines/composer/resource.cpp | |
parent | dbbfca37a2e99ee350a1b70ce8ee9728988b0b85 (diff) | |
download | scummvm-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.cpp | 61 |
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 |