[gimp] app: add the segment and spline max length options for line art.
- From: Jehan <jehanp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: add the segment and spline max length options for line art.
- Date: Thu, 29 Nov 2018 17:27:02 +0000 (UTC)
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]