[aseprite] 42/64: Fix arrow keys to move a rotated selection (fix #775)

Tobias Hansen thansen at moszumanska.debian.org
Tue Jun 21 14:43:03 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 b21f5df2d63d0089e4508df5fe16cc3b43c4e0c0
Author: David Capello <davidcapello at gmail.com>
Date:   Wed May 18 14:26:25 2016 -0300

    Fix arrow keys to move a rotated selection (fix #775)
---
 src/app/document.cpp                    |  4 +--
 src/app/tools/inks.h                    |  3 +-
 src/app/ui/editor/pivot_helpers.cpp     |  4 +--
 src/app/ui/editor/pixels_movement.cpp   | 38 +++++++++++-----------
 src/app/ui/editor/transform_handles.cpp |  4 +--
 src/gfx/point.h                         |  3 +-
 src/gfx/rect.h                          |  9 +++++-
 src/gfx/size.h                          |  1 +
 src/gfx/transformation.cpp              | 32 +++++++++----------
 src/gfx/transformation.h                | 56 ++++++++++++++++-----------------
 10 files changed, 82 insertions(+), 72 deletions(-)

diff --git a/src/app/document.cpp b/src/app/document.cpp
index 2f5474d..b039541 100644
--- a/src/app/document.cpp
+++ b/src/app/document.cpp
@@ -1,5 +1,5 @@
 // Aseprite
-// Copyright (C) 2001-2015  David Capello
+// Copyright (C) 2001-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
@@ -264,7 +264,7 @@ void Document::setTransformation(const gfx::Transformation& transform)
 void Document::resetTransformation()
 {
   if (m_mask)
-    m_transformation = gfx::Transformation(m_mask->bounds());
+    m_transformation = gfx::Transformation(gfx::RectF(m_mask->bounds()));
   else
     m_transformation = gfx::Transformation();
 }
diff --git a/src/app/tools/inks.h b/src/app/tools/inks.h
index 8c0a1e9..56bde59 100644
--- a/src/app/tools/inks.h
+++ b/src/app/tools/inks.h
@@ -364,7 +364,8 @@ public:
       m_mask.unfreeze();
 
       loop->setMask(&m_mask);
-      loop->getDocument()->setTransformation(Transformation(m_mask.bounds()));
+      loop->getDocument()->setTransformation(
+        Transformation(RectF(m_mask.bounds())));
 
       m_mask.clear();
     }
diff --git a/src/app/ui/editor/pivot_helpers.cpp b/src/app/ui/editor/pivot_helpers.cpp
index 2485138..1a3a7ee 100644
--- a/src/app/ui/editor/pivot_helpers.cpp
+++ b/src/app/ui/editor/pivot_helpers.cpp
@@ -1,5 +1,5 @@
 // Aseprite
-// Copyright (C) 2001-2015  David Capello
+// Copyright (C) 2001-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
@@ -54,7 +54,7 @@ void set_pivot_from_preferences(gfx::Transformation& t)
       break;
   }
 
-  t.displacePivotTo(gfx::Point(pivotPos));
+  t.displacePivotTo(gfx::PointF(pivotPos));
 }
 
 } // namespace app
diff --git a/src/app/ui/editor/pixels_movement.cpp b/src/app/ui/editor/pixels_movement.cpp
index 8e2ee76..1b587ca 100644
--- a/src/app/ui/editor/pixels_movement.cpp
+++ b/src/app/ui/editor/pixels_movement.cpp
@@ -235,7 +235,7 @@ void PixelsMovement::moveImage(const gfx::Point& pos, MoveModifier moveModifier)
   m_currentData.transformBox(oldCorners);
 
   ContextWriter writer(m_reader, 1000);
-  gfx::Rect bounds = m_initialData.bounds();
+  gfx::RectF bounds = m_initialData.bounds();
   bool updateBounds = false;
   double dx, dy;
 
@@ -254,16 +254,18 @@ void PixelsMovement::moveImage(const gfx::Point& pos, MoveModifier moveModifier)
           dy = 0.0;
       }
 
