[gimp/gimp-2-10] app: add the concept of line art source to Bucket Fill tool.



commit 32fdd693242ad803758347a2833036b115af772f
Author: Jehan <jehan girinstud io>
Date:   Tue Jan 15 16:06:50 2019 +0100

    app: add the concept of line art source to Bucket Fill tool.
    
    Additionally to sample merge and active layer, now we can only use the
    layer above or below the active layer as line art source.
    
    The line art fill is meant to work on drawing lines. Though sample merge
    still is ok in many cases, the more you fill with colors, the more the
    line art computation becomes unecessarily complex. Also when you use a
    lot of layers with some of them already filled with colors, it makes it
    impossible to colorize some line art zones with the tool. Moreover you
    just don't want to have to hide every layers out there to colorize one
    layer (especially background layers and such as you may want to see the
    result with your background).
    Thus we want to be able to set the source as a unique layer, while it
    not being necessarily the active one (because you want lines and colors
    on different layers). In this case, I am assuming that the color and the
    line layers are next to each other (most common organization).
    
    (cherry picked from commit c71b4916af34402e74c47f72663232cd17124070)

 app/core/gimplineart.c            |   6 ++
 app/core/gimplineart.h            |   5 +-
 app/tools/gimpbucketfilloptions.c |  26 +++++-
 app/tools/gimpbucketfilloptions.h |   1 +
 app/tools/gimpbucketfilltool.c    | 186 ++++++++++++++++++++++++--------------
 app/tools/tools-enums.c           |  33 +++++++
 app/tools/tools-enums.h           |  22 +++++
 7 files changed, 206 insertions(+), 73 deletions(-)
---
diff --git a/app/core/gimplineart.c b/app/core/gimplineart.c
index de67cf7d96..e682b4c517 100644
--- a/app/core/gimplineart.c
+++ b/app/core/gimplineart.c
@@ -439,6 +439,12 @@ gimp_line_art_set_input (GimpLineArt  *line_art,
     }
 }
 
