diff --git a/app/core/gimpgrouplayer.c b/app/core/gimpgrouplayer.c index 684560c27a..23ff01f800 100644 --- a/app/core/gimpgrouplayer.c +++ b/app/core/gimpgrouplayer.c @@ -106,6 +106,10 @@ static void gimp_group_layer_transform (GimpItem *item, GimpTransformResize clip_result, GimpProgress *progress); +static gint64 gimp_group_layer_estimate_memsize (const GimpDrawable *drawable, + gint width, + gint height); + static GeglNode * gimp_group_layer_get_graph (GimpProjectable *projectable); static GList * gimp_group_layer_get_layers (GimpProjectable *projectable); @@ -152,6 +156,7 @@ gimp_group_layer_class_init (GimpGroupLayerClass *klass) GimpObjectClass *gimp_object_class = GIMP_OBJECT_CLASS (klass); GimpViewableClass *viewable_class = GIMP_VIEWABLE_CLASS (klass); GimpItemClass *item_class = GIMP_ITEM_CLASS (klass); + GimpDrawableClass *drawable_class = GIMP_DRAWABLE_CLASS (klass); object_class->set_property = gimp_group_layer_set_property; object_class->get_property = gimp_group_layer_get_property; @@ -180,6 +185,8 @@ gimp_group_layer_class_init (GimpGroupLayerClass *klass) item_class->rotate_desc = _("Rotate Group Layer"); item_class->transform_desc = _("Transform Group Layer"); + drawable_class->estimate_memsize = gimp_group_layer_estimate_memsize; + g_object_class_install_property (object_class, PROP_LOCK_CONTENT, g_param_spec_boolean ("lock-content", NULL, NULL, @@ -663,6 +670,45 @@ gimp_group_layer_transform (GimpItem *item, clip_result, progress); } +static gint64 +gimp_group_layer_estimate_memsize (const GimpDrawable *drawable, + gint width, + gint height) +{ + GimpGroupLayer *group = GIMP_GROUP_LAYER (drawable); + GList *list; + GimpImageBaseType base_type; + gint64 memsize = 0; + + for (list = gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (group->children)); + list; + list = g_list_next (list)) + { + GimpDrawable *child = list->data; + gint child_width; + gint child_height; + + child_width = (gimp_item_get_width (GIMP_ITEM (child)) * + width / + gimp_item_get_width (GIMP_ITEM (drawable))); + child_height = (gimp_item_get_height (GIMP_ITEM (child)) * + height / + gimp_item_get_height (GIMP_ITEM (drawable))); + + memsize += gimp_drawable_estimate_memsize (child, + child_width, + child_height); + } + + base_type = GIMP_IMAGE_TYPE_BASE_TYPE (gimp_drawable_type (drawable)); + + memsize += gimp_projection_estimate_memsize (base_type, width, height); + + return memsize + GIMP_DRAWABLE_CLASS (parent_class)->estimate_memsize (drawable, + width, + height); +} + static GeglNode * gimp_group_layer_get_graph (GimpProjectable *projectable) {