mirror of
https://github.com/aseprite/aseprite.git
synced 2025-04-01 10:21:04 +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/slice.h"
|
||||||
#include "doc/sprite.h"
|
#include "doc/sprite.h"
|
||||||
#include "doc/tag.h"
|
#include "doc/tag.h"
|
||||||
|
#include "doc/tileset.h"
|
||||||
|
#include "doc/tilesets.h"
|
||||||
#include "os/system.h"
|
#include "os/system.h"
|
||||||
#include "os/window.h"
|
#include "os/window.h"
|
||||||
#include "ui/system.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);
|
std::unique_ptr<Layer> destChild(nullptr);
|
||||||
|
|
||||||
if (sourceChild->isImage()) {
|
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());
|
copyLayerContent(sourceChild, destDoc, destChild.get());
|
||||||
}
|
}
|
||||||
else if (sourceChild->isGroup()) {
|
else if (sourceChild->isGroup()) {
|
||||||
@ -590,6 +599,7 @@ Doc* Doc::duplicate(DuplicateType type) const
|
|||||||
Sprite* spriteCopy = spriteCopyPtr.release();
|
Sprite* spriteCopy = spriteCopyPtr.release();
|
||||||
|
|
||||||
spriteCopy->setTotalFrames(sourceSprite->totalFrames());
|
spriteCopy->setTotalFrames(sourceSprite->totalFrames());
|
||||||
|
spriteCopy->setTileManagementPlugin(sourceSprite->tileManagementPlugin());
|
||||||
|
|
||||||
// Copy frames duration
|
// Copy frames duration
|
||||||
for (frame_t i(0); i < sourceSprite->totalFrames(); ++i)
|
for (frame_t i(0); i < sourceSprite->totalFrames(); ++i)
|
||||||
@ -607,6 +617,16 @@ Doc* Doc::duplicate(DuplicateType type) const
|
|||||||
ASSERT(sliceCopy->owner() == &spriteCopy->slices());
|
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
|
// Copy color palettes
|
||||||
{
|
{
|
||||||
PalettesList::const_iterator it = sourceSprite->getPalettes().begin();
|
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
|
// static
|
||||||
Tileset* Tileset::MakeCopyWithoutImages(const Tileset* tileset)
|
Tileset* Tileset::MakeCopyWithoutImages(const Tileset* tileset)
|
||||||
{
|
{
|
||||||
|
@ -46,6 +46,9 @@ namespace doc {
|
|||||||
const Grid& grid,
|
const Grid& grid,
|
||||||
const tileset_index ntiles);
|
const tileset_index ntiles);
|
||||||
|
|
||||||
|
// Copy constructor
|
||||||
|
Tileset(Sprite* sprite, const Tileset* other);
|
||||||
|
|
||||||
static Tileset* MakeCopyWithoutImages(const Tileset* tileset);
|
static Tileset* MakeCopyWithoutImages(const Tileset* tileset);
|
||||||
static Tileset* MakeCopyWithSameImages(const Tileset* tileset);
|
static Tileset* MakeCopyWithSameImages(const Tileset* tileset);
|
||||||
static Tileset* MakeCopyCopyingImages(const Tileset* tileset);
|
static Tileset* MakeCopyCopyingImages(const Tileset* tileset);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user