diff options
-rw-r--r-- | engines/draci/sprite.cpp | 44 | ||||
-rw-r--r-- | engines/draci/sprite.h | 10 | ||||
-rw-r--r-- | engines/draci/walking.cpp | 4 |
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; } |