aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/draci/sprite.cpp44
-rw-r--r--engines/draci/sprite.h10
-rw-r--r--engines/draci/walking.cpp4
3 files changed, 29 insertions, 29 deletions
diff --git a/engines/draci/sprite.cpp b/engines/draci/sprite.cpp
index 1fdd5339f4..32c4044e4e 100644
--- a/engines/draci/sprite.cpp
+++ b/engines/draci/sprite.cpp
@@ -58,8 +58,8 @@ static void transformToRows(byte *img, uint16 width, uint16 height) {
/**
* Constructor for loading sprites from a raw data buffer, one byte per pixel.
*/
-Sprite::Sprite(const byte *raw_data, uint16 width, uint16 height, int x, int y,
- bool columnwise) : _data(NULL) {
+Sprite::Sprite(uint16 width, uint16 height, byte *raw_data, int x, int y, bool columnwise)
+ : _ownsData(true), _data(raw_data), _mirror(false) {
_width = width;
_height = height;
@@ -72,17 +72,9 @@ Sprite::Sprite(const byte *raw_data, uint16 width, uint16 height, int x, int y,
_delay = 0;
- _mirror = false;
-
- byte *data = new byte[width * height];
-
- memcpy(data, raw_data, width * height);
-
- // If the sprite is stored column-wise, transform it to row-wise
if (columnwise) {
- transformToRows(data, width, height);
+ transformToRows(raw_data, _width, _height);
}
- _data = data;
}
/**
@@ -90,36 +82,36 @@ Sprite::Sprite(const byte *raw_data, uint16 width, uint16 height, int x, int y,
* pixel.
*/
Sprite::Sprite(const byte *sprite_data, uint16 length, int x, int y, bool columnwise)
- : _data(NULL) {
-
- _x = x;
- _y = y;
-
- _delay = 0;
-
- _mirror = false;
+ : _ownsData(false), _data(NULL), _mirror(false) {
Common::MemoryReadStream reader(sprite_data, length);
-
_width = reader.readSint16LE();
_height = reader.readSint16LE();
_scaledWidth = _width;
_scaledHeight = _height;
- byte *data = new byte[_width * _height];
+ _x = x;
+ _y = y;
- reader.read(data, _width * _height);
+ _delay = 0;
- // If the sprite is stored column-wise, transform it to row-wise
- if (columnwise) {
+ if (!columnwise) {
+ _ownsData = false;
+ _data = sprite_data + 4;
+ } else {
+ _ownsData = true;
+ byte *data = new byte[_width * _height];
+ memcpy(data, sprite_data + 4, _width * _height);
transformToRows(data, _width, _height);
+ _data = data;
}
- _data = data;
}
Sprite::~Sprite() {
- delete[] _data;
+ if (_ownsData) {
+ delete[] _data;
+ }
}
// Macro to simulate lround() for non-C99 compilers
diff --git a/engines/draci/sprite.h b/engines/draci/sprite.h
index 0d805e0385..7756d55d6a 100644
--- a/engines/draci/sprite.h
+++ b/engines/draci/sprite.h
@@ -101,7 +101,14 @@ protected:
class Sprite : public Drawable {
public:
- Sprite(const byte *raw_data, uint16 width, uint16 height, int x, int y, bool columnwise);
+ // Takes ownership of raw_data.
+ Sprite(uint16 width, uint16 height, byte *raw_data, int x, int y, bool columnwise);
+
+ // It doesn't take ownership of sprite_data. If columnwise is false,
+ // it internally points to the original buffer (which has lifetime at
+ // least as long as this sprite, assumming that it comes from a cached
+ // BArchive file), otherwise it allocates its own buffer with the
+ // transposed image.
Sprite(const byte *sprite_data, uint16 length, int x, int y, bool columnwise);
~Sprite();
@@ -120,6 +127,7 @@ public:
DrawableType getType() const { return kDrawableSprite; }
private:
+ bool _ownsData;
const byte *_data; ///< Pointer to a buffer containing raw sprite data (row-wise)
bool _mirror;
};
diff --git a/engines/draci/walking.cpp b/engines/draci/walking.cpp
index b9d7434349..f7c85d9bcd 100644
--- a/engines/draci/walking.cpp
+++ b/engines/draci/walking.cpp
@@ -71,8 +71,8 @@ Sprite *WalkingMap::constructDrawableOverlay() const {
}
}
- Sprite *ov = new Sprite(wlk, kScreenWidth, kScreenHeight, 0, 0, false);
- delete[] wlk;
+ Sprite *ov = new Sprite(kScreenWidth, kScreenHeight, wlk, 0, 0, false);
+ // ov has taken the ownership of wlk.
return ov;
}