mirror of https://github.com/GNOME/gimp.git
app,pdb: add a compatibility wrapper to contrast-stretch
... and remove the old plug-in
This commit is contained in:
parent
5efcc0eb09
commit
120e9ccf39
|
@ -28,7 +28,7 @@
|
|||
#include "internal-procs.h"
|
||||
|
||||
|
||||
/* 703 procedures registered total */
|
||||
/* 704 procedures registered total */
|
||||
|
||||
void
|
||||
internal_procs_init (GimpPDB *pdb)
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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, ¶m);
|
||||
|
||||
/* 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, ¶m);
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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' => {},
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue