From 514d6667474a194306f104037d6eb37a89e6bfa0 Mon Sep 17 00:00:00 2001 From: David Capello Date: Sun, 3 Oct 2010 15:51:03 -0300 Subject: [PATCH] Add virtual method getMemSize() to GfxObj class (overriden by Image, Cel, Layer, etc.). These methods will be used for a new implementation of Undo. --- src/raster/cel.cpp | 5 +++++ src/raster/cel.h | 3 +++ src/raster/gfxobj.cpp | 5 +++++ src/raster/gfxobj.h | 4 ++++ src/raster/image.cpp | 12 ++++++++++++ src/raster/image.h | 6 ++++-- src/raster/layer.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/raster/layer.h | 6 ++++++ src/raster/mask.cpp | 5 +++++ src/raster/mask.h | 2 ++ 10 files changed, 82 insertions(+), 2 deletions(-) diff --git a/src/raster/cel.cpp b/src/raster/cel.cpp index 63a39b3b2..9fa7f0369 100644 --- a/src/raster/cel.cpp +++ b/src/raster/cel.cpp @@ -47,6 +47,11 @@ Cel::~Cel() { } +int Cel::getMemSize() const +{ + return sizeof(Cel); +} + ////////////////////////////////////////////////////////////////////// Cel* cel_new(int frame, int image) diff --git a/src/raster/cel.h b/src/raster/cel.h index 10b3f7838..1946a5e99 100644 --- a/src/raster/cel.h +++ b/src/raster/cel.h @@ -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); diff --git a/src/raster/gfxobj.cpp b/src/raster/gfxobj.cpp index 5a5f44abf..8fdab1576 100644 --- a/src/raster/gfxobj.cpp +++ b/src/raster/gfxobj.cpp @@ -69,6 +69,11 @@ GfxObj::~GfxObj() erase_gfxobj(this); } +int GfxObj::getMemSize() const +{ + return sizeof(GfxObj); +} + void GfxObj::assign_id() { ScopedLock lock(*objects_mutex); diff --git a/src/raster/gfxobj.h b/src/raster/gfxobj.h index 9338f30a5..6e0e99074 100644 --- a/src/raster/gfxobj.h +++ b/src/raster/gfxobj.h @@ -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); diff --git a/src/raster/image.cpp b/src/raster/image.cpp index 605b07dc8..7ac8c6067 100644 --- a/src/raster/image.cpp +++ b/src/raster/image.cpp @@ -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) diff --git a/src/raster/image.h b/src/raster/image.h index b355975cc..a7725fc15 100644 --- a/src/raster/image.h +++ b/src/raster/image.h @@ -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)); } diff --git a/src/raster/layer.cpp b/src/raster/layer.cpp index c2e99246e..13330a14f 100644 --- a/src/raster/layer.cpp +++ b/src/raster/layer.cpp @@ -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(); diff --git a/src/raster/layer.h b/src/raster/layer.h index b17132feb..151e9bcce 100644 --- a/src/raster/layer.h +++ b/src/raster/layer.h @@ -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(); } diff --git a/src/raster/mask.cpp b/src/raster/mask.cpp index 957f2acd1..e6cd53693 100644 --- a/src/raster/mask.cpp +++ b/src/raster/mask.cpp @@ -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); diff --git a/src/raster/mask.h b/src/raster/mask.h index 3d5eba73c..98bafc249 100644 --- a/src/raster/mask.h +++ b/src/raster/mask.h @@ -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 {