aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2015-03-16 00:02:45 -0400
committerPaul Gilbert2015-03-16 00:02:45 -0400
commit02657f5a91bba15c7d494f71d0c975ece7178861 (patch)
treeff554df902afa8979d99fc6029b9e38ecd95cfbd
parent6cfb7169b94e0c3c665d7799584eb8e5a7f337b3 (diff)
downloadscummvm-rg350-02657f5a91bba15c7d494f71d0c975ece7178861.tar.gz
scummvm-rg350-02657f5a91bba15c7d494f71d0c975ece7178861.tar.bz2
scummvm-rg350-02657f5a91bba15c7d494f71d0c975ece7178861.zip
SHERLOCK: Fix loading of sprite for startup animation
-rw-r--r--engines/sherlock/animation.cpp2
-rw-r--r--engines/sherlock/sprite.cpp47
-rw-r--r--engines/sherlock/sprite.h6
3 files changed, 31 insertions, 24 deletions
diff --git a/engines/sherlock/animation.cpp b/engines/sherlock/animation.cpp
index 3da0201a61..4111f6f88f 100644
--- a/engines/sherlock/animation.cpp
+++ b/engines/sherlock/animation.cpp
@@ -91,7 +91,7 @@ void Animation::playPrologue(const Common::String &filename, int minDelay, int f
// Load initial image
Common::String vdaName = baseName + ".vda";
Common::SeekableReadStream *vdaStream = _vm->_res->load(vdaName);
- Sprite sprite(*vdaStream);
+ Sprite sprite(*vdaStream, true);
// TODO
diff --git a/engines/sherlock/sprite.cpp b/engines/sherlock/sprite.cpp
index f686f0b27e..ee7c8e5019 100644
--- a/engines/sherlock/sprite.cpp
+++ b/engines/sherlock/sprite.cpp
@@ -25,8 +25,8 @@
namespace Sherlock {
-Sprite::Sprite(Common::SeekableReadStream &stream) {
- load(stream);
+Sprite::Sprite(Common::SeekableReadStream &stream, bool skipPal) {
+ load(stream, skipPal);
}
Sprite::~Sprite() {
@@ -37,22 +37,26 @@ Sprite::~Sprite() {
/**
* Load the data of the sprite
*/
-void Sprite::load(Common::SeekableReadStream &stream) {
- while (!stream.eos()) {
+void Sprite::load(Common::SeekableReadStream &stream, bool skipPal) {
+ while (stream.pos() < stream.size()) {
SpriteFrame frame;
-
frame._width = stream.readUint16LE() + 1;
frame._height = stream.readUint16LE() + 1;
frame._flags = stream.readUint16LE();
stream.readUint16LE();
+ if (skipPal)
+ frame._flags = 0;
+
if (frame._flags & 0xFF) {
+ // Nibble packed frame data
frame._size = (frame._width * frame._height) / 2;
- } else if (frame._flags & 0x0100) {
+ } else if (frame._flags & RLE_ENCODED) {
// this size includes the header size, which we subtract
frame._size = stream.readUint16LE() - 11;
frame._rleMarker = stream.readByte();
} else {
+ // Uncompressed data
frame._size = frame._width * frame._height;
}
@@ -74,24 +78,25 @@ void Sprite::decompressFrame(SpriteFrame &frame, const byte *src) {
if (frame._flags & 0xFF) {
debug("TODO: Sprite::decompressFrame() 4-bits/pixel\n");
- } else if (frame._flags & 0x0100) {
+ } else if (frame._flags & RLE_ENCODED) {
+ // RLE encoded
byte *dst = (byte *)frame._frame.getPixels();
- for (uint16 h = 0; h < frame._height; ++h) {
- int16 w = frame._width;
- while (w > 0) {
- if (*src == frame._rleMarker) {
- byte rleColor = src[1];
- byte rleCount = src[2];
- src += 3;
- w -= rleCount;
- while (rleCount--)
- *dst++ = rleColor;
- } else {
- *dst++ = *src++;
- w--;
- }
+
+ int size = frame._width * frame._height;
+ while (size > 0) {
+ if (*src == frame._rleMarker) {
+ byte rleColor = src[1];
+ byte rleCount = src[2];
+ src += 3;
+ size -= rleCount;
+ while (rleCount--)
+ *dst++ = rleColor;
+ } else {
+ *dst++ = *src++;
+ --size;
}
}
+ assert(size == 0);
} else {
// Uncompressed frame
Common::copy(src, src + frame._width * frame._height,
diff --git a/engines/sherlock/sprite.h b/engines/sherlock/sprite.h
index 1f81cf8071..17566c81bd 100644
--- a/engines/sherlock/sprite.h
+++ b/engines/sherlock/sprite.h
@@ -30,6 +30,8 @@
namespace Sherlock {
+enum { RLE_ENCODED = 0x0100 };
+
struct SpriteFrame {
uint32 _size;
uint16 _width, _height;
@@ -41,10 +43,10 @@ struct SpriteFrame {
class Sprite: public Common::Array<SpriteFrame> {
private:
- void load(Common::SeekableReadStream &stream);
+ void load(Common::SeekableReadStream &stream, bool skipPal);
void decompressFrame(SpriteFrame &frame, const byte *src);
public:
- Sprite(Common::SeekableReadStream &stream);
+ Sprite(Common::SeekableReadStream &stream, bool skipPal = false);
~Sprite();
};