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:
@ -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)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user