app: add gimp_drawable_filter_set_add_alpha()

Add an optional "format" parameter to gimp_drawable_merge_filter(),
which specifies the format to use for the output, possibly changing
the drawable's format.

In GimpDrawableFilter, add a gimp_drawable_filter_set_add_alpha()
function, which allows the filter to add an alpha channel to the
drawable when committed (by passing an appropriate format to
gimp_drawable_merge_filter()).
This commit is contained in:
Ell
2020-01-15 23:20:38 +02:00
parent 41ca26523c
commit 1485e1d143
5 changed files with 65 additions and 11 deletions

View File

@ -111,6 +111,7 @@ gimp_drawable_merge_filter (GimpDrawable *drawable,
GimpFilter *filter, GimpFilter *filter,
GimpProgress *progress, GimpProgress *progress,
const gchar *undo_desc, const gchar *undo_desc,
const Babl *format,
gboolean clip, gboolean clip,
gboolean cancellable, gboolean cancellable,
gboolean update) gboolean update)
@ -121,7 +122,7 @@ gimp_drawable_merge_filter (GimpDrawable *drawable,
const Babl *applicator_output_format = NULL; const Babl *applicator_output_format = NULL;
GeglBuffer *buffer = NULL; GeglBuffer *buffer = NULL;
GeglBuffer *dest_buffer; GeglBuffer *dest_buffer;
GeglBuffer *undo_buffer; GeglBuffer *undo_buffer = NULL;
GeglRectangle undo_rect; GeglRectangle undo_rect;
GeglBuffer *cache = NULL; GeglBuffer *cache = NULL;
GeglRectangle *rects = NULL; GeglRectangle *rects = NULL;
@ -137,6 +138,9 @@ gimp_drawable_merge_filter (GimpDrawable *drawable,
applicator = gimp_filter_get_applicator (filter); applicator = gimp_filter_get_applicator (filter);
dest_buffer = gimp_drawable_get_buffer (drawable); dest_buffer = gimp_drawable_get_buffer (drawable);
if (format == gimp_drawable_get_format (drawable))
format = NULL;
rect = gegl_node_get_bounding_box (gimp_filter_get_node (filter)); rect = gegl_node_get_bounding_box (gimp_filter_get_node (filter));
if (! clip && gegl_rectangle_equal (&rect, if (! clip && gegl_rectangle_equal (&rect,
@ -153,11 +157,19 @@ gimp_drawable_merge_filter (GimpDrawable *drawable,
{ {
return TRUE; return TRUE;
} }
if (format)
{
buffer = gegl_buffer_new (gegl_buffer_get_extent (dest_buffer),
format);
dest_buffer = buffer;
}
} }
else else
{ {
buffer = gegl_buffer_new (GEGL_RECTANGLE (0, 0, rect.width, rect.height), buffer = gegl_buffer_new (GEGL_RECTANGLE (0, 0, rect.width, rect.height),
gimp_drawable_get_format (drawable)); format);
dest_buffer = g_object_new (GEGL_TYPE_BUFFER, dest_buffer = g_object_new (GEGL_TYPE_BUFFER,
"source", buffer, "source", buffer,
@ -193,7 +205,7 @@ gimp_drawable_merge_filter (GimpDrawable *drawable,
gimp_applicator_set_output_format (applicator, NULL); gimp_applicator_set_output_format (applicator, NULL);
} }
if (clip) if (! buffer)
{ {
gegl_rectangle_align_to_buffer ( gegl_rectangle_align_to_buffer (
&undo_rect, &undo_rect,
@ -231,9 +243,19 @@ gimp_drawable_merge_filter (GimpDrawable *drawable,
if (clip) if (clip)
{ {
gimp_drawable_push_undo (drawable, undo_desc, undo_buffer, if (buffer)
undo_rect.x, undo_rect.y, {
undo_rect.width, undo_rect.height); gimp_drawable_set_buffer_full (drawable,
TRUE, undo_desc,
buffer, NULL,
FALSE);
}
else
{
gimp_drawable_push_undo (drawable, undo_desc, undo_buffer,
undo_rect.x, undo_rect.y,
undo_rect.width, undo_rect.height);
}
} }
else else
{ {
@ -289,7 +311,8 @@ gimp_drawable_merge_filter (GimpDrawable *drawable,
if (clip) if (clip)
{ {
g_object_unref (undo_buffer); g_clear_object (&undo_buffer);
g_clear_object (&buffer);
} }
else else
{ {

View File

@ -37,6 +37,7 @@ gboolean gimp_drawable_merge_filter (GimpDrawable *drawable,
GimpFilter *filter, GimpFilter *filter,
GimpProgress *progress, GimpProgress *progress,
const gchar *undo_desc, const gchar *undo_desc,
const Babl *format,
gboolean clip, gboolean clip,
gboolean cancellable, gboolean cancellable,
gboolean update); gboolean update);

View File

@ -77,6 +77,7 @@ struct _GimpDrawableFilter
GimpLayerColorSpace blend_space; GimpLayerColorSpace blend_space;
GimpLayerColorSpace composite_space; GimpLayerColorSpace composite_space;
GimpLayerCompositeMode composite_mode; GimpLayerCompositeMode composite_mode;
gboolean add_alpha;
gboolean color_managed; gboolean color_managed;
gboolean gamma_hack; gboolean gamma_hack;
@ -434,6 +435,23 @@ gimp_drawable_filter_set_mode (GimpDrawableFilter *filter,
} }
} }
void
gimp_drawable_filter_set_add_alpha (GimpDrawableFilter *filter,
gboolean add_alpha)
{
g_return_if_fail (GIMP_IS_DRAWABLE_FILTER (filter));
if (add_alpha != filter->add_alpha)
{
filter->add_alpha = add_alpha;
gimp_drawable_filter_sync_format (filter);
if (gimp_drawable_filter_is_filtering (filter))
gimp_drawable_filter_update_drawable (filter, NULL);
}
}
void void
gimp_drawable_filter_set_color_managed (GimpDrawableFilter *filter, gimp_drawable_filter_set_color_managed (GimpDrawableFilter *filter,
gboolean color_managed) gboolean color_managed)
@ -499,6 +517,10 @@ gimp_drawable_filter_commit (GimpDrawableFilter *filter,
if (gimp_drawable_filter_is_filtering (filter)) if (gimp_drawable_filter_is_filtering (filter))
{ {
const Babl *format;
format = gimp_applicator_get_output_format (filter->applicator);
gimp_drawable_filter_set_preview (filter, FALSE, gimp_drawable_filter_set_preview (filter, FALSE,
filter->preview_alignment, filter->preview_alignment,
filter->preview_position); filter->preview_position);
@ -507,6 +529,7 @@ gimp_drawable_filter_commit (GimpDrawableFilter *filter,
GIMP_FILTER (filter), GIMP_FILTER (filter),
progress, progress,
gimp_object_get_name (filter), gimp_object_get_name (filter),
format,
filter->filter_clip, filter->filter_clip,
cancellable, cancellable,
FALSE); FALSE);
@ -803,9 +826,14 @@ gimp_drawable_filter_sync_affect (GimpDrawableFilter *filter)
static void static void
gimp_drawable_filter_sync_format (GimpDrawableFilter *filter) gimp_drawable_filter_sync_format (GimpDrawableFilter *filter)
{ {
gimp_applicator_set_output_format ( const Babl *format;
filter->applicator,
gimp_drawable_get_format (filter->drawable)); if (filter->add_alpha && GIMP_IS_LAYER (filter->drawable))
format = gimp_drawable_get_format_with_alpha (filter->drawable);
else
format = gimp_drawable_get_format (filter->drawable);
gimp_applicator_set_output_format (filter->applicator, format);
} }
static void static void

View File

@ -73,6 +73,8 @@ void gimp_drawable_filter_set_mode (GimpDrawableFilter *filter,
GimpLayerColorSpace blend_space, GimpLayerColorSpace blend_space,
GimpLayerColorSpace composite_space, GimpLayerColorSpace composite_space,
GimpLayerCompositeMode composite_mode); GimpLayerCompositeMode composite_mode);
void gimp_drawable_filter_set_add_alpha (GimpDrawableFilter *filter,
gboolean add_alpha);
void gimp_drawable_filter_set_color_managed void gimp_drawable_filter_set_color_managed
(GimpDrawableFilter *filter, (GimpDrawableFilter *filter,

View File

@ -142,7 +142,7 @@ floating_sel_anchor (GimpLayer *layer)
if (filter) if (filter)
{ {
gimp_drawable_merge_filter (drawable, filter, NULL, NULL, gimp_drawable_merge_filter (drawable, filter, NULL, NULL,
FALSE, FALSE, FALSE); NULL, FALSE, FALSE, FALSE);
} }
gimp_image_remove_layer (image, layer, TRUE, NULL); gimp_image_remove_layer (image, layer, TRUE, NULL);