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