Add virtual method getMemSize() to GfxObj class (overriden by Image, Cel, Layer, etc.).

These methods will be used for a new implementation of Undo.
This commit is contained in:
David Capello 2010-10-03 15:51:03 -03:00
parent 070be38e81
commit 514d666747
10 changed files with 82 additions and 2 deletions

View File

@ -47,6 +47,11 @@ Cel::~Cel()
{
}
int Cel::getMemSize() const
{
return sizeof(Cel);
}
//////////////////////////////////////////////////////////////////////
Cel* cel_new(int frame, int image)

View File

@ -34,6 +34,9 @@ public:
Cel(int frame, int image);
Cel(const Cel& cel);
virtual ~Cel();
int getMemSize() const;
};
Cel* cel_new(int frame, int image);

View File

@ -69,6 +69,11 @@ GfxObj::~GfxObj()
erase_gfxobj(this);
}
int GfxObj::getMemSize() const
{
return sizeof(GfxObj);
}
void GfxObj::assign_id()
{
ScopedLock lock(*objects_mutex);

View File

@ -58,6 +58,10 @@ public:
GfxObjId getId() const { return m_id; }
GfxObjType getType() const { return m_type; }
// Returns the approximate amount of memory (in bytes) which this
// object use.
virtual int getMemSize() const;
// Returns a GfxObj by its ID. If it is not found, returns NULL.
static GfxObj* find(GfxObjId id);

View File

@ -49,6 +49,18 @@ Image::~Image()
if (this->line) delete[] this->line;
}
int Image::getMemSize() const
{
int scanline_size = 0;
if (imgtype == IMAGE_BITMAP)
scanline_size = BitmapTraits::scanline_size(this->w);
else
scanline_size = image_line_size(this, this->w);
return sizeof(Image) + scanline_size*this->h;
}
//////////////////////////////////////////////////////////////////////
Image* image_new(int imgtype, int w, int h)

View File

@ -54,6 +54,8 @@ public:
Image(int imgtype, int w, int h);
virtual ~Image();
int getMemSize() const;
virtual int getpixel(int x, int y) const = 0;
virtual void putpixel(int x, int y, int color) = 0;
virtual void clear(int color) = 0;
@ -98,13 +100,13 @@ void image_resize(const Image* src, Image* dst, ResizeMethod method, const Palet
int image_count_diff(const Image* i1, const Image* i2);
bool image_shrink_rect(Image *image, int *x1, int *y1, int *x2, int *y2, int refpixel);
inline int image_shift(Image* image)
inline int image_shift(const Image* image)
{
return ((image->imgtype == IMAGE_RGB)? 2:
(image->imgtype == IMAGE_GRAYSCALE)? 1: 0);
}
inline int image_line_size(Image* image, int width)
inline int image_line_size(const Image* image, int width)
{
return (width << image_shift(image));
}

View File

@ -66,6 +66,11 @@ Layer::~Layer()
{
}
int Layer::getMemSize() const
{
return sizeof(Layer);
}
/**
* Gets the previous layer of "layer" that are in the parent set.
*/
@ -150,6 +155,23 @@ LayerImage::~LayerImage()
destroy_all_cels();
}
int LayerImage::getMemSize() const
{
int size = sizeof(LayerImage);
CelConstIterator it = getCelBegin();
CelConstIterator end = getCelEnd();
for (; it != end; ++it) {
const Cel* cel = *it;
size += cel->getMemSize();
const Image* image = getSprite()->getStock()->getImage(cel->image);
size += image->getMemSize();
}
return size;
}
void LayerImage::destroy_all_cels()
{
CelIterator it = getCelBegin();
@ -303,6 +325,20 @@ void LayerFolder::destroyAllLayers()
m_layers.clear();
}
int LayerFolder::getMemSize() const
{
int size = sizeof(LayerFolder);
LayerConstIterator it = get_layer_begin();
LayerConstIterator end = get_layer_end();
for (; it != end; ++it) {
const Layer* layer = *it;
size += layer->getMemSize();
}
return size;
}
void LayerFolder::getCels(CelList& cels)
{
LayerIterator it = get_layer_begin();

View File

@ -47,6 +47,8 @@ protected:
public:
virtual ~Layer();
int getMemSize() const;
std::string getName() const { return m_name; }
void setName(const std::string& name) { m_name = name; }
@ -91,6 +93,8 @@ public:
LayerImage(const LayerImage* copy, Sprite* sprite);
virtual ~LayerImage();
int getMemSize() const;
int get_blend_mode() const { return m_blend_mode; }
void set_blend_mode(int blend_mode);
@ -128,6 +132,8 @@ public:
LayerFolder(const LayerFolder* copy, Sprite* sprite);
virtual ~LayerFolder();
int getMemSize() const;
LayerList get_layers_list() { return m_layers; }
LayerIterator get_layer_begin() { return m_layers.begin(); }
LayerIterator get_layer_end() { return m_layers.end(); }

View File

@ -63,6 +63,11 @@ void Mask::initialize()
this->bitmap = NULL;
}
int Mask::getMemSize() const
{
return sizeof(Mask) + (this->bitmap ? this->bitmap->getMemSize(): 0);
}
void Mask::freeze()
{
ASSERT(m_freeze_count >= 0);

View File

@ -36,6 +36,8 @@ public:
Mask(const Mask& mask);
virtual ~Mask();
int getMemSize() const;
// Returns true if the mask is completely empty (i.e. nothing
// selected)
bool is_empty() const {