[Scummvm-cvs-logs] SF.net SVN: scummvm:[55799] scummvm/trunk/engines/sci/graphics/robot.cpp
mthreepwood at users.sourceforge.net
mthreepwood at users.sourceforge.net
Mon Feb 7 06:53:30 CET 2011
Revision: 55799
http://scummvm.svn.sourceforge.net/scummvm/?rev=55799&view=rev
Author: mthreepwood
Date: 2011-02-07 05:53:30 +0000 (Mon, 07 Feb 2011)
Log Message:
-----------
SCI: Add support for v4 robots
Modified Paths:
--------------
scummvm/trunk/engines/sci/graphics/robot.cpp
Modified: scummvm/trunk/engines/sci/graphics/robot.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/robot.cpp 2011-02-07 02:35:17 UTC (rev 55798)
+++ scummvm/trunk/engines/sci/graphics/robot.cpp 2011-02-07 05:53:30 UTC (rev 55799)
@@ -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 @@
// 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 @@
_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 @@
_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 (_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;
- 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);
+ 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;
}
-
- outPtr += decompressedFragmentSize;
}
uint32 audioChunkSize = _frameTotalSize[_curFrame] - (24 + compressedSize);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list