Fix tilemaps not getting duplicated with sprites (fix #4759)

This commit is contained in:
Christian Kaiser 2024-11-05 10:57:29 -03:00
parent 61515eea1f
commit 6056107bd4
3 changed files with 37 additions and 1 deletions

View File

@ -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();

View File

@ -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)
{

View File

@ -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);