[gimp] Add facility to compress multiple group layer resizings into one



commit 4df9b25217c2c654bfde66dc82dca71dca908465
Author: Michael Natterer <mitch gimp org>
Date:   Mon Sep 7 13:04:55 2009 +0200

    Add facility to compress multiple group layer resizings into one
    
    * app/core/gimpgrouplayer.[ch]: add gimp_group_layer_suspend_resize()
      and gimp_group_layer_resume_resize() and call them around functions
      where all a group's children are transformed (translated, resized
      etc).  This way we go from the worst case of reallocating the
      group's projection tiles once for each child down to exactly one
      reallocation.
    
    * app/core/Makefile.am
    * app/core/core-enums.[ch]
    * app/core/core-types.h
    * app/core/gimpimage-undo-push.[ch]
    * app/core/gimpgrouplayerundo.[ch]: add new undo class
      GimpGroupLayerUndo which implements undos for suspend/resume of
      group layers and calls them in reverse order when undoing.

 app/core/Makefile.am           |    2 +
 app/core/core-enums.c          |    4 ++
 app/core/core-enums.h          |    2 +
 app/core/core-types.h          |    1 +
 app/core/gimpgrouplayer.c      |  101 ++++++++++++++++++++++++++++++++++++---
 app/core/gimpgrouplayer.h      |   10 +++-
 app/core/gimpgrouplayerundo.c  |   97 ++++++++++++++++++++++++++++++++++++++
 app/core/gimpgrouplayerundo.h  |   49 +++++++++++++++++++
 app/core/gimpimage-undo-push.c |   40 +++++++++++++++-
 app/core/gimpimage-undo-push.h |   10 ++++
 10 files changed, 305 insertions(+), 11 deletions(-)
---
diff --git a/app/core/Makefile.am b/app/core/Makefile.am
index 46f441a..54232d0 100644
--- a/app/core/Makefile.am
+++ b/app/core/Makefile.am
@@ -185,6 +185,8 @@ libappcore_a_sources = \
 	gimpgrid.h				\
 	gimpgrouplayer.c			\
 	gimpgrouplayer.h			\
+	gimpgrouplayerundo.c			\
+	gimpgrouplayerundo.h			\
 	gimpguide.c				\
 	gimpguide.h				\
 	gimpguideundo.c				\
diff --git a/app/core/core-enums.c b/app/core/core-enums.c
index 6dac060..7e33d61 100644
--- a/app/core/core-enums.c
+++ b/app/core/core-enums.c
@@ -839,6 +839,8 @@ gimp_undo_type_get_type (void)
     { GIMP_UNDO_LAYER_MODE, "GIMP_UNDO_LAYER_MODE", "layer-mode" },
     { GIMP_UNDO_LAYER_OPACITY, "GIMP_UNDO_LAYER_OPACITY", "layer-opacity" },
     { GIMP_UNDO_LAYER_LOCK_ALPHA, "GIMP_UNDO_LAYER_LOCK_ALPHA", "layer-lock-alpha" },
+    { GIMP_UNDO_GROUP_LAYER_SUSPEND, "GIMP_UNDO_GROUP_LAYER_SUSPEND", "group-layer-suspend" },
+    { GIMP_UNDO_GROUP_LAYER_RESUME, "GIMP_UNDO_GROUP_LAYER_RESUME", "group-layer-resume" },
     { GIMP_UNDO_TEXT_LAYER, "GIMP_UNDO_TEXT_LAYER", "text-layer" },
     { GIMP_UNDO_TEXT_LAYER_MODIFIED, "GIMP_UNDO_TEXT_LAYER_MODIFIED", "text-layer-modified" },
     { GIMP_UNDO_LAYER_MASK_ADD, "GIMP_UNDO_LAYER_MASK_ADD", "layer-mask-add" },
@@ -924,6 +926,8 @@ gimp_undo_type_get_type (void)
     { GIMP_UNDO_LAYER_MODE, NC_("undo-type", "Set layer mode"), NULL },
     { GIMP_UNDO_LAYER_OPACITY, NC_("undo-type", "Set layer opacity"), NULL },
     { GIMP_UNDO_LAYER_LOCK_ALPHA, NC_("undo-type", "Lock/Unlock alpha channel"), NULL },
