pdb: add a PDB procedure for shadows-highlights
(cherry picked from commit 0b96363e10)
Reviewer's (Jehan) note: the generated source files were re-generated and
amended in this commit.
This commit is contained in:
parent
851ddad2ee
commit
e238ea07ca
6 changed files with 254 additions and 1 deletions
|
|
@ -641,6 +641,64 @@ drawable_levels_stretch_invoker (GimpProcedure *procedure,
|
|||
error ? *error : NULL);
|
||||
}
|
||||
|
||||
static GimpValueArray *
|
||||
drawable_shadows_highlights_invoker (GimpProcedure *procedure,
|
||||
Gimp *gimp,
|
||||
GimpContext *context,
|
||||
GimpProgress *progress,
|
||||
const GimpValueArray *args,
|
||||
GError **error)
|
||||
{
|
||||
gboolean success = TRUE;
|
||||
GimpDrawable *drawable;
|
||||
gdouble shadows;
|
||||
gdouble highlights;
|
||||
gdouble whitepoint;
|
||||
gdouble radius;
|
||||
gdouble compress;
|
||||
gdouble shadows_ccorrect;
|
||||
gdouble highlights_ccorrect;
|
||||
|
||||
drawable = g_value_get_object (gimp_value_array_index (args, 0));
|
||||
shadows = g_value_get_double (gimp_value_array_index (args, 1));
|
||||
highlights = g_value_get_double (gimp_value_array_index (args, 2));
|
||||
whitepoint = g_value_get_double (gimp_value_array_index (args, 3));
|
||||
radius = g_value_get_double (gimp_value_array_index (args, 4));
|
||||
compress = g_value_get_double (gimp_value_array_index (args, 5));
|
||||
shadows_ccorrect = g_value_get_double (gimp_value_array_index (args, 6));
|
||||
highlights_ccorrect = g_value_get_double (gimp_value_array_index (args, 7));
|
||||
|
||||
if (success)
|
||||
{
|
||||
if (gimp_pdb_item_is_attached (GIMP_ITEM (drawable), NULL,
|
||||
GIMP_PDB_ITEM_CONTENT, error) &&
|
||||
gimp_pdb_item_is_not_group (GIMP_ITEM (drawable), error))
|
||||
{
|
||||
GeglNode *node;
|
||||
node = gegl_node_new_child (NULL,
|
||||
"operation", "gegl:shadows-highlights",
|
||||
"shadows", shadows,
|
||||
"highlights", highlights,
|
||||
"whitepoint", whitepoint,
|
||||
"radius", radius,
|
||||
"compress", compress,
|
||||
"shadows_correct", shadows_ccorrect,
|
||||
"highlights_correct", highlights_ccorrect,
|
||||
NULL);
|
||||
|
||||
gimp_drawable_apply_operation (drawable, progress,
|
||||
C_("undo-type", "Shadows-Highlights"),
|
||||
node);
|
||||
g_object_unref (node);
|
||||
}
|
||||
else
|
||||
success = FALSE;
|
||||
}
|
||||
|
||||
return gimp_procedure_get_return_values (procedure, success,
|
||||
error ? *error : NULL);
|
||||
}
|
||||
|
||||
static GimpValueArray *
|
||||
drawable_posterize_invoker (GimpProcedure *procedure,
|
||||
Gimp *gimp,
|
||||
|
|
@ -1259,6 +1317,71 @@ register_drawable_color_procs (GimpPDB *pdb)
|
|||
gimp_pdb_register_procedure (pdb, procedure);
|
||||
g_object_unref (procedure);
|
||||
|
||||
/*
|
||||
* gimp-drawable-shadows-highlights
|
||||
*/
|
||||
procedure = gimp_procedure_new (drawable_shadows_highlights_invoker);
|
||||
gimp_object_set_static_name (GIMP_OBJECT (procedure),
|
||||
"gimp-drawable-shadows-highlights");
|
||||
gimp_procedure_set_static_help (procedure,
|
||||
"Perform shadows and highlights correction.",
|
||||
"This filter allows adjusting shadows and highlights in the image separately. The implementation closely follow its counterpart in the Darktable photography software.",
|
||||
NULL);
|
||||
gimp_procedure_set_static_attribution (procedure,
|
||||
"",
|
||||
"",
|
||||
"2021");
|
||||
gimp_procedure_add_argument (procedure,
|
||||
gimp_param_spec_drawable ("drawable",
|
||||
"drawable",
|
||||
"The drawable",
|
||||
FALSE,
|
||||
GIMP_PARAM_READWRITE));
|
||||
gimp_procedure_add_argument (procedure,
|
||||
g_param_spec_double ("shadows",
|
||||
"shadows",
|
||||
"Adjust exposure of shadows",
|
||||
-100, 100, -100,
|
||||
GIMP_PARAM_READWRITE));
|
||||
gimp_procedure_add_argument (procedure,
|
||||
g_param_spec_double ("highlights",
|
||||
"highlights",
|
||||
"Adjust exposure of highlights",
|
||||
-100, 100, -100,
|
||||
GIMP_PARAM_READWRITE));
|
||||
gimp_procedure_add_argument (procedure,
|
||||
g_param_spec_double ("whitepoint",
|
||||
"whitepoint",
|
||||
"Shift white point",
|
||||
-10, 10, -10,
|
||||
GIMP_PARAM_READWRITE));
|
||||
gimp_procedure_add_argument (procedure,
|
||||
g_param_spec_double ("radius",
|
||||
"radius",
|
||||
"Spatial extent",
|
||||
0.1, 1500, 0.1,
|
||||
GIMP_PARAM_READWRITE));
|
||||
gimp_procedure_add_argument (procedure,
|
||||
g_param_spec_double ("compress",
|
||||
"compress",
|
||||
"Compress the effect on shadows/highlights and preserve midtones",
|
||||
0, 100, 0,
|
||||
GIMP_PARAM_READWRITE));
|
||||
gimp_procedure_add_argument (procedure,
|
||||
g_param_spec_double ("shadows-ccorrect",
|
||||
"shadows ccorrect",
|
||||
"Adjust saturation of shadows",
|
||||
0, 100, 0,
|
||||
GIMP_PARAM_READWRITE));
|
||||
gimp_procedure_add_argument (procedure,
|
||||
g_param_spec_double ("highlights-ccorrect",
|
||||
"highlights ccorrect",
|
||||
"Adjust saturation of highlights",
|
||||
0, 100, 0,
|
||||
GIMP_PARAM_READWRITE));
|
||||
gimp_pdb_register_procedure (pdb, procedure);
|
||||
g_object_unref (procedure);
|
||||
|
||||
/*
|
||||
* gimp-drawable-posterize
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
#include "internal-procs.h"
|
||||
|
||||
|
||||
/* 772 procedures registered total */
|
||||
/* 773 procedures registered total */
|
||||
|
||||
void
|
||||
internal_procs_init (GimpPDB *pdb)
|
||||
|
|
|
|||
|
|
@ -244,6 +244,7 @@ EXPORTS
|
|||
gimp_drawable_offset
|
||||
gimp_drawable_posterize
|
||||
gimp_drawable_set_pixel
|
||||
gimp_drawable_shadows_highlights
|
||||
gimp_drawable_threshold
|
||||
gimp_drawable_type
|
||||
gimp_drawable_type_with_alpha
|
||||
|
|
|
|||
|
|
@ -660,6 +660,64 @@ gimp_drawable_levels_stretch (GimpDrawable *drawable)
|
|||
return success;
|
||||
}
|
||||
|
||||
/**
|
||||
* gimp_drawable_shadows_highlights:
|
||||
* @drawable: The drawable.
|
||||
* @shadows: Adjust exposure of shadows.
|
||||
* @highlights: Adjust exposure of highlights.
|
||||
* @whitepoint: Shift white point.
|
||||
* @radius: Spatial extent.
|
||||
* @compress: Compress the effect on shadows/highlights and preserve midtones.
|
||||
* @shadows_ccorrect: Adjust saturation of shadows.
|
||||
* @highlights_ccorrect: Adjust saturation of highlights.
|
||||
*
|
||||
* Perform shadows and highlights correction.
|
||||
*
|
||||
* This filter allows adjusting shadows and highlights in the image
|
||||
* separately. The implementation closely follow its counterpart in the
|
||||
* Darktable photography software.
|
||||
*
|
||||
* Returns: TRUE on success.
|
||||
*
|
||||
* Since: 2.10
|
||||
**/
|
||||
gboolean
|
||||
gimp_drawable_shadows_highlights (GimpDrawable *drawable,
|
||||
gdouble shadows,
|
||||
gdouble highlights,
|
||||
gdouble whitepoint,
|
||||
gdouble radius,
|
||||
gdouble compress,
|
||||
gdouble shadows_ccorrect,
|
||||
gdouble highlights_ccorrect)
|
||||
{
|
||||
GimpValueArray *args;
|
||||
GimpValueArray *return_vals;
|
||||
gboolean success = TRUE;
|
||||
|
||||
args = gimp_value_array_new_from_types (NULL,
|
||||
GIMP_TYPE_DRAWABLE, drawable,
|
||||
G_TYPE_DOUBLE, shadows,
|
||||
G_TYPE_DOUBLE, highlights,
|
||||
G_TYPE_DOUBLE, whitepoint,
|
||||
G_TYPE_DOUBLE, radius,
|
||||
G_TYPE_DOUBLE, compress,
|
||||
G_TYPE_DOUBLE, shadows_ccorrect,
|
||||
G_TYPE_DOUBLE, highlights_ccorrect,
|
||||
G_TYPE_NONE);
|
||||
|
||||
return_vals = gimp_pdb_run_procedure_array (gimp_get_pdb (),
|
||||
"gimp-drawable-shadows-highlights",
|
||||
args);
|
||||
gimp_value_array_unref (args);
|
||||
|
||||
success = GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS;
|
||||
|
||||
gimp_value_array_unref (return_vals);
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
/**
|
||||
* gimp_drawable_posterize:
|
||||
* @drawable: The drawable.
|
||||
|
|
|
|||
|
|
@ -85,6 +85,14 @@ gboolean gimp_drawable_levels (GimpDrawable *drawable,
|
|||
gdouble high_output,
|
||||
gboolean clamp_output);
|
||||
gboolean gimp_drawable_levels_stretch (GimpDrawable *drawable);
|
||||
gboolean gimp_drawable_shadows_highlights (GimpDrawable *drawable,
|
||||
gdouble shadows,
|
||||
gdouble highlights,
|
||||
gdouble whitepoint,
|
||||
gdouble radius,
|
||||
gdouble compress,
|
||||
gdouble shadows_ccorrect,
|
||||
gdouble highlights_ccorrect);
|
||||
gboolean gimp_drawable_posterize (GimpDrawable *drawable,
|
||||
gint levels);
|
||||
gboolean gimp_drawable_threshold (GimpDrawable *drawable,
|
||||
|
|
|
|||
|
|
@ -705,6 +705,68 @@ CODE
|
|||
);
|
||||
}
|
||||
|
||||
sub drawable_shadows_highlights {
|
||||
$blurb = 'Perform shadows and highlights correction.';
|
||||
|
||||
$help = <<'HELP';
|
||||
This filter allows adjusting shadows and highlights in the image
|
||||
separately. The implementation closely follow its counterpart in the
|
||||
Darktable photography software.
|
||||
HELP
|
||||
|
||||
$date = '2021';
|
||||
$since = '2.10';
|
||||
|
||||
@inargs = (
|
||||
{ name => 'drawable', type => 'drawable',
|
||||
desc => 'The drawable' },
|
||||
{ name => 'shadows', type => '-100 <= float <= 100',
|
||||
desc => 'Adjust exposure of shadows' },
|
||||
{ name => 'highlights', type => '-100 <= float <= 100',
|
||||
desc => 'Adjust exposure of highlights' },
|
||||
{ name => 'whitepoint', type => '-10 <= float <= 10',
|
||||
desc => 'Shift white point' },
|
||||
{ name => 'radius', type => '0.1 <= float <= 1500',
|
||||
desc => 'Spatial extent' },
|
||||
{ name => 'compress', type => '0 <= float <= 100',
|
||||
desc => 'Compress the effect on shadows/highlights and preserve midtones' },
|
||||
{ name => 'shadows_ccorrect', type => '0 <= float <= 100',
|
||||
desc => 'Adjust saturation of shadows' },
|
||||
{ name => 'highlights_ccorrect', type => '0 <= float <= 100',
|
||||
desc => 'Adjust saturation of highlights' },
|
||||
);
|
||||
|
||||
%invoke = (
|
||||
code => <<'CODE'
|
||||
{
|
||||
if (gimp_pdb_item_is_attached (GIMP_ITEM (drawable), NULL,
|
||||
GIMP_PDB_ITEM_CONTENT, error) &&
|
||||
gimp_pdb_item_is_not_group (GIMP_ITEM (drawable), error))
|
||||
{
|
||||
GeglNode *node;
|
||||
node = gegl_node_new_child (NULL,
|
||||
"operation", "gegl:shadows-highlights",
|
||||
"shadows", shadows,
|
||||
"highlights", highlights,
|
||||
"whitepoint", whitepoint,
|
||||
"radius", radius,
|
||||
"compress", compress,
|
||||
"shadows_correct", shadows_ccorrect,
|
||||
"highlights_correct", highlights_ccorrect,
|
||||
NULL);
|
||||
|
||||
gimp_drawable_apply_operation (drawable, progress,
|
||||
C_("undo-type", "Shadows-Highlights"),
|
||||
node);
|
||||
g_object_unref (node);
|
||||
}
|
||||
else
|
||||
success = FALSE;
|
||||
}
|
||||
CODE
|
||||
);
|
||||
}
|
||||
|
||||
sub drawable_posterize {
|
||||
$blurb = 'Posterize the specified drawable.';
|
||||
|
||||
|
|
@ -821,6 +883,7 @@ CODE
|
|||
drawable_invert
|
||||
drawable_levels
|
||||
drawable_levels_stretch
|
||||
drawable_shadows_highlights
|
||||
drawable_posterize
|
||||
drawable_threshold);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue