Commit d3686fdb authored by Jehan's avatar Jehan
Browse files

app: make the "Automatic closure" a settings of its own.

This is the same thing as setting the max gap length to 0, except that
it would mean constantly having to play with the gap length and possibly
losing settings you carefully tweaked. Instead with this additional
settings, we hide the gap length settings when automatic closure is
disabled.

Also it makes kind of a nice parallel with the "Manual closure" settings
which can also be enabled/disabled similarly.
parent deb5dfcb
Pipeline #372504 passed with stages
in 51 minutes and 12 seconds
......@@ -59,6 +59,7 @@ enum
PROP_SELECT_TRANSPARENT,
PROP_MAX_GROW,
PROP_THRESHOLD,
PROP_AUTOMATIC_CLOSURE,
PROP_SPLINE_MAX_LEN,
PROP_SEGMENT_MAX_LEN,
};
......@@ -81,6 +82,7 @@ struct _GimpLineArtPrivate
/* Used in the closing step. */
gboolean select_transparent;
gdouble threshold;
gboolean automatic_closure;
gint spline_max_len;
gint segment_max_len;
gboolean max_len_bound;
......@@ -95,6 +97,7 @@ typedef struct
gboolean select_transparent;
gdouble threshold;
gboolean automatic_closure;
gint spline_max_len;
gint segment_max_len;
} LineArtData;
......@@ -182,6 +185,7 @@ static void gimp_line_art_input_invalidate_preview (GimpViewable
static GeglBuffer * gimp_line_art_close (GeglBuffer *buffer,
gboolean select_transparent,
gdouble stroke_threshold,
gboolean automatic_closure,
gint spline_max_length,
gint segment_max_length,
gint minimal_lineart_area,
......@@ -354,6 +358,13 @@ gimp_line_art_class_init (GimpLineArtClass *klass)
1, 100, 3,
G_PARAM_CONSTRUCT | GIMP_PARAM_READWRITE));
g_object_class_install_property (object_class, PROP_AUTOMATIC_CLOSURE,
g_param_spec_boolean ("automatic-closure",
_("Whether or not we should perform the closing step"),
_("Whether or not we should perform the closing step"),
TRUE,
G_PARAM_CONSTRUCT | GIMP_PARAM_READWRITE));
g_object_class_install_property (object_class, PROP_SPLINE_MAX_LEN,
g_param_spec_int ("spline-max-length",
_("Maximum curved closing length"),
......@@ -414,6 +425,13 @@ gimp_line_art_set_property (GObject *object,
gimp_line_art_compute (line_art);
}
break;
case PROP_AUTOMATIC_CLOSURE:
if (line_art->priv->automatic_closure != g_value_get_boolean (value))
{
line_art->priv->automatic_closure = g_value_get_boolean (value);
gimp_line_art_compute (line_art);
}
break;
case PROP_SPLINE_MAX_LEN:
if (line_art->priv->spline_max_len != g_value_get_int (value))
{
......@@ -458,6 +476,9 @@ gimp_line_art_get_property (GObject *object,
case PROP_THRESHOLD:
g_value_set_double (value, line_art->priv->threshold);
break;
case PROP_AUTOMATIC_CLOSURE:
g_value_set_boolean (value, line_art->priv->automatic_closure);
break;
case PROP_SPLINE_MAX_LEN:
g_value_set_int (value, line_art->priv->spline_max_len);
break;
......@@ -754,6 +775,7 @@ gimp_line_art_prepare_async_func (GimpAsync *async,
closed = gimp_line_art_close (buffer,
select_transparent,
data->threshold,
data->automatic_closure,
data->spline_max_len,
data->segment_max_len,
/*minimal_lineart_area,*/
......@@ -816,6 +838,7 @@ line_art_data_new (GeglBuffer *buffer,
data->buffer = g_object_ref (buffer);
data->select_transparent = line_art->priv->select_transparent;
data->threshold = line_art->priv->threshold;
data->automatic_closure = line_art->priv->automatic_closure;
data->spline_max_len = line_art->priv->spline_max_len;
data->segment_max_len = line_art->priv->segment_max_len;
......@@ -884,6 +907,9 @@ gimp_line_art_input_invalidate_preview (GimpViewable *viewable,
* luminosity.
* @stroke_threshold: [0-1] threshold value for detecting stroke pixels
* (higher values will detect more stroke pixels).
* @automatic_closure: whether the closing step should be performed or
* not. @spline_max_length and @segment_max_len are
* used only if @automatic_closure is %TRUE.
* @spline_max_length: the maximum length for creating splines between
* end points.
* @segment_max_length: the maximum length for creating segments
......@@ -928,6 +954,7 @@ static GeglBuffer *
gimp_line_art_close (GeglBuffer *buffer,
gboolean select_transparent,
gdouble stroke_threshold,
gboolean automatic_closure,
gint spline_max_length,
gint segment_max_length,
gint minimal_lineart_area,
......@@ -1031,7 +1058,8 @@ gimp_line_art_close (GeglBuffer *buffer,
closed = g_object_ref (strokes);
if (spline_max_length > 0 || segment_max_length > 0)
if (automatic_closure &&
(spline_max_length > 0 || segment_max_length > 0))
{
GArray *keypoints = NULL;
GHashTable *visited = NULL;
......
......@@ -71,6 +71,7 @@ enum
PROP_LINE_ART_MAX_GROW,
PROP_LINE_ART_STROKE,
PROP_LINE_ART_STROKE_TOOL,
PROP_LINE_ART_AUTOMATIC_CLOSURE,
PROP_LINE_ART_MAX_GAP_LENGTH,
PROP_FILL_CRITERION,
PROP_FILL_COLOR_AS_LINE_ART,
......@@ -254,6 +255,13 @@ gimp_bucket_fill_options_class_init (GimpBucketFillOptionsClass *klass)
_("The tool to stroke the fill borders with"),
"gimp-pencil", GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_LINE_ART_AUTOMATIC_CLOSURE,
"line-art-automatic-closure",
_("Automatic closure"),
_("Geometric analysis of the stroke contours to close line arts by splines/segments"),
TRUE,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_PROP_INT (object_class, PROP_LINE_ART_MAX_GAP_LENGTH,
"line-art-max-gap-length",
_("Maximum gap length"),
......@@ -372,6 +380,9 @@ gimp_bucket_fill_options_set_property (GObject *object,
NULL);
}
break;
case PROP_LINE_ART_AUTOMATIC_CLOSURE:
options->line_art_automatic_closure = g_value_get_boolean (value);
break;
case PROP_LINE_ART_MAX_GAP_LENGTH:
options->line_art_max_gap_length = g_value_get_int (value);
break;
......@@ -443,6 +454,9 @@ gimp_bucket_fill_options_get_property (GObject *object,
case PROP_LINE_ART_STROKE_TOOL:
g_value_set_string (value, options->line_art_stroke_tool);
break;
case PROP_LINE_ART_AUTOMATIC_CLOSURE:
g_value_set_boolean (value, options->line_art_automatic_closure);
break;
case PROP_LINE_ART_MAX_GAP_LENGTH:
g_value_set_int (value, options->line_art_max_gap_length);
break;
......@@ -691,13 +705,11 @@ gimp_bucket_fill_options_gui (GimpToolOptions *tool_options)
gtk_widget_show (box2);
/* Line Art Closure: max gap length */
frame = gimp_frame_new (_("Automatic closure"));
gtk_box_pack_start (GTK_BOX (box2), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
scale = gimp_prop_spin_scale_new (config, "line-art-max-gap-length",
1, 5, 0);
gtk_container_add (GTK_CONTAINER (frame), scale);
frame = gimp_prop_expanding_frame_new (config, "line-art-automatic-closure", NULL,
scale, NULL);
gtk_box_pack_start (GTK_BOX (box2), frame, FALSE, FALSE, 0);
/* Line Art Closure: manual line art closure */
scale = gimp_prop_spin_scale_new (config, "fill-color-as-line-art-threshold",
......
......@@ -52,6 +52,8 @@ struct _GimpBucketFillOptions
GimpLineArtSource line_art_source;
gdouble line_art_threshold;
gint line_art_max_grow;
gboolean line_art_automatic_closure;
gint line_art_max_gap_length;
gboolean line_art_stroke;
......
......@@ -239,6 +239,10 @@ gimp_bucket_fill_tool_constructed (GObject *object)
line_art, "max-grow",
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
bindings = g_list_prepend (bindings, binding);
binding = g_object_bind_property (options, "line-art-automatic-closure",
line_art, "automatic-closure",
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
bindings = g_list_prepend (bindings, binding);
binding = g_object_bind_property (options, "line-art-max-gap-length",
line_art, "spline-max-length",
G_BINDING_SYNC_CREATE | G_BINDING_DEFAULT);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment