[gimp/gimp-2-10] pdb: add gimp-image-merge-layer-group procedure



commit b4635741e6f40796368b3a53c9731fac45f6dfaa
Author: Ell <ell_se yahoo com>
Date:   Sat Sep 7 10:20:03 2019 +0300

    pdb: add gimp-image-merge-layer-group procedure
    
    Oddly, we didn't have this one yet :P
    
    (cherry picked from commit 62a6023b27e741c35f4a3d9afc9df0356d18f19c)

 app/pdb/image-cmds.c     | 77 ++++++++++++++++++++++++++++++++++++++++++++++++
 app/pdb/internal-procs.c |  2 +-
 libgimp/gimp.def         |  1 +
 libgimp/gimpimage_pdb.c  | 34 +++++++++++++++++++++
 libgimp/gimpimage_pdb.h  |  2 ++
 pdb/groups/image.pdb     | 47 +++++++++++++++++++++++++++--
 6 files changed, 160 insertions(+), 3 deletions(-)
---
diff --git a/app/pdb/image-cmds.c b/app/pdb/image-cmds.c
index 4b0af1427b..96925e1b4b 100644
--- a/app/pdb/image-cmds.c
+++ b/app/pdb/image-cmds.c
@@ -37,6 +37,7 @@
 #include "core/gimpchannel.h"
 #include "core/gimpcontainer.h"
 #include "core/gimpdrawable.h"
+#include "core/gimpgrouplayer.h"
 #include "core/gimpimage-colormap.h"
 #include "core/gimpimage-duplicate.h"
 #include "core/gimpimage-merge.h"
@@ -1578,6 +1579,47 @@ image_merge_down_invoker (GimpProcedure         *procedure,
   return return_vals;
 }
 
+static GimpValueArray *
+image_merge_layer_group_invoker (GimpProcedure         *procedure,
+                                 Gimp                  *gimp,
+                                 GimpContext           *context,
+                                 GimpProgress          *progress,
+                                 const GimpValueArray  *args,
+                                 GError               **error)
+{
+  gboolean success = TRUE;
+  GimpValueArray *return_vals;
+  GimpImage *image;
+  GimpLayer *layer_group;
+  GimpLayer *layer = NULL;
+
+  image = gimp_value_get_image (gimp_value_array_index (args, 0), gimp);
+  layer_group = gimp_value_get_layer (gimp_value_array_index (args, 1), gimp);
+
+  if (success)
+    {
+      if (gimp_pdb_item_is_attached (GIMP_ITEM (layer_group), image, 0, error) &&
+          gimp_pdb_item_is_group (GIMP_ITEM (layer_group), error))
+        {
+          layer = gimp_image_merge_group_layer (image,
+                                                GIMP_GROUP_LAYER (layer_group));
+
+          if (! layer)
+            success = FALSE;
+        }
+      else
+        success = FALSE;
+    }
+
+  return_vals = gimp_procedure_get_return_values (procedure, success,
+                                                  error ? *error : NULL);
+
+  if (success)
+    gimp_value_set_layer (gimp_value_array_index (return_vals, 1), layer);
+
+  return return_vals;
+}
+
 static GimpValueArray *
 image_add_layer_mask_invoker (GimpProcedure         *procedure,
                               Gimp                  *gimp,
@@ -4413,6 +4455,41 @@ register_image_procs (GimpPDB *pdb)
   gimp_pdb_register_procedure (pdb, procedure);
   g_object_unref (procedure);
 
+  /*
+   * gimp-image-merge-layer-group
+   */
+  procedure = gimp_procedure_new (image_merge_layer_group_invoker);
+  gimp_object_set_static_name (GIMP_OBJECT (procedure),
+                               "gimp-image-merge-layer-group");
+  gimp_procedure_set_static_strings (procedure,
+                                     "gimp-image-merge-layer-group",
+                                     "Merge the passed layer group's layers into one normal layer.",
+                                     "This procedure combines the layers of the passed layer group into a 
single normal layer, replacing the group.",
+                                     "Ell",
+                                     "Ell",
+                                     "2019",
+                                     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-group",
+                                                         "layer group",
+                                                         "The layer group to merge",
+                                                         pdb->gimp, FALSE,
+                                                         GIMP_PARAM_READWRITE));
+  gimp_procedure_add_return_value (procedure,
+                                   gimp_param_spec_layer_id ("layer",
+                                                             "layer",
+                                                             "The resulting layer",
+                                                             pdb->gimp, FALSE,
+                                                             GIMP_PARAM_READWRITE));
+  gimp_pdb_register_procedure (pdb, procedure);
+  g_object_unref (procedure);
+
   /*
    * gimp-image-add-layer-mask
    */
diff --git a/app/pdb/internal-procs.c b/app/pdb/internal-procs.c
index 665656969b..6363937669 100644
--- a/app/pdb/internal-procs.c
+++ b/app/pdb/internal-procs.c
@@ -28,7 +28,7 @@
 #include "internal-procs.h"
 
 
-/* 848 procedures registered total */
+/* 849 procedures registered total */
 
 void
 internal_procs_init (GimpPDB *pdb)
diff --git a/libgimp/gimp.def b/libgimp/gimp.def
index 4a0b694e68..55ac09e384 100644
--- a/libgimp/gimp.def
+++ b/libgimp/gimp.def
@@ -520,6 +520,7 @@ EXPORTS
        gimp_image_lower_vectors
        gimp_image_lower_vectors_to_bottom
        gimp_image_merge_down
