core: Add alpha on merge if filter requires it

Some filters such as Color to Alpha require
an alpha channel. Now that we have NDE,
filters can exist separately from layers
until they're merged down. This means
the layer itself may not have an alpha
channel, causing distortions on merge.
This patch adds a method to check if
the filter requires an alpha channel, and
adds it to the layer on merge or export if
it has such a filter.
This commit is contained in:
Alx Sa 2025-06-12 18:04:09 +00:00
parent 50df422969
commit c2b9c21b5b
3 changed files with 22 additions and 2 deletions

View file

@ -300,6 +300,7 @@ gimp_drawable_merge_filters (GimpDrawable *drawable)
if (GIMP_LIST (drawable->private->filter_stack)->queue->head)
{
GimpDrawableFilter *filter = NULL;
gboolean add_alpha = FALSE;
for (list = GIMP_LIST (drawable->private->filter_stack)->queue->tail;
list;
@ -307,7 +308,12 @@ gimp_drawable_merge_filters (GimpDrawable *drawable)
{
if (GIMP_IS_DRAWABLE_FILTER (list->data) &&
gimp_filter_get_active (GIMP_FILTER (list->data)))
{
filter = list->data;
if (! add_alpha)
add_alpha = gimp_drawable_filter_get_add_alpha (filter);
}
}
if (filter)
@ -317,6 +323,9 @@ gimp_drawable_merge_filters (GimpDrawable *drawable)
GeglNode *output;
GeglRectangle output_rect;
if (GIMP_IS_LAYER (drawable) && add_alpha)
gimp_layer_add_alpha (GIMP_LAYER (drawable));
graph = gimp_filter_stack_get_graph (GIMP_FILTER_STACK (drawable->private->filter_stack));
output = gegl_node_get_output_proxy (graph, "output");
output_rect = gegl_node_get_bounding_box (output);

View file

@ -530,6 +530,8 @@ gimp_drawable_filter_duplicate (GimpDrawable *drawable,
prior_filter->composite_mode);
gimp_drawable_filter_set_region (filter,
prior_filter->region);
gimp_drawable_filter_set_add_alpha (filter,
prior_filter->add_alpha);
gimp_filter_set_active (GIMP_FILTER (filter),
gimp_filter_get_active (GIMP_FILTER (prior_filter)));
gimp_filter_set_is_last_node (GIMP_FILTER (filter),
@ -1127,6 +1129,14 @@ gimp_drawable_filter_update (GimpDrawableFilter *filter,
return (*error != NULL);
}
gboolean
gimp_drawable_filter_get_add_alpha (GimpDrawableFilter *filter)
{
g_return_val_if_fail (GIMP_IS_DRAWABLE_FILTER (filter), FALSE);
return filter->add_alpha;
}
void
gimp_drawable_filter_set_add_alpha (GimpDrawableFilter *filter,
gboolean add_alpha)

View file

@ -126,6 +126,7 @@ gboolean gimp_drawable_filter_update (GimpDrawableFilter *filter,
const gchar **auxinputnames,
const GimpDrawable **auxinputs,
GError **error);
gboolean gimp_drawable_filter_get_add_alpha (GimpDrawableFilter *filter);
void gimp_drawable_filter_set_add_alpha (GimpDrawableFilter *filter,
gboolean add_alpha);