[aseprite] 116/128: Try to directly add a trimmed image in the undo history instead of calling TrimCel

Tobias Hansen thansen at moszumanska.debian.org
Mon May 9 21:24:30 UTC 2016


This is an automated email from the git hooks/post-receive script.

thansen pushed a commit to branch master
in repository aseprite.

commit 6556f97b8c2ab7e590750caeda9625958c268c42
Author: David Capello <davidcapello at gmail.com>
Date:   Thu May 5 15:40:37 2016 -0300

    Try to directly add a trimmed image in the undo history instead of calling TrimCel
---
 src/app/util/expand_cel_canvas.cpp | 97 ++++++++++++++++++++++++++++----------
 src/app/util/expand_cel_canvas.h   |  3 ++
 2 files changed, 74 insertions(+), 26 deletions(-)

diff --git a/src/app/util/expand_cel_canvas.cpp b/src/app/util/expand_cel_canvas.cpp
index fae9d67..f52be4f 100644
--- a/src/app/util/expand_cel_canvas.cpp
+++ b/src/app/util/expand_cel_canvas.cpp
@@ -13,6 +13,7 @@
 
 #include "app/app.h"
 #include "app/cmd/add_cel.h"
+#include "app/cmd/clear_cel.h"
 #include "app/cmd/copy_region.h"
 #include "app/cmd/replace_image.h"
 #include "app/cmd/set_cel_position.h"
@@ -22,6 +23,7 @@
 #include "app/transaction.h"
 #include "app/util/range_utils.h"
 #include "base/unique_ptr.h"
+#include "doc/algorithm/shrink_bounds.h"
 #include "doc/cel.h"
 #include "doc/image.h"
 #include "doc/layer.h"
@@ -164,21 +166,35 @@ void ExpandCelCanvas::commit()
     static_cast<LayerImage*>(m_layer)->removeCel(m_cel);
 
     // Add a copy of m_dstImage in the sprite's image stock
