[gimp/gimp-2-10] app: implement gimp_drawable_offset() in terms of gimp:offset



commit 003b138ee6164c91599e869276a4e1533b2ac87a
Author: Ell <ell_se yahoo com>
Date:   Wed Jun 5 18:01:18 2019 -0400

    app: implement gimp_drawable_offset() in terms of gimp:offset
    
    Implement gimp_drawable_offset() in terms of gimp:offset, added in
    the previous commit.  Other than avoiding duplication, this also
    allows gimp_drawable_offset() to respect the current selection and
    component mask (see issue #39.)
    
    (cherry picked from commit 5b2f3980bdf1417234f77d4cce46d6957481b6be)

 app/core/gimpdrawable-offset.c | 216 +++--------------------------------------
 1 file changed, 14 insertions(+), 202 deletions(-)
---
diff --git a/app/core/gimpdrawable-offset.c b/app/core/gimpdrawable-offset.c
index 9475e8a685..0c4d1ea616 100644
--- a/app/core/gimpdrawable-offset.c
+++ b/app/core/gimpdrawable-offset.c
@@ -23,20 +23,13 @@
 #include <gegl.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
 
-#include "libgimpcolor/gimpcolor.h"
-#include "libgimpmath/gimpmath.h"
-
 #include "core-types.h"
 
-#include "gegl/gimp-gegl-loops.h"
-#include "gegl/gimp-gegl-utils.h"
-
 #include "gimp.h"
 #include "gimpcontext.h"
 #include "gimpdrawable.h"
 #include "gimpdrawable-offset.h"
-#include "gimpimage.h"
-#include "gimppickable.h"
+#include "gimpdrawable-operation.h"
 
 #include "gimp-intl.h"
 
@@ -49,206 +42,25 @@ gimp_drawable_offset (GimpDrawable   *drawable,
                       gint            offset_x,
                       gint            offset_y)
 {
-  GimpItem      *item;
-  GeglBuffer    *src_buffer;
-  GeglBuffer    *new_buffer;
-  GeglRectangle  src_rect;
-  GeglRectangle  dest_rect;
-  gint           width, height;
-  gint           src_x, src_y;
-  gint           dest_x, dest_y;
+  GeglNode *node;
 
   g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
   g_return_if_fail (GIMP_IS_CONTEXT (context));
 
-  item = GIMP_ITEM (drawable);
-
-  width  = gimp_item_get_width  (item);
-  height = gimp_item_get_height (item);
-
-  if (wrap_around)
-    {
-      /*  avoid modulo operation on negative values  */
-      while (offset_x < 0)
-        offset_x += width;
-      while (offset_y < 0)
-        offset_y += height;
-
-      offset_x %= width;
-      offset_y %= height;
-    }
-  else
-    {
-      offset_x = CLAMP (offset_x, -width, width);
-      offset_y = CLAMP (offset_y, -height, height);
-    }
-
-  if (offset_x == 0 && offset_y == 0)
-    return;
-
-  src_buffer = gimp_drawable_get_buffer (drawable);
-
-  new_buffer = gegl_buffer_new (GEGL_RECTANGLE (0, 0, width, height),
-                                gimp_drawable_get_format (drawable));
-
-  if (! wrap_around)
-    {
-      if (fill_type == GIMP_OFFSET_BACKGROUND)
-        {
-          GimpRGB    bg;
-          GeglColor *color;
-
-          gimp_context_get_background (context, &bg);
-          gimp_pickable_srgb_to_image_color (GIMP_PICKABLE (drawable),
-                                             &bg, &bg);
-
-          color = gimp_gegl_color_new (&bg);
-          gegl_buffer_set_color (new_buffer, NULL, color);
-          g_object_unref (color);
-        }
-    }
-
-  if (offset_x >= 0)
-    {
-      src_x = 0;
-      dest_x = offset_x;
-      width = CLAMP ((width - offset_x), 0, width);
-    }
-  else
-    {
-      src_x = -offset_x;
-      dest_x = 0;
-      width = CLAMP ((width + offset_x), 0, width);
-    }
-
-  if (offset_y >= 0)
-    {
-      src_y = 0;
-      dest_y = offset_y;
-      height = CLAMP ((height - offset_y), 0, height);
-    }
-  else
-    {
-      src_y = -offset_y;
-      dest_y = 0;
-      height = CLAMP ((height + offset_y), 0, height);
-    }
-
-  /*  Copy the center region  */
-  if (width && height)
-    {
-      gimp_gegl_buffer_copy (src_buffer,
-                             GEGL_RECTANGLE (src_x,  src_y,  width, height),
-                             GEGL_ABYSS_NONE,
-                             new_buffer,
-                             GEGL_RECTANGLE (dest_x,dest_y,  width, height));
-    }
-
   if (wrap_around)
-    {
-      /*  Copy appropriately for wrap around  */
-
-      if (offset_x >= 0 && offset_y >= 0)
-        {
-          src_x = gimp_item_get_width  (item) - offset_x;
-          src_y = gimp_item_get_height (item) - offset_y;
-        }
-      else if (offset_x >= 0 && offset_y < 0)
-        {
-          src_x = gimp_item_get_width (item) - offset_x;
-          src_y = 0;
-        }
-      else if (offset_x < 0 && offset_y >= 0)
-        {
-          src_x = 0;
-          src_y = gimp_item_get_height (item) - offset_y;
-        }
-      else if (offset_x < 0 && offset_y < 0)
-        {
-          src_x = 0;
-          src_y = 0;
-        }
-
-      dest_x = (src_x + offset_x) % gimp_item_get_width (item);
-      if (dest_x < 0)
-        dest_x = gimp_item_get_width (item) + dest_x;
-
-      dest_y = (src_y + offset_y) % gimp_item_get_height (item);
-      if (dest_y < 0)
-        dest_y = gimp_item_get_height (item) + dest_y;
-
-      /*  intersecting region  */
-      if (offset_x != 0 && offset_y != 0)
-        {
-          gimp_gegl_buffer_copy (
-            src_buffer,
-            GEGL_RECTANGLE (src_x, src_y,
-                            ABS (offset_x), ABS (offset_y)),
-            GEGL_ABYSS_NONE,
-            new_buffer,
-            GEGL_RECTANGLE (dest_x, dest_y, 0, 0));
-        }
-
-      /*  X offset  */
-      if (offset_x != 0)
-        {
-          if (offset_y >= 0)
-            {
-              src_rect.x      = src_x;
-              src_rect.y      = 0;
-              src_rect.width  = ABS (offset_x);
-              src_rect.height = gimp_item_get_height (item) - ABS (offset_y);
-
-              dest_rect.x = dest_x;
-              dest_rect.y = dest_y + offset_y;
-            }
-          else if (offset_y < 0)
-            {
-              src_rect.x      = src_x;
-              src_rect.y      = src_y - offset_y;
-              src_rect.width  = ABS (offset_x);
-              src_rect.height = gimp_item_get_height (item) - ABS (offset_y);
-
-              dest_rect.x = dest_x;
-              dest_rect.y = 0;
-            }
-
-          gimp_gegl_buffer_copy (src_buffer, &src_rect, GEGL_ABYSS_NONE,
-                                 new_buffer, &dest_rect);
-        }
-
-      /*  X offset  */
-      if (offset_y != 0)
-        {
-          if (offset_x >= 0)
-            {
-              src_rect.x      = 0;
-              src_rect.y      = src_y;
-              src_rect.width  = gimp_item_get_width (item) - ABS (offset_x);
-              src_rect.height = ABS (offset_y);
-
-              dest_rect.x = dest_x + offset_x;
-              dest_rect.y = dest_y;
-            }
-          else if (offset_x < 0)
-            {
-              src_rect.x      = src_x - offset_x;
-              src_rect.y      = src_y;
-              src_rect.width  = gimp_item_get_width (item) - ABS (offset_x);
-              src_rect.height = ABS (offset_y);
+    fill_type = GIMP_OFFSET_WRAP_AROUND;
 
-              dest_rect.x = 0;
-              dest_rect.y = dest_y;
-            }
+  node = gegl_node_new_child (NULL,
+                              "operation", "gimp:offset",
+                              "context", context,
+                              "type",    fill_type,
+                              "x",       offset_x,
+                              "y",       offset_y,
+                              NULL);
 
-          gimp_gegl_buffer_copy (src_buffer, &src_rect, GEGL_ABYSS_NONE,
-                                 new_buffer, &dest_rect);
-        }
-    }
+  gimp_drawable_apply_operation (drawable, NULL,
+                                 C_("undo-type", "Offset Drawable"),
+                                 node);
 
-  gimp_drawable_set_buffer (drawable,
-                            gimp_item_is_attached (item),
-                            C_("undo-type", "Offset Drawable"),
-                            new_buffer);
-  g_object_unref (new_buffer);
+  g_object_unref (node);
 }


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