+    { GIMP_UNDO_GROUP_LAYER_SUSPEND, NC_("undo-type", "Suspend group layer resize"), NULL },
+    { GIMP_UNDO_GROUP_LAYER_RESUME, NC_("undo-type", "Resume group layer resize"), NULL },
     { GIMP_UNDO_TEXT_LAYER, NC_("undo-type", "Text layer"), NULL },
     { GIMP_UNDO_TEXT_LAYER_MODIFIED, NC_("undo-type", "Text layer modification"), NULL },
     { GIMP_UNDO_LAYER_MASK_ADD, NC_("undo-type", "Add layer mask"), NULL },
diff --git a/app/core/core-enums.h b/app/core/core-enums.h
index 4b1a96c..d35751f 100644
--- a/app/core/core-enums.h
+++ b/app/core/core-enums.h
@@ -420,6 +420,8 @@ typedef enum /*< pdb-skip >*/
   GIMP_UNDO_LAYER_MODE,               /*< desc="Set layer mode"              >*/
   GIMP_UNDO_LAYER_OPACITY,            /*< desc="Set layer opacity"           >*/
   GIMP_UNDO_LAYER_LOCK_ALPHA,         /*< desc="Lock/Unlock alpha channel"   >*/
+  GIMP_UNDO_GROUP_LAYER_SUSPEND,      /*< desc="Suspend group layer resize"  >*/
+  GIMP_UNDO_GROUP_LAYER_RESUME,       /*< desc="Resume group layer resize"   >*/
   GIMP_UNDO_TEXT_LAYER,               /*< desc="Text layer"                  >*/
   GIMP_UNDO_TEXT_LAYER_MODIFIED,      /*< desc="Text layer modification"     >*/
   GIMP_UNDO_LAYER_MASK_ADD,           /*< desc="Add layer mask"              >*/
diff --git a/app/core/core-types.h b/app/core/core-types.h
index 5014f28..c88aa63 100644
--- a/app/core/core-types.h
+++ b/app/core/core-types.h
@@ -129,6 +129,7 @@ typedef struct _GimpLayerMaskUndo     GimpLayerMaskUndo;
 typedef struct _GimpLayerMaskPropUndo GimpLayerMaskPropUndo;
 typedef struct _GimpLayerUndo         GimpLayerUndo;
 typedef struct _GimpLayerPropUndo     GimpLayerPropUndo;
+typedef struct _GimpGroupLayerUndo    GimpGroupLayerUndo;
 typedef struct _GimpMaskUndo          GimpMaskUndo;
 typedef struct _GimpGuideUndo         GimpGuideUndo;
 typedef struct _GimpSamplePointUndo   GimpSamplePointUndo;
diff --git a/app/core/gimpgrouplayer.c b/app/core/gimpgrouplayer.c
index 11d0932..d11a0fb 100644
--- a/app/core/gimpgrouplayer.c
+++ b/app/core/gimpgrouplayer.c
@@ -33,6 +33,7 @@
 
 #include "gimpgrouplayer.h"
 #include "gimpimage.h"
+#include "gimpimage-undo-push.h"
 #include "gimpdrawablestack.h"
 #include "gimppickable.h"
 #include "gimpprojectable.h"
