From d80ccb08d892203ba3ef41e6e4afe2eaace96801 Mon Sep 17 00:00:00 2001 From: Alx Sa Date: Wed, 1 Jan 2025 21:25:52 -0500 Subject: [PATCH] plug-ins: Include filters when composing Since we use gimp_drawable_get_buffer () to get the pixel data when composing or recomposing, NDE filters were not being included in the final output. This patch temporarily duplicates the layer, merges the filters, and then retrieves the GeglBuffer from the merged version of the layer rather than the raw pixels. --- plug-ins/common/compose.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/plug-ins/common/compose.c b/plug-ins/common/compose.c index 0b8a5e9083..5b108add95 100644 --- a/plug-ins/common/compose.c +++ b/plug-ins/common/compose.c @@ -145,6 +145,9 @@ static void cpn_affine_transform (GeglBuffer *buffer, gdouble min, gdouble max); +static GeglBuffer * get_buffer_with_filters + (GimpLayer *layer); + static void fill_buffer_from_components (GeglBuffer *temp[MAX_COMPOSE_IMAGES], GeglBuffer *dst, gint num_cpn, @@ -854,6 +857,32 @@ cpn_affine_transform (GeglBuffer *buffer, } } +static GeglBuffer * +get_buffer_with_filters (GimpLayer *layer) +{ + GimpImage *image = gimp_item_get_image (GIMP_ITEM (layer)); + GimpLayer *temp = gimp_layer_copy (layer); + GeglBuffer *src_buffer; + GeglBuffer *dst_buffer; + + gimp_image_insert_layer (image, temp, NULL, + gimp_image_get_item_position (image, + GIMP_ITEM (layer))); + + gimp_drawable_merge_filters (GIMP_DRAWABLE (temp)); + + src_buffer = gimp_drawable_get_buffer (GIMP_DRAWABLE (temp)); + dst_buffer = gegl_buffer_new (gegl_buffer_get_extent (src_buffer), + gegl_buffer_get_format (src_buffer)); + + gegl_buffer_copy (src_buffer, NULL, GEGL_ABYSS_NONE, dst_buffer, NULL); + + gimp_image_remove_layer (image, temp); + g_object_unref (src_buffer); + + return dst_buffer; +} + static void fill_buffer_from_components (GeglBuffer *temp[MAX_COMPOSE_IMAGES], GeglBuffer *dst, @@ -1055,7 +1084,7 @@ compose (const gchar *compose_type, for (j = 0; j < num_images; j++) { if (inputs[j].is_object) - buffer_src[j] = gimp_drawable_get_buffer (inputs[j].comp.object); + buffer_src[j] = get_buffer_with_filters (inputs[j].comp.object); else buffer_src[j] = NULL; } @@ -1097,7 +1126,7 @@ compose (const gchar *compose_type, } /* Get drawable for layer */ - buffer_src[j] = gimp_drawable_get_buffer (GIMP_DRAWABLE (layers[0])); + buffer_src[j] = get_buffer_with_filters (layers[0]); g_free (layers); } }