[gimp] app: fix regression: make the selection clip the FS again



commit 38e983c72482ccef2fbe8b5bc1390858a3878555
Author: Michael Natterer <mitch gimp org>
Date:   Fri Apr 12 18:26:34 2013 +0200

    app: fix regression: make the selection clip the FS again

 app/core/gimpdrawable-private.h |    2 +
 app/core/gimpdrawable.c         |  100 ++++++++++++++++++++++++++++++--------
 2 files changed, 81 insertions(+), 21 deletions(-)
---
diff --git a/app/core/gimpdrawable-private.h b/app/core/gimpdrawable-private.h
index d9ce456..7143fc7 100644
--- a/app/core/gimpdrawable-private.h
+++ b/app/core/gimpdrawable-private.h
@@ -31,6 +31,8 @@ struct _GimpDrawablePrivate
   GimpFilter    *fs_filter;
   GeglNode      *fs_crop_node;
   GeglNode      *fs_offset_node;
+  GeglNode      *fs_mask_node;
+  GeglNode      *fs_mask_offset_node;
   GeglNode      *fs_mode_node;
   GeglNode      *fs_affect_node;
 
diff --git a/app/core/gimpdrawable.c b/app/core/gimpdrawable.c
index 1d90a9c..a234b98 100644
--- a/app/core/gimpdrawable.c
+++ b/app/core/gimpdrawable.c
@@ -179,9 +179,11 @@ static void       gimp_drawable_sync_fs_filter     (GimpDrawable      *drawable,
 static void       gimp_drawable_fs_notify          (GimpLayer         *fs,
                                                     const GParamSpec  *pspec,
                                                     GimpDrawable      *drawable);
-static void       gimp_drawable_fs_image_changed   (GimpImage         *image,
+static void       gimp_drawable_fs_affect_changed  (GimpImage         *image,
                                                     GimpChannelType    channel,
                                                     GimpDrawable      *drawable);
+static void       gimp_drawable_fs_mask_changed    (GimpImage         *image,
+                                                    GimpDrawable      *drawable);
 static void       gimp_drawable_fs_update          (GimpLayer         *fs,
                                                     gint               x,
                                                     gint               y,
@@ -904,11 +906,13 @@ static GimpFilter *
 gimp_drawable_create_fs_filter (GimpDrawable *drawable,
                                 GimpDrawable *fs)
 {
-  GimpFilter *filter;
-  GeglNode   *node;
-  GeglNode   *input;
-  GeglNode   *output;
-  GeglNode   *fs_source;
+  GimpImage   *image = gimp_item_get_image (GIMP_ITEM (drawable));
+  GimpChannel *mask  = gimp_image_get_mask (image);
+  GimpFilter  *filter;
+  GeglNode    *node;
+  GeglNode    *input;
+  GeglNode    *output;
+  GeglNode    *fs_source;
 
   filter = gimp_filter_new ("Floating Selection");
 
@@ -935,15 +939,30 @@ gimp_drawable_create_fs_filter (GimpDrawable *drawable,
   gegl_node_connect_to (drawable->private->fs_crop_node,   "output",
                         drawable->private->fs_offset_node, "input");
 
+  drawable->private->fs_mask_node =
+    gegl_node_new_child (node,
+                         "operation", "gegl:buffer-source",
+                         "buffer",    gimp_drawable_get_buffer (GIMP_DRAWABLE (mask)),
+                         NULL);
+
+  drawable->private->fs_mask_offset_node =
+    gegl_node_new_child (node,
+                         "operation", "gegl:translate",
+                         NULL);
+
+  gegl_node_connect_to (drawable->private->fs_mask_node,        "output",
+                        drawable->private->fs_mask_offset_node, "input");
+
   drawable->private->fs_mode_node =
     gegl_node_new_child (node,
                          "operation", "gimp:normal-mode",
                          NULL);
 
-  gegl_node_connect_to (input,                             "output",
-                        drawable->private->fs_mode_node,   "input");
-  gegl_node_connect_to (drawable->private->fs_offset_node, "output",
-                        drawable->private->fs_mode_node,   "aux");
+  gegl_node_connect_to (input,                                  "output",
+                        drawable->private->fs_mode_node,        "input");
+  gegl_node_connect_to (drawable->private->fs_offset_node,      "output",
+                        drawable->private->fs_mode_node,        "aux");
+  /* don't connect the mask, that's done dynamically in sync_fs_filter */
 
   drawable->private->fs_affect_node =
     gegl_node_new_child (node,
@@ -973,8 +992,10 @@ gimp_drawable_sync_fs_filter (GimpDrawable *drawable,
 
   if (fs && ! detach_fs)
     {
-      gint off_x, off_y;
-      gint fs_off_x, fs_off_y;
+      GimpImage   *image = gimp_item_get_image (GIMP_ITEM (drawable));
+      GimpChannel *mask  = gimp_image_get_mask (image);
+      gint         off_x, off_y;
+      gint         fs_off_x, fs_off_y;
 
       if (! drawable->private->fs_filter)
         {
@@ -1001,7 +1022,10 @@ gimp_drawable_sync_fs_filter (GimpDrawable *drawable,
                             G_CALLBACK (gimp_drawable_fs_notify),
                             drawable);
           g_signal_connect (image, "component-active-changed",
-                            G_CALLBACK (gimp_drawable_fs_image_changed),
+                            G_CALLBACK (gimp_drawable_fs_affect_changed),
+                            drawable);
+          g_signal_connect (image, "mask-changed",
+                            G_CALLBACK (gimp_drawable_fs_mask_changed),
                             drawable);
         }
 
@@ -1020,6 +1044,21 @@ gimp_drawable_sync_fs_filter (GimpDrawable *drawable,
                      "y", (gdouble) (fs_off_y - off_y),
                      NULL);
 
+      gegl_node_set (drawable->private->fs_mask_offset_node,
+                     "x", (gdouble) - off_x,
+                     "y", (gdouble) - off_y,
+                     NULL);
+
+      if (gimp_channel_is_empty (mask))
+        {
+          gegl_node_disconnect (drawable->private->fs_mode_node, "aux2");
+        }
+      else
+        {
+          gegl_node_connect_to (drawable->private->fs_mask_offset_node, "output",
+                                drawable->private->fs_mode_node,        "aux2");
+        }
+
       gimp_gegl_mode_node_set (drawable->private->fs_mode_node,
                                gimp_layer_get_mode (fs),
                                gimp_layer_get_opacity (fs),
@@ -1039,7 +1078,10 @@ gimp_drawable_sync_fs_filter (GimpDrawable *drawable,
                                                 gimp_drawable_fs_notify,
                                                 drawable);
           g_signal_handlers_disconnect_by_func (image,
-                                                gimp_drawable_fs_image_changed,
+                                                gimp_drawable_fs_affect_changed,
+                                                drawable);
+          g_signal_handlers_disconnect_by_func (image,
+                                                gimp_drawable_fs_mask_changed,
                                                 drawable);
 
           gimp_drawable_remove_filter (drawable, drawable->private->fs_filter);
@@ -1061,10 +1103,12 @@ gimp_drawable_sync_fs_filter (GimpDrawable *drawable,
           g_object_unref (drawable->private->fs_filter);
           drawable->private->fs_filter = NULL;
 
-          drawable->private->fs_crop_node   = NULL;
-          drawable->private->fs_offset_node = NULL;
-          drawable->private->fs_mode_node   = NULL;
-          drawable->private->fs_affect_node = NULL;
+          drawable->private->fs_crop_node        = NULL;
+          drawable->private->fs_offset_node      = NULL;
+          drawable->private->fs_mask_node        = NULL;
+          drawable->private->fs_mask_offset_node = NULL;
+          drawable->private->fs_mode_node        = NULL;
+          drawable->private->fs_affect_node      = NULL;
         }
     }
 }
@@ -1085,9 +1129,23 @@ gimp_drawable_fs_notify (GimpLayer        *fs,
 }
 
 static void
-gimp_drawable_fs_image_changed (GimpImage       *image,
-                                GimpChannelType  channel,
-                                GimpDrawable    *drawable)
+gimp_drawable_fs_affect_changed (GimpImage       *image,
+                                 GimpChannelType  channel,
+                                 GimpDrawable    *drawable)
+{
+  GimpLayer *fs = gimp_drawable_get_floating_sel (drawable);
+
+  gimp_drawable_sync_fs_filter (drawable, FALSE);
+
+  gimp_drawable_update (GIMP_DRAWABLE (fs),
+                        0, 0,
+                        gimp_item_get_width  (GIMP_ITEM (fs)),
+                        gimp_item_get_height (GIMP_ITEM (fs)));
+}
+
+static void
+gimp_drawable_fs_mask_changed (GimpImage       *image,
+                               GimpDrawable    *drawable)
 {
   GimpLayer *fs = gimp_drawable_get_floating_sel (drawable);
 


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