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.
This commit is contained in:
Alx Sa 2024-06-19 21:34:57 +00:00
parent ebeef5d7ef
commit fcdddad2a7
3 changed files with 35 additions and 13 deletions

View File

@ -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))

View File

@ -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);

View File

@ -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);