@@ -118,7 +119,8 @@ static void            gimp_group_layer_child_move   (GimpLayer       *child,
 static void            gimp_group_layer_child_resize (GimpLayer       *child,
                                                       GimpGroupLayer  *group);
 
-static void            gimp_group_layer_update_size  (GimpGroupLayer    *group);
+static void            gimp_group_layer_update       (GimpGroupLayer  *group);
+static void            gimp_group_layer_update_size  (GimpGroupLayer  *group);
 
 static void            gimp_group_layer_stack_update (GimpDrawableStack *stack,
                                                       gint               x,
@@ -395,6 +397,9 @@ gimp_group_layer_translate (GimpItem *item,
   GimpLayerMask  *mask;
   GList          *list;
 
+  /*  don't push an undo here because undo will call us again  */
+  gimp_group_layer_suspend_resize (group, FALSE);
+
   for (list = gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (group->children));
        list;
        list = g_list_next (list))
@@ -415,6 +420,9 @@ gimp_group_layer_translate (GimpItem *item,
 
       gimp_viewable_invalidate_preview (GIMP_VIEWABLE (mask));
     }
+
+  /*  don't push an undo here because undo will call us again  */
+  gimp_group_layer_resume_resize (group, FALSE);
 }
 
 static void
@@ -440,6 +448,8 @@ gimp_group_layer_scale (GimpItem              *item,
   old_offset_x = gimp_item_get_offset_x (item);
   old_offset_y = gimp_item_get_offset_y (item);
 
+  gimp_group_layer_suspend_resize (group, TRUE);
+
   list = gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (group->children));
 
   while (list)
@@ -488,6 +498,8 @@ gimp_group_layer_scale (GimpItem              *item,
                      new_width, new_height,
                      new_offset_x, new_offset_y,
                      interpolation_type, progress);
+
+  gimp_group_layer_resume_resize (group, TRUE);
 }
 
 static void
@@ -506,6 +518,8 @@ gimp_group_layer_resize (GimpItem    *item,
   x = gimp_item_get_offset_x (item) - offset_x;
   y = gimp_item_get_offset_y (item) - offset_y;
 
+  gimp_group_layer_suspend_resize (group, TRUE);
+
   list = gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (group->children));
 
   while (list)
@@ -555,6 +569,8 @@ gimp_group_layer_resize (GimpItem    *item,
   if (mask)
     gimp_item_resize (GIMP_ITEM (mask), context,
                       new_width, new_height, offset_x, offset_y);
+
+  gimp_group_layer_resume_resize (group, TRUE);
 }
 
 static void
@@ -568,6 +584,8 @@ gimp_group_layer_flip (GimpItem            *item,
   GimpLayerMask  *mask;
   GList          *list;
 
+  gimp_group_layer_suspend_resize (group, TRUE);
+
   for (list = gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (group->children));
        list;
        list = g_list_next (list))
@@ -583,6 +601,8 @@ gimp_group_layer_flip (GimpItem            *item,
   if (mask)
     gimp_item_flip (GIMP_ITEM (mask), context,
                     flip_type, axis, clip_result);
+
+  gimp_group_layer_resume_resize (group, TRUE);
 }
 
 static void
@@ -597,6 +617,8 @@ gimp_group_layer_rotate (GimpItem         *item,
   GimpLayerMask  *mask;
   GList          *list;
 
+  gimp_group_layer_suspend_resize (group, TRUE);
+
   for (list = gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (group->children));
        list;
        list = g_list_next (list))
@@ -612,6 +634,8 @@ gimp_group_layer_rotate (GimpItem         *item,
   if (mask)
     gimp_item_rotate (GIMP_ITEM (mask), context,
                       rotate_type, center_x, center_y, clip_result);
+
+  gimp_group_layer_resume_resize (group, TRUE);
 }
 
 static void
@@ -628,6 +652,8 @@ gimp_group_layer_transform (GimpItem               *item,
   GimpLayerMask  *mask;
   GList          *list;
 
+  gimp_group_layer_suspend_resize (group, TRUE);
+
   for (list = gimp_item_stack_get_item_iter (GIMP_ITEM_STACK (group->children));
        list;
        list = g_list_next (list))
@@ -647,6 +673,8 @@ gimp_group_layer_transform (GimpItem               *item,
                          matrix, direction,
                          interpolation_type, recursion_level,
                          clip_result, progress);
+
+  gimp_group_layer_resume_resize (group, TRUE);
 }
 
 static gint64
@@ -758,6 +786,52 @@ gimp_group_layer_new (GimpImage *image)
   return GIMP_LAYER (group);
 }
 
