aboutsummaryrefslogtreecommitdiff
path: root/engines/draci
diff options
context:
space:
mode:
authorRobert Špalek2009-11-01 10:03:37 +0000
committerRobert Špalek2009-11-01 10:03:37 +0000
commitf91c89560f9e50f6cecfe93795d4c00513f45206 (patch)
tree343af44f00fde18843d29a4b340d144adb827447 /engines/draci
parentb3eef9e066d8155bb9ba28bf1935f3024deebccf (diff)
downloadscummvm-rg350-f91c89560f9e50f6cecfe93795d4c00513f45206.tar.gz
scummvm-rg350-f91c89560f9e50f6cecfe93795d4c00513f45206.tar.bz2
scummvm-rg350-f91c89560f9e50f6cecfe93795d4c00513f45206.zip
Get rid of doubling memory allocation and a lot of copying.
The Sprite class points to the original buffer (which is cached in the memory thanks to BArchive machinery) instead of allocating its own buffer and copying the source there. svn-id: r45594
Diffstat (limited to 'engines/draci')
-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;
}