[gimp] app: change offsets parameters of GimpItem::translate() from int to double



commit 7256f1844751fe242cd204111d22b8308c43d35f
Author: Michael Natterer <mitch gimp org>
Date:   Mon Apr 23 01:08:54 2018 +0200

    app: change offsets parameters of GimpItem::translate() from int to double
    
    so we can use it to precisely position paths; use SIGNED_ROUND() in
    channel, layer etc. to snap to pixels.

 app/core/gimpchannel.c    |   76 ++++++++++++++++++++-------------------------
 app/core/gimpitem.c       |   16 +++++-----
 app/core/gimpitem.h       |    8 ++--
 app/core/gimplayer.c      |   12 ++++---
 app/core/gimpselection.c  |    8 ++--
 app/vectors/gimpvectors.c |    8 ++--
 6 files changed, 61 insertions(+), 67 deletions(-)
---
diff --git a/app/core/gimpchannel.c b/app/core/gimpchannel.c
index 6934c96..d89e836 100644
--- a/app/core/gimpchannel.c
+++ b/app/core/gimpchannel.c
@@ -23,6 +23,7 @@
 #include <gegl.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
 
+#include "libgimpbase/gimpbase.h"
 #include "libgimpmath/gimpmath.h"
 #include "libgimpcolor/gimpcolor.h"
 
