mirror of
https://github.com/aseprite/aseprite.git
synced 2025-03-30 04:20:23 +00:00
Fix tilemaps not getting duplicated with sprites (fix #4759)
This commit is contained in:
parent
61515eea1f
commit
6056107bd4
@ -34,6 +34,8 @@
|
||||
#include "doc/slice.h"
|
||||
#include "doc/sprite.h"
|
||||
#include "doc/tag.h"
|
||||
#include "doc/tileset.h"
|
||||
#include "doc/tilesets.h"
|
||||
#include "os/system.h"
|
||||
#include "os/window.h"
|
||||
#include "ui/system.h"
|
||||
@ -550,7 +552,14 @@ void Doc::copyLayerContent(const Layer* sourceLayer0, Doc* destDoc, Layer* destL
|
||||
std::unique_ptr<Layer> destChild(nullptr);
|
||||
|
||||
if (sourceChild->isImage()) {
|
||||
destChild.reset(new LayerImage(destLayer->sprite()));
|
||||
if (sourceChild->isTilemap()) {
|
||||
auto* tilemapLayer = static_cast<LayerTilemap*>(sourceChild);
|
||||
destChild.reset(new LayerTilemap(destLayer->sprite(), tilemapLayer->tilesetIndex()));
|
||||
}
|
||||
else {
|
||||
destChild.reset(new LayerImage(destLayer->sprite()));
|
||||
}
|
||||
|
||||
copyLayerContent(sourceChild, destDoc, destChild.get());
|
||||
}
|
||||
else if (sourceChild->isGroup()) {
|
||||
@ -590,6 +599,7 @@ Doc* Doc::duplicate(DuplicateType type) const
|
||||
Sprite* spriteCopy = spriteCopyPtr.release();
|
||||
|
||||
spriteCopy->setTotalFrames(sourceSprite->totalFrames());
|
||||
spriteCopy->setTileManagementPlugin(sourceSprite->tileManagementPlugin());
|
||||
|
||||
// Copy frames duration
|
||||
for (frame_t i(0); i < sourceSprite->totalFrames(); ++i)
|
||||
@ -607,6 +617,16 @@ Doc* Doc::duplicate(DuplicateType type) const
|
||||
ASSERT(sliceCopy->owner() == &spriteCopy->slices());
|
||||
}
|
||||
|
||||
// Copy tilesets
|
||||
if (sourceSprite->hasTilesets()) {
|
||||
for (Tileset* tileset : *sourceSprite->tilesets()) {
|
||||
auto tilesetCopy = new Tileset(spriteCopy, tileset);
|
||||
spriteCopy->tilesets()->add(tilesetCopy);
|
||||
|
||||
ASSERT(tilesetCopy->sprite() == spriteCopy)
|
||||
}
|
||||
}
|
||||
|
||||
// Copy color palettes
|
||||
{
|
||||
PalettesList::const_iterator it = sourceSprite->getPalettes().begin();
|
||||
|
@ -51,6 +51,19 @@ Tileset::Tileset(Sprite* sprite,
|
||||
}
|
||||
}
|
||||
|
||||
Tileset::Tileset(Sprite* sprite, const Tileset* other)
|
||||
: WithUserData(ObjectType::Tileset)
|
||||
, m_sprite(sprite)
|
||||
, m_grid(other->grid())
|
||||
, m_tiles(other->size())
|
||||
{
|
||||
for (tile_index ti = 0; ti < other->size(); ++ti) {
|
||||
const ImageRef image = other->get(ti);
|
||||
set(ti, ImageRef(Image::createCopy(image.get())));
|
||||
setTileData(ti, other->getTileData(ti));
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
Tileset* Tileset::MakeCopyWithoutImages(const Tileset* tileset)
|
||||
{
|
||||
|
@ -46,6 +46,9 @@ namespace doc {
|
||||
const Grid& grid,
|
||||
const tileset_index ntiles);
|
||||
|
||||
// Copy constructor
|
||||
Tileset(Sprite* sprite, const Tileset* other);
|
||||
|
||||
static Tileset* MakeCopyWithoutImages(const Tileset* tileset);
|
||||
static Tileset* MakeCopyWithSameImages(const Tileset* tileset);
|
||||
static Tileset* MakeCopyCopyingImages(const Tileset* tileset);
|
||||
|
Loading…
x
Reference in New Issue
Block a user