Fixed Sprite(const Sprite&) constructor.

This commit is contained in:
David Capello 2010-03-30 22:24:05 -03:00
parent 19dd9f6c90
commit d976011597

View File

@ -50,8 +50,8 @@ public:
SpriteImpl(Sprite* sprite, int imgtype, int width, int height, int ncolors); SpriteImpl(Sprite* sprite, int imgtype, int width, int height, int ncolors);
~SpriteImpl(); ~SpriteImpl();
static SpriteImpl* copy(Sprite* new_sprite, const SpriteImpl* src_sprite);
static SpriteImpl* copyBase(Sprite* new_sprite, const SpriteImpl* src_sprite); static SpriteImpl* copyBase(Sprite* new_sprite, const SpriteImpl* src_sprite);
static SpriteImpl* copyLayers(SpriteImpl* dst_sprite, const SpriteImpl* src_sprite);
bool lock(bool write); bool lock(bool write);
bool lockToWrite(); bool lockToWrite();
@ -474,37 +474,6 @@ SpriteImpl::SpriteImpl(Sprite* sprite, int imgtype, int width, int height, int n
setPalette(&pal, true); setPalette(&pal, true);
} }
SpriteImpl* SpriteImpl::copy(Sprite* sprite, const SpriteImpl* src_sprite)
{
SpriteImpl* dst_sprite = copyBase(sprite, src_sprite);
// Copy layers
if (dst_sprite->m_folder) {
delete dst_sprite->m_folder; // delete
dst_sprite->m_folder = NULL;
}
assert(src_sprite->getFolder() != NULL);
undo_disable(dst_sprite->getUndo());
dst_sprite->m_folder = src_sprite->getFolder()->duplicate_for(dst_sprite->m_self);
undo_enable(dst_sprite->getUndo());
if (dst_sprite->m_folder == NULL) {
delete dst_sprite;
return NULL;
}
// Selected layer
if (src_sprite->getCurrentLayer() != NULL) {
int selected_layer = src_sprite->layerToIndex(src_sprite->getCurrentLayer());
dst_sprite->setCurrentLayer(dst_sprite->indexToLayer(selected_layer));
}
dst_sprite->generateMaskBoundaries();
return dst_sprite;
}
/** /**
* Makes a copy "sprite" without the layers (only with the empty layer set) * Makes a copy "sprite" without the layers (only with the empty layer set)
*/ */
@ -516,6 +485,7 @@ SpriteImpl* SpriteImpl::copyBase(Sprite* new_sprite, const SpriteImpl* src_sprit
src_sprite->m_width, src_sprite->m_height, src_sprite->m_width, src_sprite->m_height,
src_sprite->getPalette(0)->size()); src_sprite->getPalette(0)->size());
// Copy stock // Copy stock
stock_free(dst_sprite->m_stock); stock_free(dst_sprite->m_stock);
dst_sprite->m_stock = stock_new_copy(src_sprite->m_stock); dst_sprite->m_stock = stock_new_copy(src_sprite->m_stock);
@ -524,7 +494,7 @@ SpriteImpl* SpriteImpl::copyBase(Sprite* new_sprite, const SpriteImpl* src_sprit
return NULL; return NULL;
} }
/* copy general properties */ // Copy general properties
dst_sprite->m_filename = src_sprite->m_filename; dst_sprite->m_filename = src_sprite->m_filename;
dst_sprite->setTotalFrames(src_sprite->m_frames); dst_sprite->setTotalFrames(src_sprite->m_frames);
std::copy(src_sprite->m_frlens.begin(), std::copy(src_sprite->m_frlens.begin(),
@ -574,6 +544,35 @@ SpriteImpl* SpriteImpl::copyBase(Sprite* new_sprite, const SpriteImpl* src_sprit
return dst_sprite; return dst_sprite;
} }
SpriteImpl* SpriteImpl::copyLayers(SpriteImpl* dst_sprite, const SpriteImpl* src_sprite)
{
// Copy layers
if (dst_sprite->m_folder) {
delete dst_sprite->m_folder; // delete
dst_sprite->m_folder = NULL;
}
assert(src_sprite->getFolder() != NULL);
undo_disable(dst_sprite->getUndo());
dst_sprite->m_folder = src_sprite->getFolder()->duplicate_for(dst_sprite->m_self);
undo_enable(dst_sprite->getUndo());
if (dst_sprite->m_folder == NULL) {
delete dst_sprite;
return NULL;
}
// Selected layer
if (src_sprite->getCurrentLayer() != NULL) {
int selected_layer = src_sprite->layerToIndex(src_sprite->getCurrentLayer());
dst_sprite->setCurrentLayer(dst_sprite->indexToLayer(selected_layer));
}
dst_sprite->generateMaskBoundaries();
return dst_sprite;
}
SpriteImpl::~SpriteImpl() SpriteImpl::~SpriteImpl()
{ {
JLink link; JLink link;
@ -937,8 +936,9 @@ Sprite::~Sprite()
Sprite::Sprite(const Sprite& original) Sprite::Sprite(const Sprite& original)
: GfxObj(GFXOBJ_SPRITE) : GfxObj(GFXOBJ_SPRITE)
, m_impl(SpriteImpl::copy(this, original.m_impl)) , m_impl(SpriteImpl::copyBase(this, original.m_impl))
{ {
SpriteImpl::copyLayers(m_impl, original.m_impl);
} }
Sprite* Sprite::createFlattenCopy(const Sprite& src_sprite) Sprite* Sprite::createFlattenCopy(const Sprite& src_sprite)