app: add "show all" support to the Bucket Fill tool in line-art mode

In the Bucket Fill tool, when using line-art mode, use a
GimpImageProxy as input for the GimpLineArt object, instead of
using the image direclty, when the line-art source is "all visible
layers".  Set the proxy's show-all mode according to the active
shell, so that the line-art uses the full image projection,
including out-of-canvas regions, when in show-all mode.

(cherry picked from commit 43a1c33ecf)
This commit is contained in:
Ell
2019-11-04 13:08:01 +02:00
parent e79d852d3a
commit ccd5ce6cce

View File

@ -36,6 +36,7 @@
#include "core/gimperror.h" #include "core/gimperror.h"
#include "core/gimpfilloptions.h" #include "core/gimpfilloptions.h"
#include "core/gimpimage.h" #include "core/gimpimage.h"
#include "core/gimpimageproxy.h"
#include "core/gimpitem.h" #include "core/gimpitem.h"
#include "core/gimplineart.h" #include "core/gimplineart.h"
#include "core/gimppickable.h" #include "core/gimppickable.h"
@ -68,6 +69,7 @@ struct _GimpBucketFillToolPrivate
{ {
GimpLineArt *line_art; GimpLineArt *line_art;
GimpImage *line_art_image; GimpImage *line_art_image;
GimpDisplayShell *line_art_shell;
/* For preview */ /* For preview */
GeglNode *graph; GeglNode *graph;
@ -251,7 +253,7 @@ gimp_bucket_fill_tool_constructed (GObject *object)
g_signal_connect_swapped (options, "notify::line-art-source", g_signal_connect_swapped (options, "notify::line-art-source",
G_CALLBACK (gimp_bucket_fill_tool_reset_line_art), G_CALLBACK (gimp_bucket_fill_tool_reset_line_art),
tool); tool);
g_signal_connect_swapped (context, "image-changed", g_signal_connect_swapped (context, "display-changed",
G_CALLBACK (gimp_bucket_fill_tool_reset_line_art), G_CALLBACK (gimp_bucket_fill_tool_reset_line_art),
tool); tool);
@ -274,6 +276,14 @@ gimp_bucket_fill_tool_finalize (GObject *object)
g_signal_handlers_disconnect_by_data (tool->priv->line_art_image, tool); g_signal_handlers_disconnect_by_data (tool->priv->line_art_image, tool);
tool->priv->line_art_image = NULL; tool->priv->line_art_image = NULL;
} }
if (tool->priv->line_art_shell)
{
g_signal_handlers_disconnect_by_func (
tool->priv->line_art_shell,
gimp_bucket_fill_tool_reset_line_art,
tool);
tool->priv->line_art_shell = NULL;
}
g_clear_object (&tool->priv->line_art); g_clear_object (&tool->priv->line_art);
g_signal_handlers_disconnect_by_data (options, tool); g_signal_handlers_disconnect_by_data (options, tool);
@ -290,7 +300,6 @@ gimp_bucket_fill_tool_coords_in_active_pickable (GimpBucketFillTool *tool,
GimpBucketFillOptions *options = GIMP_BUCKET_FILL_TOOL_GET_OPTIONS (tool); GimpBucketFillOptions *options = GIMP_BUCKET_FILL_TOOL_GET_OPTIONS (tool);
GimpDisplayShell *shell = gimp_display_get_shell (display); GimpDisplayShell *shell = gimp_display_get_shell (display);
GimpImage *image = gimp_display_get_image (display); GimpImage *image = gimp_display_get_image (display);
gboolean show_all = FALSE;
gboolean sample_merged = FALSE; gboolean sample_merged = FALSE;
switch (options->fill_area) switch (options->fill_area)
@ -299,7 +308,6 @@ gimp_bucket_fill_tool_coords_in_active_pickable (GimpBucketFillTool *tool,
break; break;
case GIMP_BUCKET_FILL_SIMILAR_COLORS: case GIMP_BUCKET_FILL_SIMILAR_COLORS:
show_all = shell->show_all;
sample_merged = options->sample_merged; sample_merged = options->sample_merged;
break; break;
@ -310,7 +318,8 @@ gimp_bucket_fill_tool_coords_in_active_pickable (GimpBucketFillTool *tool,
} }
return gimp_image_coords_in_active_pickable (image, coords, return gimp_image_coords_in_active_pickable (image, coords,
show_all, sample_merged, TRUE); shell->show_all, sample_merged,
TRUE);
} }
static void static void
@ -919,14 +928,22 @@ gimp_bucket_fill_tool_reset_line_art (GimpBucketFillTool *tool)
{ {
GimpBucketFillOptions *options = GIMP_BUCKET_FILL_TOOL_GET_OPTIONS (tool); GimpBucketFillOptions *options = GIMP_BUCKET_FILL_TOOL_GET_OPTIONS (tool);
GimpLineArt *line_art = tool->priv->line_art; GimpLineArt *line_art = tool->priv->line_art;
GimpDisplayShell *shell = NULL;
GimpImage *image = NULL; GimpImage *image = NULL;
if (options && options->fill_area == GIMP_BUCKET_FILL_LINE_ART) if (options->fill_area == GIMP_BUCKET_FILL_LINE_ART)
{ {
GimpContext *context; GimpContext *context;
GimpDisplay *display;
context = gimp_get_user_context (GIMP_CONTEXT (options)->gimp); context = gimp_get_user_context (GIMP_CONTEXT (options)->gimp);
image = gimp_context_get_image (context); display = gimp_context_get_display (context);
if (display)
{
shell = gimp_display_get_shell (display);
image = gimp_display_get_image (display);
}
} }
if (image != tool->priv->line_art_image) if (image != tool->priv->line_art_image)
@ -960,6 +977,26 @@ gimp_bucket_fill_tool_reset_line_art (GimpBucketFillTool *tool)
} }
} }
if (shell != tool->priv->line_art_shell)
{
if (tool->priv->line_art_shell)
{
g_signal_handlers_disconnect_by_func (
tool->priv->line_art_shell,
gimp_bucket_fill_tool_reset_line_art,
tool);
}
tool->priv->line_art_shell = shell;
if (shell)
{
g_signal_connect_swapped (shell, "notify::show-all",
G_CALLBACK (gimp_bucket_fill_tool_reset_line_art),
tool);
}
}
if (image) if (image)
{ {
GimpDrawable *drawable = gimp_image_get_active_drawable (image); GimpDrawable *drawable = gimp_image_get_active_drawable (image);
@ -969,7 +1006,13 @@ gimp_bucket_fill_tool_reset_line_art (GimpBucketFillTool *tool)
if (options->line_art_source == GIMP_LINE_ART_SOURCE_SAMPLE_MERGED) if (options->line_art_source == GIMP_LINE_ART_SOURCE_SAMPLE_MERGED)
{ {
gimp_line_art_set_input (line_art, GIMP_PICKABLE (image)); GimpImageProxy *image_proxy = gimp_image_proxy_new (image);
gimp_image_proxy_set_show_all (image_proxy, shell->show_all);
gimp_line_art_set_input (line_art, GIMP_PICKABLE (image_proxy));
g_object_unref (image_proxy);
} }
else if (drawable) else if (drawable)
{ {