+void
+gimp_group_layer_suspend_resize (GimpGroupLayer *group,
+                                 gboolean        push_undo)
+{
+  GimpItem *item;
+
+  g_return_if_fail (GIMP_IS_GROUP_LAYER (group));
+
+  item = GIMP_ITEM (group);
+
+  if (! gimp_item_is_attached (item))
+    push_undo = FALSE;
+
+  if (push_undo)
+    gimp_image_undo_push_group_layer_suspend (gimp_item_get_image (item),
+                                              NULL, group);
+
+  group->suspend_resize++;
+}
+
+void
+gimp_group_layer_resume_resize (GimpGroupLayer *group,
+                                gboolean        push_undo)
+{
+  GimpItem *item;
+
+  g_return_if_fail (GIMP_IS_GROUP_LAYER (group));
+  g_return_if_fail (group->suspend_resize > 0);
+
+  item = GIMP_ITEM (group);
+
+  if (! gimp_item_is_attached (item))
+    push_undo = FALSE;
+
+  if (push_undo)
+    gimp_image_undo_push_group_layer_resume (gimp_item_get_image (item),
+                                             NULL, group);
+
+  group->suspend_resize--;
+
+  if (group->suspend_resize == 0)
+    {
+      gimp_group_layer_update_size (group);
+    }
+}
+
 
 /*  private functions  */
 
@@ -766,7 +840,7 @@ gimp_group_layer_child_add (GimpContainer  *container,
                             GimpLayer      *child,
                             GimpGroupLayer *group)
 {
-  gimp_group_layer_update_size (group);
+  gimp_group_layer_update (group);
 }
 
 static void
@@ -774,7 +848,7 @@ gimp_group_layer_child_remove (GimpContainer  *container,
                                GimpLayer      *child,
                                GimpGroupLayer *group)
 {
-  gimp_group_layer_update_size (group);
+  gimp_group_layer_update (group);
 }
 
 static void
@@ -782,20 +856,31 @@ gimp_group_layer_child_move (GimpLayer      *child,
                              GParamSpec     *pspec,
                              GimpGroupLayer *group)
 {
-  gimp_group_layer_update_size (group);
+  gimp_group_layer_update (group);
 }
 
 static void
 gimp_group_layer_child_resize (GimpLayer      *child,
                                GimpGroupLayer *group)
 {
-  gimp_group_layer_update_size (group);
+  gimp_group_layer_update (group);
+}
+
+static void
+gimp_group_layer_update (GimpGroupLayer *group)
+{
+  if (group->suspend_resize == 0)
+    {
+      gimp_group_layer_update_size (group);
+    }
 }
 
 static void
 gimp_group_layer_update_size (GimpGroupLayer *group)
 {
   GimpItem *item       = GIMP_ITEM (group);
+  gint      old_x      = gimp_item_get_offset_x (item);
+  gint      old_y      = gimp_item_get_offset_y (item);
   gint      old_width  = gimp_item_get_width  (item);
   gint      old_height = gimp_item_get_height (item);
   gint      x          = 0;
@@ -831,9 +916,9 @@ gimp_group_layer_update_size (GimpGroupLayer *group)
         }
     }
 
