mirror of
https://github.com/aseprite/aseprite.git
synced 2025-03-14 13:21:34 +00:00
Add static methods to copy a layer
This commit is contained in:
parent
220254158f
commit
b110078a8b
@ -697,27 +697,15 @@ void DocApi::restackLayerBefore(Layer* layer, LayerGroup* parent, Layer* beforeT
|
||||
Layer* DocApi::duplicateLayerAfter(Layer* sourceLayer, LayerGroup* parent, Layer* afterLayer)
|
||||
{
|
||||
ASSERT(parent);
|
||||
std::unique_ptr<Layer> newLayerPtr;
|
||||
Layer* newLayerPtr = Layer::MakeCopy(sourceLayer);
|
||||
|
||||
if (sourceLayer->isTilemap()) {
|
||||
newLayerPtr.reset(new LayerTilemap(sourceLayer->sprite(),
|
||||
static_cast<LayerTilemap*>(sourceLayer)->tilesetIndex()));
|
||||
}
|
||||
else if (sourceLayer->isImage())
|
||||
newLayerPtr.reset(new LayerImage(sourceLayer->sprite()));
|
||||
else if (sourceLayer->isGroup())
|
||||
newLayerPtr.reset(new LayerGroup(sourceLayer->sprite()));
|
||||
else
|
||||
throw std::runtime_error("Invalid layer type");
|
||||
|
||||
m_document->copyLayerContent(sourceLayer, m_document, newLayerPtr.get());
|
||||
m_document->copyLayerContent(sourceLayer, m_document, newLayerPtr);
|
||||
|
||||
newLayerPtr->setName(newLayerPtr->name() + " Copy");
|
||||
|
||||
addLayer(parent, newLayerPtr.get(), afterLayer);
|
||||
addLayer(parent, newLayerPtr, afterLayer);
|
||||
|
||||
// Release the pointer as it is owned by the sprite now.
|
||||
return newLayerPtr.release();
|
||||
return newLayerPtr;
|
||||
}
|
||||
|
||||
Layer* DocApi::duplicateLayerBefore(Layer* sourceLayer, LayerGroup* parent, Layer* beforeLayer)
|
||||
|
@ -14,8 +14,10 @@
|
||||
#include "doc/cel.h"
|
||||
#include "doc/grid.h"
|
||||
#include "doc/image.h"
|
||||
#include "doc/layer_tilemap.h"
|
||||
#include "doc/primitives.h"
|
||||
#include "doc/sprite.h"
|
||||
#include "doc/tilesets.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
@ -43,6 +45,39 @@ Layer::~Layer()
|
||||
{
|
||||
}
|
||||
|
||||
// static
|
||||
Layer* Layer::MakeCopy(doc::Layer* layer)
|
||||
{
|
||||
return MakeCopyWithSprite(layer, layer->sprite());
|
||||
}
|
||||
|
||||
// static
|
||||
Layer* Layer::MakeCopyWithSprite(doc::Layer* layer, doc::Sprite* sprite)
|
||||
{
|
||||
std::unique_ptr<doc::Layer> clone;
|
||||
if (layer->isTilemap()) {
|
||||
auto* srcTilemap = static_cast<LayerTilemap*>(layer);
|
||||
tileset_index tilesetIndex = srcTilemap->tilesetIndex();
|
||||
// If the caller is trying to make a copy of a tilemap layer specifying a
|
||||
// different sprite as its owner, then we must copy the tilesets of the
|
||||
// given tilemap layer into the new owner.
|
||||
if (sprite != srcTilemap->sprite()) {
|
||||
auto* srcTilesetCopy = Tileset::MakeCopyCopyingImages(srcTilemap->tileset());
|
||||
tilesetIndex = sprite->tilesets()->add(srcTilesetCopy);
|
||||
}
|
||||
|
||||
clone.reset(new LayerTilemap(sprite, tilesetIndex));
|
||||
}
|
||||
else if (layer->isImage())
|
||||
clone.reset(new LayerImage(sprite));
|
||||
else if (layer->isGroup())
|
||||
clone.reset(new LayerGroup(sprite));
|
||||
else
|
||||
throw std::runtime_error("Invalid layer type");
|
||||
|
||||
return clone.release();
|
||||
}
|
||||
|
||||
int Layer::getMemSize() const
|
||||
{
|
||||
return sizeof(Layer);
|
||||
|
@ -58,6 +58,9 @@ namespace doc {
|
||||
public:
|
||||
virtual ~Layer();
|
||||
|
||||
static Layer* MakeCopy(doc::Layer* layer);
|
||||
static Layer* MakeCopyWithSprite(doc::Layer* layer, doc::Sprite* sprite);
|
||||
|
||||
virtual int getMemSize() const override;
|
||||
|
||||
const std::string& name() const { return m_name; }
|
||||
@ -144,7 +147,7 @@ namespace doc {
|
||||
|
||||
BlendMode m_blendmode;
|
||||
int m_opacity;
|
||||
|
||||
|
||||
// Disable assigment
|
||||
Layer& operator=(const Layer& other);
|
||||
};
|
||||
@ -183,7 +186,7 @@ namespace doc {
|
||||
|
||||
private:
|
||||
void destroyAllCels();
|
||||
|
||||
|
||||
CelList m_cels; // List of all cels inside this layer used by frames.
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user