diff --git a/app/pdb/internal-procs.c b/app/pdb/internal-procs.c index ab752272c5..b71520a22e 100644 --- a/app/pdb/internal-procs.c +++ b/app/pdb/internal-procs.c @@ -28,7 +28,7 @@ #include "internal-procs.h" -/* 799 procedures registered total */ +/* 800 procedures registered total */ void internal_procs_init (GimpPDB *pdb) diff --git a/app/pdb/selection-cmds.c b/app/pdb/selection-cmds.c index 2b2dcdf65f..a54fd1bf8b 100644 --- a/app/pdb/selection-cmds.c +++ b/app/pdb/selection-cmds.c @@ -421,6 +421,28 @@ selection_shrink_invoker (GimpProcedure *procedure, error ? *error : NULL); } +static GimpValueArray * +selection_flood_invoker (GimpProcedure *procedure, + Gimp *gimp, + GimpContext *context, + GimpProgress *progress, + const GimpValueArray *args, + GError **error) +{ + gboolean success = TRUE; + GimpImage *image; + + image = gimp_value_get_image (gimp_value_array_index (args, 0), gimp); + + if (success) + { + gimp_channel_flood (gimp_image_get_mask (image), TRUE); + } + + return gimp_procedure_get_return_values (procedure, success, + error ? *error : NULL); +} + static GimpValueArray * selection_layer_alpha_invoker (GimpProcedure *procedure, Gimp *gimp, @@ -948,6 +970,29 @@ register_selection_procs (GimpPDB *pdb) gimp_pdb_register_procedure (pdb, procedure); g_object_unref (procedure); + /* + * gimp-selection-flood + */ + procedure = gimp_procedure_new (selection_flood_invoker); + gimp_object_set_static_name (GIMP_OBJECT (procedure), + "gimp-selection-flood"); + gimp_procedure_set_static_strings (procedure, + "gimp-selection-flood", + "Flood the image's selection", + "This procedure floods the selection. Flooding assigns to each pixel of the selection mask the minimum of the maxima of all paths from that pixel to the outside, as if the selection mask were a height map of a terrain flooded with water.", + "Ell", + "Ell", + "2016", + NULL); + gimp_procedure_add_argument (procedure, + gimp_param_spec_image_id ("image", + "image", + "The image", + pdb->gimp, FALSE, + GIMP_PARAM_READWRITE)); + gimp_pdb_register_procedure (pdb, procedure); + g_object_unref (procedure); + /* * gimp-selection-layer-alpha */ diff --git a/libgimp/gimp.def b/libgimp/gimp.def index 62db2c05ae..a20c383efa 100644 --- a/libgimp/gimp.def +++ b/libgimp/gimp.def @@ -773,6 +773,7 @@ EXPORTS gimp_selection_combine gimp_selection_feather gimp_selection_float + gimp_selection_flood gimp_selection_grow gimp_selection_invert gimp_selection_is_empty diff --git a/libgimp/gimpselection_pdb.c b/libgimp/gimpselection_pdb.c index 91fa432b01..488c7a168b 100644 --- a/libgimp/gimpselection_pdb.c +++ b/libgimp/gimpselection_pdb.c @@ -499,6 +499,40 @@ gimp_selection_shrink (gint32 image_ID, return success; } +/** + * gimp_selection_flood: + * @image_ID: The image. + * + * Flood the image's selection + * + * This procedure floods the selection. Flooding assigns to each pixel + * of the selection mask the minimum of the maxima of all paths from + * that pixel to the outside, as if the selection mask were a height + * map of a terrain flooded with water. + * + * Returns: TRUE on success. + * + * Since: 2.10 + **/ +gboolean +gimp_selection_flood (gint32 image_ID) +{ + GimpParam *return_vals; + gint nreturn_vals; + gboolean success = TRUE; + + return_vals = gimp_run_procedure ("gimp-selection-flood", + &nreturn_vals, + GIMP_PDB_IMAGE, image_ID, + GIMP_PDB_END); + + success = return_vals[0].data.d_status == GIMP_PDB_SUCCESS; + + gimp_destroy_params (return_vals, nreturn_vals); + + return success; +} + /** * gimp_selection_layer_alpha: * @layer_ID: Layer with alpha. diff --git a/libgimp/gimpselection_pdb.h b/libgimp/gimpselection_pdb.h index 31a49e2bc5..cd21a90b3f 100644 --- a/libgimp/gimpselection_pdb.h +++ b/libgimp/gimpselection_pdb.h @@ -60,6 +60,7 @@ gboolean gimp_selection_grow (gint32 image_ID, gint steps); gboolean gimp_selection_shrink (gint32 image_ID, gint steps); +gboolean gimp_selection_flood (gint32 image_ID); GIMP_DEPRECATED_FOR(gimp_image_select_item) gboolean gimp_selection_layer_alpha (gint32 layer_ID); GIMP_DEPRECATED_FOR(gimp_image_select_item) diff --git a/tools/pdbgen/pdb/selection.pdb b/tools/pdbgen/pdb/selection.pdb index 4722e58b8d..dc5def82a0 100644 --- a/tools/pdbgen/pdb/selection.pdb +++ b/tools/pdbgen/pdb/selection.pdb @@ -423,6 +423,35 @@ CODE ); } +sub selection_flood { + $blurb = "Flood the image's selection"; + + $help .= <<'HELP'; +This procedure floods the selection. Flooding assigns to each pixel +of the selection mask the minimum of the maxima of all paths from +that pixel to the outside, as if the selection mask were a height +map of a terrain flooded with water. +HELP + + $author = 'Ell'; + $copyright = 'Ell'; + $date = '2016'; + $since = '2.10'; + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image' } + ); + + %invoke = ( + code => <<'CODE' +{ + gimp_channel_flood (gimp_image_get_mask (image), TRUE); +} +CODE + ); +} + sub selection_layer_alpha { &std_pdb_deprecated ('gimp-image-select-item'); @@ -534,7 +563,7 @@ CODE selection_translate selection_float selection_invert selection_sharpen selection_all selection_none selection_feather selection_border selection_grow selection_shrink - selection_layer_alpha selection_load selection_save + selection_flood selection_layer_alpha selection_load selection_save selection_combine); %exports = (app => [@procs], lib => [@procs]);