From 0370aed02d83fe12a8630da145bbb9760d4c7abc Mon Sep 17 00:00:00 2001 From: Alx Sa Date: Wed, 11 Jun 2025 19:49:52 +0000 Subject: [PATCH] tools: Don't run Foreground Selection without strokes The Foreground Selection algorithm was being run when users switched to a different tool, even if no strokes had been painted. This caused an unnecessary delay, since no selection will be generated. This patch adds a check to verify we have at least one foreground stroke made by the user before trying to create the selection. --- app/tools/gimpforegroundselecttool.c | 33 +++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/app/tools/gimpforegroundselecttool.c b/app/tools/gimpforegroundselecttool.c index 8b4769990c..f80608615d 100644 --- a/app/tools/gimpforegroundselecttool.c +++ b/app/tools/gimpforegroundselecttool.c @@ -165,6 +165,8 @@ static void gimp_foreground_select_tool_preview_toggled(GtkToggleButton static void gimp_foreground_select_tool_update_gui (GimpForegroundSelectTool *fg_select); +static gboolean gimp_foreground_select_tool_has_strokes (GimpForegroundSelectTool *fg_select); + static StrokeUndo * gimp_foreground_select_undo_new (GeglBuffer *trimap, GArray *stroke, GimpMattingDrawMode draw_mode, @@ -964,13 +966,11 @@ gimp_foreground_select_tool_confirm (GimpPolygonSelectTool *poly_sel, static void gimp_foreground_select_tool_halt (GimpForegroundSelectTool *fg_select) { - GimpTool *tool = GIMP_TOOL (fg_select); + GimpTool *tool = GIMP_TOOL (fg_select); GimpDrawTool *draw_tool = GIMP_DRAW_TOOL (fg_select); if (draw_tool->preview) - { - gimp_draw_tool_remove_preview (draw_tool, fg_select->grayscale_preview); - } + gimp_draw_tool_remove_preview (draw_tool, fg_select->grayscale_preview); g_clear_object (&fg_select->grayscale_preview); g_clear_object (&fg_select->trimap); @@ -1028,7 +1028,9 @@ gimp_foreground_select_tool_commit (GimpForegroundSelectTool *fg_select) GimpTool *tool = GIMP_TOOL (fg_select); GimpSelectionOptions *options = GIMP_SELECTION_TOOL_GET_OPTIONS (fg_select); - if (tool->display && fg_select->state != MATTING_STATE_FREE_SELECT) + if (tool->display && + fg_select->state != MATTING_STATE_FREE_SELECT && + gimp_foreground_select_tool_has_strokes (fg_select)) { GimpImage *image = gimp_display_get_image (tool->display); @@ -1321,6 +1323,27 @@ gimp_foreground_select_tool_update_gui (GimpForegroundSelectTool *fg_select) gtk_widget_set_sensitive (fg_select->preview_toggle, TRUE); } +static gboolean +gimp_foreground_select_tool_has_strokes (GimpForegroundSelectTool *fg_select) +{ + GList *iter; + + if (fg_select->undo_stack == NULL) + return FALSE; + + /* Check if undo_stack has any foreground strokes, as these are the + only ones that can create a selection */ + for (iter = fg_select->undo_stack; iter; iter = iter->next) + { + StrokeUndo *undo = iter->data; + + if (undo && undo->draw_mode == GIMP_MATTING_DRAW_MODE_FOREGROUND) + return TRUE; + } + + return FALSE; +} + static StrokeUndo * gimp_foreground_select_undo_new (GeglBuffer *trimap, GArray *stroke,