-    ImageRef newImage(Image::createCopy(m_dstImage.get()));
-    m_cel->data()->setImage(newImage);
+    gfx::Rect trimBounds = getTrimDstImageBounds();
+    if (!trimBounds.isEmpty()) {
+      ImageRef newImage(trimDstImage(trimBounds));
+      ASSERT(newImage);
 
-    // And finally we add the cel again in the layer.
-    m_transaction.execute(new cmd::AddCel(m_layer, m_cel));
+      m_cel->data()->setImage(newImage);
+      m_cel->setPosition(m_cel->position() + trimBounds.origin());
+
+      // And finally we add the cel again in the layer.
+      m_transaction.execute(new cmd::AddCel(m_layer, m_cel));
+    }
   }
   else if (m_celImage) {
+    // Restore cel position to its original position
+    gfx::Point newPos = m_cel->position();
+    m_cel->setPosition(m_origCelPos);
+
     // If the size of each image is the same, we can create an undo
     // with only the differences between both images.
-    if (m_cel->position() == m_origCelPos &&
+    //
+    // TODO check if the valid destination region is inside the
+    // m_celImage bounds, so we try to use CopyRegion instead of
+    // ReplaceImage in more cases.
+    if (newPos == m_origCelPos &&
         m_bounds.origin() == m_origCelPos &&
         m_celImage->width() == m_dstImage->width() &&
         m_celImage->height() == m_dstImage->height()) {
-      int dx = -m_bounds.x + m_origCelPos.x;
-      int dy = -m_bounds.y + m_origCelPos.y;
+      int dx = m_origCelPos.x - m_bounds.x;
+      int dy = m_origCelPos.y - m_bounds.y;
 
       if ((m_flags & UseModifiedRegionAsUndoInfo) != UseModifiedRegionAsUndoInfo) {
         // TODO Reduce m_validDstRegion to modified areas between
@@ -188,38 +204,46 @@ void ExpandCelCanvas::commit()
       // Copy the destination to the cel image.
       m_transaction.execute(new cmd::CopyRegion(
           m_celImage.get(), m_dstImage.get(), m_validDstRegion, dx, dy));
+
+      ASSERT(m_cel);
+      ASSERT(m_cel->layer());
+      if (m_cel &&
+          m_cel->layer() &&
+          !m_cel->layer()->isBackground()) {
+        m_transaction.execute(new cmd::TrimCel(m_cel));
+      }
     }
     // If the size of both images are different, we have to
     // replace the entire image.
     else {
-      if (m_cel->position() != m_origCelPos) {
-        gfx::Point newPos = m_cel->position();
-        m_cel->setPosition(m_origCelPos);
-        m_transaction.execute(new cmd::SetCelPosition(m_cel, newPos.x, newPos.y));
-      }
-
       // Validate the whole m_dstImage copying invalid areas from m_celImage
       validateDestCanvas(gfx::Region(m_bounds));
 
-      // Replace the image in the stock. We need to create a copy of
-      // image because m_dstImage's ImageBuffer cannot be shared.
-      ImageRef newImage(Image::createCopy(m_dstImage.get()));
-      m_transaction.execute(new cmd::ReplaceImage(
-          m_sprite, m_celImage, newImage));
+      gfx::Rect trimBounds = getTrimDstImageBounds();
+      if (!trimBounds.isEmpty()) {
+        newPos += trimBounds.origin();
+
+        // Replace the image in the stock. We need to create a copy of
+        // image because m_dstImage's ImageBuffer cannot be shared.
+        ImageRef newImage(trimDstImage(trimBounds));
+        ASSERT(newImage);
+
+        if (newPos != m_origCelPos) {
+          m_transaction.execute(new cmd::SetCelPosition(m_cel, newPos.x, newPos.y));
+        }
+
+        m_transaction.execute(
+          new cmd::ReplaceImage(m_sprite, m_celImage, newImage));
+      }
+      else {
+        m_transaction.execute(new cmd::ClearCel(m_cel));
+      }
     }
   }
   else {
     ASSERT(false);
   }
 
-  ASSERT(m_cel);
-  ASSERT(m_cel->layer());
-  if (m_cel &&
-      m_cel->layer() &&
-      !m_cel->layer()->isBackground()) {
-    m_transaction.execute(new cmd::TrimCel(m_cel));
-  }
-
   m_committed = true;
 }
 
@@ -367,4 +391,25 @@ void ExpandCelCanvas::copyValidDestToSourceCanvas(const gfx::Region& rgn)
       gfx::Clip(rc.x, rc.y, rc.x, rc.y, rc.w, rc.h));
 }
 
+gfx::Rect ExpandCelCanvas::getTrimDstImageBounds() const
+{
+  if (m_layer->isBackground())
+    return m_dstImage->bounds();
+  else {
+    gfx::Rect bounds;
+    algorithm::shrink_bounds(m_dstImage.get(), bounds,
+                             m_dstImage->maskColor());
+    return bounds;
+  }
+}
+
+ImageRef ExpandCelCanvas::trimDstImage(const gfx::Rect& bounds) const
+{
+  return ImageRef(
+    crop_image(m_dstImage.get(),
+               bounds.x, bounds.y,
+               bounds.w, bounds.h,
+               m_dstImage->maskColor()));
+}
+
 } // namespace app
diff --git a/src/app/util/expand_cel_canvas.h b/src/app/util/expand_cel_canvas.h
index 6c85a4e..d78d1fc 100644
--- a/src/app/util/expand_cel_canvas.h
+++ b/src/app/util/expand_cel_canvas.h
@@ -71,6 +71,9 @@ namespace app {
     const Cel* getCel() const { return m_cel; }
 
   private:
+    gfx::Rect getTrimDstImageBounds() const;
+    ImageRef trimDstImage(const gfx::Rect& bounds) const;
+
     Document* m_document;
     Sprite* m_sprite;
     Layer* m_layer;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git



More information about the Pkg-games-commits mailing list