[gimp] app: add the segment and spline max length options for line art.



commit d71efdec207141cb6b9e860248cf4550bbf61e10
Author: Jehan <jehan girinstud io>
Date:   Thu Nov 29 17:29:42 2018 +0100

    app: add the segment and spline max length options for line art.
    
    We can't just hardcode this. On huge images in particular, you'll want
    to increase this value.

 app/core/gimpchannel-select.c             |  2 +-
 app/core/gimpdrawable-bucket-fill.c       |  8 ++++++
 app/core/gimpdrawable-bucket-fill.h       |  4 +++
 app/core/gimppickable-contiguous-region.c | 35 +++++++++++++++-------
 app/core/gimppickable-contiguous-region.h |  6 ++++
 app/pdb/drawable-edit-cmds.c              |  2 +-
 app/tools/gimpbucketfilloptions.c         | 48 +++++++++++++++++++++++++++++++
 app/tools/gimpbucketfilloptions.h         |  2 ++
 app/tools/gimpbucketfilltool.c            |  4 +++
 app/tools/gimpfuzzyselecttool.c           |  2 +-
 pdb/groups/drawable_edit.pdb              |  2 +-
 11 files changed, 100 insertions(+), 15 deletions(-)
---
diff --git a/app/core/gimpchannel-select.c b/app/core/gimpchannel-select.c
index 0ca19ce00f..d23cadcb05 100644
--- a/app/core/gimpchannel-select.c
+++ b/app/core/gimpchannel-select.c
@@ -522,7 +522,7 @@ gimp_channel_select_fuzzy (GimpChannel         *channel,
                                                     select_transparent,
                                                     select_criterion,
                                                     diagonal_neighbors,
-                                                    0.92, 3, /* TODO */
+                                                    0.92, 3, 20, 60, /* TODO */
                                                     x, y);
 
   if (! sample_merged)
