From fcdddad2a78f2d6e7dcc4e8ad64db2cfd09b28a0 Mon Sep 17 00:00:00 2001 From: Alx Sa Date: Wed, 19 Jun 2024 21:34:57 +0000 Subject: [PATCH] core: Include NDE filters when opening as layers Adds code to copy any NDE filters when importing an .xcf file as layers in an existing project. This also requires removing the check for the layer being attached to an image, which historically made sense because filter effects were immediately merged down. Now that filters can exist separately the check is no longer required. --- app/core/gimpdrawablefilter.c | 10 ---------- app/core/gimpitem.c | 3 --- app/file/file-open.c | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/app/core/gimpdrawablefilter.c b/app/core/gimpdrawablefilter.c index 1a481e937b..7fb1eb054a 100644 --- a/app/core/gimpdrawablefilter.c +++ b/app/core/gimpdrawablefilter.c @@ -279,11 +279,6 @@ gimp_drawable_filter_new (GimpDrawable *drawable, GeglNode *node; g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), NULL); - /* When copying a layer group whose children have layer effects, - * the child may be attached to the layer group but not the - * image itself at that point. */ - g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (drawable)) || - gimp_viewable_get_parent (GIMP_VIEWABLE (drawable)), NULL); g_return_val_if_fail (GEGL_IS_NODE (operation), NULL); g_return_val_if_fail (gegl_node_has_pad (operation, "output"), NULL); @@ -780,8 +775,6 @@ gimp_drawable_filter_apply (GimpDrawableFilter *filter, const GeglRectangle *area) { g_return_if_fail (GIMP_IS_DRAWABLE_FILTER (filter)); - g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (filter->drawable)) || - gimp_viewable_get_parent (GIMP_VIEWABLE (filter->drawable))); gimp_drawable_filter_add_filter (filter); @@ -804,9 +797,6 @@ gimp_drawable_filter_commit (GimpDrawableFilter *filter, gboolean success = TRUE; g_return_val_if_fail (GIMP_IS_DRAWABLE_FILTER (filter), FALSE); - g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (filter->drawable)) || - gimp_viewable_get_parent (GIMP_VIEWABLE (filter->drawable)), - FALSE); g_return_val_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress), FALSE); if (gimp_drawable_filter_is_added (filter)) diff --git a/app/core/gimpitem.c b/app/core/gimpitem.c index 63db87c8ab..9ef8ec0853 100644 --- a/app/core/gimpitem.c +++ b/app/core/gimpitem.c @@ -2716,9 +2716,6 @@ gimp_item_mask_intersect (GimpItem *item, gboolean retval; g_return_val_if_fail (GIMP_IS_ITEM (item), FALSE); - g_return_val_if_fail (gimp_item_is_attached (item) || - gimp_viewable_get_parent (GIMP_VIEWABLE (item)), - FALSE); image = gimp_item_get_image (item); selection = gimp_image_get_mask (image); diff --git a/app/file/file-open.c b/app/file/file-open.c index 3fd70b348b..2f6b62c1f6 100644 --- a/app/file/file-open.c +++ b/app/file/file-open.c @@ -32,6 +32,8 @@ #include "core/gimp.h" #include "core/gimpcontext.h" #include "core/gimpdocumentlist.h" +#include "core/gimpdrawable-filters.h" +#include "core/gimpdrawablefilter.h" #include "core/gimpimage.h" #include "core/gimpimage-merge.h" #include "core/gimpimage-undo.h" @@ -781,6 +783,39 @@ file_open_convert_items (GimpImage *dest_image, 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; + + filters = gimp_drawable_get_filters (GIMP_DRAWABLE (src)); + + for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list; + filter_list = g_list_previous (filter_list)) + { + if (GIMP_IS_DRAWABLE_FILTER (filter_list->data)) + { + GimpDrawableFilter *old_filter = filter_list->data; + GimpDrawableFilter *filter; + + filter = + gimp_drawable_filter_duplicate (GIMP_DRAWABLE (item), + old_filter); + + if (filter != NULL) + { + gimp_drawable_filter_apply (filter, NULL); + gimp_drawable_filter_commit (filter, TRUE, NULL, FALSE); + + gimp_drawable_filter_layer_mask_freeze (filter); + g_object_unref (filter); + } + } + } + } + if (g_list_length (items) == 1) { gimp_object_set_name (GIMP_OBJECT (item), basename);