+       gimp_image_merge_layer_group
        gimp_image_merge_visible_layers
        gimp_image_new
        gimp_image_new_with_precision
diff --git a/libgimp/gimpimage_pdb.c b/libgimp/gimpimage_pdb.c
index e580f13075..b5cab3bbe2 100644
--- a/libgimp/gimpimage_pdb.c
+++ b/libgimp/gimpimage_pdb.c
@@ -1697,6 +1697,40 @@ gimp_image_merge_down (gint32        image_ID,
   return layer_ID;
 }
 
+/**
+ * gimp_image_merge_layer_group:
+ * @image_ID: The image.
+ * @layer_group_ID: The layer group to merge.
+ *
+ * Merge the passed layer group's layers into one normal layer.
+ *
+ * This procedure combines the layers of the passed layer group into a
+ * single normal layer, replacing the group.
+ *
+ * Returns: The resulting layer.
+ **/
+gint32
+gimp_image_merge_layer_group (gint32 image_ID,
+                              gint32 layer_group_ID)
+{
+  GimpParam *return_vals;
+  gint nreturn_vals;
+  gint32 layer_ID = -1;
+
+  return_vals = gimp_run_procedure ("gimp-image-merge-layer-group",
+                                    &nreturn_vals,
+                                    GIMP_PDB_IMAGE, image_ID,
+                                    GIMP_PDB_LAYER, layer_group_ID,
+                                    GIMP_PDB_END);
+
+  if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
+    layer_ID = return_vals[1].data.d_layer;
+
+  gimp_destroy_params (return_vals, nreturn_vals);
+
+  return layer_ID;
+}
+
 /**
  * _gimp_image_get_colormap:
  * @image_ID: The image.
diff --git a/libgimp/gimpimage_pdb.h b/libgimp/gimpimage_pdb.h
index 5ef32c1872..71f47766b9 100644
--- a/libgimp/gimpimage_pdb.h
+++ b/libgimp/gimpimage_pdb.h
@@ -127,6 +127,8 @@ gint32                   gimp_image_merge_visible_layers       (gint32
 gint32                   gimp_image_merge_down                 (gint32               image_ID,
                                                                 gint32               merge_layer_ID,
                                                                 GimpMergeType        merge_type);
+gint32                   gimp_image_merge_layer_group          (gint32               image_ID,
+                                                                gint32               layer_group_ID);
 G_GNUC_INTERNAL guint8*  _gimp_image_get_colormap              (gint32               image_ID,
                                                                 gint                *num_bytes);
 G_GNUC_INTERNAL gboolean _gimp_image_set_colormap              (gint32               image_ID,
diff --git a/pdb/groups/image.pdb b/pdb/groups/image.pdb
index 7b25a8bc48..90f3fca09b 100644
--- a/pdb/groups/image.pdb
+++ b/pdb/groups/image.pdb
@@ -815,6 +815,48 @@ CODE
     );
 }
 
+sub image_merge_layer_group {
+    $blurb = 'Merge the passed layer group\'s layers into one normal layer.';
+
+    $help = <<'HELP';
+This procedure combines the layers of the passed layer group into
+a single normal layer, replacing the group.
+HELP
+
+    &ell_pdb_misc('2019');
+
+    @inargs = (
+        { name => 'image', type => 'image',
+          desc => 'The image' },
+        { name => 'layer_group', type => 'layer',
+          desc => 'The layer group to merge' },
+    );
+
+    @outargs = (
+        { name => 'layer', type => 'layer',
+          desc => 'The resulting layer' }
+    );
+
+    %invoke = (
+        headers => [ qw("core/gimpgrouplayer.h" "core/gimpimage-merge.h") ],
+        code => <<'CODE'
+{
+  if (gimp_pdb_item_is_attached (GIMP_ITEM (layer_group), image, 0, error) &&
+      gimp_pdb_item_is_group (GIMP_ITEM (layer_group), error))
+    {
+      layer = gimp_image_merge_group_layer (image,
+                                            GIMP_GROUP_LAYER (layer_group));
+
+      if (! layer)
+        success = FALSE;
+    }
+  else
+    success = FALSE;
+}
+CODE
+    );
+}
+
 sub image_flatten {
     $blurb = <<'BLURB';
 Flatten all visible layers into a single layer. Discard all invisible layers.
@@ -3121,6 +3163,7 @@ CODE
             image_raise_item_to_top image_lower_item_to_bottom
             image_reorder_item
             image_flatten image_merge_visible_layers image_merge_down
+            image_merge_layer_group
             image_add_layer_mask image_remove_layer_mask
             image_get_colormap image_set_colormap
             image_get_metadata image_set_metadata
@@ -3151,11 +3194,11 @@ CODE
             image_get_parasite
             image_get_parasite_list);
 
-# For the lib parameter EXCLUDE functions #45 and #46, which are
+# For the lib parameter EXCLUDE functions #46 and #47, which are
 # image_add_layer_mask and image_remove_layer_mask.
 # If adding or removing functions, make sure the range below is
 # updated correctly!
-%exports = (app => [@procs], lib => [@procs[0..44,47..87]]);
+%exports = (app => [@procs], lib => [@procs[0..45,48..88]]);
 
 $desc = 'Image';
 $doc_title = 'gimpimage';


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