plug-ins: Port nl-filter to GimpProcedureDialog

This commit is contained in:
Alx Sa 2023-04-09 02:13:46 +00:00
parent 43b4ec765a
commit d171355703
1 changed files with 101 additions and 134 deletions

View File

@ -89,12 +89,15 @@ static GimpValueArray * nlfilter_run (GimpProcedure *procedu
const GimpValueArray *args,
gpointer run_data);
static void nlfilter (GimpDrawable *drawable,
GimpPreview *preview);
static void nlfilter_preview (GimpDrawable *drawable,
static void nlfilter (GObject *config,
GimpDrawable *drawable,
GimpPreview *preview);
static void nlfilter_preview (GtkWidget *widget,
GObject *config);
static gboolean nlfilter_dialog (GimpDrawable *drawable);
static gboolean nlfilter_dialog (GimpProcedure *procedure,
GObject *config,
GimpDrawable *drawable);
static gint nlfiltInit (gdouble alpha,
gdouble radius,
@ -108,9 +111,6 @@ static void nlfiltRow (guchar *srclast,
gint bpp,
gint filtno);
static void nlfilter_scale_entry_update_double (GimpLabelSpin *entry,
gdouble *value);
G_DEFINE_TYPE (Nlfilter, nlfilter, GIMP_TYPE_PLUG_IN)
@ -118,14 +118,6 @@ GIMP_MAIN (NLFILTER_TYPE)
DEFINE_STD_SET_I18N
static NLFilterValues nlfvals =
{
0.3,
1.0 / 3.0,
0
};
static void
nlfilter_class_init (NlfilterClass *klass)
{
@ -168,34 +160,35 @@ nlfilter_create_procedure (GimpPlugIn *plug_in,
gimp_procedure_set_documentation (procedure,
_("Nonlinear swiss army knife filter"),
"This is the pnmnlfilt, in gimp's "
"clothing. See the pnmnlfilt manpage "
"for details.",
_("This is the pnmnlfilt, in GIMP's "
"clothing. See the pnmnlfilt manpage "
"for details."),
name);
gimp_procedure_set_attribution (procedure,
"Graeme W. Gill, gimp 0.99 plug-in "
"Graeme W. Gill, GIMP 0.99 plug-in "
"by Eric L. Hernes",
"Graeme W. Gill, Eric L. Hernes",
"1997");
GIMP_PROC_ARG_DOUBLE (procedure, "alpha",
"Alpha",
"The amount of the filter to apply",
_("_Alpha"),
_("The amount of the filter to apply"),
0, 1, 0.3,
G_PARAM_READWRITE);
GIMP_PROC_ARG_DOUBLE (procedure, "radius",
"Radius",
"The filter radius",
_("Ra_dius"),
_("The filter radius"),
1.0 / 3.0, 1, 1.0 / 3.0,
G_PARAM_READWRITE);
GIMP_PROC_ARG_INT (procedure, "filter",
"Filter",
"The Filter to Run, "
"0 - alpha trimmed mean; "
"1 - optimal estimation (alpha controls noise variance); "
"2 - edge enhancement",
_("Filter"),
_("The Filter to Run, "
"0 - alpha trimmed mean; "
"1 - optimal estimation "
"(alpha controls noise variance); "
"2 - edge enhancement"),
0, 2, 0,
G_PARAM_READWRITE);
}
@ -212,14 +205,21 @@ nlfilter_run (GimpProcedure *procedure,
const GimpValueArray *args,
gpointer run_data)
{
GimpDrawable *drawable;
GimpProcedureConfig *config;
GimpDrawable *drawable;
gegl_init (NULL, NULL);
config = gimp_procedure_create_config (procedure);
gimp_procedure_config_begin_run (config, NULL, run_mode, args);
if (n_drawables != 1)
{
GError *error = NULL;
gimp_procedure_config_end_run (config, GIMP_PDB_EXECUTION_ERROR);
g_object_unref (config);
g_set_error (&error, GIMP_PLUG_IN_ERROR, 0,
_("Procedure '%s' only works with one drawable."),
gimp_procedure_get_name (procedure));
@ -236,34 +236,28 @@ nlfilter_run (GimpProcedure *procedure,
switch (run_mode)
{
case GIMP_RUN_INTERACTIVE:
gimp_get_data (PLUG_IN_PROC, &nlfvals);
if (! nlfilter_dialog (drawable))
if (! nlfilter_dialog (procedure, G_OBJECT (config), drawable))
{
gimp_procedure_config_end_run (config, GIMP_PDB_CANCEL);
g_object_unref (config);
return gimp_procedure_new_return_values (procedure,
GIMP_PDB_CANCEL,
NULL);
}
break;
case GIMP_RUN_NONINTERACTIVE:
nlfvals.alpha = GIMP_VALUES_GET_DOUBLE (args, 0);
nlfvals.radius = GIMP_VALUES_GET_DOUBLE (args, 1);
nlfvals.filter = GIMP_VALUES_GET_INT (args, 2);
break;
case GIMP_RUN_WITH_LAST_VALS :
gimp_get_data (PLUG_IN_PROC, &nlfvals);
default:
break;
};
nlfilter (drawable, NULL);
nlfilter (G_OBJECT (config), drawable, NULL);
if (run_mode != GIMP_RUN_NONINTERACTIVE)
gimp_displays_flush ();
if (run_mode == GIMP_RUN_INTERACTIVE)
gimp_set_data (PLUG_IN_PROC, &nlfvals, sizeof (NLFilterValues));
gimp_procedure_config_end_run (config, GIMP_PDB_SUCCESS);
g_object_unref (config);
return gimp_procedure_new_return_values (procedure, GIMP_PDB_SUCCESS, NULL);
}
@ -967,7 +961,8 @@ rectang_area (gdouble rx0, gdouble ry0, gdouble rx1, gdouble ry1, gdouble tx0,
}
static void
nlfilter (GimpDrawable *drawable,
nlfilter (GObject *config,
GimpDrawable *drawable,
GimpPreview *preview)
{
GeglBuffer *src_buffer;
@ -978,6 +973,15 @@ nlfilter (GimpDrawable *drawable,
gint x1, y1, y2;
gint width, height, bpp;
gint filtno, y, rowsize, exrowsize, p_update;
gdouble alpha;
gdouble radius;
gint filter;
g_object_get (config,
"alpha", &alpha,
"radius", &radius,
"filter", &filter,
NULL);
if (preview)
{
@ -1021,7 +1025,7 @@ nlfilter (GimpDrawable *drawable,
thisrow = lastrow + exrowsize;
nextrow = thisrow + exrowsize;
filtno = nlfiltInit (nlfvals.alpha, nlfvals.radius, nlfvals.filter);
filtno = nlfiltInit (alpha, radius, filter);
if (!preview)
gimp_progress_init (_("NL Filter"));
@ -1097,122 +1101,85 @@ nlfilter (GimpDrawable *drawable,
}
static void
nlfilter_preview (GimpDrawable *drawable,
GimpPreview *preview)
nlfilter_preview (GtkWidget *widget,
GObject *config)
{
nlfilter (drawable, preview);
GimpPreview *preview = GIMP_PREVIEW (widget);
GimpDrawable *drawable = g_object_get_data (config, "drawable");
nlfilter (config, drawable, preview);
}
static gboolean
nlfilter_dialog (GimpDrawable *drawable)
nlfilter_dialog (GimpProcedure *procedure,
GObject *config,
GimpDrawable *drawable)
{
GtkWidget *dialog;
GtkWidget *main_vbox;
GtkWidget *preview;
GtkWidget *frame;
GtkWidget *alpha_trim;
GtkWidget *opt_est;
GtkWidget *edge_enhance;
GtkWidget *grid;
GtkWidget *scale;
gboolean run;
GtkWidget *dialog;
GtkWidget *vbox;
GtkWidget *preview;
GtkListStore *store;
GtkWidget *frame;
GtkWidget *scale;
gboolean run;
gimp_ui_init (PLUG_IN_BINARY);
dialog = gimp_dialog_new (_("NL Filter"), PLUG_IN_ROLE,
NULL, 0,
gimp_standard_help_func, PLUG_IN_PROC,
_("_Cancel"), GTK_RESPONSE_CANCEL,
_("_OK"), GTK_RESPONSE_OK,
NULL);
dialog = gimp_procedure_dialog_new (procedure,
GIMP_PROCEDURE_CONFIG (config),
_("NL Filter"));
gimp_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
GTK_RESPONSE_OK,
GTK_RESPONSE_CANCEL,
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);
store = gimp_int_store_new (_("Alpha trimmed mean"), 0,
_("Optimal estimation"), 1,
_("Edge enhancement"), 2,
NULL);
frame = gimp_procedure_dialog_get_int_radio (GIMP_PROCEDURE_DIALOG (dialog),
"filter", GIMP_INT_STORE (store));
gtk_widget_set_margin_bottom (frame, 12);
preview = gimp_drawable_preview_new_from_drawable (drawable);
gtk_box_pack_start (GTK_BOX (main_vbox), preview, TRUE, TRUE, 0);
scale = gimp_procedure_dialog_get_scale_entry (GIMP_PROCEDURE_DIALOG (dialog),
"alpha", 1.0);
gtk_widget_set_margin_bottom (scale, 12);
scale = gimp_procedure_dialog_get_scale_entry (GIMP_PROCEDURE_DIALOG (dialog),
"radius", 1.0);
gtk_widget_set_margin_bottom (scale, 12);
vbox = gimp_procedure_dialog_fill_box (GIMP_PROCEDURE_DIALOG (dialog),
"nlfilter-vbox", "filter", "alpha",
"radius", NULL);
preview = gimp_aspect_preview_new_from_drawable (drawable);
gtk_box_pack_start (GTK_BOX (vbox), preview, TRUE, TRUE, 0);
gtk_box_reorder_child (GTK_BOX (vbox), preview, 0);
gtk_widget_set_margin_bottom (preview, 12);
gtk_widget_show (preview);
g_signal_connect_swapped (preview, "invalidated",
G_CALLBACK (nlfilter_preview),
drawable);
g_object_set_data (config, "drawable", drawable);
frame = gimp_int_radio_group_new (TRUE, _("Filter"),
G_CALLBACK (gimp_radio_button_update),
&nlfvals.filter, NULL, nlfvals.filter,
g_signal_connect (preview, "invalidated",
G_CALLBACK (nlfilter_preview),
config);
_("_Alpha trimmed mean"),
filter_alpha_trim, &alpha_trim,
_("Op_timal estimation"),
filter_opt_est, &opt_est,
_("_Edge enhancement"),
filter_edge_enhance, &edge_enhance,
NULL);
gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
g_signal_connect_swapped (alpha_trim, "toggled",
G_CALLBACK (gimp_preview_invalidate),
preview);
g_signal_connect_swapped (opt_est, "toggled",
G_CALLBACK (gimp_preview_invalidate),
preview);
g_signal_connect_swapped (edge_enhance, "toggled",
g_signal_connect_swapped (config, "notify",
G_CALLBACK (gimp_preview_invalidate),
preview);
grid = gtk_grid_new ();
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
gtk_grid_set_column_spacing (GTK_GRID (grid), 6);
gtk_box_pack_start (GTK_BOX (main_vbox), grid, FALSE, FALSE, 0);
gtk_widget_show (grid);
scale = gimp_scale_entry_new (_("A_lpha:"), nlfvals.alpha, 0.0, 1.0, 2);
g_signal_connect (scale, "value-changed",
G_CALLBACK (nlfilter_scale_entry_update_double),
&nlfvals.alpha);
g_signal_connect_swapped (scale, "value-changed",
G_CALLBACK (gimp_preview_invalidate),
preview);
gtk_grid_attach (GTK_GRID (grid), scale, 0, 0, 3, 1);
gtk_widget_show (scale);
scale = gimp_scale_entry_new (_("_Radius:"), nlfvals.radius, 1.0 / 3.0, 1.0, 2);
g_signal_connect (scale, "value-changed",
G_CALLBACK (nlfilter_scale_entry_update_double),
&nlfvals.radius);
g_signal_connect_swapped (scale, "value-changed",
G_CALLBACK (gimp_preview_invalidate),
preview);
gtk_grid_attach (GTK_GRID (grid), scale, 0, 1, 3, 1);
gtk_widget_show (scale);
gimp_procedure_dialog_fill (GIMP_PROCEDURE_DIALOG (dialog),
"nlfilter-vbox", NULL);
gtk_widget_show (dialog);
run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);
run = gimp_procedure_dialog_run (GIMP_PROCEDURE_DIALOG (dialog));
gtk_widget_destroy (dialog);
return run;
}
static void
nlfilter_scale_entry_update_double (GimpLabelSpin *entry,
gdouble *value)
{
*value = gimp_label_spin_get_value (entry);
}