[aseprite] 19/64: Add cmd::CropCel and implement cmd::TrimCel using it

Tobias Hansen thansen at moszumanska.debian.org
Tue Jun 21 14:43:01 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 1e0fd3541355941643c17a02cbaa1abfaa9f87f0
Author: David Capello <davidcapello at gmail.com>
Date:   Tue May 10 10:37:16 2016 -0300

    Add cmd::CropCel and implement cmd::TrimCel using it
---
 src/app/CMakeLists.txt                 |  1 +
 src/app/cmd/crop_cel.cpp               | 72 ++++++++++++++++++++++++++++++++++
 src/app/cmd/{trim_cel.h => crop_cel.h} | 26 ++++++------
 src/app/cmd/trim_cel.cpp               | 62 ++++++-----------------------
 src/app/cmd/trim_cel.h                 | 21 ++++------
 5 files changed, 105 insertions(+), 77 deletions(-)

diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt
index 89c2a52..29e3cc1 100644
--- a/src/app/CMakeLists.txt
+++ b/src/app/CMakeLists.txt
@@ -111,6 +111,7 @@ add_library(app-lib
   cmd/copy_frame.cpp
   cmd/copy_rect.cpp
   cmd/copy_region.cpp
+  cmd/crop_cel.cpp
   cmd/deselect_mask.cpp
   cmd/flatten_layers.cpp
   cmd/flip_image.cpp
diff --git a/src/app/cmd/crop_cel.cpp b/src/app/cmd/crop_cel.cpp
new file mode 100644
index 0000000..8753f53
--- /dev/null
+++ b/src/app/cmd/crop_cel.cpp
@@ -0,0 +1,72 @@
+// Aseprite
+// Copyright (C) 2016  David Capello
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2 as
+// published by the Free Software Foundation.
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "app/cmd/crop_cel.h"
+
+#include "doc/cel.h"
+#include "doc/primitives.h"
+
+namespace app {
+namespace cmd {
+
+using namespace doc;
+
+CropCel::CropCel(Cel* cel, const gfx::Rect& newBounds)
+  : WithCel(cel)
+  , m_oldOrigin(cel->position())
+  , m_newOrigin(newBounds.origin())
+  , m_oldBounds(cel->bounds())
+  , m_newBounds(newBounds)
+{
+  m_oldBounds.offset(-m_newOrigin);
+  m_newBounds.offset(-m_oldOrigin);
+}
+
+void CropCel::onExecute()
+{
+  cropImage(m_newOrigin, m_newBounds);
+}
+
+void CropCel::onUndo()
+{
+  cropImage(m_oldOrigin, m_oldBounds);
+}
+
+// Crops the cel image leaving the same ID in the image.
+void CropCel::cropImage(const gfx::Point& origin,
+                        const gfx::Rect& bounds)
+{
+  Cel* cel = this->cel();
+
+  if (bounds != cel->image()->bounds()) {
+    ImageRef image(crop_image(cel->image(),
+                              bounds.x, bounds.y,
+                              bounds.w, bounds.h,
+                              cel->image()->maskColor()));
+    ObjectId id = cel->image()->id();
+    ObjectVersion ver = cel->image()->version();
+
+    cel->image()->setId(NullId);
+    image->setId(id);
+    image->setVersion(ver);
+    image->incrementVersion();
+    cel->data()->setImage(image);
+    cel->incrementVersion();
+  }
+
+  if (cel->data()->position() != origin) {
+    cel->data()->setPosition(origin);
+    cel->incrementVersion();
+  }
+}
+
+} // namespace cmd
+} // namespace app
diff --git a/src/app/cmd/trim_cel.h b/src/app/cmd/crop_cel.h
similarity index 56%
copy from src/app/cmd/trim_cel.h
copy to src/app/cmd/crop_cel.h
index 2304751..f939986 100644
--- a/src/app/cmd/trim_cel.h
+++ b/src/app/cmd/crop_cel.h
@@ -5,40 +5,38 @@
 // it under the terms of the GNU General Public License version 2 as
 // published by the Free Software Foundation.
 
-#ifndef APP_CMD_TRIM_CEL_H_INCLUDED
-#define APP_CMD_TRIM_CEL_H_INCLUDED
+#ifndef APP_CMD_CROP_CEL_H_INCLUDED
+#define APP_CMD_CROP_CEL_H_INCLUDED
 #pragma once
 
 #include "app/cmd.h"
-#include "app/cmd/remove_cel.h"
 #include "app/cmd/with_cel.h"
-#include "doc/color.h"
+#include "gfx/point.h"
 #include "gfx/rect.h"
 
 namespace app {
 namespace cmd {
 
-  class TrimCel : public Cmd
+  class CropCel : public Cmd
                 , public WithCel {
   public:
-    TrimCel(doc::Cel* cel);
+    CropCel(doc::Cel* cel, const gfx::Rect& newBounds);
 
   protected:
     void onExecute() override;
     void onUndo() override;
-    void onRedo() override;
     size_t onMemSize() const override {
-      return sizeof(*this) +
-        (m_removeCel ? m_removeCel->memSize() : 0);
+      return sizeof(*this);
     }
 
   private:
-    void cropImage(const gfx::Rect& bounds);
+    void cropImage(const gfx::Point& origin,
+                   const gfx::Rect& bounds);
 
-    gfx::Rect m_bounds;
-    gfx::Rect m_originalBounds;
-    doc::color_t m_color;
-    RemoveCel* m_removeCel;
+    gfx::Point m_oldOrigin;
+    gfx::Point m_newOrigin;
+    gfx::Rect m_oldBounds;
+    gfx::Rect m_newBounds;
   };
 
 } // namespace cmd
diff --git a/src/app/cmd/trim_cel.cpp b/src/app/cmd/trim_cel.cpp
index 5006cda..c4605bc 100644
--- a/src/app/cmd/trim_cel.cpp
+++ b/src/app/cmd/trim_cel.cpp
@@ -11,9 +11,10 @@
 
 #include "app/cmd/trim_cel.h"
 
+#include "app/cmd/crop_cel.h"
+#include "app/cmd/remove_cel.h"
 #include "doc/algorithm/shrink_bounds.h"
 #include "doc/cel.h"
-#include "doc/primitives.h"
 
 namespace app {
 namespace cmd {
@@ -21,68 +22,31 @@ namespace cmd {
 using namespace doc;
 
 TrimCel::TrimCel(Cel* cel)
-  : WithCel(cel)
-  , m_originalBounds(cel->image()->bounds())
-  , m_color(cel->image()->maskColor())
-  , m_removeCel(nullptr)
 {
-  if (algorithm::shrink_bounds(cel->image(), m_bounds, m_color)) {
-    m_originalBounds.x = -m_bounds.x;
-    m_originalBounds.y = -m_bounds.y;
+  gfx::Rect newBounds;
+  if (algorithm::shrink_bounds(cel->image(), newBounds,
+                               cel->image()->maskColor())) {
+    newBounds.offset(cel->position());
+    m_subCmd = new cmd::CropCel(cel, newBounds);
+  }
+  else {
+    m_subCmd = new cmd::RemoveCel(cel);
   }
-  else
-    m_removeCel = new cmd::RemoveCel(cel);
 }
 
 void TrimCel::onExecute()
 {
-  if (m_removeCel)
-    m_removeCel->execute(context());
-  else
-    cropImage(m_bounds);
+  m_subCmd->execute(context());
 }
 
 void TrimCel::onUndo()
 {
-  if (m_removeCel)
-    m_removeCel->undo();
-  else
-    cropImage(m_originalBounds);
+  m_subCmd->undo();
 }
 
 void TrimCel::onRedo()
 {
-  if (m_removeCel)
-    m_removeCel->redo();
-  else
-    cropImage(m_bounds);
-}
-
-// Crops the cel image leaving the same ID in the image.
-void TrimCel::cropImage(const gfx::Rect& bounds)
-{
-  Cel* cel = this->cel();
-
-  if (bounds == cel->image()->bounds())
-    return;
-
-  ImageRef image(crop_image(cel->image(),
-                            bounds.x, bounds.y,
-                            bounds.w, bounds.h,
-                            m_color));
-
-  ObjectId id = cel->image()->id();
-  ObjectVersion ver = cel->image()->version();
-  gfx::Point newPos = cel->position() + bounds.origin();
-
-  cel->image()->setId(NullId);
-  image->setId(id);
-  image->setVersion(ver);
-  image->incrementVersion();
-
-  cel->data()->setImage(image);
-  cel->data()->setPosition(newPos);
-  cel->incrementVersion();
+  m_subCmd->redo();
 }
 
 } // namespace cmd
diff --git a/src/app/cmd/trim_cel.h b/src/app/cmd/trim_cel.h
index 2304751..e8cced1 100644
--- a/src/app/cmd/trim_cel.h
+++ b/src/app/cmd/trim_cel.h
@@ -10,16 +10,15 @@
 #pragma once
 
 #include "app/cmd.h"
-#include "app/cmd/remove_cel.h"
-#include "app/cmd/with_cel.h"
-#include "doc/color.h"
-#include "gfx/rect.h"
+
+namespace doc {
+  class Cel;
+}
 
 namespace app {
 namespace cmd {
 
-  class TrimCel : public Cmd
-                , public WithCel {
+  class TrimCel : public Cmd {
   public:
     TrimCel(doc::Cel* cel);
 
@@ -28,17 +27,11 @@ namespace cmd {
     void onUndo() override;
     void onRedo() override;
     size_t onMemSize() const override {
-      return sizeof(*this) +
-        (m_removeCel ? m_removeCel->memSize() : 0);
+      return sizeof(*this) + m_subCmd->memSize();
     }
 
   private:
-    void cropImage(const gfx::Rect& bounds);
-
-    gfx::Rect m_bounds;
-    gfx::Rect m_originalBounds;
-    doc::color_t m_color;
-    RemoveCel* m_removeCel;
+    Cmd* m_subCmd;
   };
 
 } // namespace cmd

-- 
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