From e5faac07b59b8def5d67d8f957f842146964a770 Mon Sep 17 00:00:00 2001 From: David Capello Date: Thu, 3 Oct 2024 12:42:26 -0300 Subject: [PATCH] Fix regression breaking linked cels on "Merge Down" (fix #4685) --- src/app/cmd/flatten_layers.cpp | 17 ++++++++++++++++- tests/scripts/merge_down_bugs.lua | 24 +++++++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/app/cmd/flatten_layers.cpp b/src/app/cmd/flatten_layers.cpp index d2e42515a..147f748be 100644 --- a/src/app/cmd/flatten_layers.cpp +++ b/src/app/cmd/flatten_layers.cpp @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2019-2022 Igara Studio S.A. +// Copyright (C) 2019-2024 Igara Studio S.A. // Copyright (C) 2001-2018 David Capello // // This program is distributed under the terms of @@ -35,6 +35,8 @@ #include "doc/sprite.h" #include "render/render.h" +#include + namespace app { namespace cmd { @@ -128,11 +130,24 @@ void FlattenLayers::onExecute() RestoreVisibleLayers restore; restore.showSelectedLayers(sprite, layers); + const LayerList visibleLayers = sprite->allVisibleLayers(); + // Map draw area to image coords const gfx::ClipF area_to_image(0, 0, area); // Copy all frames to the background. for (frame_t frame(0); frametotalFrames(); ++frame) { + // If the flatLayer is the only cel in this frame, we can skip + // this frame to keep existing links in the flatLayer. + const bool anotherCelExists = + std::any_of(visibleLayers.begin(), + visibleLayers.end(), + [flatLayer, frame](const Layer* other) { + return (flatLayer != other && other->cel(frame)); + }); + if (!anotherCelExists) + continue; + // Clear the image and render this frame. clear_image(image.get(), bgcolor); render.renderSprite(image.get(), sprite, frame, area_to_image); diff --git a/tests/scripts/merge_down_bugs.lua b/tests/scripts/merge_down_bugs.lua index 6930cfa2b..537d396e7 100644 --- a/tests/scripts/merge_down_bugs.lua +++ b/tests/scripts/merge_down_bugs.lua @@ -1,4 +1,4 @@ --- Copyright (C) 2019 Igara Studio S.A. +-- Copyright (C) 2019-2024 Igara Studio S.A. -- -- This file is released under the terms of the MIT license. -- Read LICENSE.txt for more information. @@ -46,3 +46,25 @@ do local after = s.cels[1].image assert(before:isEqual(after)) end + +-- Check that linked cels are not broken (regression in issue #4685) +-- We create two layers, the bottom one with 4 linked frames, and the +-- top one with one cel at 2nd frame, when we merge them, the +-- resulting layer should have frame 1, 3, and 4 linked. +do + local s = Sprite(32, 32) + app.useTool{ color=Color(255, 0, 0), points={ {0,0}, {32,32} } } + app.layer.isContinuous = true + app.command.NewFrame{ content=cellinked } + app.command.NewFrame{ content=cellinked } + app.command.NewFrame{ content=cellinked } + s:newLayer() + app.frame = 2 + app.useTool{ color=Color(0, 0, 255), points={ {32,0}, {0,32} } } + app.command.MergeDownLayer() + local cels = app.layer.cels + -- Check that frame 1, 3, and 4 have the same image (linked cels) + assert(cels[1].image ~= cels[2].image) + assert(cels[1].image == cels[3].image) + assert(cels[1].image == cels[4].image) +end