[gimp] app: GimpSelectionEditor multi-drawable aware.



commit 84e587d25539340152b60ee71bb81391d1c9f1fb
Author: Jehan <jehan girinstud io>
Date:   Mon Aug 17 18:22:19 2020 +0200

    app: GimpSelectionEditor multi-drawable aware.
    
    When clicking on the selection mask (in the dockable view) or when
    dropping a color on this same view, we can now select by color based on
    the selected layer composition (not only one single layer, nor the whole
    image as sample merged, but also a specific list of composited layers).
    
    gimp_channel_select_by_color() is made multi-drawable aware as a
    consequence of this.

 app/core/gimpchannel-select.c     | 42 +++++++++++++++++++++++++++++++--------
 app/core/gimpchannel-select.h     |  2 +-
 app/pdb/image-select-cmds.c       |  4 +++-
 app/widgets/gimpselectioneditor.c | 17 ++++++++--------
 pdb/groups/image_select.pdb       |  4 +++-
 5 files changed, 49 insertions(+), 20 deletions(-)
---
diff --git a/app/core/gimpchannel-select.c b/app/core/gimpchannel-select.c
index b76280ed8b..4580d8c08d 100644
--- a/app/core/gimpchannel-select.c
+++ b/app/core/gimpchannel-select.c
@@ -32,9 +32,13 @@
 #include "gegl/gimp-gegl-loops.h"
 #include "gegl/gimp-gegl-mask-combine.h"
 
+#include "gimp.h"
 #include "gimpchannel.h"
 #include "gimpchannel-select.h"
 #include "gimpchannel-combine.h"
+#include "gimpcontainer.h"
+#include "gimpimage.h"
+#include "gimpimage-new.h"
 #include "gimppickable.h"
 #include "gimppickable-contiguous-region.h"
 #include "gimpscanconvert.h"
