From 62a6023b27e741c35f4a3d9afc9df0356d18f19c Mon Sep 17 00:00:00 2001 From: Ell Date: Sat, 7 Sep 2019 10:20:03 +0300 Subject: [PATCH] pdb: add gimp-image-merge-layer-group procedure Oddly, we didn't have this one yet :P --- app/pdb/image-cmds.c | 76 ++++++++++++++++++++++++++++++++++++++++ app/pdb/internal-procs.c | 2 +- libgimp/gimp.def | 1 + libgimp/gimpimage_pdb.c | 38 ++++++++++++++++++++ libgimp/gimpimage_pdb.h | 2 ++ pdb/groups/image.pdb | 43 +++++++++++++++++++++++ 6 files changed, 161 insertions(+), 1 deletion(-) diff --git a/app/pdb/image-cmds.c b/app/pdb/image-cmds.c index c7ed26fda6..5e795f6501 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" @@ -1461,6 +1462,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 = g_value_get_object (gimp_value_array_index (args, 0)); + layer_group = g_value_get_object (gimp_value_array_index (args, 1)); + + 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) + g_value_set_object (gimp_value_array_index (return_vals, 1), layer); + + return return_vals; +} + static GimpValueArray * image_get_colormap_invoker (GimpProcedure *procedure, Gimp *gimp, @@ -4066,6 +4108,40 @@ 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, + "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 ("image", + "image", + "The image", + FALSE, + GIMP_PARAM_READWRITE)); + gimp_procedure_add_argument (procedure, + gimp_param_spec_layer ("layer-group", + "layer group", + "The layer group to merge", + FALSE, + GIMP_PARAM_READWRITE)); + gimp_procedure_add_return_value (procedure, + gimp_param_spec_layer ("layer", + "layer", + "The resulting layer", + FALSE, + GIMP_PARAM_READWRITE)); + gimp_pdb_register_procedure (pdb, procedure); + g_object_unref (procedure); + /* * gimp-image-get-colormap */ diff --git a/app/pdb/internal-procs.c b/app/pdb/internal-procs.c index 9a1782134e..3f904c5ada 100644 --- a/app/pdb/internal-procs.c +++ b/app/pdb/internal-procs.c @@ -28,7 +28,7 @@ #include "internal-procs.h" -/* 745 procedures registered total */ +/* 746 procedures registered total */ void internal_procs_init (GimpPDB *pdb) diff --git a/libgimp/gimp.def b/libgimp/gimp.def index 1ef5ce5ce3..ddef7dd9a5 100644 --- a/libgimp/gimp.def +++ b/libgimp/gimp.def @@ -437,6 +437,7 @@ EXPORTS gimp_image_lower_item gimp_image_lower_item_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 85fb087d3d..fb4f23a945 100644 --- a/libgimp/gimpimage_pdb.c +++ b/libgimp/gimpimage_pdb.c @@ -1726,6 +1726,44 @@ gimp_image_merge_down (GimpImage *image, return layer; } +/** + * gimp_image_merge_layer_group: + * @image: The image. + * @layer_group: 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: (transfer none): The resulting layer. + **/ +GimpLayer * +gimp_image_merge_layer_group (GimpImage *image, + GimpLayer *layer_group) +{ + GimpValueArray *args; + GimpValueArray *return_vals; + GimpLayer *layer = NULL; + + args = gimp_value_array_new_from_types (NULL, + GIMP_TYPE_IMAGE, image, + GIMP_TYPE_LAYER, layer_group, + G_TYPE_NONE); + + return_vals = gimp_pdb_run_procedure_array (gimp_get_pdb (), + "gimp-image-merge-layer-group", + args); + gimp_value_array_unref (args); + + if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS) + layer = GIMP_VALUES_GET_LAYER (return_vals, 1); + + gimp_value_array_unref (return_vals); + + return layer; +} + /** * _gimp_image_get_colormap: * @image: The image. diff --git a/libgimp/gimpimage_pdb.h b/libgimp/gimpimage_pdb.h index 4f3a128ff2..3cb3a0ede2 100644 --- a/libgimp/gimpimage_pdb.h +++ b/libgimp/gimpimage_pdb.h @@ -113,6 +113,8 @@ GimpLayer* gimp_image_merge_visible_layers (GimpImage GimpLayer* gimp_image_merge_down (GimpImage *image, GimpLayer *merge_layer, GimpMergeType merge_type); +GimpLayer* gimp_image_merge_layer_group (GimpImage *image, + GimpLayer *layer_group); G_GNUC_INTERNAL guint8* _gimp_image_get_colormap (GimpImage *image, gint *num_bytes); G_GNUC_INTERNAL gboolean _gimp_image_set_colormap (GimpImage *image, diff --git a/pdb/groups/image.pdb b/pdb/groups/image.pdb index a4eccc13d8..d4cc31f499 100644 --- a/pdb/groups/image.pdb +++ b/pdb/groups/image.pdb @@ -797,6 +797,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. @@ -2972,6 +3014,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_get_colormap image_set_colormap image_get_metadata image_set_metadata image_clean_all image_is_dirty