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.
This commit is contained in:
Alx Sa
2024-10-07 13:49:44 +00:00
parent 1019574bcc
commit afc0a6d15d
7 changed files with 43 additions and 42 deletions

View File

@ -818,7 +818,8 @@ layers_duplicate_cmd_callback (GimpAction *action,
_("Duplicate layers")); _("Duplicate layers"));
for (iter = layers; iter; iter = iter->next) 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), new_layer = GIMP_LAYER (gimp_item_duplicate (GIMP_ITEM (iter->data),
G_TYPE_FROM_INSTANCE (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); new_layers = g_list_prepend (new_layers, new_layer);
/* Import any attached layer effects */ /* 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; GList *filter_list;
GimpContainer *filters; GimpContainer *filters;

View File

@ -493,15 +493,15 @@ gimp_edit_paste_get_tagged_layers (GimpImage *image,
"gimp-image-copied-layer")); "gimp-image-copied-layer"));
if (copied) if (copied)
{ {
GimpContainer *filters;
layer = GIMP_LAYER (gimp_item_convert (GIMP_ITEM (iter->data), layer = GIMP_LAYER (gimp_item_convert (GIMP_ITEM (iter->data),
image, layer_type)); 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; GList *filter_list;
GimpContainer *filters;
filters = gimp_drawable_get_filters (GIMP_DRAWABLE (iter->data));
for (filter_list = GIMP_LIST (filters)->queue->tail; for (filter_list = GIMP_LIST (filters)->queue->tail;
filter_list; filter_list;

View File

@ -1330,10 +1330,11 @@ gimp_drawable_convert_type (GimpDrawable *drawable,
gboolean push_undo, gboolean push_undo,
GimpProgress *progress) GimpProgress *progress)
{ {
const Babl *old_format; const Babl *old_format;
const Babl *new_format; const Babl *new_format;
gint old_bits; gint old_bits;
gint new_bits; gint new_bits;
GimpContainer *filters;
g_return_if_fail (GIMP_IS_DRAWABLE (drawable)); g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
g_return_if_fail (GIMP_IS_IMAGE (dest_image)); 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 */ /* Update the masks of any filters */
/* TODO: Move to gimp_drawable_real_convert_type () once it's updated /* TODO: Move to gimp_drawable_real_convert_type () once it's updated
* to run for all GimpDrawable child classes */ * 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; const Babl *mask_format;
GList *filter_list; GList *filter_list;
GimpContainer *filters = gimp_drawable_get_filters (drawable);
GimpPrecision new_mask_precision; GimpPrecision new_mask_precision;
mask_format = gimp_image_get_mask_format (dest_image); mask_format = gimp_image_get_mask_format (dest_image);

View File

@ -591,6 +591,7 @@ gimp_group_layer_duplicate (GimpItem *item,
GimpItem *child = list->data; GimpItem *child = list->data;
GimpItem *new_child; GimpItem *new_child;
GimpLayerMask *mask; GimpLayerMask *mask;
GimpContainer *filters;
new_child = gimp_item_duplicate (child, G_TYPE_FROM_INSTANCE (child)); new_child = gimp_item_duplicate (child, G_TYPE_FROM_INSTANCE (child));
@ -617,12 +618,10 @@ gimp_group_layer_duplicate (GimpItem *item,
position++); position++);
/* Copy any attached layer effects */ /* 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; GList *filter_list;
GimpContainer *filters;
filters = gimp_drawable_get_filters (GIMP_DRAWABLE (child));
for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list; for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list;
filter_list = g_list_previous (filter_list)) filter_list = g_list_previous (filter_list))

View File

@ -243,8 +243,9 @@ gimp_image_duplicate_layers (GimpImage *image,
list; list;
list = g_list_next (list)) list = g_list_next (list))
{ {
GimpLayer *layer = list->data; GimpLayer *layer = list->data;
GimpLayer *new_layer; GimpLayer *new_layer;
GimpContainer *filters;
if (gimp_layer_is_floating_sel (layer)) if (gimp_layer_is_floating_sel (layer))
continue; continue;
@ -263,12 +264,10 @@ gimp_image_duplicate_layers (GimpImage *image,
NULL, count++, FALSE); NULL, count++, FALSE);
/* Import any attached layer effects */ /* 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; GList *filter_list;
GimpContainer *filters;
filters = gimp_drawable_get_filters (GIMP_DRAWABLE (layer));
for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list; for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list;
filter_list = g_list_previous (filter_list)) filter_list = g_list_previous (filter_list))

View File

@ -341,10 +341,11 @@ gimp_image_new_copy_drawables (GimpImage *image,
{ {
if (g_list_find (copied_drawables, iter->data)) if (g_list_find (copied_drawables, iter->data))
{ {
GimpLayer *new_layer; GimpLayer *new_layer;
GType new_type; GimpContainer *filters;
gboolean is_group; GType new_type;
gboolean is_tagged; gboolean is_group;
gboolean is_tagged;
if (GIMP_IS_LAYER (iter->data)) if (GIMP_IS_LAYER (iter->data))
new_type = G_TYPE_FROM_INSTANCE (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)) if (gimp_layer_can_lock_alpha (new_layer))
gimp_layer_set_lock_alpha (new_layer, FALSE, FALSE); 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; GList *filter_list;
GimpContainer *filters;
filters = gimp_drawable_get_filters (GIMP_DRAWABLE (iter->data));
for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list; for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list;
filter_list = g_list_previous (filter_list)) filter_list = g_list_previous (filter_list))

View File

@ -778,19 +778,20 @@ file_open_convert_items (GimpImage *dest_image,
for (list = items; list; list = g_list_next (list)) for (list = items; list; list = g_list_next (list))
{ {
GimpItem *src = list->data; GimpItem *src = list->data;
GimpItem *item; GimpContainer *filters = NULL;
GimpItem *item;
item = gimp_item_convert (src, dest_image, G_TYPE_FROM_INSTANCE (src)); item = gimp_item_convert (src, dest_image, G_TYPE_FROM_INSTANCE (src));
/* Import any attached layer effects */ /* Import any attached layer effects */
if (GIMP_IS_DRAWABLE (item) && if (GIMP_IS_DRAWABLE (item))
gimp_drawable_has_filters (GIMP_DRAWABLE (src))) filters = gimp_drawable_get_filters (GIMP_DRAWABLE (src));
{
GList *filter_list;
GimpContainer *filters;
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; for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list;
filter_list = g_list_previous (filter_list)) filter_list = g_list_previous (filter_list))