@@ -519,7 +523,7 @@ gimp_channel_select_fuzzy (GimpChannel         *channel,
 
 void
 gimp_channel_select_by_color (GimpChannel         *channel,
-                              GimpDrawable        *drawable,
+                              GList               *drawables,
                               gboolean             sample_merged,
                               const GimpRGB       *color,
                               gfloat               threshold,
@@ -533,18 +537,36 @@ gimp_channel_select_by_color (GimpChannel         *channel,
 {
   GimpPickable *pickable;
   GeglBuffer   *add_on;
-  gint          add_on_x = 0;
-  gint          add_on_y = 0;
+  GimpImage    *image;
+  GimpImage    *sel_image = NULL;
+  gint          add_on_x  = 0;
+  gint          add_on_y  = 0;
 
   g_return_if_fail (GIMP_IS_CHANNEL (channel));
   g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (channel)));
-  g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
+  g_return_if_fail (drawables != NULL);
   g_return_if_fail (color != NULL);
 
+  image = gimp_item_get_image (drawables->data);
   if (sample_merged)
-    pickable = GIMP_PICKABLE (gimp_item_get_image (GIMP_ITEM (drawable)));
+    {
+      pickable = GIMP_PICKABLE (image);
+    }
   else
-    pickable = GIMP_PICKABLE (drawable);
+    {
+      if (g_list_length (drawables) == 1)
+        {
+          pickable = GIMP_PICKABLE (drawables->data);
+        }
+      else
+        {
+          sel_image = gimp_image_new_from_drawables (image->gimp, drawables, FALSE);
+          gimp_container_remove (image->gimp->images, GIMP_OBJECT (sel_image));
+
+          pickable = GIMP_PICKABLE (sel_image);
+          gimp_pickable_flush (pickable);
+        }
+    }
 
   add_on = gimp_pickable_contiguous_region_by_color (pickable,
                                                      antialias,
@@ -553,8 +575,8 @@ gimp_channel_select_by_color (GimpChannel         *channel,
                                                      select_criterion,
                                                      color);
 
-  if (! sample_merged)
-    gimp_item_get_offset (GIMP_ITEM (drawable), &add_on_x, &add_on_y);
+  if (! sample_merged && ! sel_image)
+    gimp_item_get_offset (GIMP_ITEM (drawables->data), &add_on_x, &add_on_y);
 
   gimp_channel_select_buffer (channel, C_("undo-type", "Select by Color"),
                               add_on, add_on_x, add_on_y,
@@ -562,7 +584,11 @@ gimp_channel_select_by_color (GimpChannel         *channel,
                               feather,
                               feather_radius_x,
                               feather_radius_y);
+
   g_object_unref (add_on);
+  if (sel_image)
+    g_object_unref (sel_image);
+
 }
 
 void
diff --git a/app/core/gimpchannel-select.h b/app/core/gimpchannel-select.h
index ca2680d644..7ea669832f 100644
--- a/app/core/gimpchannel-select.h
+++ b/app/core/gimpchannel-select.h
@@ -137,7 +137,7 @@ void   gimp_channel_select_fuzzy        (GimpChannel         *channel,
                                          gdouble              feather_radius_x,
                                          gdouble              feather_radius_y);
 void   gimp_channel_select_by_color     (GimpChannel         *channel,
-                                         GimpDrawable        *drawable,
+                                         GList               *drawables,
                                          gboolean             sample_merged,
                                          const GimpRGB       *color,
                                          gfloat               threshold,
diff --git a/app/pdb/image-select-cmds.c b/app/pdb/image-select-cmds.c
index 4d46325d80..9b67d64cb7 100644
--- a/app/pdb/image-select-cmds.c
+++ b/app/pdb/image-select-cmds.c
@@ -73,7 +73,8 @@ image_select_color_invoker (GimpProcedure         *procedure,
       if (pdb_context->sample_merged ||
           gimp_pdb_item_is_attached (GIMP_ITEM (drawable), image, 0, error))
         {
-          gimp_channel_select_by_color (gimp_image_get_mask (image), drawable,
+          GList *drawables = g_list_prepend (NULL, drawable);
+          gimp_channel_select_by_color (gimp_image_get_mask (image), drawables,
                                         pdb_context->sample_merged,
                                         &color,
                                         pdb_context->sample_threshold,
@@ -84,6 +85,7 @@ image_select_color_invoker (GimpProcedure         *procedure,
                                         pdb_context->feather,
                                         pdb_context->feather_radius_x,
                                         pdb_context->feather_radius_y);
+          g_list_free (drawables);
         }
       else
         success = FALSE;
diff --git a/app/widgets/gimpselectioneditor.c b/app/widgets/gimpselectioneditor.c
index 69e6f95dab..1285c13838 100644
--- a/app/widgets/gimpselectioneditor.c
+++ b/app/widgets/gimpselectioneditor.c
@@ -245,7 +245,6 @@ gimp_selection_view_button_press (GtkWidget           *widget,
   GimpToolInfo            *tool_info;
   GimpSelectionOptions    *sel_options;
   GimpRegionSelectOptions *options;
-  GimpDrawable            *drawable;
   GimpChannelOps           operation;
   GList                   *drawables;
   gint                     x, y;
@@ -265,12 +264,11 @@ gimp_selection_view_button_press (GtkWidget           *widget,
   sel_options = GIMP_SELECTION_OPTIONS (tool_info->tool_options);
   options     = GIMP_REGION_SELECT_OPTIONS (tool_info->tool_options);
 
-  drawable = gimp_image_get_active_drawable (image_editor->image);
+  drawables = gimp_image_get_selected_drawables (image_editor->image);
 
-  if (! drawable)
+  if (! drawables)
     return TRUE;
 
-  drawables = g_list_prepend (NULL, drawable);
   operation = gimp_modifiers_to_channel_op (bevent->state);
 
   x = gimp_image_get_width  (image_editor->image) * bevent->x / renderer->width;
@@ -283,7 +281,7 @@ gimp_selection_view_button_press (GtkWidget           *widget,
                              NULL, &color))
     {
       gimp_channel_select_by_color (gimp_image_get_mask (image_editor->image),
-                                    drawable,
+                                    drawables,
                                     options->sample_merged,
                                     &color,
                                     options->threshold / 255.0,
@@ -312,7 +310,7 @@ gimp_selection_editor_drop_color (GtkWidget     *widget,
   GimpToolInfo            *tool_info;
   GimpSelectionOptions    *sel_options;
   GimpRegionSelectOptions *options;
-  GimpDrawable            *drawable;
+  GList                   *drawables;
 
   if (! editor->image)
     return;
@@ -325,13 +323,13 @@ gimp_selection_editor_drop_color (GtkWidget     *widget,
   sel_options = GIMP_SELECTION_OPTIONS (tool_info->tool_options);
   options     = GIMP_REGION_SELECT_OPTIONS (tool_info->tool_options);
 
-  drawable = gimp_image_get_active_drawable (editor->image);
+  drawables = gimp_image_get_selected_drawables (editor->image);
 
-  if (! drawable)
+  if (! drawables)
     return;
 
   gimp_channel_select_by_color (gimp_image_get_mask (editor->image),
-                                drawable,
+                                drawables,
                                 options->sample_merged,
                                 color,
                                 options->threshold / 255.0,
@@ -343,6 +341,7 @@ gimp_selection_editor_drop_color (GtkWidget     *widget,
                                 sel_options->feather_radius,
                                 sel_options->feather_radius);
   gimp_image_flush (editor->image);
+  g_list_free (drawables);
 }
 
 static void
diff --git a/pdb/groups/image_select.pdb b/pdb/groups/image_select.pdb
index e539f95fde..3e0a4ede08 100644
--- a/pdb/groups/image_select.pdb
+++ b/pdb/groups/image_select.pdb
@@ -63,7 +63,8 @@ HELP
   if (pdb_context->sample_merged ||
       gimp_pdb_item_is_attached (GIMP_ITEM (drawable), image, 0, error))
     {
-      gimp_channel_select_by_color (gimp_image_get_mask (image), drawable,
+      GList *drawables = g_list_prepend (NULL, drawable);
+      gimp_channel_select_by_color (gimp_image_get_mask (image), drawables,
                                     pdb_context->sample_merged,
                                     &color,
                                     pdb_context->sample_threshold,
@@ -74,6 +75,7 @@ HELP
                                     pdb_context->feather,
                                     pdb_context->feather_radius_x,
                                     pdb_context->feather_radius_y);
+      g_list_free (drawables);
     }
   else
     success = FALSE;


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