[gimp] pdb: add gimp_image_insert_layer,channel,vectors()



commit a547c5d20055e6dcd14f55cbb97d48c5b729288f
Author: Michael Natterer <mitch gimp org>
Date:   Sun Sep 5 23:54:23 2010 +0200

    pdb: add gimp_image_insert_layer,channel,vectors()
    
    which all take "parent" parameters and allow to insert items in a
    tree. We don't have channel or vectors trees (yet) but API symmetry is
    more important here than a currently useless parameter.

 app/pdb/image-cmds.c       |  254 +++++++++++++++++++++++++++++++++++++++++++-
 app/pdb/internal-procs.c   |    2 +-
 libgimp/gimp.def           |    3 +
 libgimp/gimpimage_pdb.c    |  125 +++++++++++++++++++++-
 libgimp/gimpimage_pdb.h    |   12 ++
 tools/pdbgen/pdb/image.pdb |  145 ++++++++++++++++++++++++-
 6 files changed, 533 insertions(+), 8 deletions(-)
---
diff --git a/app/pdb/image-cmds.c b/app/pdb/image-cmds.c
index df4c6cb..e967d10 100644
--- a/app/pdb/image-cmds.c
+++ b/app/pdb/image-cmds.c
@@ -931,6 +931,51 @@ image_add_layer_invoker (GimpProcedure      *procedure,
 }
 
 static GValueArray *