+GimpPickable *
+gimp_line_art_get_input (GimpLineArt *line_art)
+{
+  return line_art->priv->input;
+}
+
 void
 gimp_line_art_freeze (GimpLineArt *line_art)
 {
diff --git a/app/core/gimplineart.h b/app/core/gimplineart.h
index 1a867b598a..ee5d1b55c2 100644
--- a/app/core/gimplineart.h
+++ b/app/core/gimplineart.h
@@ -50,14 +50,15 @@ struct _GimpLineArtClass
 
 GType                gimp_line_art_get_type         (void) G_GNUC_CONST;
 
-GimpLineArt *        gimp_line_art_new              (void);
+GimpLineArt        * gimp_line_art_new              (void);
 
 void                 gimp_line_art_set_input        (GimpLineArt  *line_art,
                                                      GimpPickable *pickable);
+GimpPickable       * gimp_line_art_get_input        (GimpLineArt  *line_art);
 void                 gimp_line_art_freeze           (GimpLineArt  *line_art);
 void                 gimp_line_art_thaw             (GimpLineArt  *line_art);
 
-GeglBuffer *         gimp_line_art_get              (GimpLineArt  *line_art,
+GeglBuffer         * gimp_line_art_get              (GimpLineArt  *line_art,
                                                      gfloat      **distmap);
 
 #endif /* __GIMP_LINEART__ */
diff --git a/app/tools/gimpbucketfilloptions.c b/app/tools/gimpbucketfilloptions.c
index e313e626eb..e173bec236 100644
--- a/app/tools/gimpbucketfilloptions.c
+++ b/app/tools/gimpbucketfilloptions.c
@@ -53,6 +53,7 @@ enum
   PROP_DIAGONAL_NEIGHBORS,
   PROP_ANTIALIAS,
   PROP_THRESHOLD,
+  PROP_LINE_ART_SOURCE,
   PROP_LINE_ART_THRESHOLD,
   PROP_LINE_ART_MAX_GROW,
   PROP_LINE_ART_MAX_GAP_LENGTH,
@@ -158,6 +159,14 @@ gimp_bucket_fill_options_class_init (GimpBucketFillOptionsClass *klass)
                            0.0, 255.0, 15.0,
                            GIMP_PARAM_STATIC_STRINGS);
 
+  GIMP_CONFIG_PROP_ENUM (object_class, PROP_LINE_ART_SOURCE,
+                         "line-art-source",
+                         _("Source"),
+                         _("Source image for line art computation"),
+                         GIMP_TYPE_LINE_ART_SOURCE,
+                         GIMP_LINE_ART_SOURCE_SAMPLE_MERGED,
+                         GIMP_PARAM_STATIC_STRINGS);
+
   GIMP_CONFIG_PROP_DOUBLE (object_class, PROP_LINE_ART_THRESHOLD,
                            "line-art-threshold",
                            _("Line art detection threshold"),
@@ -234,6 +243,9 @@ gimp_bucket_fill_options_set_property (GObject      *object,
     case PROP_THRESHOLD:
       options->threshold = g_value_get_double (value);
       break;
+    case PROP_LINE_ART_SOURCE:
+      options->line_art_source = g_value_get_enum (value);
+      break;
     case PROP_LINE_ART_THRESHOLD:
       options->line_art_threshold = g_value_get_double (value);
       break;
@@ -284,6 +296,9 @@ gimp_bucket_fill_options_get_property (GObject    *object,
     case PROP_THRESHOLD:
       g_value_set_double (value, options->threshold);
       break;
+    case PROP_LINE_ART_SOURCE:
+      g_value_set_enum (value, options->line_art_source);
+      break;
     case PROP_LINE_ART_THRESHOLD:
       g_value_set_double (value, options->line_art_threshold);
       break;
@@ -437,16 +452,17 @@ gimp_bucket_fill_options_gui (GimpToolOptions *tool_options)
   gtk_container_add (GTK_CONTAINER (frame), vbox2);
   gtk_widget_show (vbox2);
 
+  /*  Line Art: source combo (replace sample merged!) */
+  combo = gimp_prop_enum_combo_box_new (config, "line-art-source", 0, 0);
+  gimp_int_combo_box_set_label (GIMP_INT_COMBO_BOX (combo), _("Source"));
+  gtk_box_pack_start (GTK_BOX (vbox2), combo, FALSE, FALSE, 0);
+  gtk_widget_show (combo);
+
   /*  the fill transparent areas toggle  */
   button = gimp_prop_check_button_new (config, "fill-transparent", NULL);
   gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
   gtk_widget_show (button);
 
-  /*  the sample merged toggle  */
-  button = gimp_prop_check_button_new (config, "sample-merged", NULL);
-  gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
-  gtk_widget_show (button);
-
   /*  the antialias toggle  */
   button = gimp_prop_check_button_new (config, "antialias", NULL);
   gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
diff --git a/app/tools/gimpbucketfilloptions.h b/app/tools/gimpbucketfilloptions.h
index 83fdb17e50..ee09b5745c 100644
--- a/app/tools/gimpbucketfilloptions.h
+++ b/app/tools/gimpbucketfilloptions.h
@@ -46,6 +46,7 @@ struct _GimpBucketFillOptions
   gboolean                      antialias;
   gdouble                       threshold;
 
+  GimpLineArtSource             line_art_source;
   gdouble                       line_art_threshold;
   gint                          line_art_max_grow;
   gint                          line_art_max_gap_length;
diff --git a/app/tools/gimpbucketfilltool.c b/app/tools/gimpbucketfilltool.c
index 7d9f83006c..49edb1f625 100644
--- a/app/tools/gimpbucketfilltool.c
+++ b/app/tools/gimpbucketfilltool.c
@@ -27,6 +27,7 @@
 #include "core/gimp.h"
 #include "core/gimpasync.h"
 #include "core/gimpcancelable.h"
+#include "core/gimpcontainer.h"
 #include "core/gimpdrawable-bucket-fill.h"
 #include "core/gimpdrawable-edit.h"
 #include "core/gimpdrawablefilter.h"
@@ -131,13 +132,7 @@ static void     gimp_bucket_fill_tool_filter_flush     (GimpDrawableFilter    *f
                                                         GimpTool              *tool);
 static void     gimp_bucket_fill_tool_create_graph     (GimpBucketFillTool    *tool);
 
-static void     gimp_bucket_fill_tool_reset_line_art   (GimpBucketFillTool    *tool,
-                                                        GimpBucketFillOptions *options);
-static void     gimp_bucket_fill_tool_image_changed    (GimpContext           *context,
-                                                        GimpImage             *image,
-                                                        GimpBucketFillTool    *tool);
-static void     gimp_bucket_fill_tool_drawable_changed (GimpImage            *image,
-                                                        GimpBucketFillTool   *tool);
+static void     gimp_bucket_fill_tool_reset_line_art   (GimpBucketFillTool    *tool);
 
 
 G_DEFINE_TYPE_WITH_PRIVATE (GimpBucketFillTool, gimp_bucket_fill_tool,
@@ -233,11 +228,14 @@ gimp_bucket_fill_tool_constructed (GObject *object)
                           G_BINDING_SYNC_CREATE | G_BINDING_DEFAULT);
   bucket_tool->priv->line_art = line_art;
 
-  gimp_bucket_fill_tool_reset_line_art (bucket_tool, options);
+  gimp_bucket_fill_tool_reset_line_art (bucket_tool);
 
-  g_signal_connect (context, "image-changed",
-                    G_CALLBACK (gimp_bucket_fill_tool_image_changed),
-                    tool);
+  g_signal_connect_swapped (options, "notify::line-art-source",
+                            G_CALLBACK (gimp_bucket_fill_tool_reset_line_art),
+                            tool);
+  g_signal_connect_swapped (context, "image-changed",
+                            G_CALLBACK (gimp_bucket_fill_tool_reset_line_art),
+                            tool);
 
   GIMP_COLOR_TOOL (tool)->pick_target =
     (options->fill_mode == GIMP_BUCKET_FILL_BG) ?
@@ -252,8 +250,12 @@ gimp_bucket_fill_tool_finalize (GObject *object)
   Gimp                  *gimp     = GIMP_CONTEXT (options)->gimp;
   GimpContext           *context  = gimp_get_user_context (gimp);
 
-  gimp_bucket_fill_tool_reset_line_art (tool, NULL);
-
+  if (tool->priv->line_art_image)
+    {
+      g_signal_handlers_disconnect_by_data (gimp_image_get_layers (tool->priv->line_art_image), tool);
+      g_signal_handlers_disconnect_by_data (tool->priv->line_art_image, tool);
+      tool->priv->line_art_image = NULL;
+    }
   g_clear_object (&tool->priv->line_art);
 
   g_signal_handlers_disconnect_by_data (context, tool);
@@ -266,8 +268,10 @@ gimp_bucket_fill_tool_initialize (GimpTool     *tool,
                                   GimpDisplay  *display,
                                   GError      **error)
 {
-  GimpImage    *image    = gimp_display_get_image (display);
-  GimpDrawable *drawable = gimp_image_get_active_drawable (image);
+  GimpBucketFillOptions *options     = GIMP_BUCKET_FILL_TOOL_GET_OPTIONS (tool);
+  GimpBucketFillTool    *bucket_tool = GIMP_BUCKET_FILL_TOOL (tool);
+  GimpImage             *image       = gimp_display_get_image (display);
+  GimpDrawable          *drawable    = gimp_image_get_active_drawable (image);
 
   if (! GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error))
     {
@@ -297,6 +301,16 @@ gimp_bucket_fill_tool_initialize (GimpTool     *tool,
       return FALSE;
     }
 
+  if (options->fill_area == GIMP_BUCKET_FILL_LINE_ART &&
+      ! gimp_line_art_get_input (bucket_tool->priv->line_art))
+    {
+      g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED,
+                           _("No valid line art source selected."));
+      if (error)
+        gimp_tools_blink_lock_box (display->gimp, GIMP_ITEM (drawable));
+      return FALSE;
+    }
+
   return TRUE;
 }
 
@@ -358,18 +372,17 @@ gimp_bucket_fill_tool_preview (GimpBucketFillTool *tool,
       gdouble     x        = coords->x;
       gdouble     y        = coords->y;
 
-      if (! options->sample_merged)
+      if (options->fill_area == GIMP_BUCKET_FILL_SIMILAR_COLORS)
         {
-          gint off_x, off_y;
-
-          gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y);
+          if (! options->sample_merged)
+            {
+              gint off_x, off_y;
 
-          x -= (gdouble) off_x;
-          y -= (gdouble) off_y;
-        }
+              gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y);
 
-      if (options->fill_area == GIMP_BUCKET_FILL_SIMILAR_COLORS)
-        {
+              x -= (gdouble) off_x;
+              y -= (gdouble) off_y;
+            }
           fill = gimp_drawable_get_bucket_fill_buffer (drawable,
                                                        fill_options,
                                                        options->fill_transparent,
@@ -383,10 +396,20 @@ gimp_bucket_fill_tool_preview (GimpBucketFillTool *tool,
         }
       else
         {
+          if (options->line_art_source != GIMP_LINE_ART_SOURCE_SAMPLE_MERGED)
+            {
+              gint off_x, off_y;
+
+              gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y);
+
+              x -= (gdouble) off_x;
+              y -= (gdouble) off_y;
+            }
           fill = gimp_drawable_get_line_art_fill_buffer (drawable,
                                                          tool->priv->line_art,
                                                          fill_options,
-                                                         options->sample_merged,
+                                                         options->line_art_source ==
+                                                         GIMP_LINE_ART_SOURCE_SAMPLE_MERGED,
                                                          x, y,
                                                          &tool->priv->fill_mask,
                                                          &x, &y, NULL, NULL);
@@ -489,6 +512,7 @@ gimp_bucket_fill_tool_button_press (GimpTool            *tool,
   GimpBucketFillTool    *bucket_tool = GIMP_BUCKET_FILL_TOOL (tool);
   GimpBucketFillOptions *options     = GIMP_BUCKET_FILL_TOOL_GET_OPTIONS (tool);
   GimpImage             *image       = gimp_display_get_image (display);
+  gboolean               sample_merged;
 
   if (gimp_color_tool_is_enabled (GIMP_COLOR_TOOL (tool)))
     {
@@ -497,9 +521,11 @@ gimp_bucket_fill_tool_button_press (GimpTool            *tool,
       return;
     }
 
+  sample_merged = (options->fill_area == GIMP_BUCKET_FILL_LINE_ART ?
+                   options->line_art_source == GIMP_LINE_ART_SOURCE_SAMPLE_MERGED :
+                   options->sample_merged);
   if (press_type == GIMP_BUTTON_PRESS_NORMAL &&
-      gimp_image_coords_in_active_pickable (image, coords,
-                                            options->sample_merged, TRUE))
+      gimp_image_coords_in_active_pickable (image, coords, sample_merged, TRUE))
     {
       GimpDrawable    *drawable = gimp_image_get_active_drawable (image);
       GimpContext     *context  = GIMP_CONTEXT (options);
@@ -555,14 +581,17 @@ gimp_bucket_fill_tool_motion (GimpTool         *tool,
   GimpBucketFillTool    *bucket_tool = GIMP_BUCKET_FILL_TOOL (tool);
   GimpBucketFillOptions *options     = GIMP_BUCKET_FILL_TOOL_GET_OPTIONS (tool);
   GimpImage             *image       = gimp_display_get_image (display);
+  gboolean               sample_merged;
 
   GIMP_TOOL_CLASS (parent_class)->motion (tool, coords, time, state, display);
 
   if (gimp_color_tool_is_enabled (GIMP_COLOR_TOOL (tool)))
     return;
 
-  if (gimp_image_coords_in_active_pickable (image, coords,
-                                            options->sample_merged, TRUE) &&
+  sample_merged = (options->fill_area == GIMP_BUCKET_FILL_LINE_ART ?
+                   options->line_art_source == GIMP_LINE_ART_SOURCE_SAMPLE_MERGED :
+                   options->sample_merged);
+  if (gimp_image_coords_in_active_pickable (image, coords, sample_merged, TRUE) &&
       /* Fill selection only needs to happen once. */
       options->fill_area != GIMP_BUCKET_FILL_SELECTION)
     {
@@ -736,9 +765,12 @@ gimp_bucket_fill_tool_cursor_update (GimpTool         *tool,
   GimpBucketFillOptions *options  = GIMP_BUCKET_FILL_TOOL_GET_OPTIONS (tool);
   GimpCursorModifier     modifier = GIMP_CURSOR_MODIFIER_BAD;
   GimpImage             *image    = gimp_display_get_image (display);
+  gboolean               sample_merged;
 
-  if (gimp_image_coords_in_active_pickable (image, coords,
-                                            options->sample_merged, TRUE))
+  sample_merged = (options->fill_area == GIMP_BUCKET_FILL_LINE_ART ?
+                   options->line_art_source == GIMP_LINE_ART_SOURCE_SAMPLE_MERGED :
+                   options->sample_merged);
+  if (gimp_image_coords_in_active_pickable (image, coords, sample_merged, TRUE))
     {
       GimpDrawable *drawable = gimp_image_get_active_drawable (image);
 
@@ -781,7 +813,7 @@ gimp_bucket_fill_tool_options_notify (GimpTool         *tool,
   if (! strcmp (pspec->name, "fill-area") ||
       ! strcmp (pspec->name, "sample-merged"))
     {
-      gimp_bucket_fill_tool_reset_line_art (bucket_tool, bucket_options);
+      gimp_bucket_fill_tool_reset_line_art (bucket_tool);
     }
   else if (! strcmp (pspec->name, "fill-mode"))
     {
@@ -811,11 +843,11 @@ gimp_bucket_fill_tool_options_notify (GimpTool         *tool,
 }
 
 static void
-gimp_bucket_fill_tool_reset_line_art (GimpBucketFillTool    *tool,
-                                      GimpBucketFillOptions *options)
+gimp_bucket_fill_tool_reset_line_art (GimpBucketFillTool *tool)
 {
-  GimpLineArt *line_art = tool->priv->line_art;
-  GimpImage   *image    = NULL;
+  GimpBucketFillOptions *options  = GIMP_BUCKET_FILL_TOOL_GET_OPTIONS (tool);
+  GimpLineArt           *line_art = tool->priv->line_art;
+  GimpImage             *image    = NULL;
 
   if (options && options->fill_area == GIMP_BUCKET_FILL_LINE_ART)
     {
@@ -828,18 +860,31 @@ gimp_bucket_fill_tool_reset_line_art (GimpBucketFillTool    *tool,
   if (image != tool->priv->line_art_image)
     {
       if (tool->priv->line_art_image)
-        g_signal_handlers_disconnect_by_data (tool->priv->line_art_image, tool);
+        {
+          g_signal_handlers_disconnect_by_data (gimp_image_get_layers (tool->priv->line_art_image), tool);
+          g_signal_handlers_disconnect_by_data (tool->priv->line_art_image, tool);
+        }
 
       tool->priv->line_art_image = image;
 
       if (image)
         {
-          g_signal_connect (image, "active-layer-changed",
-                            G_CALLBACK (gimp_bucket_fill_tool_drawable_changed),
-                            tool);
-          g_signal_connect (image, "active-channel-changed",
-                            G_CALLBACK (gimp_bucket_fill_tool_drawable_changed),
-                            tool);
+          g_signal_connect_swapped (image, "active-layer-changed",
+                                    G_CALLBACK (gimp_bucket_fill_tool_reset_line_art),
+                                    tool);
+          g_signal_connect_swapped (image, "active-channel-changed",
+                                    G_CALLBACK (gimp_bucket_fill_tool_reset_line_art),
+                                    tool);
+
+          g_signal_connect_swapped (gimp_image_get_layers (image), "add",
+                                    G_CALLBACK (gimp_bucket_fill_tool_reset_line_art),
+                                    tool);
+          g_signal_connect_swapped (gimp_image_get_layers (image), "remove",
+                                    G_CALLBACK (gimp_bucket_fill_tool_reset_line_art),
+                                    tool);
+          g_signal_connect_swapped (gimp_image_get_layers (image), "reorder",
+                                    G_CALLBACK (gimp_bucket_fill_tool_reset_line_art),
+                                    tool);
         }
     }
 
@@ -850,34 +895,43 @@ gimp_bucket_fill_tool_reset_line_art (GimpBucketFillTool    *tool,
       if (gimp_viewable_get_children (GIMP_VIEWABLE (drawable)))
         drawable = NULL;
 
-      if (options->sample_merged)
-        gimp_line_art_set_input (line_art, GIMP_PICKABLE (image));
+      if (options->line_art_source == GIMP_LINE_ART_SOURCE_SAMPLE_MERGED)
+        {
+          gimp_line_art_set_input (line_art, GIMP_PICKABLE (image));
+        }
       else if (drawable)
-        gimp_line_art_set_input (line_art, GIMP_PICKABLE (drawable));
+        {
+          GimpItem      *parent;
+          GimpContainer *container;
+          GimpObject    *neighbour = NULL;
+          GimpPickable  *source    = NULL;
+          gint           index;
+
+          parent = gimp_item_get_parent (GIMP_ITEM (drawable));
+          if (parent)
+            container = gimp_viewable_get_children (GIMP_VIEWABLE (parent));
+          else
+            container = gimp_image_get_layers (image);
+
+          index = gimp_item_get_index (GIMP_ITEM (drawable));
+
+          if (options->line_art_source == GIMP_LINE_ART_SOURCE_ACTIVE_LAYER)
+            source = GIMP_PICKABLE (drawable);
+          else if (options->line_art_source == GIMP_LINE_ART_SOURCE_LOWER_LAYER)
+            neighbour = gimp_container_get_child_by_index (container, index + 1);
+          else if (options->line_art_source == GIMP_LINE_ART_SOURCE_UPPER_LAYER)
+            neighbour = gimp_container_get_child_by_index (container, index - 1);
+
+          source = neighbour ? GIMP_PICKABLE (neighbour) : source;
+          gimp_line_art_set_input (line_art, source);
+        }
       else
-        gimp_line_art_set_input (line_art, NULL);
+        {
+          gimp_line_art_set_input (line_art, NULL);
+        }
     }
   else
     {
       gimp_line_art_set_input (line_art, NULL);
     }
 }
-
-static void
-gimp_bucket_fill_tool_image_changed (GimpContext        *context,
-                                     GimpImage          *image,
-                                     GimpBucketFillTool *tool)
-{
-  GimpBucketFillOptions *options = GIMP_BUCKET_FILL_TOOL_GET_OPTIONS (tool);
-
-  gimp_bucket_fill_tool_reset_line_art (tool, options);
-}
-
-static void
-gimp_bucket_fill_tool_drawable_changed (GimpImage          *image,
-                                        GimpBucketFillTool *tool)
-{
-  GimpBucketFillOptions *options = GIMP_BUCKET_FILL_TOOL_GET_OPTIONS (tool);
-
-  gimp_bucket_fill_tool_reset_line_art (tool, options);
-}
diff --git a/app/tools/tools-enums.c b/app/tools/tools-enums.c
index 1ff1e9387a..30ac1073af 100644
--- a/app/tools/tools-enums.c
+++ b/app/tools/tools-enums.c
@@ -40,6 +40,39 @@ gimp_bucket_fill_area_get_type (void)
   return type;
 }
 
+GType
+gimp_line_art_source_get_type (void)
+{
+  static const GEnumValue values[] =
+  {
+    { GIMP_LINE_ART_SOURCE_SAMPLE_MERGED, "GIMP_LINE_ART_SOURCE_SAMPLE_MERGED", "sample-merged" },
+    { GIMP_LINE_ART_SOURCE_ACTIVE_LAYER, "GIMP_LINE_ART_SOURCE_ACTIVE_LAYER", "active-layer" },
+    { GIMP_LINE_ART_SOURCE_LOWER_LAYER, "GIMP_LINE_ART_SOURCE_LOWER_LAYER", "lower-layer" },
+    { GIMP_LINE_ART_SOURCE_UPPER_LAYER, "GIMP_LINE_ART_SOURCE_UPPER_LAYER", "upper-layer" },
+    { 0, NULL, NULL }
+  };
+
+  static const GimpEnumDesc descs[] =
+  {
+    { GIMP_LINE_ART_SOURCE_SAMPLE_MERGED, NC_("line-art-source", "All visible layers"), NULL },
+    { GIMP_LINE_ART_SOURCE_ACTIVE_LAYER, NC_("line-art-source", "Active layer"), NULL },
+    { GIMP_LINE_ART_SOURCE_LOWER_LAYER, NC_("line-art-source", "Layer below the active one"), NULL },
+    { GIMP_LINE_ART_SOURCE_UPPER_LAYER, NC_("line-art-source", "Layer above the active one"), NULL },
+    { 0, NULL, NULL }
+  };
+
+  static GType type = 0;
+
+  if (G_UNLIKELY (! type))
+    {
+      type = g_enum_register_static ("GimpLineArtSource", values);
+      gimp_type_set_translation_context (type, "line-art-source");
+      gimp_enum_set_value_descriptions (type, descs);
+    }
+
+  return type;
+}
+
 GType
 gimp_rect_select_mode_get_type (void)
 {
diff --git a/app/tools/tools-enums.h b/app/tools/tools-enums.h
index 592c17bd7c..be53c0b29c 100644
--- a/app/tools/tools-enums.h
+++ b/app/tools/tools-enums.h
@@ -43,6 +43,28 @@ typedef enum
 } GimpBucketFillArea;
 
 
+/**
+ * GimpLineArtSource:
+ * @GIMP_LINE_ART_SOURCE_SAMPLE_MERGED: All visible layers
+ * @GIMP_LINE_ART_SOURCE_ACTIVE_LAYER:  Active layer
+ * @GIMP_LINE_ART_SOURCE_LOWER_LAYER:   Layer below the active one
+ * @GIMP_LINE_ART_SOURCE_UPPER_LAYER:   Layer above the active one
+ *
+ * Bucket fill area.
+ */
+#define GIMP_TYPE_LINE_ART_SOURCE (gimp_line_art_source_get_type ())
+
+GType gimp_line_art_source_get_type (void) G_GNUC_CONST;
+
+typedef enum
+{
+  GIMP_LINE_ART_SOURCE_SAMPLE_MERGED, /*< desc="All visible layers" >*/
+  GIMP_LINE_ART_SOURCE_ACTIVE_LAYER,  /*< desc="Active layer" >*/
+  GIMP_LINE_ART_SOURCE_LOWER_LAYER,   /*< desc="Layer below the active one" >*/
+  GIMP_LINE_ART_SOURCE_UPPER_LAYER    /*< desc="Layer above the active one" >*/
+} GimpLineArtSource;
+
+
 #define GIMP_TYPE_RECT_SELECT_MODE (gimp_rect_select_mode_get_type ())
 
 GType gimp_rect_select_mode_get_type (void) G_GNUC_CONST;


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