diff --git a/app/core/gimpdrawable-bucket-fill.c b/app/core/gimpdrawable-bucket-fill.c
index 39fcaf2237..a455b9606a 100644
--- a/app/core/gimpdrawable-bucket-fill.c
+++ b/app/core/gimpdrawable-bucket-fill.c
@@ -60,6 +60,8 @@ gimp_drawable_bucket_fill (GimpDrawable         *drawable,
                            gboolean              diagonal_neighbors,
                            gfloat                line_art_stroke_threshold,
                            gint                  line_art_max_grow,
+                           gint                  line_art_segment_max_length,
+                           gint                  line_art_spline_max_length,
                            gdouble               seed_x,
                            gdouble               seed_y)
 {
@@ -82,6 +84,8 @@ gimp_drawable_bucket_fill (GimpDrawable         *drawable,
                                                  diagonal_neighbors,
                                                  line_art_stroke_threshold,
                                                  line_art_max_grow,
+                                                 line_art_segment_max_length,
+                                                 line_art_spline_max_length,
                                                  seed_x, seed_y, NULL,
                                                  &mask_x, &mask_y, &width, &height);
 
@@ -148,6 +152,8 @@ gimp_drawable_get_bucket_fill_buffer (GimpDrawable         *drawable,
                                       gboolean              diagonal_neighbors,
                                       gfloat                stroke_threshold,
                                       gint                  max_grow,
+                                      gint                  segment_max_length,
+                                      gint                  spline_max_length,
                                       gdouble               seed_x,
                                       gdouble               seed_y,
                                       GeglBuffer          **mask_buffer,
@@ -211,6 +217,8 @@ gimp_drawable_get_bucket_fill_buffer (GimpDrawable         *drawable,
                                                       diagonal_neighbors,
                                                       stroke_threshold,
                                                       max_grow,
+                                                      segment_max_length,
+                                                      spline_max_length,
                                                       (gint) seed_x,
                                                       (gint) seed_y);
   if (mask_buffer && *mask_buffer)
diff --git a/app/core/gimpdrawable-bucket-fill.h b/app/core/gimpdrawable-bucket-fill.h
index d7acbb38d2..4019d82780 100644
--- a/app/core/gimpdrawable-bucket-fill.h
+++ b/app/core/gimpdrawable-bucket-fill.h
@@ -30,6 +30,8 @@ void         gimp_drawable_bucket_fill            (GimpDrawable         *drawabl
                                                    gboolean              diagonal_neighbors,
                                                    gfloat                line_art_stroke_threshold,
                                                    gint                  line_art_max_grow,
+                                                   gint                  line_art_segment_max_length,
+                                                   gint                  line_art_spline_max_length,
                                                    gdouble               x,
                                                    gdouble               y);
 GeglBuffer * gimp_drawable_get_bucket_fill_buffer (GimpDrawable         *drawable,
@@ -43,6 +45,8 @@ GeglBuffer * gimp_drawable_get_bucket_fill_buffer (GimpDrawable         *drawabl
                                                    gboolean              diagonal_neighbors,
                                                    gfloat                line_art_stroke_threshold,
                                                    gint                  line_art_max_grow,
+                                                   gint                  line_art_segment_max_length,
+                                                   gint                  line_art_spline_max_length,
                                                    gdouble               seed_x,
                                                    gdouble               seed_y,
                                                    GeglBuffer          **mask_buffer,
diff --git a/app/core/gimppickable-contiguous-region.c b/app/core/gimppickable-contiguous-region.c
index ebabf4c8bb..28f155bd5f 100644
--- a/app/core/gimppickable-contiguous-region.c
+++ b/app/core/gimppickable-contiguous-region.c
@@ -44,6 +44,8 @@ typedef struct
   GeglBuffer *buffer;
   gboolean    select_transparent;
   gfloat      stroke_threshold;
+  gint        segment_max_length;
+  gint        spline_max_length;
 } LineArtData;
 
 typedef struct
@@ -115,7 +117,9 @@ static void     find_contiguous_region    (GeglBuffer          *src_buffer,
 
 static LineArtData   * line_art_data_new    (GeglBuffer          *buffer,
                                              gboolean             select_transparent,
-                                             gfloat               stroke_threshold);
+                                             gfloat               stroke_threshold,
+                                             gint                 segment_max_length,
+                                             gint                 spline_max_length);
 static void            line_art_data_free   (LineArtData         *data);
 static GimpPickableLineArtAsyncResult *
                        line_art_result_new  (GeglBuffer          *line_art,
@@ -201,8 +205,7 @@ gimp_pickable_contiguous_region_prepare_line_art_async_func (GimpAsync   *async,
                                 5,
                                 /*end_point_rate,*/
                                 0.85,
-                                /*spline_max_length,*/
-                                60,
+                                data->spline_max_length,
                                 /*spline_max_angle,*/
                                 90.0,
                                 /*end_point_connectivity,*/
@@ -217,8 +220,7 @@ gimp_pickable_contiguous_region_prepare_line_art_async_func (GimpAsync   *async,
                                 100,
                                 /*small_segments_from_spline_sources,*/
                                 TRUE,
-                                /*segments_max_length*/
-                                20,
+                                data->segment_max_length,
                                 &distmap);
 
   GIMP_TIMER_END("close line-art");
@@ -234,6 +236,8 @@ GeglBuffer *
 gimp_pickable_contiguous_region_prepare_line_art (GimpPickable  *pickable,
                                                   gboolean       select_transparent,
                                                   gfloat         stroke_threshold,
+                                                  gint           segment_max_length,
+                                                  gint           spline_max_length,
                                                   gfloat       **distmap)
 {
   GimpAsync                      *async;
@@ -247,8 +251,8 @@ gimp_pickable_contiguous_region_prepare_line_art (GimpPickable  *pickable,
 
   async = gimp_async_new ();
   data  = line_art_data_new (gimp_pickable_get_buffer (pickable),
-                             select_transparent,
-                             stroke_threshold);
+                             select_transparent, stroke_threshold,
+                             segment_max_length, spline_max_length);
 
   gimp_pickable_contiguous_region_prepare_line_art_async_func (async, data);
 
@@ -267,6 +271,8 @@ GimpAsync *
 gimp_pickable_contiguous_region_prepare_line_art_async (GimpPickable *pickable,
                                                         gboolean      select_transparent,
                                                         gfloat        stroke_threshold,
+                                                        gint          segment_max_length,
+                                                        gint          spline_max_length,
                                                         gint          priority)
 {
   GeglBuffer  *buffer;
@@ -279,9 +285,8 @@ gimp_pickable_contiguous_region_prepare_line_art_async (GimpPickable *pickable,
 
   buffer = gegl_buffer_dup (gimp_pickable_get_buffer (pickable));
 
-  data  = line_art_data_new (buffer,
-                             select_transparent,
-                             stroke_threshold);
+  data  = line_art_data_new (buffer, select_transparent, stroke_threshold,
+                             segment_max_length, spline_max_length);
 
   g_object_unref (buffer);
 
@@ -306,6 +311,8 @@ gimp_pickable_contiguous_region_by_seed (GimpPickable        *pickable,
                                          gboolean             diagonal_neighbors,
                                          gfloat               stroke_threshold,
                                          gint                 flooding_max,
+                                         gint                 segment_max_length,
+                                         gint                 spline_max_length,
                                          gint                 x,
                                          gint                 y)
 {
@@ -334,6 +341,8 @@ gimp_pickable_contiguous_region_by_seed (GimpPickable        *pickable,
            */
           line_art      = gimp_pickable_contiguous_region_prepare_line_art (pickable, select_transparent,
                                                                             stroke_threshold,
+                                                                            segment_max_length,
+                                                                            spline_max_length,
                                                                             &distmap);
           free_line_art = TRUE;
         }
@@ -1145,13 +1154,17 @@ find_contiguous_region (GeglBuffer          *src_buffer,
 static LineArtData *
 line_art_data_new (GeglBuffer *buffer,
                    gboolean    select_transparent,
-                   gfloat      stroke_threshold)
+                   gfloat      stroke_threshold,
+                   gint        segment_max_length,
+                   gint        spline_max_length)
 {
   LineArtData *data = g_slice_new (LineArtData);
 
   data->buffer             = g_object_ref (buffer);
   data->select_transparent = select_transparent;
   data->stroke_threshold   = stroke_threshold;
+  data->segment_max_length = segment_max_length;
+  data->spline_max_length  = spline_max_length;
 
   return data;
 }
diff --git a/app/core/gimppickable-contiguous-region.h b/app/core/gimppickable-contiguous-region.h
index 2431ebf363..772f9d3cdc 100644
--- a/app/core/gimppickable-contiguous-region.h
+++ b/app/core/gimppickable-contiguous-region.h
@@ -27,10 +27,14 @@ typedef struct
 GeglBuffer * gimp_pickable_contiguous_region_prepare_line_art       (GimpPickable        *pickable,
                                                                      gboolean             select_transparent,
                                                                      gfloat               stroke_threshold,
+                                                                     gint                 segment_max_length,
+                                                                     gint                 spline_max_length,
                                                                      gfloat             **distmap);
 GimpAsync  * gimp_pickable_contiguous_region_prepare_line_art_async (GimpPickable        *pickable,
                                                                      gboolean             select_transparent,
                                                                      gfloat               stroke_threshold,
+                                                                     gint                 segment_max_length,
+                                                                     gint                 spline_max_length,
                                                                      gint                 priority);
 
 GeglBuffer * gimp_pickable_contiguous_region_by_seed                (GimpPickable        *pickable,
@@ -43,6 +47,8 @@ GeglBuffer * gimp_pickable_contiguous_region_by_seed                (GimpPickabl
                                                                      gboolean             diagonal_neighbors,
                                                                      gfloat               
line_art_stroke_threshold,
                                                                      gint                 line_art_max_grow,
+                                                                     gint                 
line_art_segment_max_length,
+                                                                     gint                 
line_art_spline_max_length,
                                                                      gint                 x,
                                                                      gint                 y);
 
diff --git a/app/pdb/drawable-edit-cmds.c b/app/pdb/drawable-edit-cmds.c
index dde18dc373..4d7c8a9cfc 100644
--- a/app/pdb/drawable-edit-cmds.c
+++ b/app/pdb/drawable-edit-cmds.c
@@ -171,7 +171,7 @@ drawable_edit_bucket_fill_invoker (GimpProcedure         *procedure,
                                          GIMP_PDB_CONTEXT (context)->sample_threshold,
                                          GIMP_PDB_CONTEXT (context)->sample_merged,
                                          GIMP_PDB_CONTEXT (context)->diagonal_neighbors,
-                                         0.92, 3, /* TODO */
+                                         0.92, 3, 20, 60, /* TODO */
                                          x, y);
             }
           else
diff --git a/app/tools/gimpbucketfilloptions.c b/app/tools/gimpbucketfilloptions.c
index f5d604e6bf..d30b7e9b3d 100644
--- a/app/tools/gimpbucketfilloptions.c
+++ b/app/tools/gimpbucketfilloptions.c
@@ -55,6 +55,8 @@ enum
   PROP_THRESHOLD,
   PROP_LINE_ART_THRESHOLD,
   PROP_LINE_ART_MAX_GROW,
+  PROP_LINE_ART_SPLINE_MAX_LEN,
+  PROP_LINE_ART_SEGMENT_MAX_LEN,
   PROP_FILL_CRITERION
 };
 
@@ -65,6 +67,8 @@ struct _GimpBucketFillOptionsPrivate
 
   GtkWidget *line_art_threshold_scale;
   GtkWidget *line_art_grow_scale;
+  GtkWidget *line_art_segment_max_len_scale;
+  GtkWidget *line_art_spline_max_len_scale;
 };
 
 static void   gimp_bucket_fill_options_config_iface_init (GimpConfigInterface *config_iface);
@@ -170,6 +174,20 @@ gimp_bucket_fill_options_class_init (GimpBucketFillOptionsClass *klass)
                         1, 100, 3,
                         GIMP_PARAM_STATIC_STRINGS);
 
+  GIMP_CONFIG_PROP_INT (object_class, PROP_LINE_ART_SPLINE_MAX_LEN,
+                        "line-art-spline-max-len",
+                        _("Maximum curved closing length"),
+                        _("Maximum curved length (in pixels) to close the line art"),
+                        1, 1000, 60,
+                        GIMP_PARAM_STATIC_STRINGS);
+
+  GIMP_CONFIG_PROP_INT (object_class, PROP_LINE_ART_SEGMENT_MAX_LEN,
+                        "line-art-segment-max-len",
+                        _("Maximum straight closing length"),
+                        _("Maximum straight length (in pixels) to close the line art"),
+                        1, 1000, 20,
+                        GIMP_PARAM_STATIC_STRINGS);
+
   GIMP_CONFIG_PROP_ENUM (object_class, PROP_FILL_CRITERION,
                          "fill-criterion",
                          _("Fill by"),
@@ -230,6 +248,12 @@ gimp_bucket_fill_options_set_property (GObject      *object,
     case PROP_LINE_ART_MAX_GROW:
       options->line_art_max_grow = g_value_get_int (value);
       break;
+    case PROP_LINE_ART_SEGMENT_MAX_LEN:
+      options->line_art_segment_max_len = g_value_get_int (value);
+      break;
+    case PROP_LINE_ART_SPLINE_MAX_LEN:
+      options->line_art_spline_max_len = g_value_get_int (value);
+      break;
     case PROP_FILL_CRITERION:
       options->fill_criterion = g_value_get_enum (value);
       gimp_bucket_fill_options_update_criterion (options);
@@ -278,6 +302,12 @@ gimp_bucket_fill_options_get_property (GObject    *object,
     case PROP_LINE_ART_MAX_GROW:
       g_value_set_int (value, options->line_art_max_grow);
       break;
+    case PROP_LINE_ART_SEGMENT_MAX_LEN:
+      g_value_set_int (value, options->line_art_segment_max_len);
+      break;
+    case PROP_LINE_ART_SPLINE_MAX_LEN:
+      g_value_set_int (value, options->line_art_spline_max_len);
+      break;
     case PROP_FILL_CRITERION:
       g_value_set_enum (value, options->fill_criterion);
       break;
@@ -319,10 +349,14 @@ gimp_bucket_fill_options_update_criterion (GimpBucketFillOptions *options)
 
       gtk_widget_show (options->priv->line_art_threshold_scale);
       gtk_widget_show (options->priv->line_art_grow_scale);
+      gtk_widget_show (options->priv->line_art_segment_max_len_scale);
+      gtk_widget_show (options->priv->line_art_spline_max_len_scale);
       break;
     default:
       gtk_widget_hide (options->priv->line_art_threshold_scale);
       gtk_widget_hide (options->priv->line_art_grow_scale);
+      gtk_widget_hide (options->priv->line_art_segment_max_len_scale);
+      gtk_widget_hide (options->priv->line_art_spline_max_len_scale);
 
       gtk_widget_show (options->priv->diagonal_neighbors_checkbox);
       gtk_widget_show (options->priv->threshold_scale);
@@ -431,6 +465,20 @@ gimp_bucket_fill_options_gui (GimpToolOptions *tool_options)
   options->priv->line_art_threshold_scale = scale;
   gtk_widget_show (scale);
 
+  /*  Line Art: segment max len */
+  scale = gimp_prop_spin_scale_new (config, "line-art-segment-max-len", NULL,
+                                    1, 5, 0);
+  gtk_box_pack_start (GTK_BOX (vbox2), scale, FALSE, FALSE, 0);
+  options->priv->line_art_segment_max_len_scale = scale;
+  gtk_widget_show (scale);
+
+  /*  Line Art: spline max len */
+  scale = gimp_prop_spin_scale_new (config, "line-art-spline-max-len", NULL,
+                                    1, 5, 0);
+  gtk_box_pack_start (GTK_BOX (vbox2), scale, FALSE, FALSE, 0);
+  options->priv->line_art_spline_max_len_scale = scale;
+  gtk_widget_show (scale);
+
   /*  the fill criterion combo  */
   combo = gimp_prop_enum_combo_box_new (config, "fill-criterion", 0, 0);
   gimp_int_combo_box_set_label (GIMP_INT_COMBO_BOX (combo), _("Fill by"));
diff --git a/app/tools/gimpbucketfilloptions.h b/app/tools/gimpbucketfilloptions.h
index 43fa265b02..261fc6b9d2 100644
--- a/app/tools/gimpbucketfilloptions.h
+++ b/app/tools/gimpbucketfilloptions.h
@@ -48,6 +48,8 @@ struct _GimpBucketFillOptions
 
   gdouble                       line_art_threshold;
   gint                          line_art_max_grow;
+  gint                          line_art_segment_max_len;
+  gint                          line_art_spline_max_len;
 
   GimpSelectCriterion           fill_criterion;
 
diff --git a/app/tools/gimpbucketfilltool.c b/app/tools/gimpbucketfilltool.c
index ce45736619..e856878ab7 100644
--- a/app/tools/gimpbucketfilltool.c
+++ b/app/tools/gimpbucketfilltool.c
@@ -400,6 +400,8 @@ gimp_bucket_fill_tool_preview (GimpBucketFillTool *tool,
                                                    options->diagonal_neighbors,
                                                    options->line_art_threshold,
                                                    options->line_art_max_grow,
+                                                   options->line_art_segment_max_len,
+                                                   options->line_art_spline_max_len,
                                                    x, y, &tool->priv->fill_mask,
                                                    &x, &y, NULL, NULL);
       if (line_art)
@@ -817,6 +819,8 @@ gimp_bucket_fill_compute_line_art (GimpBucketFillTool *tool)
               pickable,
               options->fill_transparent,
               options->line_art_threshold,
+              options->line_art_segment_max_len,
+              options->line_art_spline_max_len,
               +1);
           g_signal_handlers_unblock_by_func (gimp_image_get_projection (GIMP_IMAGE (image)),
                                            G_CALLBACK (gimp_bucket_fill_tool_projection_rendered),
diff --git a/app/tools/gimpfuzzyselecttool.c b/app/tools/gimpfuzzyselecttool.c
index 63cbaed46c..de86b3c171 100644
--- a/app/tools/gimpfuzzyselecttool.c
+++ b/app/tools/gimpfuzzyselecttool.c
@@ -128,6 +128,6 @@ gimp_fuzzy_select_tool_get_mask (GimpRegionSelectTool *region_select,
                                                   options->select_transparent,
                                                   options->select_criterion,
                                                   options->diagonal_neighbors,
-                                                  0.92, 3, /* TODO */
+                                                  0.92, 3, 20, 60, /* TODO */
                                                   x, y);
 }
diff --git a/pdb/groups/drawable_edit.pdb b/pdb/groups/drawable_edit.pdb
index 3174bfa90f..2be98f4456 100644
--- a/pdb/groups/drawable_edit.pdb
+++ b/pdb/groups/drawable_edit.pdb
@@ -175,7 +175,7 @@ HELP
                                      GIMP_PDB_CONTEXT (context)->sample_threshold,
                                      GIMP_PDB_CONTEXT (context)->sample_merged,
                                      GIMP_PDB_CONTEXT (context)->diagonal_neighbors,
-                                     0.92, 3, /* TODO */
+                                     0.92, 3, 20, 60, /* TODO */
                                      x, y);
         }
       else


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