-      bounds.offset(int(dx), int(dy));
+      bounds.offset(dx, dy);
       updateBounds = true;
 
       if ((moveModifier & SnapToGridMovement) == SnapToGridMovement) {
         // Snap the x1,y1 point to the grid.
         gfx::Rect gridBounds = App::instance()
           ->preferences().document(m_document).grid.bounds();
-        gfx::Point gridOffset(bounds.origin());
-        gridOffset = snap_to_grid(gridBounds, gridOffset,
-                                  PreferSnapTo::ClosestGridVertex);
+        gfx::PointF gridOffset(
+          snap_to_grid(
+            gridBounds,
+            gfx::Point(bounds.origin()),
+            PreferSnapTo::ClosestGridVertex));
 
         // Now we calculate the difference from x1,y1 point and we can
         // use it to adjust all coordinates (x1, y1, x2, y2).
@@ -285,8 +287,8 @@ void PixelsMovement::moveImage(const gfx::Point& pos, MoveModifier moveModifier)
         { 0.0, 0.5 },               { 1.0, 0.5 },
         { 0.0, 1.0 }, { 0.5, 1.0 }, { 1.0, 1.0 }
       };
-      gfx::PointT<double> pivot;
-      gfx::PointT<double> handle(
+      gfx::PointF pivot;
+      gfx::PointF handle(
         handles[m_handle-ScaleNWHandle][0],
         handles[m_handle-ScaleNWHandle][1]);
 
@@ -301,12 +303,12 @@ void PixelsMovement::moveImage(const gfx::Point& pos, MoveModifier moveModifier)
         pivot.y = bounds.y + bounds.h*pivot.y;
       }
 
