From a5ac6eb9c14f24064063eb102eae68220a9cc164 Mon Sep 17 00:00:00 2001 From: Jehan Date: Wed, 22 Oct 2025 23:58:56 +0200 Subject: [PATCH] app: fix merge visible layers when there are pass-through groups. --- app/core/gimpimage-merge.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/app/core/gimpimage-merge.c b/app/core/gimpimage-merge.c index eba026e325..cbe24a84f6 100644 --- a/app/core/gimpimage-merge.c +++ b/app/core/gimpimage-merge.c @@ -746,6 +746,7 @@ gimp_image_merge_layers (GimpImage *image, for (layers = trimmed_list; layers; layers = g_slist_next (layers)) { gint off_x, off_y; + gint width, height; layer = layers->data; @@ -753,7 +754,23 @@ gimp_image_merge_layers (GimpImage *image, gimp_drawable_merge_filters (GIMP_DRAWABLE (layer)); gimp_drawable_clear_filters (GIMP_DRAWABLE (layer)); - gimp_item_get_offset (GIMP_ITEM (layer), &off_x, &off_y); + if (gimp_layer_get_mode (layer) == GIMP_LAYER_MODE_PASS_THROUGH) + { + GeglNode *mode_node = gimp_drawable_get_mode_node (GIMP_DRAWABLE (layer)); + GeglRectangle rect; + + rect = gegl_node_get_bounding_box (mode_node); + off_x = rect.x; + off_y = rect.y; + width = rect.width; + height = rect.height; + } + else + { + gimp_item_get_offset (GIMP_ITEM (layer), &off_x, &off_y); + width = gimp_item_get_width (GIMP_ITEM (layer)); + height = gimp_item_get_height (GIMP_ITEM (layer)); + } switch (merge_type) { @@ -763,8 +780,8 @@ gimp_image_merge_layers (GimpImage *image, { x1 = off_x; y1 = off_y; - x2 = off_x + gimp_item_get_width (GIMP_ITEM (layer)); - y2 = off_y + gimp_item_get_height (GIMP_ITEM (layer)); + x2 = off_x + width; + y2 = off_y + height; } else { @@ -772,10 +789,10 @@ gimp_image_merge_layers (GimpImage *image, x1 = off_x; if (off_y < y1) y1 = off_y; - if ((off_x + gimp_item_get_width (GIMP_ITEM (layer))) > x2) - x2 = (off_x + gimp_item_get_width (GIMP_ITEM (layer))); - if ((off_y + gimp_item_get_height (GIMP_ITEM (layer))) > y2) - y2 = (off_y + gimp_item_get_height (GIMP_ITEM (layer))); + if ((off_x + width) > x2) + x2 = (off_x + width); + if ((off_y + height) > y2) + y2 = (off_y + height); } if (merge_type == GIMP_CLIP_TO_IMAGE) @@ -792,8 +809,8 @@ gimp_image_merge_layers (GimpImage *image, { x1 = off_x; y1 = off_y; - x2 = off_x + gimp_item_get_width (GIMP_ITEM (layer)); - y2 = off_y + gimp_item_get_height (GIMP_ITEM (layer)); + x2 = off_x + width; + y2 = off_y + height; } break;