app,pdb: add a compatibility wrapper to contrast-stretch

... and remove the old plug-in
This commit is contained in:
Téo Mazars 2013-11-15 19:10:42 +01:00
parent 5efcc0eb09
commit 120e9ccf39
9 changed files with 126 additions and 273 deletions

View File

@ -28,7 +28,7 @@
#include "internal-procs.h"
/* 703 procedures registered total */
/* 704 procedures registered total */
void
internal_procs_init (GimpPDB *pdb)

View File

@ -257,6 +257,45 @@ plug_in_autocrop_layer_invoker (GimpProcedure *procedure,
error ? *error : NULL);
}
static GimpValueArray *
plug_in_c_astretch_invoker (GimpProcedure *procedure,
Gimp *gimp,
GimpContext *context,
GimpProgress *progress,
const GimpValueArray *args,
GError **error)
{
gboolean success = TRUE;
GimpDrawable *drawable;
drawable = gimp_value_get_drawable (gimp_value_array_index (args, 2), gimp);
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 =
gegl_node_new_child (NULL,
"operation", "gegl:stretch-contrast",
"keep-colors", (gboolean) FALSE,
NULL);
gimp_drawable_apply_operation (drawable, progress,
C_("undo-type", "Stretch Contrast"),
node);
g_object_unref (node);
}
else
success = FALSE;
}
return gimp_procedure_get_return_values (procedure, success,
error ? *error : NULL);
}
static GimpValueArray *
plug_in_colors_channel_mixer_invoker (GimpProcedure *procedure,
Gimp *gimp,
@ -1819,6 +1858,42 @@ register_plug_in_compat_procs (GimpPDB *pdb)
gimp_pdb_register_procedure (pdb, procedure);
g_object_unref (procedure);
/*
* gimp-plug-in-c-astretch
*/
procedure = gimp_procedure_new (plug_in_c_astretch_invoker);
gimp_object_set_static_name (GIMP_OBJECT (procedure),
"plug-in-c-astretch");
gimp_procedure_set_static_strings (procedure,
"plug-in-c-astretch",
"Stretch contrast to cover the maximum possible range",
"This simple plug-in does an automatic contrast stretch. For each channel in the image, it finds the minimum and maximum values... it uses those values to stretch the individual histograms to the full contrast range. For some images it may do just what you want; for others it may not work that well.",
"Compatibility procedure. Please see 'gegl:stretch-contrast' for credits.",
"Compatibility procedure. Please see 'gegl:stretch-contrast' for credits.",
"2013",
NULL);
gimp_procedure_add_argument (procedure,
g_param_spec_enum ("run-mode",
"run mode",
"The run mode",
GIMP_TYPE_RUN_MODE,
GIMP_RUN_INTERACTIVE,
GIMP_PARAM_READWRITE));
gimp_procedure_add_argument (procedure,
gimp_param_spec_image_id ("image",
"image",
"Input image (unused)",
pdb->gimp, FALSE,
GIMP_PARAM_READWRITE));
gimp_procedure_add_argument (procedure,
gimp_param_spec_drawable_id ("drawable",
"drawable",
"Input drawable",
pdb->gimp, FALSE,
GIMP_PARAM_READWRITE));
gimp_pdb_register_procedure (pdb, procedure);
g_object_unref (procedure);
/*
* gimp-plug-in-colors-channel-mixer
*/

View File

@ -44,8 +44,6 @@
/contrast-normalize.exe
/contrast-retinex
/contrast-retinex.exe
/contrast-stretch
/contrast-stretch.exe
/contrast-stretch-hsv
/contrast-stretch-hsv.exe
/convolution-matrix

View File

@ -65,7 +65,6 @@ libexec_PROGRAMS = \
compose \
contrast-normalize \
contrast-retinex \
contrast-stretch \
contrast-stretch-hsv \
convolution-matrix \
crop-zealous \
@ -556,21 +555,6 @@ contrast_retinex_LDADD = \
$(INTLLIBS) \
$(contrast_retinex_RC)
contrast_stretch_SOURCES = \
contrast-stretch.c
contrast_stretch_LDADD = \
$(libgimp) \
$(libgimpmath) \
$(libgimpconfig) \
$(libgimpcolor) \
$(libgimpbase) \
$(CAIRO_LIBS) \
$(GDK_PIXBUF_LIBS) \
$(RT_LIBS) \
$(INTLLIBS) \
$(contrast_stretch_RC)
contrast_stretch_hsv_SOURCES = \
contrast-stretch-hsv.c

View File

@ -1,251 +0,0 @@
/* Contrast Autostretch 1.06 --- image filter plug-in for GIMP
*
* Copyright (C) 1996 Federico Mena Quintero
*
* You can contact me at quartic@polloux.fciencias.unam.mx
* You can contact the original GIMP authors at gimp@xcf.berkeley.edu
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <libgimp/gimp.h>
#include "libgimp/stdplugins-intl.h"
#define PLUG_IN_PROC "plug-in-c-astretch"
/* Declare local functions.
*/
static void query (void);
static void run (const gchar *name,
gint nparams,
const GimpParam *param,
gint *nreturn_vals,
GimpParam **return_vals);
static void c_astretch (GimpDrawable *drawable);
static void indexed_c_astretch (gint32 image_ID);
const GimpPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN ()
static void
query (void)
{
static const GimpParamDef args[] =
{
{ GIMP_PDB_INT32, "run-mode", "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }" },
{ GIMP_PDB_IMAGE, "image", "Input image" },
{ GIMP_PDB_DRAWABLE, "drawable", "Input drawable" }
};
gimp_install_procedure (PLUG_IN_PROC,
N_("Stretch contrast to cover the maximum possible range"),
"This simple plug-in does an automatic contrast "
"stretch. For each channel in the image, it finds "
"the minimum and maximum values... it uses those "
"values to stretch the individual histograms to the "
"full contrast range. For some images it may do "
"just what you want; for others it may not work "
"that well.",
"Federico Mena Quintero",
"Federico Mena Quintero",
"1996",
N_("_Stretch Contrast"),
"RGB*, GRAY*, INDEXED*",
GIMP_PLUGIN,
G_N_ELEMENTS (args), 0,
args, NULL);
gimp_plugin_menu_register (PLUG_IN_PROC, "<Image>/Colors/Auto");
}
static void
run (const gchar *name,
gint nparams,
const GimpParam *param,
gint *nreturn_vals,
GimpParam **return_vals)
{
static GimpParam values[1];
GimpDrawable *drawable;
GimpPDBStatusType status = GIMP_PDB_SUCCESS;
GimpRunMode run_mode;
gint32 image_ID;
INIT_I18N();
run_mode = param[0].data.d_int32;
/* Get the specified drawable */
drawable = gimp_drawable_get (param[2].data.d_drawable);
image_ID = param[1].data.d_image;
/* Make sure that the drawable is gray or RGB color */
if (gimp_drawable_is_rgb (drawable->drawable_id) ||
gimp_drawable_is_gray (drawable->drawable_id))
{
gimp_progress_init (_("Auto-stretching contrast"));
gimp_tile_cache_ntiles (2 * (drawable->width / gimp_tile_width () + 1));
c_astretch (drawable);
if (run_mode != GIMP_RUN_NONINTERACTIVE)
gimp_displays_flush ();
}
else if (gimp_drawable_is_indexed (drawable->drawable_id))
{
indexed_c_astretch (image_ID);
if (run_mode != GIMP_RUN_NONINTERACTIVE)
gimp_displays_flush ();
}
else
{
status = GIMP_PDB_EXECUTION_ERROR;
}
*nreturn_vals = 1;
*return_vals = values;
values[0].type = GIMP_PDB_STATUS;
values[0].data.d_status = status;
gimp_drawable_detach (drawable);
}
static void
indexed_c_astretch (gint32 image_ID)
{
guchar *cmap;
gint ncols, i;
gint rhi = 0, ghi = 0, bhi = 0, rlo = 255, glo = 255, blo = 255;
cmap = gimp_image_get_colormap (image_ID, &ncols);
if (!cmap)
{
g_message (_("c_astretch: cmap was NULL! Quitting...\n"));
gimp_quit();
}
for (i = 0; i < ncols; i++)
{
if (cmap[i * 3 + 0] > rhi) rhi = cmap[i * 3 + 0];
if (cmap[i * 3 + 1] > ghi) ghi = cmap[i * 3 + 1];
if (cmap[i * 3 + 2] > bhi) bhi = cmap[i * 3 + 2];
if (cmap[i * 3 + 0] < rlo) rlo = cmap[i * 3 + 0];
if (cmap[i * 3 + 1] < glo) glo = cmap[i * 3 + 1];
if (cmap[i * 3 + 2] < blo) blo = cmap[i * 3 + 2];
}
for (i = 0; i < ncols; i++)
{
if (rhi != rlo)
cmap[i * 3 + 0] = (255 * (cmap[i * 3 + 0] - rlo)) / (rhi - rlo);
if (ghi != glo)
cmap[i * 3 + 1] = (255 * (cmap[i * 3 + 1] - glo)) / (ghi - glo);
if (rhi != rlo)
cmap[i * 3 + 2] = (255 * (cmap[i * 3 + 2] - blo)) / (bhi - blo);
}
gimp_image_set_colormap (image_ID, cmap, ncols);
}
typedef struct {
gint alpha;
guchar lut[256][3];
guchar min[3];
guchar max[3];
gboolean has_alpha;
} AutoStretchParam_t;
static void
find_min_max (const guchar *src,
gint bpp,
gpointer data)
{
AutoStretchParam_t *param = data;
gint b;
for (b = 0; b < param->alpha; b++)
{
if (!param->has_alpha || src[param->alpha])
{
if (src[b] < param->min[b])
param->min[b] = src[b];
if (src[b] > param->max[b])
param->max[b] = src[b];
}
}
}
static void
c_astretch_func (const guchar *src,
guchar *dest,
gint bpp,
gpointer data)
{
AutoStretchParam_t *param = data;
gint b;
for (b = 0; b < param->alpha; b++)
dest[b] = param->lut[src[b]][b];
if (param->has_alpha)
dest[param->alpha] = src[param->alpha];
}
static void
c_astretch (GimpDrawable *drawable)
{
AutoStretchParam_t param;
gint b;
param.has_alpha = gimp_drawable_has_alpha (drawable->drawable_id);
param.alpha = (param.has_alpha) ? drawable->bpp - 1 : drawable->bpp;
/* Get minimum and maximum values for each channel */
param.min[0] = param.min[1] = param.min[2] = 255;
param.max[0] = param.max[1] = param.max[2] = 0;
gimp_rgn_iterate1 (drawable, 0 /* unused */, find_min_max, &param);
/* Calculate LUTs with stretched contrast */
for (b = 0; b < param.alpha; b++)
{
gint range = param.max[b] - param.min[b];
gint x;
if (range != 0)
for (x = param.min[b]; x <= param.max[b]; x++)
param.lut[x][b] = 255 * (x - param.min[b]) / range;
else
param.lut[param.min[b]][b] = param.min[b];
}
gimp_rgn_iterate2 (drawable, 0 /* unused */, c_astretch_func, &param);
}

View File

@ -19,7 +19,6 @@ colormap_remap_RC = colormap-remap.rc.o
compose_RC = compose.rc.o
contrast_normalize_RC = contrast-normalize.rc.o
contrast_retinex_RC = contrast-retinex.rc.o
contrast_stretch_RC = contrast-stretch.rc.o
contrast_stretch_hsv_RC = contrast-stretch-hsv.rc.o
convolution_matrix_RC = convolution-matrix.rc.o
crop_zealous_RC = crop-zealous.rc.o

View File

@ -20,7 +20,6 @@
'compose' => { ui => 1, gegl => 1 },
'contrast-normalize' => {},
'contrast-retinex' => { ui => 1 },
'contrast-stretch' => {},
'contrast-stretch-hsv' => {},
'convolution-matrix' => { ui => 1 },
'crop-zealous' => {},

View File

@ -27,7 +27,6 @@ plug-ins/common/colormap-remap.c
plug-ins/common/compose.c
plug-ins/common/contrast-normalize.c
plug-ins/common/contrast-retinex.c
plug-ins/common/contrast-stretch.c
plug-ins/common/contrast-stretch-hsv.c
plug-ins/common/convolution-matrix.c
plug-ins/common/crop-zealous.c

View File

@ -242,6 +242,55 @@ CODE
);
}
sub plug_in_c_astretch {
$blurb = 'Stretch contrast to cover the maximum possible range';
$help = <<'HELP';
This simple plug-in does an automatic contrast stretch. For each
channel in the image, it finds the minimum and maximum values... it
uses those values to stretch the individual histograms to the full
contrast range. For some images it may do just what you want; for
others it may not work that well.
HELP
&std_pdb_compat('gegl:stretch-contrast');
$date = '2013';
@inargs = (
{ name => 'run_mode', type => 'enum GimpRunMode', dead => 1,
desc => 'The run mode' },
{ name => 'image', type => 'image', dead => 1,
desc => 'Input image (unused)' },
{ name => 'drawable', type => 'drawable',
desc => 'Input drawable' }
);
%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 =
gegl_node_new_child (NULL,
"operation", "gegl:stretch-contrast",
"keep-colors", (gboolean) FALSE,
NULL);
gimp_drawable_apply_operation (drawable, progress,
C_("undo-type", "Stretch Contrast"),
node);
g_object_unref (node);
}
else
success = FALSE;
}
CODE
);
}
sub plug_in_colors_channel_mixer {
$blurb = 'Alter colors by mixing RGB Channels';
@ -1801,6 +1850,7 @@ CODE
plug_in_antialias
plug_in_autocrop
plug_in_autocrop_layer
plug_in_c_astretch
plug_in_colors_channel_mixer
plug_in_colortoalpha
plug_in_cubism