diff --git a/src/app/ui/editor/moving_pixels_state.cpp b/src/app/ui/editor/moving_pixels_state.cpp index 045118568..ea4d685a3 100644 --- a/src/app/ui/editor/moving_pixels_state.cpp +++ b/src/app/ui/editor/moving_pixels_state.cpp @@ -630,10 +630,21 @@ void MovingPixelsState::onBeforeCommandExecution(CommandExecutionEvent& ev) std::unique_ptr floatingMask; m_pixelsMovement->getDraggedImageCopy(floatingImage, floatingMask); - Clipboard::instance()-> - copyImage(floatingImage.get(), - floatingMask.get(), - document->sprite()->palette(m_editor->frame())); + if (floatingImage->isTilemap()) { + Site site = m_editor->getSite(); + ASSERT(site.tileset()); + Clipboard::instance()-> + copyTilemap(floatingImage.get(), + floatingMask.get(), + document->sprite()->palette(m_editor->frame()), + site.tileset()); + } + else { + Clipboard::instance()-> + copyImage(floatingImage.get(), + floatingMask.get(), + document->sprite()->palette(m_editor->frame())); + } } // Clear floating pixels on Cut/Clear. diff --git a/src/app/ui/editor/pixels_movement.cpp b/src/app/ui/editor/pixels_movement.cpp index 68854153c..286477539 100644 --- a/src/app/ui/editor/pixels_movement.cpp +++ b/src/app/ui/editor/pixels_movement.cpp @@ -716,9 +716,22 @@ void PixelsMovement::getDraggedImageCopy(std::unique_ptr& outputImage, if (bounds.isEmpty()) return; + doc::PixelFormat pixelFormat; + gfx::Size imgSize; + if (m_site.tilemapMode() == TilemapMode::Tiles) { + imgSize = m_site.grid().canvasToTile(bounds).size(); + pixelFormat = IMAGE_TILEMAP; + } + else { + imgSize = bounds.size(); + pixelFormat = m_site.sprite()->pixelFormat(); + } + std::unique_ptr image( Image::create( - m_site.sprite()->pixelFormat(), bounds.w, bounds.h)); + pixelFormat, + imgSize.w, + imgSize.h)); drawImage(m_currentData, image.get(), gfx::PointF(bounds.origin()), false); @@ -1177,12 +1190,8 @@ static void merge_tilemaps(Image* dst, const Image* src, gfx::Clip area) ImageConstIterator src_it(src, area.srcBounds(), area.src.x, area.src.y); ImageIterator dst_it(dst, area.dstBounds(), area.dst.x, area.dst.y); - int end_x = area.dst.x+area.size.w; - - for (int end_y=area.dst.y+area.size.h; - area.dst.ypixelFormat() == IMAGE_TILEMAP); + ASSERT(src->pixelFormat() == IMAGE_TILEMAP); + const int boxw = std::max(1, src->width()-2); const int boxh = std::max(1, src->height()-2); diff --git a/src/app/util/clipboard.cpp b/src/app/util/clipboard.cpp index 12e4a3623..c1db89cf0 100644 --- a/src/app/util/clipboard.cpp +++ b/src/app/util/clipboard.cpp @@ -416,6 +416,7 @@ void Clipboard::copyImage(const Image* image, const Mask* mask, const Palette* pal) { + ASSERT(image->pixelFormat() != IMAGE_TILEMAP); setData( Image::createCopy(image), (mask ? new Mask(*mask): nullptr), @@ -424,6 +425,20 @@ void Clipboard::copyImage(const Image* image, true, false); } +void Clipboard::copyTilemap(const Image* image, + const Mask* mask, + const Palette* pal, + const Tileset* tileset) +{ + ASSERT(image->pixelFormat() == IMAGE_TILEMAP); + setData( + Image::createCopy(image), + (mask ? new Mask(*mask): nullptr), + (pal ? new Palette(*pal): nullptr), + Tileset::MakeCopyCopyingImages(tileset), + true, false); +} + void Clipboard::copyPalette(const Palette* palette, const PalettePicks& picks) { diff --git a/src/app/util/clipboard.h b/src/app/util/clipboard.h index e4f3b309f..a7aa466ba 100644 --- a/src/app/util/clipboard.h +++ b/src/app/util/clipboard.h @@ -68,6 +68,10 @@ namespace app { void copyImage(const doc::Image* image, const doc::Mask* mask, const doc::Palette* palette); + void copyTilemap(const doc::Image* image, + const doc::Mask* mask, + const doc::Palette* pal, + const doc::Tileset* tileset); void copyPalette(const doc::Palette* palette, const doc::PalettePicks& picks); void paste(Context* ctx, const bool interactive);