-      gfx::Point a = bounds.origin();
-      gfx::Point b = bounds.point2();
+      gfx::PointF a = bounds.origin();
+      gfx::PointF b = bounds.point2();
 
       if ((moveModifier & MaintainAspectRatioMovement) == MaintainAspectRatioMovement) {
-        auto u = point2Vector(gfx::PointT<double>(m_catchPos) - pivot);
-        auto v = point2Vector(gfx::PointT<double>(pos) - pivot);
+        auto u = point2Vector(gfx::PointF(m_catchPos) - pivot);
+        auto v = point2Vector(gfx::PointF(pos) - pivot);
         auto w = v.projectOn(u);
         double scale = u.magnitude();
         if (scale != 0.0)
@@ -362,8 +364,8 @@ void PixelsMovement::moveImage(const gfx::Point& pos, MoveModifier moveModifier)
     case RotateSHandle:
     case RotateSEHandle:
       {
-        gfx::Point abs_initial_pivot = m_initialData.pivot();
-        gfx::Point abs_pivot = m_currentData.pivot();
+        gfx::PointF abs_initial_pivot = m_initialData.pivot();
+        gfx::PointF abs_pivot = m_currentData.pivot();
 
         double newAngle =
           m_initialData.angle()
@@ -405,8 +407,8 @@ void PixelsMovement::moveImage(const gfx::Point& pos, MoveModifier moveModifier)
     case PivotHandle:
       {
         // Calculate the new position of the pivot
-        gfx::Point newPivot(m_initialData.pivot().x + (pos.x - m_catchPos.x),
-                            m_initialData.pivot().y + (pos.y - m_catchPos.y));
+        gfx::PointF newPivot(m_initialData.pivot().x + (pos.x - m_catchPos.x),
+                             m_initialData.pivot().y + (pos.y - m_catchPos.y));
 
         m_currentData = m_initialData;
         m_currentData.displacePivotTo(newPivot);
@@ -527,7 +529,7 @@ void PixelsMovement::dropImageTemporarily()
 
       // Get the a factor for the X/Y position of the initial pivot
       // position inside the initial non-rotated bounds.
-      gfx::PointT<double> pivotPosFactor(m_initialData.pivot() - m_initialData.bounds().origin());
+      gfx::PointF pivotPosFactor(m_initialData.pivot() - m_initialData.bounds().origin());
       pivotPosFactor.x /= m_initialData.bounds().w;
       pivotPosFactor.y /= m_initialData.bounds().h;
 
@@ -544,7 +546,7 @@ void PixelsMovement::dropImageTemporarily()
       newPivot += pivotPosFactor.x * point2Vector(corners.rightTop() - corners.leftTop());
       newPivot += pivotPosFactor.y * point2Vector(corners.leftBottom() - corners.leftTop());
 
-      m_currentData.displacePivotTo(gfx::Point((int)newPivot.x, (int)newPivot.y));
+      m_currentData.displacePivotTo(gfx::PointF(newPivot.x, newPivot.y));
     }
 
     redrawCurrentMask();
@@ -707,7 +709,7 @@ void PixelsMovement::drawParallelogram(
   // fast rotation algorithm, as it's pixel-perfect match with the
   // original selection when just a translation is applied.
   if (m_currentData.angle() == 0.0 &&
-      m_currentData.bounds().size() == src->size()) {
+      gfx::Rect(m_currentData.bounds()).size() == src->size()) {
     rotAlgo = tools::RotationAlgorithm::FAST;
   }
 
diff --git a/src/app/ui/editor/transform_handles.cpp b/src/app/ui/editor/transform_handles.cpp
index 4e8c202..6feca06 100644
--- a/src/app/ui/editor/transform_handles.cpp
+++ b/src/app/ui/editor/transform_handles.cpp
@@ -1,5 +1,5 @@
 // Aseprite
-// Copyright (C) 2001-2015  David Capello
+// Copyright (C) 2001-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
@@ -177,7 +177,7 @@ gfx::Rect TransformHandles::getPivotHandleBounds(Editor* editor,
 {
   SkinTheme* theme = static_cast<SkinTheme*>(CurrentTheme::get());
   gfx::Size partSize = theme->parts.pivotHandle()->size();
-  gfx::Point screenPivotPos = editor->editorToScreen(transform.pivot());
+  gfx::Point screenPivotPos = editor->editorToScreen(gfx::Point(transform.pivot()));
 
   screenPivotPos.x += editor->zoom().apply(1) / 2;
   screenPivotPos.y += editor->zoom().apply(1) / 2;
diff --git a/src/gfx/point.h b/src/gfx/point.h
index 0e6f2da..438b583 100644
--- a/src/gfx/point.h
+++ b/src/gfx/point.h
@@ -1,5 +1,5 @@
 // Aseprite Gfx Library
-// Copyright (C) 2001-2013 David Capello
+// Copyright (C) 2001-2016 David Capello
 //
 // This file is released under the terms of the MIT license.
 // Read LICENSE.txt for more information.
@@ -118,6 +118,7 @@ public:
 };
 
 typedef PointT<int> Point;
+typedef PointT<double> PointF;
 
 } // namespace gfx
 
diff --git a/src/gfx/rect.h b/src/gfx/rect.h
index 1c2c07d..7c20248 100644
--- a/src/gfx/rect.h
+++ b/src/gfx/rect.h
@@ -1,5 +1,5 @@
 // Aseprite Gfx Library
-// Copyright (C) 2001-2013, 2015 David Capello
+// Copyright (C) 2001-2016 David Capello
 //
 // This file is released under the terms of the MIT license.
 // Read LICENSE.txt for more information.
@@ -45,6 +45,12 @@ public:
     w(rect.w), h(rect.h) {
   }
 
+  template<typename T2>
+  RectT(const RectT<T2>& rect) :
+    x(static_cast<T>(rect.x)), y(static_cast<T>(rect.y)),
+    w(static_cast<T>(rect.w)), h(static_cast<T>(rect.h)) {
+  }
+
   RectT(const PointT<T>& point, const SizeT<T>& size) :
     x(point.x), y(point.y),
     w(size.w), h(size.h) {
@@ -298,6 +304,7 @@ public:
 };
 
 typedef RectT<int> Rect;
+typedef RectT<double> RectF;
 
 } // namespace gfx
 
diff --git a/src/gfx/size.h b/src/gfx/size.h
index a031972..343b7c6 100644
--- a/src/gfx/size.h
+++ b/src/gfx/size.h
@@ -130,6 +130,7 @@ public:
 };
 
 typedef SizeT<int> Size;
+typedef SizeT<double> SizeF;
 
 } // namespace gfx
 
diff --git a/src/gfx/transformation.cpp b/src/gfx/transformation.cpp
index dbbf690..1345baa 100644
--- a/src/gfx/transformation.cpp
+++ b/src/gfx/transformation.cpp
@@ -1,5 +1,5 @@
 // Aseprite Gfx Library
-// Copyright (C) 2001-2013, 2015 David Capello
+// Copyright (C) 2001-2016 David Capello
 //
 // This file is released under the terms of the MIT license.
 // Read LICENSE.txt for more information.
