mirror of
https://github.com/aseprite/aseprite.git
synced 2025-03-01 10:13:22 +00:00
Fixed Sprite(const Sprite&) constructor.
This commit is contained in:
parent
19dd9f6c90
commit
d976011597
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user