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