+image_insert_layer_invoker (GimpProcedure      *procedure,
+                            Gimp               *gimp,
+                            GimpContext        *context,
+                            GimpProgress       *progress,
+                            const GValueArray  *args,
+                            GError            **error)
+{
+  gboolean success = TRUE;
+  GimpImage *image;
+  GimpLayer *layer;
+  GimpLayer *parent;
+  gint32 position;
+
+  image = gimp_value_get_image (&args->values[0], gimp);
+  layer = gimp_value_get_layer (&args->values[1], gimp);
+  parent = gimp_value_get_layer (&args->values[2], gimp);
+  position = g_value_get_int (&args->values[3]);
+
+  if (success)
+    {
+      if (gimp_pdb_item_is_floating (GIMP_ITEM (layer), image, error) &&
+          gimp_pdb_image_is_base_type (image,
+                                       GIMP_IMAGE_TYPE_BASE_TYPE (gimp_drawable_type (GIMP_DRAWABLE (layer))),
+                                       error) &&
+          (parent == NULL ||
+           (gimp_pdb_item_is_in_tree (GIMP_ITEM (parent), image, FALSE, error) &&
+            gimp_pdb_item_is_group (GIMP_ITEM (parent), error))))
+        {
+          if (position == -1 && parent == NULL)
+            parent = GIMP_IMAGE_ACTIVE_PARENT;
+
+          success = gimp_image_add_layer (image, layer,
+                                          parent, MAX (position, -1), TRUE);
+        }
+      else
+        {
+          success = FALSE;
+        }
+    }
+
+  return gimp_procedure_get_return_values (procedure, success,
+                                           error ? *error : NULL);
+}
+
+static GValueArray *
 image_remove_layer_invoker (GimpProcedure      *procedure,
                             Gimp               *gimp,
                             GimpContext        *context,
@@ -993,6 +1038,48 @@ image_add_channel_invoker (GimpProcedure      *procedure,
 }
 
 static GValueArray *
+image_insert_channel_invoker (GimpProcedure      *procedure,
+                              Gimp               *gimp,
+                              GimpContext        *context,
+                              GimpProgress       *progress,
+                              const GValueArray  *args,
+                              GError            **error)
+{
+  gboolean success = TRUE;
+  GimpImage *image;
+  GimpChannel *channel;
+  GimpChannel *parent;
+  gint32 position;
+
+  image = gimp_value_get_image (&args->values[0], gimp);
+  channel = gimp_value_get_channel (&args->values[1], gimp);
+  parent = gimp_value_get_channel (&args->values[2], gimp);
+  position = g_value_get_int (&args->values[3]);
+
+  if (success)
+    {
+      if (gimp_pdb_item_is_floating (GIMP_ITEM (channel), image, error) &&
+          (parent == NULL ||
+           (gimp_pdb_item_is_in_tree (GIMP_ITEM (parent), image, FALSE, error) &&
+            gimp_pdb_item_is_group (GIMP_ITEM (parent), error))))
+        {
+          if (position == -1 && parent == NULL)
+            parent = GIMP_IMAGE_ACTIVE_PARENT;
+
+          success = gimp_image_add_channel (image, channel,
+                                            parent, MAX (position, -1), TRUE);
+        }
+      else
+        {
+          success = FALSE;
+        }
+    }
+
+  return gimp_procedure_get_return_values (procedure, success,
+                                           error ? *error : NULL);
+}
+
+static GValueArray *
 image_remove_channel_invoker (GimpProcedure      *procedure,
                               Gimp               *gimp,
                               GimpContext        *context,
@@ -1055,6 +1142,48 @@ image_add_vectors_invoker (GimpProcedure      *procedure,
 }
 
 static GValueArray *
+image_insert_vectors_invoker (GimpProcedure      *procedure,
+                              Gimp               *gimp,
+                              GimpContext        *context,
+                              GimpProgress       *progress,
+                              const GValueArray  *args,
+                              GError            **error)
+{
+  gboolean success = TRUE;
+  GimpImage *image;
+  GimpVectors *vectors;
+  GimpVectors *parent;
+  gint32 position;
+
+  image = gimp_value_get_image (&args->values[0], gimp);
+  vectors = gimp_value_get_vectors (&args->values[1], gimp);
+  parent = gimp_value_get_vectors (&args->values[2], gimp);
+  position = g_value_get_int (&args->values[3]);
+
+  if (success)
+    {
+      if (gimp_pdb_item_is_floating (GIMP_ITEM (vectors), image, error) &&
+          (parent == NULL ||
+           (gimp_pdb_item_is_in_tree (GIMP_ITEM (parent), image, FALSE, error) &&
+            gimp_pdb_item_is_group (GIMP_ITEM (parent), error))))
+        {
+          if (position == -1 && parent == NULL)
+            parent = GIMP_IMAGE_ACTIVE_PARENT;
+
+          success = gimp_image_add_vectors (image, vectors,
+                                            parent, MAX (position, -1), TRUE);
+        }
+      else
+        {
+          success = FALSE;
+        }
+    }
+
+  return gimp_procedure_get_return_values (procedure, success,
+                                           error ? *error : NULL);
+}
+
+static GValueArray *
 image_remove_vectors_invoker (GimpProcedure      *procedure,
                               Gimp               *gimp,
                               GimpContext        *context,
@@ -2803,7 +2932,7 @@ register_image_procs (GimpPDB *pdb)
   gimp_procedure_set_static_strings (procedure,
                                      "gimp-image-new",
                                      "Creates a new image with the specified width, height, and type.",
-                                     "Creates a new image, undisplayed with the specified extents and type. A layer should be created and added before this image is displayed, or subsequent calls to 'gimp-display-new' with this image as an argument will fail. Layers can be created using the 'gimp-layer-new' commands. They can be added to an image using the 'gimp-image-add-layer' command.",
+                                     "Creates a new image, undisplayed with the specified extents and type. A layer should be created and added before this image is displayed, or subsequent calls to 'gimp-display-new' with this image as an argument will fail. Layers can be created using the 'gimp-layer-new' commands. They can be added to an image using the 'gimp-image-insert-layer' command.",
                                      "Spencer Kimball & Peter Mattis",
                                      "Spencer Kimball & Peter Mattis",
                                      "1995-1996",
@@ -3610,6 +3739,47 @@ register_image_procs (GimpPDB *pdb)
   g_object_unref (procedure);
 
   /*
+   * gimp-image-insert-layer
+   */
+  procedure = gimp_procedure_new (image_insert_layer_invoker);
+  gimp_object_set_static_name (GIMP_OBJECT (procedure),
+                               "gimp-image-insert-layer");
+  gimp_procedure_set_static_strings (procedure,
+                                     "gimp-image-insert-layer",
+                                     "Add the specified layer to the image.",
+                                     "This procedure adds the specified layer to the image at the given position. If the position is specified as -1 and the parent is specified as NULL, then the layer is inserted above the active layer. The layer type must be compatible with the image base type.",
+                                     "Spencer Kimball & Peter Mattis",
+                                     "Spencer Kimball & Peter Mattis",
+                                     "1995-1996",
+                                     NULL);
+  gimp_procedure_add_argument (procedure,
+                               gimp_param_spec_image_id ("image",
+                                                         "image",
+                                                         "The image",
+                                                         pdb->gimp, FALSE,
+                                                         GIMP_PARAM_READWRITE));
+  gimp_procedure_add_argument (procedure,
+                               gimp_param_spec_layer_id ("layer",
+                                                         "layer",
+                                                         "The layer",
+                                                         pdb->gimp, FALSE,
+                                                         GIMP_PARAM_READWRITE));
+  gimp_procedure_add_argument (procedure,
+                               gimp_param_spec_layer_id ("parent",
+                                                         "parent",
+                                                         "The parent layer",
+                                                         pdb->gimp, FALSE,
+                                                         GIMP_PARAM_READWRITE));
+  gimp_procedure_add_argument (procedure,
+                               gimp_param_spec_int32 ("position",
+                                                      "position",
+                                                      "The layer position",
+                                                      G_MININT32, G_MAXINT32, 0,
+                                                      GIMP_PARAM_READWRITE));
+  gimp_pdb_register_procedure (pdb, procedure);
+  g_object_unref (procedure);
+
+  /*
    * gimp-image-remove-layer
    */
   procedure = gimp_procedure_new (image_remove_layer_invoker);
@@ -3674,6 +3844,47 @@ register_image_procs (GimpPDB *pdb)
   g_object_unref (procedure);
 
   /*
+   * gimp-image-insert-channel
+   */
+  procedure = gimp_procedure_new (image_insert_channel_invoker);
+  gimp_object_set_static_name (GIMP_OBJECT (procedure),
+                               "gimp-image-insert-channel");
+  gimp_procedure_set_static_strings (procedure,
+                                     "gimp-image-insert-channel",
+                                     "Add the specified channel to the image.",
+                                     "This procedure adds the specified channel to the image at the given position. If the position is specified as -1 and the parent is specified as NULL, then the channel is inserted above the active channel.",
+                                     "Spencer Kimball & Peter Mattis",
+                                     "Spencer Kimball & Peter Mattis",
+                                     "1995-1996",
+                                     NULL);
+  gimp_procedure_add_argument (procedure,
+                               gimp_param_spec_image_id ("image",
+                                                         "image",
+                                                         "The image",
+                                                         pdb->gimp, FALSE,
+                                                         GIMP_PARAM_READWRITE));
+  gimp_procedure_add_argument (procedure,
+                               gimp_param_spec_channel_id ("channel",
+                                                           "channel",
+                                                           "The channel",
+                                                           pdb->gimp, FALSE,
+                                                           GIMP_PARAM_READWRITE));
+  gimp_procedure_add_argument (procedure,
+                               gimp_param_spec_channel_id ("parent",
+                                                           "parent",
+                                                           "The parent channel",
+                                                           pdb->gimp, FALSE,
+                                                           GIMP_PARAM_READWRITE));
+  gimp_procedure_add_argument (procedure,
+                               gimp_param_spec_int32 ("position",
+                                                      "position",
+                                                      "The channel position",
+                                                      G_MININT32, G_MAXINT32, 0,
+                                                      GIMP_PARAM_READWRITE));
+  gimp_pdb_register_procedure (pdb, procedure);
+  g_object_unref (procedure);
+
+  /*
    * gimp-image-remove-channel
    */
   procedure = gimp_procedure_new (image_remove_channel_invoker);
@@ -3738,6 +3949,47 @@ register_image_procs (GimpPDB *pdb)
   g_object_unref (procedure);
 
   /*
+   * gimp-image-insert-vectors
+   */
+  procedure = gimp_procedure_new (image_insert_vectors_invoker);
+  gimp_object_set_static_name (GIMP_OBJECT (procedure),
+                               "gimp-image-insert-vectors");
+  gimp_procedure_set_static_strings (procedure,
+                                     "gimp-image-insert-vectors",
+                                     "Add the specified vectors to the image.",
+                                     "This procedure adds the specified vectors to the image at the given position. If the position is specified as -1 and the parent is specified as NULL, then the vectors is inserted above the active vectors.",
+                                     "Spencer Kimball & Peter Mattis",
+                                     "Spencer Kimball & Peter Mattis",
+                                     "1995-1996",
+                                     NULL);
+  gimp_procedure_add_argument (procedure,
+                               gimp_param_spec_image_id ("image",
+                                                         "image",
+                                                         "The image",
+                                                         pdb->gimp, FALSE,
+                                                         GIMP_PARAM_READWRITE));
+  gimp_procedure_add_argument (procedure,
+                               gimp_param_spec_vectors_id ("vectors",
+                                                           "vectors",
+                                                           "The vectors",
+                                                           pdb->gimp, FALSE,
+                                                           GIMP_PARAM_READWRITE));
+  gimp_procedure_add_argument (procedure,
+                               gimp_param_spec_vectors_id ("parent",
+                                                           "parent",
+                                                           "The parent vectors",
+                                                           pdb->gimp, FALSE,
+                                                           GIMP_PARAM_READWRITE));
+  gimp_procedure_add_argument (procedure,
+                               gimp_param_spec_int32 ("position",
+                                                      "position",
+                                                      "The vectors position",
+                                                      G_MININT32, G_MAXINT32, 0,
+                                                      GIMP_PARAM_READWRITE));
+  gimp_pdb_register_procedure (pdb, procedure);
+  g_object_unref (procedure);
+
+  /*
    * gimp-image-remove-vectors
    */
   procedure = gimp_procedure_new (image_remove_vectors_invoker);
diff --git a/app/pdb/internal-procs.c b/app/pdb/internal-procs.c
index 0bc96a4..dad1125 100644
--- a/app/pdb/internal-procs.c
+++ b/app/pdb/internal-procs.c
@@ -28,7 +28,7 @@
 #include "internal-procs.h"
 
 
-/* 637 procedures registered total */
+/* 640 procedures registered total */
 
 void
 internal_procs_init (GimpPDB *pdb)
diff --git a/libgimp/gimp.def b/libgimp/gimp.def
index 3c6144b..2dfac04 100644
--- a/libgimp/gimp.def
+++ b/libgimp/gimp.def
@@ -361,6 +361,9 @@ EXPORTS
 	gimp_image_grid_set_spacing
 	gimp_image_grid_set_style
 	gimp_image_height
+	gimp_image_insert_channel
+	gimp_image_insert_layer
+	gimp_image_insert_vectors
 	gimp_image_is_dirty
 	gimp_image_is_valid
 	gimp_image_list
diff --git a/libgimp/gimpimage_pdb.c b/libgimp/gimpimage_pdb.c
index 6f13e69..9d39ae4 100644
--- a/libgimp/gimpimage_pdb.c
+++ b/libgimp/gimpimage_pdb.c
@@ -123,7 +123,7 @@ gimp_image_list (gint *num_images)
  * displayed, or subsequent calls to gimp_display_new() with this image
  * as an argument will fail. Layers can be created using the
  * gimp_layer_new() commands. They can be added to an image using the
- * gimp_image_add_layer() command.
+ * gimp_image_insert_layer() command.
  *
  * Returns: The ID of the newly created image.
  */
@@ -1007,6 +1007,47 @@ gimp_image_add_layer (gint32 image_ID,
 }
 
 /**
+ * gimp_image_insert_layer:
+ * @image_ID: The image.
+ * @layer_ID: The layer.
+ * @parent_ID: The parent layer.
+ * @position: The layer position.
+ *
+ * Add the specified layer to the image.
+ *
+ * This procedure adds the specified layer to the image at the given
+ * position. If the position is specified as -1 and the parent is
+ * specified as NULL, then the layer is inserted above the active
+ * layer. The layer type must be compatible with the image base type.
+ *
+ * Returns: TRUE on success.
+ */
+gboolean
+gimp_image_insert_layer (gint32 image_ID,
+                         gint32 layer_ID,
+                         gint32 parent_ID,
+                         gint   position)
+{
+  GimpParam *return_vals;
+  gint nreturn_vals;
+  gboolean success = TRUE;
+
+  return_vals = gimp_run_procedure ("gimp-image-insert-layer",
+                                    &nreturn_vals,
+                                    GIMP_PDB_IMAGE, image_ID,
+                                    GIMP_PDB_LAYER, layer_ID,
+                                    GIMP_PDB_LAYER, parent_ID,
+                                    GIMP_PDB_INT32, position,
+                                    GIMP_PDB_END);
+
+  success = return_vals[0].data.d_status == GIMP_PDB_SUCCESS;
+
+  gimp_destroy_params (return_vals, nreturn_vals);
+
+  return success;
+}
+
+/**
  * gimp_image_remove_layer:
  * @image_ID: The image.
  * @layer_ID: The layer.
@@ -1081,6 +1122,47 @@ gimp_image_add_channel (gint32 image_ID,
 }
 
 /**
+ * gimp_image_insert_channel:
+ * @image_ID: The image.
+ * @channel_ID: The channel.
+ * @parent_ID: The parent channel.
+ * @position: The channel position.
+ *
+ * Add the specified channel to the image.
+ *
+ * This procedure adds the specified channel to the image at the given
+ * position. If the position is specified as -1 and the parent is
+ * specified as NULL, then the channel is inserted above the active
+ * channel.
+ *
+ * Returns: TRUE on success.
+ */
+gboolean
+gimp_image_insert_channel (gint32 image_ID,
+                           gint32 channel_ID,
+                           gint32 parent_ID,
+                           gint   position)
+{
+  GimpParam *return_vals;
+  gint nreturn_vals;
+  gboolean success = TRUE;
+
+  return_vals = gimp_run_procedure ("gimp-image-insert-channel",
+                                    &nreturn_vals,
+                                    GIMP_PDB_IMAGE, image_ID,
+                                    GIMP_PDB_CHANNEL, channel_ID,
+                                    GIMP_PDB_CHANNEL, parent_ID,
+                                    GIMP_PDB_INT32, position,
+                                    GIMP_PDB_END);
+
+  success = return_vals[0].data.d_status == GIMP_PDB_SUCCESS;
+
+  gimp_destroy_params (return_vals, nreturn_vals);
+
+  return success;
+}
+
+/**
  * gimp_image_remove_channel:
  * @image_ID: The image.
  * @channel_ID: The channel.
@@ -1151,6 +1233,47 @@ gimp_image_add_vectors (gint32 image_ID,
 }
 
 /**
+ * gimp_image_insert_vectors:
+ * @image_ID: The image.
+ * @vectors_ID: The vectors.
+ * @parent_ID: The parent vectors.
+ * @position: The vectors position.
+ *
+ * Add the specified vectors to the image.
+ *
+ * This procedure adds the specified vectors to the image at the given
+ * position. If the position is specified as -1 and the parent is
+ * specified as NULL, then the vectors is inserted above the active
+ * vectors.
+ *
+ * Returns: TRUE on success.
+ */
+gboolean
+gimp_image_insert_vectors (gint32 image_ID,
+                           gint32 vectors_ID,
+                           gint32 parent_ID,
+                           gint   position)
+{
+  GimpParam *return_vals;
+  gint nreturn_vals;
+  gboolean success = TRUE;
+
+  return_vals = gimp_run_procedure ("gimp-image-insert-vectors",
+                                    &nreturn_vals,
+                                    GIMP_PDB_IMAGE, image_ID,
+                                    GIMP_PDB_VECTORS, vectors_ID,
+                                    GIMP_PDB_VECTORS, parent_ID,
+                                    GIMP_PDB_INT32, position,
+                                    GIMP_PDB_END);
+
+  success = return_vals[0].data.d_status == GIMP_PDB_SUCCESS;
+
+  gimp_destroy_params (return_vals, nreturn_vals);
+
+  return success;
+}
+
+/**
  * gimp_image_remove_vectors:
  * @image_ID: The image.
  * @vectors_ID: The vectors object.
diff --git a/libgimp/gimpimage_pdb.h b/libgimp/gimpimage_pdb.h
index e903f19..af8cb29 100644
--- a/libgimp/gimpimage_pdb.h
+++ b/libgimp/gimpimage_pdb.h
@@ -87,16 +87,28 @@ gint32                   gimp_image_pick_correlate_layer     (gint32
 gboolean                 gimp_image_add_layer                (gint32                  image_ID,
                                                               gint32                  layer_ID,
                                                               gint                    position);
+gboolean                 gimp_image_insert_layer             (gint32                  image_ID,
+                                                              gint32                  layer_ID,
+                                                              gint32                  parent_ID,
+                                                              gint                    position);
 gboolean                 gimp_image_remove_layer             (gint32                  image_ID,
                                                               gint32                  layer_ID);
 gboolean                 gimp_image_add_channel              (gint32                  image_ID,
                                                               gint32                  channel_ID,
                                                               gint                    position);
+gboolean                 gimp_image_insert_channel           (gint32                  image_ID,
+                                                              gint32                  channel_ID,
+                                                              gint32                  parent_ID,
+                                                              gint                    position);
 gboolean                 gimp_image_remove_channel           (gint32                  image_ID,
                                                               gint32                  channel_ID);
 gboolean                 gimp_image_add_vectors              (gint32                  image_ID,
                                                               gint32                  vectors_ID,
                                                               gint                    position);
+gboolean                 gimp_image_insert_vectors           (gint32                  image_ID,
+                                                              gint32                  vectors_ID,
+                                                              gint32                  parent_ID,
+                                                              gint                    position);
 gboolean                 gimp_image_remove_vectors           (gint32                  image_ID,
                                                               gint32                  vectors_ID);
 gint                     gimp_image_get_item_position        (gint32                  image_ID,
diff --git a/tools/pdbgen/pdb/image.pdb b/tools/pdbgen/pdb/image.pdb
index 730e0f7..ee0b47d 100644
--- a/tools/pdbgen/pdb/image.pdb
+++ b/tools/pdbgen/pdb/image.pdb
@@ -91,7 +91,7 @@ type. A layer should be created and added before this image is
 displayed, or subsequent calls to gimp_display_new() with this image
 as an argument will fail. Layers can be created using the
 gimp_layer_new() commands. They can be added to an image using the
-gimp_image_add_layer() command.
+gimp_image_insert_layer() command.
 HELP
 
     &std_pdb_misc;
@@ -1200,6 +1200,53 @@ HELP
 CODE
 }
 
+sub image_insert_layer {
+    $blurb = 'Add the specified layer to the image.';
+
+    $help = <<'HELP';
+This procedure adds the specified layer to the image at the given
+position.  If the position is specified as -1 and the parent is
+specified as NULL, then the layer is inserted above the active
+layer. The layer type must be compatible with the image base type.
+HELP
+
+    &std_pdb_misc;
+
+    @inargs = (
+	{ name => 'image', type => 'image',
+	  desc => 'The image' },
+	{ name => 'layer', type => 'layer',
+	  desc => 'The layer' },
+	{ name => 'parent', type => 'layer',
+          desc => 'The parent layer' },
+	{ name => 'position', type => 'int32',
+	  desc => 'The layer position' }
+    );
+
+    $invoke{code} = <<'CODE';
+{
+  if (gimp_pdb_item_is_floating (GIMP_ITEM (layer), image, error) &&
+      gimp_pdb_image_is_base_type (image,
+				   GIMP_IMAGE_TYPE_BASE_TYPE (gimp_drawable_type (GIMP_DRAWABLE (layer))),
+				   error) &&
+      (parent == NULL ||
+       (gimp_pdb_item_is_in_tree (GIMP_ITEM (parent), image, FALSE, error) &&
+        gimp_pdb_item_is_group (GIMP_ITEM (parent), error))))
+    {
+      if (position == -1 && parent == NULL)
+        parent = GIMP_IMAGE_ACTIVE_PARENT;
+
+      success = gimp_image_add_layer (image, layer,
+                                      parent, MAX (position, -1), TRUE);
+    }
+  else
+    {
+      success = FALSE;
+    }
+}
+CODE
+}
+
 sub image_remove_layer {
     $blurb = 'Remove the specified layer from the image.';
 
@@ -1394,6 +1441,50 @@ CODE
     );
 }
 
+sub image_insert_channel {
+    $blurb = 'Add the specified channel to the image.';
+
+    $help = <<'HELP';
+This procedure adds the specified channel to the image at the given
+position.  If the position is specified as -1 and the parent is
+specified as NULL, then the channel is inserted above the active
+channel.
+HELP
+
+    &std_pdb_misc;
+
+    @inargs = (
+	{ name => 'image', type => 'image',
+	  desc => 'The image' },
+	{ name => 'channel', type => 'channel',
+	  desc => 'The channel' },
+	{ name => 'parent', type => 'channel',
+          desc => 'The parent channel' },
+	{ name => 'position', type => 'int32',
+	  desc => 'The channel position' }
+    );
+
+    $invoke{code} = <<'CODE';
+{
+  if (gimp_pdb_item_is_floating (GIMP_ITEM (channel), image, error) &&
+      (parent == NULL ||
+       (gimp_pdb_item_is_in_tree (GIMP_ITEM (parent), image, FALSE, error) &&
+        gimp_pdb_item_is_group (GIMP_ITEM (parent), error))))
+    {
+      if (position == -1 && parent == NULL)
+        parent = GIMP_IMAGE_ACTIVE_PARENT;
+
+      success = gimp_image_add_channel (image, channel,
+                                        parent, MAX (position, -1), TRUE);
+    }
+  else
+    {
+      success = FALSE;
+    }
+}
+CODE
+}
+
 sub image_remove_channel {
     $blurb = 'Remove the specified channel from the image.';
 
@@ -1459,6 +1550,50 @@ HELP
 CODE
 }
 
+sub image_insert_vectors {
+    $blurb = 'Add the specified vectors to the image.';
+
+    $help = <<'HELP';
+This procedure adds the specified vectors to the image at the given
+position.  If the position is specified as -1 and the parent is
+specified as NULL, then the vectors is inserted above the active
+vectors.
+HELP
+
+    &std_pdb_misc;
+
+    @inargs = (
+	{ name => 'image', type => 'image',
+	  desc => 'The image' },
+	{ name => 'vectors', type => 'vectors',
+	  desc => 'The vectors' },
+	{ name => 'parent', type => 'vectors',
+          desc => 'The parent vectors' },
+	{ name => 'position', type => 'int32',
+	  desc => 'The vectors position' }
+    );
+
+    $invoke{code} = <<'CODE';
+{
+  if (gimp_pdb_item_is_floating (GIMP_ITEM (vectors), image, error) &&
+      (parent == NULL ||
+       (gimp_pdb_item_is_in_tree (GIMP_ITEM (parent), image, FALSE, error) &&
+        gimp_pdb_item_is_group (GIMP_ITEM (parent), error))))
+    {
+      if (position == -1 && parent == NULL)
+        parent = GIMP_IMAGE_ACTIVE_PARENT;
+
+      success = gimp_image_add_vectors (image, vectors,
+                                        parent, MAX (position, -1), TRUE);
+    }
+  else
+    {
+      success = FALSE;
+    }
+}
+CODE
+}
+
 sub image_remove_vectors {
     $blurb = 'Remove the specified path from the image.';
 
@@ -2816,9 +2951,9 @@ CODE
             image_floating_sel_attached_to
             image_pick_color
             image_pick_correlate_layer
-            image_add_layer image_remove_layer
-            image_add_channel image_remove_channel
-            image_add_vectors image_remove_vectors
+            image_add_layer image_insert_layer image_remove_layer
+            image_add_channel image_insert_channel image_remove_channel
+            image_add_vectors image_insert_vectors image_remove_vectors
             image_get_item_position
             image_raise_item image_lower_item
             image_raise_item_to_top image_lower_item_to_bottom
@@ -2852,7 +2987,7 @@ CODE
             image_get_channel_by_tattoo
             image_get_vectors_by_tattoo);
 
-%exports = (app => [ procs], lib => [ procs[0  52,55..83]]);
+%exports = (app => [ procs], lib => [ procs[0  55,58..86]]);
 
 $desc = 'Image';
 $doc_title = 'gimpimage';



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