From afc0a6d15dee5da8631744723549a37e9f6fc4ea Mon Sep 17 00:00:00 2001 From: Alx Sa Date: Mon, 7 Oct 2024 13:49:44 +0000 Subject: [PATCH] actions,core,file: Copy inactive filters Previously we used gimp_drawable_has_filters () to detect if a layer had any filters set. However, this function only gets active filters, leading to filters with their visibility set to FALSE not being copied. This patch checks the number of children in the filter stack container instead to get an accurate filter count. --- app/actions/layers-commands.c | 6 ++++-- app/core/gimp-edit.c | 10 +++++----- app/core/gimpdrawable.c | 13 +++++++------ app/core/gimpgrouplayer.c | 9 ++++----- app/core/gimpimage-duplicate.c | 13 ++++++------- app/core/gimpimage-new.c | 17 ++++++++--------- app/file/file-open.c | 17 +++++++++-------- 7 files changed, 43 insertions(+), 42 deletions(-) diff --git a/app/actions/layers-commands.c b/app/actions/layers-commands.c index 0360964fe2..e862353f2e 100644 --- a/app/actions/layers-commands.c +++ b/app/actions/layers-commands.c @@ -818,7 +818,8 @@ layers_duplicate_cmd_callback (GimpAction *action, _("Duplicate layers")); for (iter = layers; iter; iter = iter->next) { - GimpLayer *new_layer; + GimpLayer *new_layer; + GimpContainer *filters; new_layer = GIMP_LAYER (gimp_item_duplicate (GIMP_ITEM (iter->data), G_TYPE_FROM_INSTANCE (iter->data))); @@ -834,7 +835,8 @@ layers_duplicate_cmd_callback (GimpAction *action, new_layers = g_list_prepend (new_layers, new_layer); /* Import any attached layer effects */ - if (gimp_drawable_has_filters (GIMP_DRAWABLE (iter->data))) + filters = gimp_drawable_get_filters (GIMP_DRAWABLE (iter->data)); + if (gimp_container_get_n_children (filters) > 0) { GList *filter_list; GimpContainer *filters; diff --git a/app/core/gimp-edit.c b/app/core/gimp-edit.c index ea3faf6fa7..fbece61ea2 100644 --- a/app/core/gimp-edit.c +++ b/app/core/gimp-edit.c @@ -493,15 +493,15 @@ gimp_edit_paste_get_tagged_layers (GimpImage *image, "gimp-image-copied-layer")); if (copied) { + GimpContainer *filters; + layer = GIMP_LAYER (gimp_item_convert (GIMP_ITEM (iter->data), image, layer_type)); - if (gimp_drawable_has_filters (GIMP_DRAWABLE (iter->data))) + filters = gimp_drawable_get_filters (GIMP_DRAWABLE (iter->data)); + if (gimp_container_get_n_children (filters) > 0) { - GList *filter_list; - GimpContainer *filters; - - filters = gimp_drawable_get_filters (GIMP_DRAWABLE (iter->data)); + GList *filter_list; for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list; diff --git a/app/core/gimpdrawable.c b/app/core/gimpdrawable.c index d320bd4008..1dbf387b97 100644 --- a/app/core/gimpdrawable.c +++ b/app/core/gimpdrawable.c @@ -1330,10 +1330,11 @@ gimp_drawable_convert_type (GimpDrawable *drawable, gboolean push_undo, GimpProgress *progress) { - const Babl *old_format; - const Babl *new_format; - gint old_bits; - gint new_bits; + const Babl *old_format; + const Babl *new_format; + gint old_bits; + gint new_bits; + GimpContainer *filters; g_return_if_fail (GIMP_IS_DRAWABLE (drawable)); g_return_if_fail (GIMP_IS_IMAGE (dest_image)); @@ -1382,11 +1383,11 @@ gimp_drawable_convert_type (GimpDrawable *drawable, /* Update the masks of any filters */ /* TODO: Move to gimp_drawable_real_convert_type () once it's updated * to run for all GimpDrawable child classes */ - if (gimp_drawable_has_filters (drawable)) + filters = gimp_drawable_get_filters (drawable); + if (gimp_container_get_n_children (filters) > 0) { const Babl *mask_format; GList *filter_list; - GimpContainer *filters = gimp_drawable_get_filters (drawable); GimpPrecision new_mask_precision; mask_format = gimp_image_get_mask_format (dest_image); diff --git a/app/core/gimpgrouplayer.c b/app/core/gimpgrouplayer.c index 9e53fb8b96..71d194369a 100644 --- a/app/core/gimpgrouplayer.c +++ b/app/core/gimpgrouplayer.c @@ -591,6 +591,7 @@ gimp_group_layer_duplicate (GimpItem *item, GimpItem *child = list->data; GimpItem *new_child; GimpLayerMask *mask; + GimpContainer *filters; new_child = gimp_item_duplicate (child, G_TYPE_FROM_INSTANCE (child)); @@ -617,12 +618,10 @@ gimp_group_layer_duplicate (GimpItem *item, position++); /* Copy any attached layer effects */ - if (gimp_drawable_has_filters (GIMP_DRAWABLE (child))) + filters = gimp_drawable_get_filters (GIMP_DRAWABLE (child)); + if (gimp_container_get_n_children (filters) > 0) { - GList *filter_list; - GimpContainer *filters; - - filters = gimp_drawable_get_filters (GIMP_DRAWABLE (child)); + GList *filter_list; for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list; filter_list = g_list_previous (filter_list)) diff --git a/app/core/gimpimage-duplicate.c b/app/core/gimpimage-duplicate.c index 8f49d98c0d..65af564e4a 100644 --- a/app/core/gimpimage-duplicate.c +++ b/app/core/gimpimage-duplicate.c @@ -243,8 +243,9 @@ gimp_image_duplicate_layers (GimpImage *image, list; list = g_list_next (list)) { - GimpLayer *layer = list->data; - GimpLayer *new_layer; + GimpLayer *layer = list->data; + GimpLayer *new_layer; + GimpContainer *filters; if (gimp_layer_is_floating_sel (layer)) continue; @@ -263,12 +264,10 @@ gimp_image_duplicate_layers (GimpImage *image, NULL, count++, FALSE); /* Import any attached layer effects */ - if (gimp_drawable_has_filters (GIMP_DRAWABLE (layer))) + filters = gimp_drawable_get_filters (GIMP_DRAWABLE (layer)); + if (gimp_container_get_n_children (filters) > 0) { - GList *filter_list; - GimpContainer *filters; - - filters = gimp_drawable_get_filters (GIMP_DRAWABLE (layer)); + GList *filter_list; for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list; filter_list = g_list_previous (filter_list)) diff --git a/app/core/gimpimage-new.c b/app/core/gimpimage-new.c index 3e47061be3..bfc2714aae 100644 --- a/app/core/gimpimage-new.c +++ b/app/core/gimpimage-new.c @@ -341,10 +341,11 @@ gimp_image_new_copy_drawables (GimpImage *image, { if (g_list_find (copied_drawables, iter->data)) { - GimpLayer *new_layer; - GType new_type; - gboolean is_group; - gboolean is_tagged; + GimpLayer *new_layer; + GimpContainer *filters; + GType new_type; + gboolean is_group; + gboolean is_tagged; if (GIMP_IS_LAYER (iter->data)) new_type = G_TYPE_FROM_INSTANCE (iter->data); @@ -388,12 +389,10 @@ gimp_image_new_copy_drawables (GimpImage *image, if (gimp_layer_can_lock_alpha (new_layer)) gimp_layer_set_lock_alpha (new_layer, FALSE, FALSE); - if (gimp_drawable_has_filters (GIMP_DRAWABLE (iter->data))) + filters = gimp_drawable_get_filters (GIMP_DRAWABLE (iter->data)); + if (gimp_container_get_n_children (filters) > 0) { - GList *filter_list; - GimpContainer *filters; - - filters = gimp_drawable_get_filters (GIMP_DRAWABLE (iter->data)); + GList *filter_list; for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list; filter_list = g_list_previous (filter_list)) diff --git a/app/file/file-open.c b/app/file/file-open.c index 859cc8c97e..e05a8267dd 100644 --- a/app/file/file-open.c +++ b/app/file/file-open.c @@ -778,19 +778,20 @@ file_open_convert_items (GimpImage *dest_image, for (list = items; list; list = g_list_next (list)) { - GimpItem *src = list->data; - GimpItem *item; + GimpItem *src = list->data; + GimpContainer *filters = NULL; + GimpItem *item; item = gimp_item_convert (src, dest_image, G_TYPE_FROM_INSTANCE (src)); /* Import any attached layer effects */ - if (GIMP_IS_DRAWABLE (item) && - gimp_drawable_has_filters (GIMP_DRAWABLE (src))) - { - GList *filter_list; - GimpContainer *filters; + if (GIMP_IS_DRAWABLE (item)) + filters = gimp_drawable_get_filters (GIMP_DRAWABLE (src)); - filters = gimp_drawable_get_filters (GIMP_DRAWABLE (src)); + if (filters != NULL && + gimp_container_get_n_children (filters) > 0) + { + GList *filter_list; for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list; filter_list = g_list_previous (filter_list))