-  if (x      != gimp_item_get_offset_x (item) ||
-      y      != gimp_item_get_offset_y (item) ||
-      width  != old_width                     ||
+  if (x      != old_x     ||
+      y      != old_y     ||
+      width  != old_width ||
       height != old_height)
     {
       if (width  != old_width ||
diff --git a/app/core/gimpgrouplayer.h b/app/core/gimpgrouplayer.h
index 2635323..1f70d11 100644
--- a/app/core/gimpgrouplayer.h
+++ b/app/core/gimpgrouplayer.h
@@ -43,6 +43,7 @@ struct _GimpGroupLayer
   GimpProjection *projection;
   GeglNode       *graph;
   GeglNode       *offset_node;
+  gint            suspend_resize;
 };
 
 struct _GimpGroupLayerClass
@@ -51,9 +52,14 @@ struct _GimpGroupLayerClass
 };
 
 
-GType       gimp_group_layer_get_type (void) G_GNUC_CONST;
+GType       gimp_group_layer_get_type       (void) G_GNUC_CONST;
 
-GimpLayer * gimp_group_layer_new      (GimpImage  *image);
+GimpLayer * gimp_group_layer_new            (GimpImage      *image);
+
+void        gimp_group_layer_suspend_resize (GimpGroupLayer *group,
+                                             gboolean        push_undo);
+void        gimp_group_layer_resume_resize  (GimpGroupLayer *group,
+                                             gboolean        push_undo);
 
 
 #endif /* __GIMP_GROUP_LAYER_H__ */
diff --git a/app/core/gimpgrouplayerundo.c b/app/core/gimpgrouplayerundo.c
new file mode 100644
index 0000000..7295284
--- /dev/null
+++ b/app/core/gimpgrouplayerundo.c
@@ -0,0 +1,97 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gegl.h>
+
+#include "core-types.h"
+
+#include "gimpimage.h"
+#include "gimpgrouplayer.h"
+#include "gimpgrouplayerundo.h"
+
+
+static GObject * gimp_group_layer_undo_constructor (GType                  type,
+                                                    guint                  n_params,
+                                                    GObjectConstructParam *params);
+
+static void      gimp_group_layer_undo_pop         (GimpUndo              *undo,
+                                                    GimpUndoMode           undo_mode,
+                                                    GimpUndoAccumulator   *accum);
+
+
+G_DEFINE_TYPE (GimpGroupLayerUndo, gimp_group_layer_undo, GIMP_TYPE_ITEM_UNDO)
+
+#define parent_class gimp_group_layer_undo_parent_class
+
+
+static void
+gimp_group_layer_undo_class_init (GimpGroupLayerUndoClass *klass)
+{
+  GObjectClass  *object_class = G_OBJECT_CLASS (klass);
+  GimpUndoClass *undo_class   = GIMP_UNDO_CLASS (klass);
+
+  object_class->constructor   = gimp_group_layer_undo_constructor;
+
+  undo_class->pop             = gimp_group_layer_undo_pop;
+}
+
+static void
+gimp_group_layer_undo_init (GimpGroupLayerUndo *undo)
+{
+}
+
+static GObject *
+gimp_group_layer_undo_constructor (GType                  type,
+                                   guint                  n_params,
+                                   GObjectConstructParam *params)
+{
+  GObject *object;
+
+  object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
+
+  g_assert (GIMP_IS_GROUP_LAYER (GIMP_ITEM_UNDO (object)->item));
+
+  return object;
+}
+
+static void
+gimp_group_layer_undo_pop (GimpUndo            *undo,
+                          GimpUndoMode         undo_mode,
+                          GimpUndoAccumulator *accum)
+{
+  GimpGroupLayer *group = GIMP_GROUP_LAYER (GIMP_ITEM_UNDO (undo)->item);
+
+  GIMP_UNDO_CLASS (parent_class)->pop (undo, undo_mode, accum);
+
+  if ((undo_mode       == GIMP_UNDO_MODE_UNDO &&
+       undo->undo_type == GIMP_UNDO_GROUP_LAYER_SUSPEND) ||
+      (undo_mode       == GIMP_UNDO_MODE_REDO &&
+       undo->undo_type == GIMP_UNDO_GROUP_LAYER_RESUME))
+    {
+      /*  resume group layer auto-resizing  */
+
+      gimp_group_layer_resume_resize (group, FALSE);
+    }
+  else
+    {
+      /*  suspend group layer auto-resizing  */
+
+      gimp_group_layer_suspend_resize (group, FALSE);
+    }
+}
diff --git a/app/core/gimpgrouplayerundo.h b/app/core/gimpgrouplayerundo.h
new file mode 100644
index 0000000..f3b8168
--- /dev/null
+++ b/app/core/gimpgrouplayerundo.h
@@ -0,0 +1,49 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GIMP_GROUP_LAYER_UNDO_H__
+#define __GIMP_GROUP_LAYER_UNDO_H__
+
+
+#include "gimpitemundo.h"
+
+
+#define GIMP_TYPE_GROUP_LAYER_UNDO            (gimp_group_layer_undo_get_type ())
+#define GIMP_GROUP_LAYER_UNDO(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_GROUP_LAYER_UNDO, GimpGroupLayerUndo))
+#define GIMP_GROUP_LAYER_UNDO_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_GROUP_LAYER_UNDO, GimpGroupLayerUndoClass))
+#define GIMP_IS_GROUP_LAYER_UNDO(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_GROUP_LAYER_UNDO))
+#define GIMP_IS_GROUP_LAYER_UNDO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_GROUP_LAYER_UNDO))
+#define GIMP_GROUP_LAYER_UNDO_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_GROUP_LAYER_UNDO, GimpGroupLayerUndoClass))
+
+
+typedef struct _GimpGroupLayerUndoClass GimpGroupLayerUndoClass;
+
+struct _GimpGroupLayerUndo
+{
+  GimpItemUndo   parent_instance;
+};
+
+struct _GimpGroupLayerUndoClass
+{
+  GimpItemUndoClass  parent_class;
+};
+
+
+GType   gimp_group_layer_undo_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_GROUP_LAYER_UNDO_H__ */
diff --git a/app/core/gimpimage-undo-push.c b/app/core/gimpimage-undo-push.c
index 3098db2..47949bd 100644
--- a/app/core/gimpimage-undo-push.c
+++ b/app/core/gimpimage-undo-push.c
@@ -32,6 +32,8 @@
 #include "gimpdrawableundo.h"
 #include "gimpfloatingselundo.h"
 #include "gimpgrid.h"
+#include "gimpgrouplayer.h"
+#include "gimpgrouplayerundo.h"
 #include "gimpguide.h"
 #include "gimpguideundo.h"
 #include "gimpimage.h"
@@ -39,7 +41,6 @@
 #include "gimpimage-undo-push.h"
 #include "gimpimageundo.h"
 #include "gimpitempropundo.h"
-#include "gimplayer.h"
 #include "gimplayermask.h"
 #include "gimplayermaskpropundo.h"
 #include "gimplayermaskundo.h"
@@ -514,6 +515,43 @@ gimp_image_undo_push_layer_lock_alpha (GimpImage   *image,
 }
 
 
+/***********************/
+/*  Group Layer Undos  */
+/***********************/
+
+GimpUndo *
+gimp_image_undo_push_group_layer_suspend (GimpImage      *image,
+                                          const gchar    *undo_desc,
+                                          GimpGroupLayer *group)
+{
+  g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
+  g_return_val_if_fail (GIMP_IS_GROUP_LAYER (group), NULL);
+  g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (group)), NULL);
+
+  return gimp_image_undo_push (image, GIMP_TYPE_GROUP_LAYER_UNDO,
+                               GIMP_UNDO_GROUP_LAYER_SUSPEND, undo_desc,
+                               GIMP_DIRTY_ITEM | GIMP_DIRTY_DRAWABLE,
+                               "item",  group,
+                               NULL);
+}
+
+GimpUndo *
+gimp_image_undo_push_group_layer_resume (GimpImage      *image,
+                                         const gchar    *undo_desc,
+                                         GimpGroupLayer *group)
+{
+  g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
+  g_return_val_if_fail (GIMP_IS_GROUP_LAYER (group), NULL);
+  g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (group)), NULL);
+
+  return gimp_image_undo_push (image, GIMP_TYPE_GROUP_LAYER_UNDO,
+                               GIMP_UNDO_GROUP_LAYER_RESUME, undo_desc,
+                               GIMP_DIRTY_ITEM | GIMP_DIRTY_DRAWABLE,
+                               "item",  group,
+                               NULL);
+}
+
+
 /**********************/
 /*  Text Layer Undos  */
 /**********************/
diff --git a/app/core/gimpimage-undo-push.h b/app/core/gimpimage-undo-push.h
index 71a654f..e933e70 100644
--- a/app/core/gimpimage-undo-push.h
+++ b/app/core/gimpimage-undo-push.h
@@ -128,6 +128,16 @@ GimpUndo * gimp_image_undo_push_layer_lock_alpha    (GimpImage     *image,
                                                      GimpLayer     *layer);
 
 
+/*  group layer undos  */
+
+GimpUndo * gimp_image_undo_push_group_layer_suspend (GimpImage      *image,
+                                                     const gchar    *undo_desc,
+                                                     GimpGroupLayer *group);
+GimpUndo * gimp_image_undo_push_group_layer_resume  (GimpImage      *image,
+                                                     const gchar    *undo_desc,
+                                                     GimpGroupLayer *group);
+
+
 /*  text layer undos  */
 
 GimpUndo * gimp_image_undo_push_text_layer          (GimpImage     *image,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]