From 2eb6787f5503d50ebfa89cde1255dfc8e746d80e Mon Sep 17 00:00:00 2001 From: Jehan Date: Tue, 1 Mar 2022 21:06:35 +0100 Subject: [PATCH] app: apply feather before stroking. The feather on stroked border is clearly not ideal (though I wonder if there are cases where it's wanted). Let's do it the other way around. --- app/core/gimpdrawable-bucket-fill.c | 53 ++++++++++++++++------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/app/core/gimpdrawable-bucket-fill.c b/app/core/gimpdrawable-bucket-fill.c index 7af371c6ef..e4c08b8739 100644 --- a/app/core/gimpdrawable-bucket-fill.c +++ b/app/core/gimpdrawable-bucket-fill.c @@ -367,7 +367,7 @@ gimp_drawable_get_line_art_fill_buffer (GimpDrawable *drawable, GimpImage *image; GeglBuffer *buffer; GeglBuffer *new_mask; - GeglBuffer *stroke_mask; + GeglBuffer *rendered_mask; GeglBuffer *fill_buffer = NULL; GimpRGB fill_color; gint fill_offset_x = 0; @@ -444,9 +444,26 @@ gimp_drawable_get_line_art_fill_buffer (GimpDrawable *drawable, if (mask_buffer) *mask_buffer = new_mask; + rendered_mask = gimp_gegl_buffer_dup (new_mask); + if (gimp_fill_options_get_feather (options, &feather_radius)) + { + /* Feathering for the line art algorithm is not applied during + * mask creation because we just want to apply it on the borders + * of the mask at the end (since the mask can evolve, we don't + * want to actually touch the mask, but only the intermediate + * rendered results). + */ + gimp_gegl_apply_feather (rendered_mask, NULL, NULL, rendered_mask, NULL, + feather_radius, feather_radius, TRUE); + } + if (line_art_stroke) { + /* Similarly to feathering, stroke only happens on the rendered + * result, not on the returned mask. + */ GimpChannel *channel; + GimpChannel *stroked; GList *drawables; GimpStrokeOptions *stroke_options; GimpContext *context = gimp_get_user_context (image->gimp); @@ -466,8 +483,10 @@ gimp_drawable_get_line_art_fill_buffer (GimpDrawable *drawable, stroke_options = gimp_config_duplicate (GIMP_CONFIG (stroke_options)); channel = gimp_channel_new_from_buffer (image, new_mask, NULL, NULL); + stroked = gimp_channel_new_from_buffer (image, rendered_mask, NULL, NULL); gimp_image_add_hidden_item (image, GIMP_ITEM (channel)); - drawables = g_list_prepend (NULL, channel); + gimp_image_add_hidden_item (image, GIMP_ITEM (stroked)); + drawables = g_list_prepend (NULL, stroked); if (! gimp_item_stroke (GIMP_ITEM (channel), drawables, context, @@ -481,22 +500,21 @@ gimp_drawable_get_line_art_fill_buffer (GimpDrawable *drawable, g_list_free (drawables); - gimp_pickable_flush (GIMP_PICKABLE (channel)); - stroke_mask = gimp_drawable_get_buffer (GIMP_DRAWABLE (channel)); - g_object_ref (stroke_mask); + gimp_pickable_flush (GIMP_PICKABLE (stroked)); + g_object_unref (rendered_mask); + rendered_mask = gimp_drawable_get_buffer (GIMP_DRAWABLE (stroked)); + g_object_ref (rendered_mask); gimp_image_remove_hidden_item (image, GIMP_ITEM (channel)); g_object_unref (channel); + gimp_image_remove_hidden_item (image, GIMP_ITEM (stroked)); + g_object_unref (stroked); g_object_unref (stroke_options); g_object_unref (context); } - else - { - stroke_mask = g_object_ref (new_mask); - } - gimp_gegl_mask_bounds (stroke_mask, &x, &y, &width, &height); + gimp_gegl_mask_bounds (rendered_mask, &x, &y, &width, &height); width -= x; height -= y; @@ -566,20 +584,9 @@ gimp_drawable_get_line_art_fill_buffer (GimpDrawable *drawable, width, height), -x, -y); - gimp_gegl_apply_opacity (buffer, NULL, NULL, buffer, stroke_mask, + gimp_gegl_apply_opacity (buffer, NULL, NULL, buffer, rendered_mask, -mask_offset_x, -mask_offset_y, 1.0); - if (gimp_fill_options_get_feather (options, &feather_radius)) - { - /* Feathering for the line art algorithm is not applied during - * mask creation because we just want to apply it on the borders - * of the mask at the end (since the mask can evolve, we don't - * want to actually touch it, but only the intermediate results). - */ - gimp_gegl_apply_feather (buffer, NULL, NULL, buffer, NULL, - feather_radius, feather_radius, TRUE); - } - if (mask_x) *mask_x = x; if (mask_y) @@ -592,7 +599,7 @@ gimp_drawable_get_line_art_fill_buffer (GimpDrawable *drawable, if (! mask_buffer) g_object_unref (new_mask); - g_object_unref (stroke_mask); + g_object_unref (rendered_mask); gimp_unset_busy (image->gimp);