@@ -28,7 +28,7 @@ Transformation::Transformation()
   m_pivot.y = 0;
 }
 
-Transformation::Transformation(const Rect& bounds)
+Transformation::Transformation(const RectF& bounds)
   : m_bounds(bounds)
 {
   m_angle = 0.0;
@@ -38,8 +38,6 @@ Transformation::Transformation(const Rect& bounds)
 
 void Transformation::transformBox(Corners& corners) const
 {
-  PointT<double> pivot_f(m_pivot);
-
   // TODO We could create a composed 4x4 matrix with all
   // transformation and apply the same matrix to avoid calling
   // rotatePoint/cos/sin functions 4 times, anyway, it's not
@@ -47,10 +45,10 @@ void Transformation::transformBox(Corners& corners) const
 
   corners = m_bounds;
   for (std::size_t c=0; c<corners.size(); ++c)
-    corners[c] = Transformation::rotatePoint(corners[c], pivot_f, m_angle);
+    corners[c] = Transformation::rotatePoint(corners[c], m_pivot, m_angle);
 }
 
-void Transformation::displacePivotTo(const Point& newPivot)
+void Transformation::displacePivotTo(const PointF& newPivot)
 {
   // Calculate the rotated corners
   Corners corners;
@@ -58,20 +56,20 @@ void Transformation::displacePivotTo(const Point& newPivot)
 
   // Rotate-back (-angle) the position of the rotated origin (corners[0])
   // using the new pivot.
-  PointT<double> newBoundsOrigin =
+  PointF newBoundsOrigin =
     rotatePoint(corners.leftTop(),
-                PointT<double>(newPivot.x, newPivot.y),
+                newPivot,
                 -m_angle);
 
   // Change the new pivot.
   m_pivot = newPivot;
-  m_bounds = Rect(Point(newBoundsOrigin), m_bounds.size());
+  m_bounds = RectF(newBoundsOrigin, m_bounds.size());
 }
 
-PointT<double> Transformation::rotatePoint(
-    const PointT<double>& point,
-    const PointT<double>& pivot,
-    double angle)
+PointF Transformation::rotatePoint(
+  const PointF& point,
+  const PointF& pivot,
+  double angle)
 {
   using namespace fixmath;
 
@@ -82,21 +80,21 @@ PointT<double> Transformation::rotatePoint(
   fixed sin = fixsin(fixangle);
   fixed dx = fixsub(ftofix(point.x), ftofix(pivot.x));
   fixed dy = fixsub(ftofix(point.y), ftofix(pivot.y));
-  return PointT<double>(
+  return PointF(
     fixtof(fixadd(ftofix(pivot.x), fixsub(fixmul(dx, cos), fixmul(dy, sin)))),
     fixtof(fixadd(ftofix(pivot.y), fixadd(fixmul(dy, cos), fixmul(dx, sin)))));
 }
 
-Rect Transformation::transformedBounds() const
+RectF Transformation::transformedBounds() const
 {
   // Get transformed corners
   Corners corners;
   transformBox(corners);
 
   // Create a union of all corners
-  Rect bounds;
+  RectF bounds;
   for (int i=0; i<Corners::NUM_OF_CORNERS; ++i)
-    bounds = bounds.createUnion(gfx::Rect((int)corners[i].x, (int)corners[i].y, 1, 1));
+    bounds = bounds.createUnion(RectF(corners[i].x, corners[i].y, 1, 1));
 
   return bounds;
 }
diff --git a/src/gfx/transformation.h b/src/gfx/transformation.h
index 754bce8..f0c84af 100644
--- a/src/gfx/transformation.h
+++ b/src/gfx/transformation.h
@@ -1,5 +1,5 @@
 // Aseprite Gfx Library
-// Copyright (C) 2001-2013, 2015 David Capello
+// Copyright (C) 2001-2016 David Capello
 //
 // This file is released under the terms of the MIT license.
 // Read LICENSE.txt for more information.
@@ -33,20 +33,20 @@ public:
 
       std::size_t size() const { return m_corners.size(); }
 
-      PointT<double>& operator[](int index) { return m_corners[index]; }
-      const PointT<double>& operator[](int index) const { return m_corners[index]; }
+      PointF& operator[](int index) { return m_corners[index]; }
+      const PointF& operator[](int index) const { return m_corners[index]; }
 
-      const PointT<double>& leftTop() const { return m_corners[LEFT_TOP]; }
-      const PointT<double>& rightTop() const { return m_corners[RIGHT_TOP]; }
-      const PointT<double>& rightBottom() const { return m_corners[RIGHT_BOTTOM]; }
-      const PointT<double>& leftBottom() const { return m_corners[LEFT_BOTTOM]; }
+      const PointF& leftTop() const { return m_corners[LEFT_TOP]; }
+      const PointF& rightTop() const { return m_corners[RIGHT_TOP]; }
+      const PointF& rightBottom() const { return m_corners[RIGHT_BOTTOM]; }
+      const PointF& leftBottom() const { return m_corners[LEFT_BOTTOM]; }
 
-      void leftTop(const PointT<double>& pt) { m_corners[LEFT_TOP] = pt; }
-      void rightTop(const PointT<double>& pt) { m_corners[RIGHT_TOP] = pt; }
-      void rightBottom(const PointT<double>& pt) { m_corners[RIGHT_BOTTOM] = pt; }
-      void leftBottom(const PointT<double>& pt) { m_corners[LEFT_BOTTOM] = pt; }
+      void leftTop(const PointF& pt) { m_corners[LEFT_TOP] = pt; }
+      void rightTop(const PointF& pt) { m_corners[RIGHT_TOP] = pt; }
+      void rightBottom(const PointF& pt) { m_corners[RIGHT_BOTTOM] = pt; }
+      void leftBottom(const PointF& pt) { m_corners[LEFT_BOTTOM] = pt; }
 
-      Corners& operator=(const gfx::Rect& bounds) {
+      Corners& operator=(const RectF bounds) {
         m_corners[LEFT_TOP].x = bounds.x;
         m_corners[LEFT_TOP].y = bounds.y;
         m_corners[RIGHT_TOP].x = bounds.x + bounds.w;
@@ -58,29 +58,28 @@ public:
         return *this;
       }
 
-      gfx::Rect bounds() const {
-        Rect bounds;
+      RectF bounds() const {
+        RectF bounds;
         for (int i=0; i<Corners::NUM_OF_CORNERS; ++i)
-          bounds = bounds.createUnion(gfx::Rect((int)m_corners[i].x,
-                                                (int)m_corners[i].y, 1, 1));
+          bounds |= RectF(m_corners[i].x, m_corners[i].y, 1, 1);
         return bounds;
       }
 
     private:
-      std::vector<PointT<double> > m_corners;
+      std::vector<PointF> m_corners;
   };
 
   Transformation();
-  Transformation(const Rect& bounds);
+  Transformation(const RectF& bounds);
 
   // Simple getters and setters. The angle is in radians.
 
-  const Rect& bounds() const { return m_bounds; }
-  const Point& pivot() const { return m_pivot; }
+  const RectF& bounds() const { return m_bounds; }
+  const PointF& pivot() const { return m_pivot; }
   double angle() const { return m_angle; }
 
-  void bounds(const Rect& bounds) { m_bounds = bounds; }
-  void pivot(const Point& pivot) { m_pivot = pivot; }
+  void bounds(const RectF& bounds) { m_bounds = bounds; }
+  void pivot(const PointF& pivot) { m_pivot = pivot; }
   void angle(double angle) { m_angle = angle; }
 
   // Applies the transformation (rotation with angle/pivot) to the
@@ -89,17 +88,18 @@ public:
 
   // Changes the pivot to another location, adjusting the bounds to
   // keep the current rotated-corners in the same location.
-  void displacePivotTo(const Point& newPivot);
+  void displacePivotTo(const PointF& newPivot);
 
-  Rect transformedBounds() const;
+  RectF transformedBounds() const;
 
   // Static helper method to rotate points.
-  static PointT<double> rotatePoint(const PointT<double>& point,
-    const PointT<double>& pivot, double angle);
+  static PointF rotatePoint(const PointF& point,
+                            const PointF& pivot,
+                            double angle);
 
 private:
-  Rect m_bounds;
-  Point m_pivot;
+  RectF m_bounds;
+  PointF m_pivot;
   double m_angle;
 };
 

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