diff --git a/app/pdb/internal-procs.c b/app/pdb/internal-procs.c index 8504f1d49b..439eda1b5c 100644 --- a/app/pdb/internal-procs.c +++ b/app/pdb/internal-procs.c @@ -28,7 +28,7 @@ #include "internal-procs.h" -/* 698 procedures registered total */ +/* 699 procedures registered total */ void internal_procs_init (GimpPDB *pdb) diff --git a/app/pdb/plug-in-compat-cmds.c b/app/pdb/plug-in-compat-cmds.c index 4290272c1a..32e7e3af0a 100644 --- a/app/pdb/plug-in-compat-cmds.c +++ b/app/pdb/plug-in-compat-cmds.c @@ -433,6 +433,60 @@ plug_in_cubism_invoker (GimpProcedure *procedure, error ? *error : NULL); } +static GimpValueArray * +plug_in_hsv_noise_invoker (GimpProcedure *procedure, + Gimp *gimp, + GimpContext *context, + GimpProgress *progress, + const GimpValueArray *args, + GError **error) +{ + gboolean success = TRUE; + GimpDrawable *drawable; + gint32 holdness; + gint32 hue_distance; + gint32 saturation_distance; + gint32 value_distance; + + drawable = gimp_value_get_drawable (gimp_value_array_index (args, 2), gimp); + holdness = g_value_get_int (gimp_value_array_index (args, 3)); + hue_distance = g_value_get_int (gimp_value_array_index (args, 4)); + saturation_distance = g_value_get_int (gimp_value_array_index (args, 5)); + value_distance = g_value_get_int (gimp_value_array_index (args, 6)); + + 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; + + gdouble saturation = saturation_distance / 255.0; + gdouble value = value_distance / 255.0; + + node = gegl_node_new_child (NULL, + "operation", "gegl:noise-hsv", + "holdness", (gint) holdness, + "hue-distance", (gdouble) hue_distance, + "saturation-distance", (gdouble) saturation, + "value-distance", (gdouble) value, + NULL); + + gimp_drawable_apply_operation (drawable, progress, + C_("undo-type", "Noise HSV"), + node); + + g_object_unref (node); + } + else + success = FALSE; + } + + return gimp_procedure_get_return_values (procedure, success, + error ? *error : NULL); +} + static GimpValueArray * plug_in_mblur_invoker (GimpProcedure *procedure, Gimp *gimp, @@ -1847,6 +1901,66 @@ register_plug_in_compat_procs (GimpPDB *pdb) gimp_pdb_register_procedure (pdb, procedure); g_object_unref (procedure); + /* + * gimp-plug-in-hsv-noise + */ + procedure = gimp_procedure_new (plug_in_hsv_noise_invoker); + gimp_object_set_static_name (GIMP_OBJECT (procedure), + "plug-in-hsv-noise"); + gimp_procedure_set_static_strings (procedure, + "plug-in-hsv-noise", + "Randomize hue, saturation and value independently", + "Scattering pixel values in HSV space", + "Compatibility procedure. Please see 'gegl:noise-hsv' for credits.", + "Compatibility procedure. Please see 'gegl:noise-hsv' 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_procedure_add_argument (procedure, + gimp_param_spec_int32 ("holdness", + "holdness", + "Convolution strength", + 1, 8, 1, + GIMP_PARAM_READWRITE)); + gimp_procedure_add_argument (procedure, + gimp_param_spec_int32 ("hue-distance", + "hue distance", + "Scattering of hue angle", + 0, 180, 0, + GIMP_PARAM_READWRITE)); + gimp_procedure_add_argument (procedure, + gimp_param_spec_int32 ("saturation-distance", + "saturation distance", + "Distribution distance on saturation axis", + 0, 255, 0, + GIMP_PARAM_READWRITE)); + gimp_procedure_add_argument (procedure, + gimp_param_spec_int32 ("value-distance", + "value distance", + "Distribution distance on value axis", + 0, 255, 0, + GIMP_PARAM_READWRITE)); + gimp_pdb_register_procedure (pdb, procedure); + g_object_unref (procedure); + /* * gimp-plug-in-mblur */ diff --git a/plug-ins/common/.gitignore b/plug-ins/common/.gitignore index 5e69a6f4fa..16da47b745 100644 --- a/plug-ins/common/.gitignore +++ b/plug-ins/common/.gitignore @@ -190,8 +190,6 @@ /newsprint.exe /nl-filter /nl-filter.exe -/noise-hsv -/noise-hsv.exe /noise-rgb /noise-rgb.exe /noise-solid diff --git a/plug-ins/common/Makefile.am b/plug-ins/common/Makefile.am index 7bc509c714..8ebe9b2882 100644 --- a/plug-ins/common/Makefile.am +++ b/plug-ins/common/Makefile.am @@ -138,7 +138,6 @@ libexec_PROGRAMS = \ max-rgb \ newsprint \ nl-filter \ - noise-hsv \ noise-rgb \ noise-solid \ nova \ @@ -1842,23 +1841,6 @@ nl_filter_LDADD = \ $(INTLLIBS) \ $(nl_filter_RC) -noise_hsv_SOURCES = \ - noise-hsv.c - -noise_hsv_LDADD = \ - $(libgimpui) \ - $(libgimpwidgets) \ - $(libgimpmodule) \ - $(libgimp) \ - $(libgimpmath) \ - $(libgimpconfig) \ - $(libgimpcolor) \ - $(libgimpbase) \ - $(GTK_LIBS) \ - $(RT_LIBS) \ - $(INTLLIBS) \ - $(noise_hsv_RC) - noise_rgb_SOURCES = \ noise-rgb.c diff --git a/plug-ins/common/gimprc.common b/plug-ins/common/gimprc.common index 8d035abb5c..5904c1b2f3 100644 --- a/plug-ins/common/gimprc.common +++ b/plug-ins/common/gimprc.common @@ -92,7 +92,6 @@ mail_RC = mail.rc.o max_rgb_RC = max-rgb.rc.o newsprint_RC = newsprint.rc.o nl_filter_RC = nl-filter.rc.o -noise_hsv_RC = noise-hsv.rc.o noise_rgb_RC = noise-rgb.rc.o noise_solid_RC = noise-solid.rc.o nova_RC = nova.rc.o diff --git a/plug-ins/common/noise-hsv.c b/plug-ins/common/noise-hsv.c deleted file mode 100644 index d9f644ef25..0000000000 --- a/plug-ins/common/noise-hsv.c +++ /dev/null @@ -1,455 +0,0 @@ -/* scatter_hsv.c -- This is a plug-in for GIMP (1.0's API) - * Author: Shuji Narazaki - * Time-stamp: <2000-01-08 02:49:39 yasuhiro> - * Version: 0.42 - * - * Copyright (C) 1997 Shuji Narazaki - * - * 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 . - */ - -#include "config.h" - -#include - -#include -#include - -#include "libgimp/stdplugins-intl.h" - - -#define HSV_NOISE_PROC "plug-in-hsv-noise" -#define SCATTER_HSV_PROC "plug-in-scatter-hsv" -#define PLUG_IN_BINARY "noise-hsv" -#define PLUG_IN_ROLE "gimp-noise-hsv" -#define SCALE_WIDTH 100 -#define ENTRY_WIDTH 3 - - -static void query (void); -static void run (const gchar *name, - gint nparams, - const GimpParam *param, - gint *nreturn_vals, - GimpParam **return_vals); - -static void scatter_hsv (GimpDrawable *drawable); -static gboolean scatter_hsv_dialog (GimpDrawable *drawable); -static void scatter_hsv_preview (GimpPreview *preview); - -static void scatter_hsv_scatter (guchar *r, - guchar *g, - guchar *b); - -static gint randomize_value (gint now, - gint min, - gint max, - gboolean wraps_around, - gint rand_max); - - -const GimpPlugInInfo PLUG_IN_INFO = -{ - NULL, /* init_proc */ - NULL, /* quit_proc */ - query, /* query_proc */ - run, /* run_proc */ -}; - -typedef struct -{ - gint holdness; - gint hue_distance; - gint saturation_distance; - gint value_distance; -} ValueType; - -static ValueType VALS = -{ - 2, - 3, - 10, - 10 -}; - -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 (not used)" }, - { GIMP_PDB_DRAWABLE, "drawable", "Input drawable" }, - { GIMP_PDB_INT32, "holdness", "convolution strength" }, - { GIMP_PDB_INT32, "hue-distance", "scattering of hue angle [0,180]" }, - { GIMP_PDB_INT32, "saturation-distance", "distribution distance on saturation axis [0,255]" }, - { GIMP_PDB_INT32, "value-distance", "distribution distance on value axis [0,255]" } - }; - - gimp_install_procedure (HSV_NOISE_PROC, - N_("Randomize hue/saturation/value independently"), - "Scattering pixel values in HSV space", - "Shuji Narazaki (narazaki@InetQ.or.jp)", - "Shuji Narazaki", - "1997", - N_("HSV Noise..."), - "RGB*", - GIMP_PLUGIN, - G_N_ELEMENTS (args), 0, - args, NULL); - - gimp_plugin_menu_register (HSV_NOISE_PROC, "/Filters/Noise"); - - gimp_install_procedure (SCATTER_HSV_PROC, - "Scattering pixel values in HSV space", - "Scattering pixel values in HSV space", - "Shuji Narazaki (narazaki@InetQ.or.jp)", - "Shuji Narazaki", - "1997", - NULL, - "RGB*", - GIMP_PLUGIN, - G_N_ELEMENTS (args), 0, - args, NULL); -} - -static void -run (const gchar *name, - gint nparams, - const GimpParam *param, - gint *nreturn_vals, - GimpParam **return_vals) -{ - static GimpParam values[1]; - GimpPDBStatusType status = GIMP_PDB_SUCCESS; - GimpRunMode run_mode; - GimpDrawable *drawable; - - INIT_I18N (); - - run_mode = param[0].data.d_int32; - drawable = gimp_drawable_get (param[2].data.d_int32); - - *nreturn_vals = 1; - *return_vals = values; - - values[0].type = GIMP_PDB_STATUS; - values[0].data.d_status = status; - - switch (run_mode) - { - case GIMP_RUN_INTERACTIVE: - gimp_get_data (HSV_NOISE_PROC, &VALS); - if (!gimp_drawable_is_rgb (drawable->drawable_id)) - { - g_message (_("Can only operate on RGB drawables.")); - return; - } - if (! scatter_hsv_dialog (drawable)) - return; - break; - - case GIMP_RUN_NONINTERACTIVE: - VALS.holdness = CLAMP (param[3].data.d_int32, 1, 8); - VALS.hue_distance = CLAMP (param[4].data.d_int32, 0, 180); - VALS.saturation_distance = CLAMP (param[5].data.d_int32, 0, 255); - VALS.value_distance = CLAMP (param[6].data.d_int32, 0, 255); - break; - - case GIMP_RUN_WITH_LAST_VALS: - gimp_get_data (HSV_NOISE_PROC, &VALS); - break; - } - - scatter_hsv (drawable); - - if (run_mode != GIMP_RUN_NONINTERACTIVE) - gimp_displays_flush(); - if (run_mode == GIMP_RUN_INTERACTIVE && status == GIMP_PDB_SUCCESS ) - gimp_set_data (HSV_NOISE_PROC, &VALS, sizeof (ValueType)); - - values[0].type = GIMP_PDB_STATUS; - values[0].data.d_status = status; -} - -static void -scatter_hsv_func (const guchar *src, - guchar *dest, - gint bpp, - gpointer data) -{ - guchar h, s, v; - - h = src[0]; - s = src[1]; - v = src[2]; - - scatter_hsv_scatter (&h, &s, &v); - - dest[0] = h; - dest[1] = s; - dest[2] = v; - - if (bpp == 4) - dest[3] = src[3]; -} - -static void -scatter_hsv (GimpDrawable *drawable) -{ - gimp_tile_cache_ntiles (2 * (drawable->width / gimp_tile_width () + 1)); - - gimp_progress_init (_("HSV Noise")); - - gimp_rgn_iterate2 (drawable, 0 /* unused */, scatter_hsv_func, NULL); - - gimp_drawable_detach (drawable); -} - -static gint -randomize_value (gint now, - gint min, - gint max, - gboolean wraps_around, - gint rand_max) -{ - gint flag, steps, index; - gdouble rand_val, new; - - steps = max - min + 1; - rand_val = g_random_double (); - - for (index = 1; index < VALS.holdness; index++) - { - double tmp = g_random_double (); - if (tmp < rand_val) - rand_val = tmp; - } - - if (g_random_double () < 0.5) - flag = -1; - else - flag = 1; - - new = now + flag * fmod (rand_max * rand_val, steps); - - if (new < min) - { - if (wraps_around) - new += steps; - else - new = min; - } - - if (max < new) - { - if (wraps_around) - new -= steps; - else - new = max; - } - - return (gint) (new + 0.5); -} - -static void -scatter_hsv_scatter (guchar *r, - guchar *g, - guchar *b) -{ - gint h, s, v; - gint h1, s1, v1; - gint h2, s2, v2; - - h = *r; s = *g; v = *b; - - gimp_rgb_to_hsv_int (&h, &s, &v); - - /* there is no need for scattering hue of desaturated pixels here */ - if ((VALS.hue_distance > 0) && (s > 0)) - h = randomize_value (h, 0, 359, TRUE, VALS.hue_distance); - - /* desaturated pixels get random hue before increasing saturation */ - if (VALS.saturation_distance > 0) { - if (s == 0) - h = g_random_int_range (0, 360); - s = randomize_value (s, 0, 255, FALSE, VALS.saturation_distance); - } - - if (VALS.value_distance > 0) - v = randomize_value (v, 0, 255, FALSE, VALS.value_distance); - - h1 = h; s1 = s; v1 = v; - - gimp_hsv_to_rgb_int (&h, &s, &v); /* don't believe ! */ - - h2 = h; s2 = s; v2 = v; - - gimp_rgb_to_hsv_int (&h2, &s2, &v2); /* h2 should be h1. But... */ - - if ((abs (h1 - h2) <= VALS.hue_distance) && - (abs (s1 - s2) <= VALS.saturation_distance) && - (abs (v1 - v2) <= VALS.value_distance)) - { - *r = h; - *g = s; - *b = v; - } -} - -static void -scatter_hsv_preview (GimpPreview *preview) -{ - GimpDrawable *drawable; - GimpPixelRgn src_rgn; - guchar *src, *dst; - gint i; - gint x1, y1; - gint width, height; - gint bpp; - - drawable = - gimp_drawable_preview_get_drawable (GIMP_DRAWABLE_PREVIEW (preview)); - - gimp_preview_get_position (preview, &x1, &y1); - gimp_preview_get_size (preview, &width, &height); - - bpp = drawable->bpp; - - src = g_new (guchar, width * height * bpp); - dst = g_new (guchar, width * height * bpp); - - gimp_pixel_rgn_init (&src_rgn, drawable, - x1, y1, width, height, - FALSE, FALSE); - gimp_pixel_rgn_get_rect (&src_rgn, src, x1, y1, width, height); - - for (i = 0; i < width * height; i++) - scatter_hsv_func (src + i * bpp, dst + i * bpp, bpp, NULL); - - gimp_preview_draw_buffer (preview, dst, width * bpp); - - g_free (src); - g_free (dst); -} - - -/* dialog stuff */ - -static gboolean -scatter_hsv_dialog (GimpDrawable *drawable) -{ - GtkWidget *dialog; - GtkWidget *main_vbox; - GtkWidget *preview; - GtkWidget *table; - GtkObject *adj; - gboolean run; - - gimp_ui_init (PLUG_IN_BINARY, TRUE); - - dialog = gimp_dialog_new (_("HSV Noise"), PLUG_IN_ROLE, - NULL, 0, - gimp_standard_help_func, HSV_NOISE_PROC, - - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, - - NULL); - - gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog), - GTK_RESPONSE_OK, - GTK_RESPONSE_CANCEL, - -1); - - gimp_window_set_transient (GTK_WINDOW (dialog)); - - main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); - gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 12); - gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), - main_vbox, TRUE, TRUE, 0); - gtk_widget_show (main_vbox); - - preview = gimp_drawable_preview_new (drawable, NULL); - gtk_box_pack_start (GTK_BOX (main_vbox), preview, TRUE, TRUE, 0); - gtk_widget_show (preview); - - g_signal_connect (preview, "invalidated", - G_CALLBACK (scatter_hsv_preview), - NULL); - - table = gtk_table_new (4, 3, FALSE); - gtk_table_set_col_spacings (GTK_TABLE (table), 6); - gtk_table_set_row_spacings (GTK_TABLE (table), 6); - gtk_box_pack_start (GTK_BOX (main_vbox), table, FALSE, FALSE, 0); - gtk_widget_show (table); - - adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 0, - _("_Holdness:"), SCALE_WIDTH, ENTRY_WIDTH, - VALS.holdness, 1, 8, 1, 2, 0, - TRUE, 0, 0, - NULL, NULL); - g_signal_connect (adj, "value-changed", - G_CALLBACK (gimp_int_adjustment_update), - &VALS.holdness); - g_signal_connect_swapped (adj, "value-changed", - G_CALLBACK (gimp_preview_invalidate), - preview); - - adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 1, - _("H_ue:"), SCALE_WIDTH, ENTRY_WIDTH, - VALS.hue_distance, 0, 180, 1, 6, 0, - TRUE, 0, 0, - NULL, NULL); - g_signal_connect (adj, "value-changed", - G_CALLBACK (gimp_int_adjustment_update), - &VALS.hue_distance); - g_signal_connect_swapped (adj, "value-changed", - G_CALLBACK (gimp_preview_invalidate), - preview); - - adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 2, - _("_Saturation:"), SCALE_WIDTH, ENTRY_WIDTH, - VALS.saturation_distance, 0, 255, 1, 8, 0, - TRUE, 0, 0, - NULL, NULL); - g_signal_connect (adj, "value-changed", - G_CALLBACK (gimp_int_adjustment_update), - &VALS.saturation_distance); - g_signal_connect_swapped (adj, "value-changed", - G_CALLBACK (gimp_preview_invalidate), - preview); - - adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 3, - _("_Value:"), SCALE_WIDTH, ENTRY_WIDTH, - VALS.value_distance, 0, 255, 1, 8, 0, - TRUE, 0, 0, - NULL, NULL); - g_signal_connect (adj, "value-changed", - G_CALLBACK (gimp_int_adjustment_update), - &VALS.value_distance); - g_signal_connect_swapped (adj, "value-changed", - G_CALLBACK (gimp_preview_invalidate), - preview); - - gtk_widget_show (dialog); - - run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK); - - gtk_widget_destroy (dialog); - - return run; -} diff --git a/plug-ins/common/plugin-defs.pl b/plug-ins/common/plugin-defs.pl index 54858ed3aa..03fc2da317 100644 --- a/plug-ins/common/plugin-defs.pl +++ b/plug-ins/common/plugin-defs.pl @@ -93,7 +93,6 @@ 'max-rgb' => { ui => 1 }, 'newsprint' => { ui => 1 }, 'nl-filter' => { ui => 1 }, - 'noise-hsv' => { ui => 1 }, 'noise-rgb' => { ui => 1 }, 'noise-solid' => { ui => 1 }, 'nova' => { ui => 1 }, diff --git a/po-plug-ins/POTFILES.in b/po-plug-ins/POTFILES.in index 4353404208..482347ad0f 100644 --- a/po-plug-ins/POTFILES.in +++ b/po-plug-ins/POTFILES.in @@ -100,7 +100,6 @@ plug-ins/common/mail.c plug-ins/common/max-rgb.c plug-ins/common/newsprint.c plug-ins/common/nl-filter.c -plug-ins/common/noise-hsv.c plug-ins/common/noise-rgb.c plug-ins/common/noise-solid.c plug-ins/common/nova.c diff --git a/tools/pdbgen/pdb/plug_in_compat.pdb b/tools/pdbgen/pdb/plug_in_compat.pdb index dbf8828a38..2bead1d1fa 100644 --- a/tools/pdbgen/pdb/plug_in_compat.pdb +++ b/tools/pdbgen/pdb/plug_in_compat.pdb @@ -437,6 +437,67 @@ CODE ); } +sub plug_in_hsv_noise { + $blurb = 'Randomize hue, saturation and value independently'; + + $help = <<'HELP'; +Scattering pixel values in HSV space +HELP + + &std_pdb_compat('gegl:noise-hsv'); + $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' }, + { name => 'holdness', type => '1 <= int32 <= 8', + desc => 'Convolution strength' }, + { name => 'hue_distance', type => '0 <= int32 <= 180', + desc => 'Scattering of hue angle' }, + { name => 'saturation_distance', type => '0 <= int32 <= 255', + desc => 'Distribution distance on saturation axis' }, + { name => 'value_distance', type => '0 <= int32 <= 255', + desc => 'Distribution distance on value axis' } + ); + + %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; + + gdouble saturation = saturation_distance / 255.0; + gdouble value = value_distance / 255.0; + + + node = gegl_node_new_child (NULL, + "operation", "gegl:noise-hsv", + "holdness", (gint) holdness, + "hue-distance", (gdouble) hue_distance, + "saturation-distance", (gdouble) saturation, + "value-distance", (gdouble) value, + NULL); + + gimp_drawable_apply_operation (drawable, progress, + C_("undo-type", "Noise HSV"), + node); + + g_object_unref (node); + } + else + success = FALSE; +} +CODE + ); +} + sub plug_in_mblur { $blurb = 'Simulate movement using directional blur'; @@ -1615,6 +1676,7 @@ CODE plug_in_colors_channel_mixer plug_in_colortoalpha plug_in_cubism + plug_in_hsv_noise plug_in_mblur plug_in_mblur_inward plug_in_mosaic