diff options
author | Matthew Hoops | 2011-02-07 05:53:30 +0000 |
---|---|---|
committer | Matthew Hoops | 2011-02-07 05:53:30 +0000 |
commit | cd599216a595c9ca7d36aa034b054c1da38d4591 (patch) | |
tree | 85ca20a31d50d282431fbd0b777f0388ca1b52fc | |
parent | 5167cd390ca3c28698f7ee6ba77877b8a4a0f474 (diff) | |
download | scummvm-rg350-cd599216a595c9ca7d36aa034b054c1da38d4591.tar.gz scummvm-rg350-cd599216a595c9ca7d36aa034b054c1da38d4591.tar.bz2 scummvm-rg350-cd599216a595c9ca7d36aa034b054c1da38d4591.zip |
SCI: Add support for v4 robots
svn-id: r55799
-rw-r--r-- | engines/sci/graphics/robot.cpp | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/engines/sci/graphics/robot.cpp b/engines/sci/graphics/robot.cpp index 5a49a1ee21..2853e8aa52 100644 --- a/engines/sci/graphics/robot.cpp +++ b/engines/sci/graphics/robot.cpp @@ -46,7 +46,6 @@ namespace Sci { // TODO: -// - v4 robot support (used in PQ:SWAT) // - Positioning // - Proper handling of frame scaling - scaled frames look squashed // (probably because both dimensions should be scaled) @@ -109,11 +108,6 @@ void GfxRobot::init(GuiResourceId resourceId, uint16 x, uint16 y) { // v6: SCI3 games switch (_header.version) { case 4: // used in PQ:SWAT - // Unsupported - warning("TODO: add support for v4 robot videos"); - _curFrame = _header.frameCount; // jump to the last frame - freeData(); - return; case 5: // used in most SCI2.1 games and in some SCI3 robots case 6: // used in SCI3 games // Supported @@ -211,6 +205,7 @@ void GfxRobot::readFrameSizesChunk() { _robotFile->skip(_header.frameCount * wordSize * 2); #else switch (_header.version) { + case 4: case 5: // sizes are 16-bit integers // Skip table with frame image sizes, as we don't need it _robotFile->skip(_header.frameCount * 2); @@ -263,23 +258,30 @@ void GfxRobot::processNextFrame() { _outputBufferSize = decompressedSize; DecompressorLZS lzs; - byte *outPtr = _outputBuffer; - - for (uint16 i = 0; i < frameFragments; ++i) { - uint32 compressedFragmentSize = _robotFile->readUint32(); - uint32 decompressedFragmentSize = _robotFile->readUint32(); - uint16 compressionType = _robotFile->readUint16(); - - if (compressionType == 0) { - Common::SeekableSubReadStream fragmentStream(_robotFile, _robotFile->pos(), _robotFile->pos() + compressedFragmentSize); - lzs.unpack(&fragmentStream, outPtr, compressedFragmentSize, decompressedFragmentSize); - } else if (compressionType == 2) { // untested - _robotFile->read(outPtr, compressedFragmentSize); - } else { - error("Unknown frame compression found: %d", compressionType); - } - outPtr += decompressedFragmentSize; + if (_header.version == 4) { + // v4 has just the one fragment, it seems, and ignores the fragment count + Common::SeekableSubReadStream fragmentStream(_robotFile, _robotFile->pos(), _robotFile->pos() + compressedSize); + lzs.unpack(&fragmentStream, _outputBuffer, compressedSize, decompressedSize); + } else { + byte *outPtr = _outputBuffer; + + for (uint16 i = 0; i < frameFragments; ++i) { + uint32 compressedFragmentSize = _robotFile->readUint32(); + uint32 decompressedFragmentSize = _robotFile->readUint32(); + uint16 compressionType = _robotFile->readUint16(); + + if (compressionType == 0) { + Common::SeekableSubReadStream fragmentStream(_robotFile, _robotFile->pos(), _robotFile->pos() + compressedFragmentSize); + lzs.unpack(&fragmentStream, outPtr, compressedFragmentSize, decompressedFragmentSize); + } else if (compressionType == 2) { // untested + _robotFile->read(outPtr, compressedFragmentSize); + } else { + error("Unknown frame compression found: %d", compressionType); + } + + outPtr += decompressedFragmentSize; + } } uint32 audioChunkSize = _frameTotalSize[_curFrame] - (24 + compressedSize); |