@@ -89,8 +90,8 @@ static void       gimp_channel_convert       (GimpItem          *item,
                                               GimpImage         *dest_image,
                                               GType              old_type);
 static void       gimp_channel_translate     (GimpItem          *item,
-                                              gint               off_x,
-                                              gint               off_y,
+                                              gdouble            off_x,
+                                              gdouble            off_y,
                                               gboolean           push_undo);
 static void       gimp_channel_scale         (GimpItem          *item,
                                               gint               new_width,
@@ -634,82 +635,73 @@ gimp_channel_convert (GimpItem  *item,
 
 static void
 gimp_channel_translate (GimpItem *item,
-                        gint      off_x,
-                        gint      off_y,
+                        gdouble   off_x,
+                        gdouble   off_y,
                         gboolean  push_undo)
 {
-  GimpChannel *channel    = GIMP_CHANNEL (item);
-  GeglBuffer  *tmp_buffer = NULL;
-  gint         width, height;
-  gint         x1, y1, x2, y2;
+  GimpChannel *channel = GIMP_CHANNEL (item);
+  gint         x, y, width, height;
 
-  gimp_item_bounds (GIMP_ITEM (channel), &x1, &y1, &x2, &y2);
-  x2 += x1;
-  y2 += y1;
+  gimp_item_bounds (GIMP_ITEM (channel), &x, &y, &width, &height);
 
   /*  update the old area  */
-  gimp_drawable_update (GIMP_DRAWABLE (item), x1, y1, x2 - x1, y2 - y1);
+  gimp_drawable_update (GIMP_DRAWABLE (item), x, y, width, height);
 
   if (push_undo)
     gimp_channel_push_undo (channel, NULL);
 
-  x1 = CLAMP ((x1 + off_x), 0, gimp_item_get_width  (GIMP_ITEM (channel)));
-  y1 = CLAMP ((y1 + off_y), 0, gimp_item_get_height (GIMP_ITEM (channel)));
-  x2 = CLAMP ((x2 + off_x), 0, gimp_item_get_width  (GIMP_ITEM (channel)));
-  y2 = CLAMP ((y2 + off_y), 0, gimp_item_get_height (GIMP_ITEM (channel)));
-
-  width  = x2 - x1;
-  height = y2 - y1;
-
-  /*  make sure width and height are non-zero  */
-  if (width != 0 && height != 0)
+  if (gimp_rectangle_intersect (x + SIGNED_ROUND (off_x),
+                                y + SIGNED_ROUND (off_y),
+                                width, height,
+                                0, 0,
+                                gimp_item_get_width  (GIMP_ITEM (channel)),
+                                gimp_item_get_height (GIMP_ITEM (channel)),
+                                &x, &y, &width, &height))
     {
       /*  copy the portion of the mask we will keep to a temporary
        *  buffer
        */
-      tmp_buffer =
+      GeglBuffer *tmp_buffer =
         gegl_buffer_new (GEGL_RECTANGLE (0, 0, width, height),
                          gimp_drawable_get_format (GIMP_DRAWABLE (channel)));
 
       gegl_buffer_copy (gimp_drawable_get_buffer (GIMP_DRAWABLE (channel)),
-                        GEGL_RECTANGLE (x1 - off_x, y1 - off_y, width, height),
+                        GEGL_RECTANGLE (x - SIGNED_ROUND (off_x),
+                                        y - SIGNED_ROUND (off_y),
+                                        width, height),
                         GEGL_ABYSS_NONE,
                         tmp_buffer,
                         GEGL_RECTANGLE (0, 0, 0, 0));
-    }
 
-  /*  clear the mask  */
-  gegl_buffer_clear (gimp_drawable_get_buffer (GIMP_DRAWABLE (channel)),
-                     NULL);
+      /*  clear the mask  */
+      gegl_buffer_clear (gimp_drawable_get_buffer (GIMP_DRAWABLE (channel)),
+                         NULL);
 
-  if (width != 0 && height != 0)
-    {
       /*  copy the temp mask back to the mask  */
-
       gegl_buffer_copy (tmp_buffer, NULL, GEGL_ABYSS_NONE,
                         gimp_drawable_get_buffer (GIMP_DRAWABLE (channel)),
-                        GEGL_RECTANGLE (x1, y1, 0, 0));
+                        GEGL_RECTANGLE (x, y, 0, 0));
 
       /*  free the temporary mask  */
       g_object_unref (tmp_buffer);
-    }
 
-  /*  calculate new bounds  */
-  if (width == 0 || height == 0)
+      channel->x1 = x;
+      channel->y1 = y;
+      channel->x2 = x + width;
+      channel->y2 = y + height;
+    }
+  else
     {
+      /*  clear the mask  */
+      gegl_buffer_clear (gimp_drawable_get_buffer (GIMP_DRAWABLE (channel)),
+                         NULL);
+
       channel->empty = TRUE;
       channel->x1    = 0;
       channel->y1    = 0;
       channel->x2    = gimp_item_get_width  (GIMP_ITEM (channel));
       channel->y2    = gimp_item_get_height (GIMP_ITEM (channel));
     }
-  else
-    {
-      channel->x1 = x1;
-      channel->y1 = y1;
-      channel->x2 = x2;
-      channel->y2 = y2;
-    }
 
   /*  update the new area  */
   gimp_drawable_update (GIMP_DRAWABLE (item),
diff --git a/app/core/gimpitem.c b/app/core/gimpitem.c
index c49327c..a0ccaa6 100644
--- a/app/core/gimpitem.c
+++ b/app/core/gimpitem.c
@@ -148,8 +148,8 @@ static void       gimp_item_real_start_transform    (GimpItem       *item,
 static void       gimp_item_real_end_transform      (GimpItem       *item,
                                                      gboolean        push_undo);
 static void       gimp_item_real_translate          (GimpItem       *item,
-                                                     gint            offset_x,
-                                                     gint            offset_y,
+                                                     gdouble         offset_x,
+                                                     gdouble         offset_y,
                                                      gboolean        push_undo);
 static void       gimp_item_real_scale              (GimpItem       *item,
                                                      gint            new_width,
@@ -612,15 +612,15 @@ gimp_item_real_rename (GimpItem     *item,
 
 static void
 gimp_item_real_translate (GimpItem *item,
-                          gint      offset_x,
-                          gint      offset_y,
+                          gdouble   offset_x,
+                          gdouble   offset_y,
                           gboolean  push_undo)
 {
   GimpItemPrivate *private = GET_PRIVATE (item);
 
   gimp_item_set_offset (item,
-                        private->offset_x + offset_x,
-                        private->offset_y + offset_y);
+                        private->offset_x + SIGNED_ROUND (offset_x),
+                        private->offset_y + SIGNED_ROUND (offset_y));
 }
 
 static void
@@ -1256,8 +1256,8 @@ gimp_item_end_transform (GimpItem *item,
  */
 void
 gimp_item_translate (GimpItem *item,
-                     gint      offset_x,
-                     gint      offset_y,
+                     gdouble   offset_x,
+                     gdouble   offset_y,
                      gboolean  push_undo)
 {
   GimpItemClass *item_class;
diff --git a/app/core/gimpitem.h b/app/core/gimpitem.h
index efe1804..3854ad5 100644
--- a/app/core/gimpitem.h
+++ b/app/core/gimpitem.h
@@ -78,8 +78,8 @@ struct _GimpItemClass
   void            (* end_transform)      (GimpItem               *item,
                                           gboolean                push_undo);
   void            (* translate)          (GimpItem               *item,
-                                          gint                    offset_x,
-                                          gint                    offset_y,
+                                          gdouble                 offset_x,
+                                          gdouble                 offset_y,
                                           gboolean                push_undo);
   void            (* scale)              (GimpItem               *item,
                                           gint                    new_width,
@@ -226,8 +226,8 @@ void            gimp_item_end_transform      (GimpItem           *item,
                                               gboolean            push_undo);
 
 void            gimp_item_translate          (GimpItem           *item,
-                                              gint                offset_x,
-                                              gint                offset_y,
+                                              gdouble             offset_x,
+                                              gdouble             offset_y,
                                               gboolean            push_undo);
 
 gboolean        gimp_item_check_scaling      (GimpItem           *item,
diff --git a/app/core/gimplayer.c b/app/core/gimplayer.c
index fa8aba9..d5e3106 100644
--- a/app/core/gimplayer.c
+++ b/app/core/gimplayer.c
@@ -136,8 +136,8 @@ static void       gimp_layer_start_move         (GimpItem           *item,
 static void       gimp_layer_end_move           (GimpItem           *item,
                                                  gboolean            push_undo);
 static void       gimp_layer_translate          (GimpItem           *item,
-                                                 gint                offset_x,
-                                                 gint                offset_y,
+                                                 gdouble             offset_x,
+                                                 gdouble             offset_y,
                                                  gboolean            push_undo);
 static void       gimp_layer_scale              (GimpItem           *item,
                                                  gint                new_width,
@@ -1119,8 +1119,8 @@ gimp_layer_end_move (GimpItem *item,
 
 static void
 gimp_layer_translate (GimpItem *item,
-                      gint      offset_x,
-                      gint      offset_y,
+                      gdouble   offset_x,
+                      gdouble   offset_y,
                       gboolean  push_undo)
 {
   GimpLayer *layer = GIMP_LAYER (item);
@@ -1128,7 +1128,9 @@ gimp_layer_translate (GimpItem *item,
   if (push_undo)
     gimp_image_undo_push_item_displace (gimp_item_get_image (item), NULL, item);
 
-  GIMP_LAYER_GET_CLASS (layer)->translate (layer, offset_x, offset_y);
+  GIMP_LAYER_GET_CLASS (layer)->translate (layer,
+                                           SIGNED_ROUND (offset_x),
+                                           SIGNED_ROUND (offset_y));
 
   if (layer->mask)
     {
diff --git a/app/core/gimpselection.c b/app/core/gimpselection.c
index 1d7ac16..03e4c8d 100644
--- a/app/core/gimpselection.c
+++ b/app/core/gimpselection.c
@@ -49,8 +49,8 @@
 static gboolean   gimp_selection_is_attached   (GimpItem            *item);
 static GimpItemTree * gimp_selection_get_tree  (GimpItem            *item);
 static void       gimp_selection_translate     (GimpItem            *item,
-                                                gint                 offset_x,
-                                                gint                 offset_y,
+                                                gdouble              offset_x,
+                                                gdouble              offset_y,
                                                 gboolean             push_undo);
 static void       gimp_selection_scale         (GimpItem            *item,
                                                 gint                 new_width,
@@ -217,8 +217,8 @@ gimp_selection_get_tree (GimpItem *item)
 
 static void
 gimp_selection_translate (GimpItem *item,
-                          gint      offset_x,
-                          gint      offset_y,
+                          gdouble   offset_x,
+                          gdouble   offset_y,
                           gboolean  push_undo)
 {
   GIMP_ITEM_CLASS (parent_class)->translate (item, offset_x, offset_y,
diff --git a/app/vectors/gimpvectors.c b/app/vectors/gimpvectors.c
index 7cf8271..0520719 100644
--- a/app/vectors/gimpvectors.c
+++ b/app/vectors/gimpvectors.c
@@ -81,8 +81,8 @@ static void       gimp_vectors_convert       (GimpItem          *item,
                                               GimpImage         *dest_image,
                                               GType              old_type);
 static void       gimp_vectors_translate     (GimpItem          *item,
-                                              gint               offset_x,
-                                              gint               offset_y,
+                                              gdouble            offset_x,
+                                              gdouble            offset_y,
                                               gboolean           push_undo);
 static void       gimp_vectors_scale         (GimpItem          *item,
                                               gint               new_width,
@@ -441,8 +441,8 @@ gimp_vectors_convert (GimpItem  *item,
 
 static void
 gimp_vectors_translate (GimpItem *item,
-                        gint      offset_x,
-                        gint      offset_y,
+                        gdouble   offset_x,
+                        gdouble   offset_y,
                         gboolean  push_undo)
 {
   GimpVectors *vectors = GIMP_VECTORS (item);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]