added a float adjustment callback.

2000-01-15  Michael Natterer  <mitch@gimp.org>

	* libgimp/gimpwidgets.[ch]: added a float adjustment callback.

	* plug-ins/common/bumpmap.c
	* plug-ins/common/depthmerge.c
	* plug-ins/common/despeckle.c
	* plug-ins/common/destripe.c
	* plug-ins/common/gpb.c
	* plug-ins/common/iwarp.c
	* plug-ins/common/polar.c
	* plug-ins/common/sharpen.c
	* plug-ins/common/tileit.c
	* plug-ins/common/whirlpinch.c
	* plug-ins/common/wind.c:

	- Some more hscale+spinbutton instead of hscale+entry widgets.
	- Get the CHECK_SIZE constants from libgimp in some plugins.
This commit is contained in:
Michael Natterer
2000-01-15 15:32:28 +00:00
committed by Michael Natterer
parent 868ffd98fc
commit 6e83e1ba0a
16 changed files with 1771 additions and 2420 deletions

View File

@ -1,3 +1,22 @@
2000-01-15 Michael Natterer <mitch@gimp.org>
* libgimp/gimpwidgets.[ch]: added a float adjustment callback.
* plug-ins/common/bumpmap.c
* plug-ins/common/depthmerge.c
* plug-ins/common/despeckle.c
* plug-ins/common/destripe.c
* plug-ins/common/gpb.c
* plug-ins/common/iwarp.c
* plug-ins/common/polar.c
* plug-ins/common/sharpen.c
* plug-ins/common/tileit.c
* plug-ins/common/whirlpinch.c
* plug-ins/common/wind.c:
- Some more hscale+spinbutton instead of hscale+entry widgets.
- Get the CHECK_SIZE constants from libgimp in some plugins.
Sat Jan 15 15:40:26 CET 2000 Stanislav Brabec <utx@penguin.cz> Sat Jan 15 15:40:26 CET 2000 Stanislav Brabec <utx@penguin.cz>
* plug-ins/webbrowser/webbrowser.c: Small i18n fix. * plug-ins/webbrowser/webbrowser.c: Small i18n fix.

View File

@ -152,9 +152,6 @@ gimp_radio_group_new (gboolean in_frame,
button = gtk_radio_button_new_with_label (group, label); button = gtk_radio_button_new_with_label (group, label);
group = gtk_radio_button_group (GTK_RADIO_BUTTON (button)); group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (button), "toggled",
GTK_SIGNAL_FUNC (callback),
data);
if (user_data) if (user_data)
gtk_object_set_user_data (GTK_OBJECT (button), user_data); gtk_object_set_user_data (GTK_OBJECT (button), user_data);
@ -162,10 +159,13 @@ gimp_radio_group_new (gboolean in_frame,
if (widget_ptr) if (widget_ptr)
*widget_ptr = button; *widget_ptr = button;
/* press the initially active radio button */
if (active) if (active)
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
gtk_signal_connect (GTK_OBJECT (button), "toggled",
GTK_SIGNAL_FUNC (callback),
data);
gtk_widget_show (button); gtk_widget_show (button);
label = va_arg (args, gchar*); label = va_arg (args, gchar*);
@ -228,9 +228,6 @@ gimp_radio_group_new2 (gboolean in_frame,
button = gtk_radio_button_new_with_label (group, label); button = gtk_radio_button_new_with_label (group, label);
group = gtk_radio_button_group (GTK_RADIO_BUTTON (button)); group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (button), "toggled",
GTK_SIGNAL_FUNC (callback),
data);
if (user_data) if (user_data)
gtk_object_set_user_data (GTK_OBJECT (button), user_data); gtk_object_set_user_data (GTK_OBJECT (button), user_data);
@ -238,10 +235,13 @@ gimp_radio_group_new2 (gboolean in_frame,
if (widget_ptr) if (widget_ptr)
*widget_ptr = button; *widget_ptr = button;
/* press the initially active radio button */
if (initial == user_data) if (initial == user_data)
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
gtk_signal_connect (GTK_OBJECT (button), "toggled",
GTK_SIGNAL_FUNC (callback),
data);
gtk_widget_show (button); gtk_widget_show (button);
label = va_arg (args, gchar*); label = va_arg (args, gchar*);
@ -410,6 +410,16 @@ gimp_int_adjustment_update (GtkAdjustment *adjustment,
*val = (gint) (adjustment->value + 0.5); *val = (gint) (adjustment->value + 0.5);
} }
void
gimp_float_adjustment_update (GtkAdjustment *adjustment,
gpointer data)
{
gfloat *val;
val = (gfloat *) data;
*val = adjustment->value;
}
void void
gimp_double_adjustment_update (GtkAdjustment *adjustment, gimp_double_adjustment_update (GtkAdjustment *adjustment,
gpointer data) gpointer data)

View File

@ -115,6 +115,9 @@ void gimp_radio_button_update (GtkWidget *widget,
void gimp_int_adjustment_update (GtkAdjustment *adjustment, void gimp_int_adjustment_update (GtkAdjustment *adjustment,
gpointer data); gpointer data);
void gimp_float_adjustment_update (GtkAdjustment *adjustment,
gpointer data);
void gimp_double_adjustment_update (GtkAdjustment *adjustment, void gimp_double_adjustment_update (GtkAdjustment *adjustment,
gpointer data); gpointer data);

View File

@ -152,9 +152,6 @@ gimp_radio_group_new (gboolean in_frame,
button = gtk_radio_button_new_with_label (group, label); button = gtk_radio_button_new_with_label (group, label);
group = gtk_radio_button_group (GTK_RADIO_BUTTON (button)); group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (button), "toggled",
GTK_SIGNAL_FUNC (callback),
data);
if (user_data) if (user_data)
gtk_object_set_user_data (GTK_OBJECT (button), user_data); gtk_object_set_user_data (GTK_OBJECT (button), user_data);
@ -162,10 +159,13 @@ gimp_radio_group_new (gboolean in_frame,
if (widget_ptr) if (widget_ptr)
*widget_ptr = button; *widget_ptr = button;
/* press the initially active radio button */
if (active) if (active)
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
gtk_signal_connect (GTK_OBJECT (button), "toggled",
GTK_SIGNAL_FUNC (callback),
data);
gtk_widget_show (button); gtk_widget_show (button);
label = va_arg (args, gchar*); label = va_arg (args, gchar*);
@ -228,9 +228,6 @@ gimp_radio_group_new2 (gboolean in_frame,
button = gtk_radio_button_new_with_label (group, label); button = gtk_radio_button_new_with_label (group, label);
group = gtk_radio_button_group (GTK_RADIO_BUTTON (button)); group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (button), "toggled",
GTK_SIGNAL_FUNC (callback),
data);
if (user_data) if (user_data)
gtk_object_set_user_data (GTK_OBJECT (button), user_data); gtk_object_set_user_data (GTK_OBJECT (button), user_data);
@ -238,10 +235,13 @@ gimp_radio_group_new2 (gboolean in_frame,
if (widget_ptr) if (widget_ptr)
*widget_ptr = button; *widget_ptr = button;
/* press the initially active radio button */
if (initial == user_data) if (initial == user_data)
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
gtk_signal_connect (GTK_OBJECT (button), "toggled",
GTK_SIGNAL_FUNC (callback),
data);
gtk_widget_show (button); gtk_widget_show (button);
label = va_arg (args, gchar*); label = va_arg (args, gchar*);
@ -410,6 +410,16 @@ gimp_int_adjustment_update (GtkAdjustment *adjustment,
*val = (gint) (adjustment->value + 0.5); *val = (gint) (adjustment->value + 0.5);
} }
void
gimp_float_adjustment_update (GtkAdjustment *adjustment,
gpointer data)
{
gfloat *val;
val = (gfloat *) data;
*val = adjustment->value;
}
void void
gimp_double_adjustment_update (GtkAdjustment *adjustment, gimp_double_adjustment_update (GtkAdjustment *adjustment,
gpointer data) gpointer data)

View File

@ -115,6 +115,9 @@ void gimp_radio_button_update (GtkWidget *widget,
void gimp_int_adjustment_update (GtkAdjustment *adjustment, void gimp_int_adjustment_update (GtkAdjustment *adjustment,
gpointer data); gpointer data);
void gimp_float_adjustment_update (GtkAdjustment *adjustment,
gpointer data);
void gimp_double_adjustment_update (GtkAdjustment *adjustment, void gimp_double_adjustment_update (GtkAdjustment *adjustment,
gpointer data); gpointer data);

View File

@ -109,7 +109,6 @@
#define PREVIEW_SIZE 128 #define PREVIEW_SIZE 128
#define SCALE_WIDTH 200 #define SCALE_WIDTH 200
#define ENTRY_WIDTH 60
/***** Types *****/ /***** Types *****/
@ -211,33 +210,29 @@ static void bumpmap_row (guchar *src_row,
static void bumpmap_convert_row (guchar *row, int width, int bpp, static void bumpmap_convert_row (guchar *row, int width, int bpp,
int has_alpha, guchar *lut); int has_alpha, guchar *lut);
static gint bumpmap_dialog(void); static gint bumpmap_dialog (void);
static void dialog_init_preview(void); static void dialog_init_preview (void);
static void dialog_new_bumpmap(void); static void dialog_new_bumpmap (void);
static void dialog_update_preview(void); static void dialog_update_preview (void);
static gint dialog_preview_events(GtkWidget *widget, GdkEvent *event); static gint dialog_preview_events (GtkWidget *widget, GdkEvent *event);
static void dialog_scroll_src(void); static void dialog_scroll_src (void);
static void dialog_scroll_bumpmap(void); static void dialog_scroll_bumpmap (void);
static void dialog_get_rows(GPixelRgn *pr, guchar **rows, int x, int y, int width, int height); static void dialog_get_rows (GPixelRgn *pr, guchar **rows,
static void dialog_fill_src_rows(int start, int how_many, int yofs); int x, int y, int width, int height);
static void dialog_fill_bumpmap_rows(int start, int how_many, int yofs); static void dialog_fill_src_rows (int start, int how_many, int yofs);
static void dialog_fill_bumpmap_rows (int start, int how_many, int yofs);
static void dialog_compensate_callback(GtkWidget *widget, gpointer data); static void dialog_compensate_callback (GtkWidget *widget, gpointer data);
static void dialog_invert_callback(GtkWidget *widget, gpointer data); static void dialog_invert_callback (GtkWidget *widget, gpointer data);
static void dialog_map_type_callback(GtkWidget *widget, gpointer data); static void dialog_map_type_callback (GtkWidget *widget, gpointer data);
static gint dialog_constrain(gint32 image_id, gint32 drawable_id, gpointer data); static gint dialog_constrain (gint32 image_id, gint32 drawable_id,
static void dialog_bumpmap_callback(gint32 id, gpointer data); gpointer data);
static void dialog_create_dvalue(char *title, GtkTable *table, int row, gdouble *value, static void dialog_bumpmap_callback (gint32 id, gpointer data);
double left, double right); static void dialog_dscale_update (GtkAdjustment *adjustment,
static void dialog_dscale_update(GtkAdjustment *adjustment, gdouble *value); gdouble *value);
static void dialog_dentry_update(GtkWidget *widget, gdouble *value); static void dialog_iscale_update_normal (GtkAdjustment *adjustment, gint *value);
static void dialog_create_ivalue(char *title, GtkTable *table, int row, gint *value, static void dialog_iscale_update_full (GtkAdjustment *adjustment, gint *value);
int left, int right, int full_update); static void dialog_ok_callback (GtkWidget *widget, gpointer data);
static void dialog_iscale_update_normal(GtkAdjustment *adjustment, gint *value);
static void dialog_iscale_update_full(GtkAdjustment *adjustment, gint *value);
static void dialog_ientry_update_normal(GtkWidget *widget, gint *value);
static void dialog_ientry_update_full(GtkWidget *widget, gint *value);
static void dialog_ok_callback(GtkWidget *widget, gpointer data);
/***** Variables *****/ /***** Variables *****/
@ -291,18 +286,11 @@ static bumpmap_interface_t bmint =
FALSE /* run */ FALSE /* run */
}; };
static char *map_types[] =
{
N_("Linear map"),
N_("Spherical map"),
N_("Sinusoidal map")
};
GDrawable *drawable = NULL; GDrawable *drawable = NULL;
int sel_x1, sel_y1, sel_x2, sel_y2; gint sel_x1, sel_y1, sel_x2, sel_y2;
int sel_width, sel_height; gint sel_width, sel_height;
int img_bpp, img_has_alpha; gint img_bpp, img_has_alpha;
/***** Functions *****/ /***** Functions *****/
@ -773,12 +761,11 @@ bumpmap_dialog (void)
GtkWidget *frame; GtkWidget *frame;
GtkWidget *table; GtkWidget *table;
GtkWidget *right_vbox; GtkWidget *right_vbox;
GtkWidget *vbox;
GtkWidget *label; GtkWidget *label;
GtkWidget *option_menu; GtkWidget *option_menu;
GtkWidget *menu; GtkWidget *menu;
GtkWidget *button; GtkWidget *button;
GSList *group; GtkObject *adj;
gint argc; gint argc;
gchar **argv; gchar **argv;
guchar *color_cube; guchar *color_cube;
@ -887,31 +874,20 @@ bumpmap_dialog (void)
/* Type of map */ /* Type of map */
frame = gtk_frame_new (NULL); frame =
gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN); gimp_radio_group_new2 (TRUE, NULL,
dialog_map_type_callback,
&bmvals.type, (gpointer) bmvals.type,
_("Linear Map"), (gpointer) LINEAR, NULL,
_("Spherical Map"), (gpointer) SPHERICAL, NULL,
_("Sinuosidal Map"), (gpointer) SINUOSIDAL, NULL,
NULL);
gtk_box_pack_start (GTK_BOX (right_vbox), frame, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (right_vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame); gtk_widget_show (frame);
vbox = gtk_vbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
gtk_widget_show (vbox);
group = NULL;
for (i = 0; i < (sizeof(map_types) / sizeof(map_types[0])); i++)
{
button = gtk_radio_button_new_with_label (group, gettext (map_types[i]));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
if (i == bmvals.type)
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
gtk_signal_connect (GTK_OBJECT (button), "toggled",
(GtkSignalFunc) dialog_map_type_callback,
(gpointer) ((long) i));
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
gtk_widget_show (button);
}
/* Table for bottom controls */ /* Table for bottom controls */
table = gtk_table_new (8, 3, FALSE); table = gtk_table_new (8, 3, FALSE);
@ -943,20 +919,61 @@ bumpmap_dialog (void)
/* Controls */ /* Controls */
dialog_create_dvalue(_("Azimuth:"), GTK_TABLE (table), 1, adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
&bmvals.azimuth, 0.0, 360.0); _("Azimuth:"), SCALE_WIDTH, 0,
dialog_create_dvalue (_("Elevation:"), GTK_TABLE (table), 2, bmvals.azimuth, 0.0, 360.0, 1.0, 15.0, 2,
&bmvals.elevation, 0.5, 90.0); NULL, NULL);
dialog_create_ivalue (_("Depth:"), GTK_TABLE (table), 3, gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
&bmvals.depth, 1, 65, FALSE); GTK_SIGNAL_FUNC (dialog_dscale_update),
dialog_create_ivalue (_("X Offset:"), GTK_TABLE (table), 4, &bmvals.azimuth);
&bmvals.xofs, -1000, 1001, FALSE);
dialog_create_ivalue (_("Y Offset:"), GTK_TABLE (table), 5, adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
&bmvals.yofs, -1000, 1001, FALSE); _("Elevation:"), SCALE_WIDTH, 0,
dialog_create_ivalue (_("Waterlevel:"), GTK_TABLE (table), 6, bmvals.elevation, 0.5, 90.0, 1.0, 5.0, 2,
&bmvals.waterlevel, 0, 256, TRUE); NULL, NULL);
dialog_create_ivalue (_("Ambient:"), GTK_TABLE (table), 7, gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
&bmvals.ambient, 0, 256, FALSE); GTK_SIGNAL_FUNC (dialog_dscale_update),
&bmvals.elevation);
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 3,
_("Depth:"), SCALE_WIDTH, 0,
bmvals.depth, 1.0, 65.0, 1.0, 5.0, 0,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (dialog_iscale_update_normal),
&bmvals.depth);
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 4,
_("X Offset:"), SCALE_WIDTH, 0,
bmvals.xofs, -1000.0, 1001.0, 1.0, 10.0, 0,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (dialog_iscale_update_normal),
&bmvals.xofs);
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 5,
_("Y Offset:"), SCALE_WIDTH, 0,
bmvals.yofs, -1000.0, 1001.0, 1.0, 10.0, 0,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (dialog_iscale_update_normal),
&bmvals.yofs);
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 6,
_("Waterlevel:"), SCALE_WIDTH, 0,
bmvals.waterlevel, 0.0, 256.0, 1.0, 8.0, 0,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (dialog_iscale_update_full),
&bmvals.waterlevel);
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 7,
_("Ambient:"), SCALE_WIDTH, 0,
bmvals.ambient, 0.0, 256.0, 1.0, 8.0, 0,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (dialog_iscale_update_normal),
&bmvals.ambient);
/* Done */ /* Done */
@ -1520,10 +1537,10 @@ static void
dialog_map_type_callback (GtkWidget *widget, dialog_map_type_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
gimp_radio_button_update (widget, data);
if (GTK_TOGGLE_BUTTON (widget)->active) if (GTK_TOGGLE_BUTTON (widget)->active)
{ {
bmvals.type = (long) data;
bumpmap_init_params (&bmint.params); bumpmap_init_params (&bmint.params);
dialog_fill_bumpmap_rows (0, bmint.preview_height + 2, bmint.bm_yofs); dialog_fill_bumpmap_rows (0, bmint.preview_height + 2, bmint.bm_yofs);
dialog_update_preview (); dialog_update_preview ();
@ -1551,258 +1568,33 @@ dialog_bumpmap_callback (gint32 id,
dialog_update_preview (); dialog_update_preview ();
} }
static void
dialog_create_dvalue (char *title,
GtkTable *table,
int row,
gdouble *value,
double left,
double right)
{
GtkWidget *label;
GtkWidget *scale;
GtkWidget *entry;
GtkObject *scale_data;
gchar buf[256];
label = gtk_label_new (title);
gtk_misc_set_alignment (GTK_MISC(label), 1.0, 0.5);
gtk_table_attach (table, label, 0, 1, row, row + 1, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label);
scale_data = gtk_adjustment_new (*value, left, right, 1.0, 1.0, 0.0);
gtk_signal_connect (GTK_OBJECT (scale_data), "value_changed",
(GtkSignalFunc) dialog_dscale_update,
value);
scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data));
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_table_attach (table, scale, 1, 2, row, row + 1,
GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_CONTINUOUS);
gtk_widget_show (scale);
entry = gtk_entry_new ();
gtk_object_set_user_data (GTK_OBJECT (entry), scale_data);
gtk_object_set_user_data (scale_data, entry);
gtk_widget_set_usize (entry, ENTRY_WIDTH, 0);
g_snprintf (buf, sizeof (buf), "%0.2f", *value);
gtk_entry_set_text (GTK_ENTRY (entry), buf);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) dialog_dentry_update,
value);
gtk_table_attach (GTK_TABLE (table), entry, 2, 3, row, row + 1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (entry);
}
static void static void
dialog_dscale_update (GtkAdjustment *adjustment, dialog_dscale_update (GtkAdjustment *adjustment,
gdouble *value) gdouble *value)
{ {
GtkWidget *entry; gimp_double_adjustment_update (adjustment, value);
gchar buf[256];
if (*value != adjustment->value)
{
*value = adjustment->value;
entry = gtk_object_get_user_data (GTK_OBJECT (adjustment));
g_snprintf (buf, sizeof (buf), "%0.2f", *value);
gtk_signal_handler_block_by_data (GTK_OBJECT (entry), value);
gtk_entry_set_text (GTK_ENTRY (entry), buf);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (entry), value);
dialog_update_preview (); dialog_update_preview ();
}
}
static void
dialog_dentry_update (GtkWidget *widget,
gdouble *value)
{
GtkAdjustment *adjustment;
gdouble new_value;
new_value = atof (gtk_entry_get_text (GTK_ENTRY (widget)));
if (*value != new_value)
{
adjustment = gtk_object_get_user_data (GTK_OBJECT (widget));
if ((new_value >= adjustment->lower) &&
(new_value <= adjustment->upper))
{
*value = new_value;
adjustment->value = new_value;
gtk_signal_emit_by_name (GTK_OBJECT (adjustment), "value_changed");
dialog_update_preview();
}
}
}
static void
dialog_create_ivalue (char *title,
GtkTable *table,
int row,
gint *value,
int left,
int right,
int full_update)
{
GtkWidget *label;
GtkWidget *scale;
GtkWidget *entry;
GtkObject *scale_data;
gchar buf[256];
label = gtk_label_new (title);
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (table, label, 0, 1, row, row + 1, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label);
scale_data = gtk_adjustment_new (*value, left, right, 1.0, 1.0, 1.0);
if (full_update)
gtk_signal_connect (GTK_OBJECT (scale_data), "value_changed",
(GtkSignalFunc) dialog_iscale_update_full,
value);
else
gtk_signal_connect (GTK_OBJECT (scale_data), "value_changed",
(GtkSignalFunc) dialog_iscale_update_normal,
value);
scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data));
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_table_attach (table, scale, 1, 2, row, row + 1,
GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_CONTINUOUS);
gtk_widget_show (scale);
entry = gtk_entry_new ();
gtk_object_set_user_data (GTK_OBJECT (entry), scale_data);
gtk_object_set_user_data (scale_data, entry);
gtk_widget_set_usize (entry, ENTRY_WIDTH, 0);
g_snprintf(buf, sizeof (buf), "%d", *value);
gtk_entry_set_text (GTK_ENTRY (entry), buf);
if (full_update)
gtk_signal_connect(GTK_OBJECT (entry), "changed",
(GtkSignalFunc) dialog_ientry_update_full,
value);
else
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) dialog_ientry_update_normal,
value);
gtk_table_attach (GTK_TABLE (table), entry, 2, 3, row, row + 1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (entry);
} }
static void static void
dialog_iscale_update_normal (GtkAdjustment *adjustment, dialog_iscale_update_normal (GtkAdjustment *adjustment,
gint *value) gint *value)
{ {
GtkWidget *entry; gimp_int_adjustment_update (adjustment, value);
gchar buf[256];
if (*value != adjustment->value)
{
*value = adjustment->value;
entry = gtk_object_get_user_data (GTK_OBJECT (adjustment));
g_snprintf (buf, sizeof (buf), "%d", *value);
gtk_signal_handler_block_by_data (GTK_OBJECT (entry), value);
gtk_entry_set_text (GTK_ENTRY (entry), buf);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (entry), value);
dialog_update_preview (); dialog_update_preview ();
}
} }
static void static void
dialog_iscale_update_full (GtkAdjustment *adjustment, dialog_iscale_update_full (GtkAdjustment *adjustment,
gint *value) gint *value)
{ {
GtkWidget *entry; gimp_int_adjustment_update (adjustment, value);
gchar buf[256];
if (*value != adjustment->value)
{
*value = adjustment->value;
entry = gtk_object_get_user_data (GTK_OBJECT (adjustment));
g_snprintf (buf, sizeof (buf), "%d", *value);
gtk_signal_handler_block_by_data (GTK_OBJECT (entry), value);
gtk_entry_set_text (GTK_ENTRY (entry), buf);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (entry), value);
bumpmap_init_params (&bmint.params); bumpmap_init_params (&bmint.params);
dialog_fill_bumpmap_rows (0, bmint.preview_height + 2, bmint.bm_yofs); dialog_fill_bumpmap_rows (0, bmint.preview_height + 2, bmint.bm_yofs);
dialog_update_preview (); dialog_update_preview ();
}
}
static void
dialog_ientry_update_normal (GtkWidget *widget,
gint *value)
{
GtkAdjustment *adjustment;
gdouble new_value;
new_value = atoi (gtk_entry_get_text (GTK_ENTRY (widget)));
if (*value != new_value)
{
adjustment = gtk_object_get_user_data (GTK_OBJECT (widget));
if ((new_value >= adjustment->lower) &&
(new_value <= adjustment->upper))
{
*value = new_value;
adjustment->value = new_value;
gtk_signal_emit_by_name (GTK_OBJECT (adjustment), "value_changed");
dialog_update_preview();
}
}
}
static void
dialog_ientry_update_full (GtkWidget *widget,
gint *value)
{
GtkAdjustment *adjustment;
gdouble new_value;
new_value = atoi (gtk_entry_get_text (GTK_ENTRY (widget)));
if (*value != new_value)
{
adjustment = gtk_object_get_user_data (GTK_OBJECT (widget));
if ((new_value >= adjustment->lower) &&
(new_value <= adjustment->upper))
{
*value = new_value;
adjustment->value = new_value;
gtk_signal_emit_by_name (GTK_OBJECT (adjustment), "value_changed");
bumpmap_init_params (&bmint.params);
dialog_fill_bumpmap_rows (0, bmint.preview_height + 2, bmint.bm_yofs);
dialog_update_preview();
}
}
} }
static void static void

File diff suppressed because it is too large Load Diff

View File

@ -31,9 +31,7 @@
* preview_scroll_callback() - Update the preview when a scrollbar is moved. * preview_scroll_callback() - Update the preview when a scrollbar is moved.
* preview_update() - Update the preview window. * preview_update() - Update the preview window.
* preview_exit() - Free all memory used by the preview window... * preview_exit() - Free all memory used by the preview window...
* dialog_create_ivalue() - Create an integer value control...
* dialog_iscale_update() - Update the value field using the scale. * dialog_iscale_update() - Update the value field using the scale.
* dialog_ientry_update() - Update the value field using the text entry.
* dialog_adaptive_callback() - Update the filter type... * dialog_adaptive_callback() - Update the filter type...
* dialog_recursive_callback() - Update the filter type... * dialog_recursive_callback() - Update the filter type...
* dialog_ok_callback() - Start the filter... * dialog_ok_callback() - Start the filter...
@ -41,6 +39,26 @@
* Revision History: * Revision History:
* *
* $Log$ * $Log$
* Revision 1.25 2000/01/15 15:32:28 mitch
* 2000-01-15 Michael Natterer <mitch@gimp.org>
*
* * libgimp/gimpwidgets.[ch]: added a float adjustment callback.
*
* * plug-ins/common/bumpmap.c
* * plug-ins/common/depthmerge.c
* * plug-ins/common/despeckle.c
* * plug-ins/common/destripe.c
* * plug-ins/common/gpb.c
* * plug-ins/common/iwarp.c
* * plug-ins/common/polar.c
* * plug-ins/common/sharpen.c
* * plug-ins/common/tileit.c
* * plug-ins/common/whirlpinch.c
* * plug-ins/common/wind.c:
*
* - Some more hscale+spinbutton instead of hscale+entry widgets.
* - Get the CHECK_SIZE constants from libgimp in some plugins.
*
* Revision 1.24 2000/01/14 12:40:59 mitch * Revision 1.24 2000/01/14 12:40:59 mitch
* 2000-01-14 Michael Natterer <mitch@gimp.org> * 2000-01-14 Michael Natterer <mitch@gimp.org>
* *

View File

@ -30,9 +30,7 @@
* preview_scroll_callback() - Update the preview when a scrollbar is moved. * preview_scroll_callback() - Update the preview when a scrollbar is moved.
* preview_update() - Update the preview window. * preview_update() - Update the preview window.
* preview_exit() - Free all memory used by the preview window... * preview_exit() - Free all memory used by the preview window...
* dialog_create_ivalue() - Create an integer value control...
* dialog_iscale_update() - Update the value field using the scale. * dialog_iscale_update() - Update the value field using the scale.
* dialog_ientry_update() - Update the value field using the text entry.
* dialog_histogram_callback() * dialog_histogram_callback()
* dialog_ok_callback() - Start the filter... * dialog_ok_callback() - Start the filter...
* *
@ -64,7 +62,6 @@
#define PLUG_IN_VERSION "0.2" #define PLUG_IN_VERSION "0.2"
#define PREVIEW_SIZE 200 #define PREVIEW_SIZE 200
#define SCALE_WIDTH 140 #define SCALE_WIDTH 140
#define ENTRY_WIDTH 40
#define MAX_AVG 100 #define MAX_AVG 100
/* /*
@ -72,18 +69,17 @@
*/ */
static void query (void); static void query (void);
static void run (char *, static void run (gchar *name,
int, gint nparams,
GParam *, GParam *param,
int *, gint *nreturn_vals,
GParam **); GParam **return_vals);
static void destripe (void); static void destripe (void);
static gint destripe_dialog (void); static gint destripe_dialog (void);
static void dialog_create_ivalue (char *, GtkTable *, int, gint *, int, int); static void dialog_histogram_callback (GtkWidget *, gpointer);
static void dialog_iscale_update (GtkAdjustment *, gint *); static void dialog_iscale_update (GtkAdjustment *, gint *);
static void dialog_ientry_update (GtkWidget *, gint *);
static void dialog_ok_callback (GtkWidget *, gpointer); static void dialog_ok_callback (GtkWidget *, gpointer);
static void preview_init (void); static void preview_init (void);
@ -97,15 +93,15 @@ static void preview_scroll_callback (void);
*/ */
GPlugInInfo PLUG_IN_INFO = GPlugInInfo PLUG_IN_INFO =
{ {
NULL, /* init_proc */ NULL, /* init_proc */
NULL, /* quit_proc */ NULL, /* quit_proc */
query, /* query_proc */ query, /* query_proc */
run /* run_proc */ run /* run_proc */
}; };
GtkWidget *preview; /* Preview widget */ GtkWidget *preview; /* Preview widget */
int preview_width, /* Width of preview widget */ gint preview_width, /* Width of preview widget */
preview_height, /* Height of preview widget */ preview_height, /* Height of preview widget */
preview_x1, /* Upper-left X of preview */ preview_x1, /* Upper-left X of preview */
preview_y1, /* Upper-left Y of preview */ preview_y1, /* Upper-left Y of preview */
@ -115,29 +111,21 @@ GtkObject *hscroll_data, /* Horizontal scrollbar data */
*vscroll_data; /* Vertical scrollbar data */ *vscroll_data; /* Vertical scrollbar data */
GDrawable *drawable = NULL; /* Current image */ GDrawable *drawable = NULL; /* Current image */
int sel_x1, /* Selection bounds */ gint sel_x1, /* Selection bounds */
sel_y1, sel_y1,
sel_x2, sel_x2,
sel_y2; sel_y2;
int histogram = FALSE; gint histogram = FALSE;
int img_bpp; /* Bytes-per-pixel in image */ gint img_bpp; /* Bytes-per-pixel in image */
gint run_filter = FALSE; /* True if we should run the filter */ gint run_filter = FALSE; /* True if we should run the filter */
int avg_width = 36; gint avg_width = 36;
/* MAIN ()
* 'main()' - Main entry - just call gimp_main()...
*/
MAIN()
/*
* 'query()' - Respond to a plug-in query...
*/
static void static void
query(void) query (void)
{ {
static GParamDef args[] = static GParamDef args[] =
{ {
@ -152,33 +140,29 @@ query(void)
INIT_I18N(); INIT_I18N();
gimp_install_procedure(PLUG_IN_NAME, gimp_install_procedure (PLUG_IN_NAME,
_("Destripe filter, used to remove vertical stripes caused by cheap scanners."), _("Destripe filter, used to remove vertical stripes caused by cheap scanners."),
_("This plug-in tries to remove vertical stripes from an image."), _("This plug-in tries to remove vertical stripes from an image."),
"Marc Lehmann <pcg@goof.com>", "Marc Lehmann <pcg@goof.com>", "Marc Lehmann <pcg@goof.com>", "Marc Lehmann <pcg@goof.com>",
PLUG_IN_VERSION, PLUG_IN_VERSION,
N_("<Image>/Filters/Enhance/Destripe..."), N_("<Image>/Filters/Enhance/Destripe..."),
"RGB*, GRAY*", "RGB*, GRAY*",
PROC_PLUG_IN, nargs, nreturn_vals, args, return_vals); PROC_PLUG_IN,
nargs, nreturn_vals,
args, return_vals);
} }
/*
* 'run()' - Run the filter...
*/
static void static void
run(char *name, /* I - Name of filter program. */ run (gchar *name,
int nparams, /* I - Number of parameters passed in */ gint nparams,
GParam *param, /* I - Parameter values */ GParam *param,
int *nreturn_vals, /* O - Number of return values */ gint *nreturn_vals,
GParam **return_vals) /* O - Return values */ GParam **return_vals)
{ {
GRunModeType run_mode; /* Current run mode */ GRunModeType run_mode; /* Current run mode */
GStatusType status; /* Return status */ GStatusType status; /* Return status */
static GParam values[1]; /* Return values */ static GParam values[1]; /* Return values */
INIT_I18N_UI(); INIT_I18N_UI();
/* /*
@ -198,11 +182,11 @@ run(char *name, /* I - Name of filter program. */
* Get drawable information... * Get drawable information...
*/ */
drawable = gimp_drawable_get(param[2].data.d_drawable); drawable = gimp_drawable_get (param[2].data.d_drawable);
gimp_drawable_mask_bounds(drawable->id, &sel_x1, &sel_y1, &sel_x2, &sel_y2); gimp_drawable_mask_bounds (drawable->id, &sel_x1, &sel_y1, &sel_x2, &sel_y2);
img_bpp = gimp_drawable_bpp(drawable->id); img_bpp = gimp_drawable_bpp (drawable->id);
/* /*
* See how we will run * See how we will run
@ -210,26 +194,23 @@ run(char *name, /* I - Name of filter program. */
switch (run_mode) switch (run_mode)
{ {
case RUN_INTERACTIVE : case RUN_INTERACTIVE:
/* /*
* Possibly retrieve data... * Possibly retrieve data...
*/ */
gimp_get_data (PLUG_IN_NAME, &avg_width);
gimp_get_data(PLUG_IN_NAME, &avg_width);
/* /*
* Get information from the dialog... * Get information from the dialog...
*/ */
if (!destripe_dialog ())
if (!destripe_dialog())
return; return;
break; break;
case RUN_NONINTERACTIVE : case RUN_NONINTERACTIVE:
/* /*
* Make sure all the arguments are present... * Make sure all the arguments are present...
*/ */
if (nparams != 4) if (nparams != 4)
status = STATUS_CALLING_ERROR; status = STATUS_CALLING_ERROR;
else else
@ -240,8 +221,7 @@ run(char *name, /* I - Name of filter program. */
/* /*
* Possibly retrieve data... * Possibly retrieve data...
*/ */
gimp_get_data (PLUG_IN_NAME, &avg_width);
gimp_get_data(PLUG_IN_NAME, &avg_width);
break; break;
default : default :
@ -255,35 +235,31 @@ run(char *name, /* I - Name of filter program. */
if (status == STATUS_SUCCESS) if (status == STATUS_SUCCESS)
{ {
if ((gimp_drawable_is_rgb(drawable->id) || if ((gimp_drawable_is_rgb (drawable->id) ||
gimp_drawable_is_gray(drawable->id))) gimp_drawable_is_gray (drawable->id)))
{ {
/* /*
* Set the tile cache size... * Set the tile cache size...
*/ */
gimp_tile_cache_ntiles ((drawable->width + gimp_tile_width() - 1) /
gimp_tile_cache_ntiles((drawable->width + gimp_tile_width() - 1) /
gimp_tile_width()); gimp_tile_width());
/* /*
* Run! * Run!
*/ */
destripe ();
destripe();
/* /*
* If run mode is interactive, flush displays... * If run mode is interactive, flush displays...
*/ */
if (run_mode != RUN_NONINTERACTIVE) if (run_mode != RUN_NONINTERACTIVE)
gimp_displays_flush(); gimp_displays_flush();
/* /*
* Store data... * Store data...
*/ */
if (run_mode == RUN_INTERACTIVE) if (run_mode == RUN_INTERACTIVE)
gimp_set_data(PLUG_IN_NAME, &avg_width, sizeof(avg_width)); gimp_set_data (PLUG_IN_NAME, &avg_width, sizeof(avg_width));
} }
else else
status = STATUS_EXECUTION_ERROR; status = STATUS_EXECUTION_ERROR;
@ -292,22 +268,23 @@ run(char *name, /* I - Name of filter program. */
/* /*
* Reset the current run status... * Reset the current run status...
*/ */
values[0].data.d_status = status; values[0].data.d_status = status;
/* /*
* Detach from the drawable... * Detach from the drawable...
*/ */
gimp_drawable_detach (drawable);
gimp_drawable_detach(drawable);
} }
static inline void static inline void
preview_draw_row (int x, int y, int w, guchar *row) preview_draw_row (gint x,
gint y,
gint w,
guchar *row)
{ {
guchar *rgb = g_new(guchar, w * 3); guchar *rgb = g_new (guchar, w * 3);
guchar *rgb_ptr; guchar *rgb_ptr;
int i; gint i;
switch (img_bpp) switch (img_bpp)
{ {
@ -316,23 +293,25 @@ preview_draw_row (int x, int y, int w, guchar *row)
for (i = 0, rgb_ptr = rgb; i < w; i++, row += img_bpp, rgb_ptr += 3) for (i = 0, rgb_ptr = rgb; i < w; i++, row += img_bpp, rgb_ptr += 3)
rgb_ptr[0] = rgb_ptr[1] = rgb_ptr[2] = *row; rgb_ptr[0] = rgb_ptr[1] = rgb_ptr[2] = *row;
gtk_preview_draw_row(GTK_PREVIEW(preview), rgb, x, y, w); gtk_preview_draw_row (GTK_PREVIEW (preview), rgb, x, y, w);
break; break;
case 3: case 3:
gtk_preview_draw_row(GTK_PREVIEW(preview), row, x, y, w); gtk_preview_draw_row (GTK_PREVIEW (preview), row, x, y, w);
break; break;
case 4: case 4:
for (i = 0, rgb_ptr = rgb; i < w; i++, row += 4, rgb_ptr += 3) for (i = 0, rgb_ptr = rgb; i < w; i++, row += 4, rgb_ptr += 3)
rgb_ptr[0] = row[0], {
rgb_ptr[1] = row[1], rgb_ptr[0] = row[0];
rgb_ptr[1] = row[1];
rgb_ptr[2] = row[2]; rgb_ptr[2] = row[2];
}
gtk_preview_draw_row(GTK_PREVIEW(preview), rgb, x, y, w); gtk_preview_draw_row (GTK_PREVIEW (preview), rgb, x, y, w);
break; break;
} }
g_free(rgb); g_free (rgb);
} }
@ -549,35 +528,20 @@ destripe (void)
destripe_rect (sel_x1, sel_y1, sel_x2, sel_y2, FALSE); destripe_rect (sel_x1, sel_y1, sel_x2, sel_y2, FALSE);
} }
static void
dialog_histogram_callback (GtkWidget *widget, /* I - Toggle button */
gpointer data) /* I - Data */
{
histogram = !histogram;
preview_update ();
}
/*
* 'destripe_dialog()' - Popup a dialog window for the filter box size...
*/
static gint static gint
destripe_dialog (void) destripe_dialog (void)
{ {
GtkWidget *dialog; /* Dialog window */ GtkWidget *dialog;
GtkWidget *table; /* Table "container" for controls */ GtkWidget *table;
GtkWidget *ptable; /* Preview table */ GtkWidget *ptable;
GtkWidget *ftable; /* Filter table */ GtkWidget *ftable;
GtkWidget *frame; /* Frame for preview */ GtkWidget *frame;
GtkWidget *scrollbar; /* Horizontal + vertical scroller */ GtkWidget *scrollbar;
GtkWidget *button; GtkWidget *button;
gint argc; /* Fake argc for GUI */ GtkObject *adj;
gchar **argv; /* Fake argv for GUI */ gint argc;
guchar *color_cube; /* Preview color cube... */ gchar **argv;
guchar *color_cube;
/*
* Initialize the program's display...
*/
argc = 1; argc = 1;
argv = g_new (gchar *, 1); argv = g_new (gchar *, 1);
@ -601,10 +565,6 @@ destripe_dialog (void)
gtk_widget_set_default_visual (gtk_preview_get_visual ()); gtk_widget_set_default_visual (gtk_preview_get_visual ());
gtk_widget_set_default_colormap (gtk_preview_get_cmap ()); gtk_widget_set_default_colormap (gtk_preview_get_cmap ());
/*
* Dialog window...
*/
dialog = gimp_dialog_new (_("Destripe"), "destripe", dialog = gimp_dialog_new (_("Destripe"), "destripe",
gimp_plugin_help_func, "filters/destripe.html", gimp_plugin_help_func, "filters/destripe.html",
GTK_WIN_POS_MOUSE, GTK_WIN_POS_MOUSE,
@ -626,9 +586,9 @@ destripe_dialog (void)
*/ */
table = gtk_table_new (3, 3, FALSE); table = gtk_table_new (3, 3, FALSE);
gtk_container_set_border_width (GTK_CONTAINER (table), 6);
gtk_table_set_row_spacings (GTK_TABLE (table), 4); gtk_table_set_row_spacings (GTK_TABLE (table), 4);
gtk_table_set_col_spacings (GTK_TABLE (table), 4); gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_container_set_border_width (GTK_CONTAINER (table), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), table, gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), table,
FALSE, FALSE, 0); FALSE, FALSE, 0);
gtk_widget_show (table); gtk_widget_show (table);
@ -719,12 +679,13 @@ destripe_dialog (void)
* Box size (radius) control... * Box size (radius) control...
*/ */
dialog_create_ivalue (_("Width:"), GTK_TABLE (table), 2, adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
&avg_width, 2, MAX_AVG); _("Width:"), SCALE_WIDTH, 0,
avg_width, 2, MAX_AVG, 1, 10, 0,
/* NULL, NULL);
* Show it and wait for the user to do something... gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
*/ GTK_SIGNAL_FUNC (dialog_iscale_update),
&avg_width);
gtk_widget_show (dialog); gtk_widget_show (dialog);
@ -733,23 +694,12 @@ destripe_dialog (void)
gtk_main (); gtk_main ();
gdk_flush (); gdk_flush ();
/*
* Free the preview data...
*/
preview_exit (); preview_exit ();
/*
* Return ok/cancel...
*/
return run_filter; return run_filter;
} }
/* preview functions */
/*
* 'preview_init()' - Initialize the preview window...
*/
static void static void
preview_init (void) preview_init (void)
@ -759,7 +709,6 @@ preview_init (void)
/* /*
* Setup for preview filter... * Setup for preview filter...
*/ */
width = preview_width * img_bpp; width = preview_width * img_bpp;
preview_x1 = sel_x1; preview_x1 = sel_x1;
@ -768,11 +717,6 @@ preview_init (void)
preview_y2 = preview_y1 + MIN (preview_height, sel_y2 -sel_y1); preview_y2 = preview_y1 + MIN (preview_height, sel_y2 -sel_y1);
} }
/*
* 'preview_scroll_callback()' - Update the preview when a scrollbar is moved.
*/
static void static void
preview_scroll_callback (void) preview_scroll_callback (void)
{ {
@ -784,158 +728,39 @@ preview_scroll_callback (void)
preview_update (); preview_update ();
} }
/*
* 'preview_update()' - Update the preview window.
*/
static void static void
preview_update (void) preview_update (void)
{ {
destripe_rect (preview_x1, preview_y1, preview_x2, preview_y2, TRUE); destripe_rect (preview_x1, preview_y1, preview_x2, preview_y2, TRUE);
} }
/*
* 'preview_exit()' - Free all memory used by the preview window...
*/
static void static void
preview_exit (void) preview_exit (void)
{ {
} }
/* dialog callbacks */
/*
* 'dialog_create_ivalue()' - Create an integer value control...
*/
static void static void
dialog_create_ivalue (char *title, /* I - Label for control */ dialog_histogram_callback (GtkWidget *widget,
GtkTable *table, /* I - Table container to use */ gpointer data)
int row, /* I - Row # for container */
gint *value, /* I - Value holder */
int left, /* I - Minimum value for slider */
int right) /* I - Maximum value for slider */
{ {
GtkWidget *label, /* Control label */ histogram = !histogram;
*scale, /* Scale widget */ preview_update ();
*entry; /* Text widget */
GtkObject *scale_data; /* Scale data */
gchar buf[256]; /* String buffer */
/*
* Label...
*/
label = gtk_label_new(title);
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach(table, label, 0, 1, row, row + 1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(label);
/*
* Scale...
*/
scale_data = gtk_adjustment_new(*value, left, right, 1.0, 1.0, 1.0);
gtk_signal_connect(GTK_OBJECT(scale_data), "value_changed",
(GtkSignalFunc) dialog_iscale_update,
value);
scale = gtk_hscale_new(GTK_ADJUSTMENT(scale_data));
gtk_widget_set_usize(scale, SCALE_WIDTH, 0);
gtk_table_attach(table, scale, 1, 2, row, row + 1,
GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
gtk_scale_set_draw_value(GTK_SCALE(scale), FALSE);
gtk_range_set_update_policy(GTK_RANGE(scale), GTK_UPDATE_CONTINUOUS);
gtk_widget_show(scale);
/*
* Text entry...
*/
entry = gtk_entry_new();
gtk_object_set_user_data(GTK_OBJECT(entry), scale_data);
gtk_object_set_user_data(scale_data, entry);
gtk_widget_set_usize(entry, ENTRY_WIDTH, 0);
g_snprintf(buf, sizeof (buf), "%d", *value);
gtk_entry_set_text(GTK_ENTRY(entry), buf);
gtk_signal_connect(GTK_OBJECT(entry), "changed",
(GtkSignalFunc) dialog_ientry_update,
value);
gtk_table_attach(GTK_TABLE(table), entry, 2, 3, row, row + 1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show(entry);
} }
/*
* 'dialog_iscale_update()' - Update the value field using the scale.
*/
static void static void
dialog_iscale_update (GtkAdjustment *adjustment, /* I - New value */ dialog_iscale_update (GtkAdjustment *adjustment,
gint *value) /* I - Current value */ gint *value)
{ {
GtkWidget *entry; /* Text entry widget */ gimp_int_adjustment_update (adjustment, value);
gchar buf[256]; /* Text buffer */
if (*value != adjustment->value) preview_update ();
{
*value = adjustment->value;
entry = gtk_object_get_user_data(GTK_OBJECT(adjustment));
g_snprintf(buf, sizeof (buf), "%d", *value);
gtk_signal_handler_block_by_data(GTK_OBJECT(entry), value);
gtk_entry_set_text(GTK_ENTRY(entry), buf);
gtk_signal_handler_unblock_by_data(GTK_OBJECT(entry), value);
preview_update();
};
} }
/*
* 'dialog_ientry_update()' - Update the value field using the text entry.
*/
static void static void
dialog_ientry_update(GtkWidget *widget, /* I - Entry widget */ dialog_ok_callback (GtkWidget *widget,
gint *value) /* I - Current value */ gpointer data)
{
GtkAdjustment *adjustment;
gint new_value;
new_value = atoi(gtk_entry_get_text(GTK_ENTRY(widget)));
if (*value != new_value)
{
adjustment = gtk_object_get_user_data(GTK_OBJECT(widget));
if ((new_value >= adjustment->lower) &&
(new_value <= adjustment->upper))
{
*value = new_value;
adjustment->value = new_value;
gtk_signal_emit_by_name(GTK_OBJECT(adjustment), "value_changed");
preview_update();
};
};
}
/*
* 'dialog_ok_callback()' - Start the filter...
*/
static void
dialog_ok_callback (GtkWidget *widget, /* I - OK button widget */
gpointer data) /* I - Dialog window */
{ {
run_filter = TRUE; run_filter = TRUE;

View File

@ -48,7 +48,8 @@
/* Parameters applicable each time we save a gpb or gih, saved /* Parameters applicable each time we save a gpb or gih, saved
* in the main gimp application between invocations of this plug-in. * in the main gimp application between invocations of this plug-in.
*/ */
static struct { static struct
{
/* Use by both gpb and gih: */ /* Use by both gpb and gih: */
guint spacing; guint spacing;
guchar description[MAXDESCLEN+1]; guchar description[MAXDESCLEN+1];
@ -86,10 +87,10 @@ typedef struct
/* Declare some local functions. /* Declare some local functions.
*/ */
static void query (void); static void query (void);
static void run (char *name, static void run (gchar *name,
int nparams, gint nparams,
GParam *param, GParam *param,
int *nreturn_vals, gint *nreturn_vals,
GParam **return_vals); GParam **return_vals);
static void init_gtk (void); static void init_gtk (void);
@ -106,7 +107,7 @@ GPlugInInfo PLUG_IN_INFO =
MAIN () MAIN ()
static void static void
query () query (void)
{ {
static GParamDef gpb_save_args[] = static GParamDef gpb_save_args[] =
{ {
@ -164,7 +165,7 @@ query ()
} }
static void static void
init_gtk () init_gtk (void)
{ {
gchar **argv; gchar **argv;
gint argc; gint argc;
@ -177,7 +178,6 @@ init_gtk ()
gtk_rc_parse (gimp_gtkrc ()); gtk_rc_parse (gimp_gtkrc ());
} }
static void static void
adjustment_callback (GtkWidget *widget, adjustment_callback (GtkWidget *widget,
gpointer data) gpointer data)
@ -293,35 +293,32 @@ common_save_dialog (GtkWidget *dlg,
NULL); NULL);
gtk_table_set_row_spacings (GTK_TABLE (table), 10);
gtk_table_set_col_spacings (GTK_TABLE (table), 10);
/* /*
* Spacing: __ * Spacing: __
*/ */
gtk_table_resize (GTK_TABLE (table), gtk_table_resize (GTK_TABLE (table),
GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols); GTK_TABLE (table)->nrows + 1,
GTK_TABLE (table)->ncols);
label = gtk_label_new (_("Spacing (percent):")); label = gtk_label_new (_("Spacing (Percent):"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, gtk_table_attach (GTK_TABLE (table), label, 0, 1,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows, GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_FILL, GTK_FILL, 0, 0); GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label); gtk_widget_show (label);
adjustment = gtk_adjustment_new (info.spacing, 1, 1000, 1, 10, 10); spinbutton = gimp_spin_button_new (&adjustment,
spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (adjustment), 1, 0); info.spacing, 1, 1000, 1, 10, 10,
gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinbutton), 1, 0);
GTK_SHADOW_NONE);
gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
gtk_widget_set_usize (spinbutton, 75, 0);
box = gtk_hbox_new (FALSE, 0); box = gtk_hbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, TRUE, 0);
gtk_table_attach (GTK_TABLE (table), box, 1, 2, gtk_table_attach (GTK_TABLE (table), box, 1, 2,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows, GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
(GtkSignalFunc) adjustment_callback, &info.spacing); GTK_SIGNAL_FUNC (adjustment_callback),
&info.spacing);
gtk_widget_show (spinbutton); gtk_widget_show (spinbutton);
gtk_widget_show (box); gtk_widget_show (box);
@ -332,7 +329,7 @@ common_save_dialog (GtkWidget *dlg,
GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols); GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols);
label = gtk_label_new (_("Description:")); label = gtk_label_new (_("Description:"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, gtk_table_attach (GTK_TABLE (table), label, 0, 1,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows, GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_FILL, GTK_FILL, 0, 0); GTK_FILL, GTK_FILL, 0, 0);
@ -345,7 +342,8 @@ common_save_dialog (GtkWidget *dlg,
gtk_widget_set_usize (entry, 200, 0); gtk_widget_set_usize (entry, 200, 0);
gtk_entry_set_text (GTK_ENTRY (entry), info.description); gtk_entry_set_text (GTK_ENTRY (entry), info.description);
gtk_signal_connect (GTK_OBJECT (entry), "changed", gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) entry_callback, info.description); GTK_SIGNAL_FUNC (entry_callback),
info.description);
gtk_widget_show (entry); gtk_widget_show (entry);
} }
@ -366,13 +364,16 @@ gpb_save_dialog (void)
NULL); NULL);
/* The main table */ /* The main table */
table = gtk_table_new (2, 0, FALSE); table = gtk_table_new (2, 2, FALSE);
gtk_container_border_width (GTK_CONTAINER (table), 10); gtk_container_set_border_width (GTK_CONTAINER (table), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), table, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), table, TRUE, TRUE, 0);
gtk_widget_show (table); gtk_widget_show (table);
common_save_dialog (dlg, table); common_save_dialog (dlg, table);
gtk_table_set_row_spacings (GTK_TABLE (table), 4);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_widget_show (dlg); gtk_widget_show (dlg);
gtk_main (); gtk_main ();
@ -421,7 +422,7 @@ gih_save_dialog (gint32 image_ID)
NULL); NULL);
/* The main table */ /* The main table */
table = gtk_table_new (2, 0, FALSE); table = gtk_table_new (2, 2, FALSE);
gtk_container_border_width (GTK_CONTAINER (table), 10); gtk_container_border_width (GTK_CONTAINER (table), 10);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), table, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), table, TRUE, TRUE, 0);
gtk_widget_show (table); gtk_widget_show (table);
@ -435,22 +436,19 @@ gih_save_dialog (gint32 image_ID)
gtk_table_resize (GTK_TABLE (table), gtk_table_resize (GTK_TABLE (table),
GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols); GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols);
label = gtk_label_new ( _("Cell size:")); label = gtk_label_new ( _("Cell Size:"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, gtk_table_attach (GTK_TABLE (table), label, 0, 1,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows, GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_FILL, GTK_FILL, 0, 0); GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label); gtk_widget_show (label);
box = gtk_hbox_new (FALSE, 0); box = gtk_hbox_new (FALSE, 4);
adjustment = gtk_adjustment_new (gihparms.cellwidth, spinbutton = gimp_spin_button_new (&adjustment,
2, gimp_image_width (image_ID), 1, 1, 1); gihparms.cellwidth,
spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (adjustment), 1, 0); 2, gimp_image_width (image_ID), 1, 1, 1,
gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinbutton), 1, 0);
GTK_SHADOW_NONE);
gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
gtk_widget_set_usize (spinbutton, 75, 0);
gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, FALSE, 0);
layer_ID = gimp_image_get_layers (image_ID, &nlayers); layer_ID = gimp_image_get_layers (image_ID, &nlayers);
@ -461,21 +459,18 @@ gih_save_dialog (gint32 image_ID)
cellw_adjust.guides = NULL; cellw_adjust.guides = NULL;
cellw_adjust.value = &gihparms.cellwidth; cellw_adjust.value = &gihparms.cellwidth;
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
(GtkSignalFunc) size_adjustment_callback, GTK_SIGNAL_FUNC (size_adjustment_callback),
&cellw_adjust); &cellw_adjust);
gtk_widget_show (spinbutton); gtk_widget_show (spinbutton);
label = gtk_label_new (" x "); label = gtk_label_new ("x");
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
gtk_widget_show (label); gtk_widget_show (label);
adjustment = gtk_adjustment_new (gihparms.cellheight, spinbutton = gimp_spin_button_new (&adjustment,
2, gimp_image_height (image_ID), 1, 1, 1); gihparms.cellheight,
spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (adjustment), 1, 0); gimp_image_height (image_ID), 1, 1, 1, 1,
gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinbutton), 1, 0);
GTK_SHADOW_NONE);
gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
gtk_widget_set_usize (spinbutton, 75, 0);
gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, FALSE, 0);
cellh_adjust.orientation = ORIENTATION_HORIZONTAL; cellh_adjust.orientation = ORIENTATION_HORIZONTAL;
cellh_adjust.image = image_ID; cellh_adjust.image = image_ID;
@ -484,11 +479,11 @@ gih_save_dialog (gint32 image_ID)
cellh_adjust.guides = NULL; cellh_adjust.guides = NULL;
cellh_adjust.value = &gihparms.cellheight; cellh_adjust.value = &gihparms.cellheight;
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed", gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
(GtkSignalFunc) size_adjustment_callback, GTK_SIGNAL_FUNC (size_adjustment_callback),
&cellh_adjust); &cellh_adjust);
gtk_widget_show (spinbutton); gtk_widget_show (spinbutton);
label = gtk_label_new ( _(" pixels")); label = gtk_label_new ( _("Pixels"));
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
gtk_widget_show (label); gtk_widget_show (label);
@ -506,29 +501,28 @@ gih_save_dialog (gint32 image_ID)
gtk_table_resize (GTK_TABLE (table), gtk_table_resize (GTK_TABLE (table),
GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols); GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols);
label = gtk_label_new ( _("Number of cells:")); label = gtk_label_new (_("Number of Cells:"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, gtk_table_attach (GTK_TABLE (table), label, 0, 1,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows, GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_FILL, GTK_FILL, 0, 0); GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label); gtk_widget_show (label);
adjustment = gtk_adjustment_new (gihparms.ncells, 1, 1000, 1, 10, 10);
spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (adjustment), 1, 0);
gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinbutton),
GTK_SHADOW_NONE);
gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
gtk_widget_set_usize (spinbutton, 75, 0);
box = gtk_hbox_new (FALSE, 0); box = gtk_hbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, TRUE, 0);
gtk_table_attach (GTK_TABLE (table), box, 1, 2, gtk_table_attach (GTK_TABLE (table), box, 1, 2,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows, GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
(GtkSignalFunc) adjustment_callback, &gihparms.ncells);
gtk_widget_show (spinbutton);
gtk_widget_show (box); gtk_widget_show (box);
spinbutton = gimp_spin_button_new (&adjustment,
gihparms.ncells, 1, 1000, 1, 10, 10,
1, 0);
gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, TRUE, 0);
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
GTK_SIGNAL_FUNC (adjustment_callback),
&gihparms.ncells);
gtk_widget_show (spinbutton);
if (gihparms.dim == 1) if (gihparms.dim == 1)
cellw_adjust.ncells = cellh_adjust.ncells = adjustment; cellw_adjust.ncells = cellh_adjust.ncells = adjustment;
else else
@ -540,8 +534,8 @@ gih_save_dialog (gint32 image_ID)
gtk_table_resize (GTK_TABLE (table), gtk_table_resize (GTK_TABLE (table),
GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols); GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols);
label = gtk_label_new ( _("Display as:")); label = gtk_label_new (_("Display as:"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, gtk_table_attach (GTK_TABLE (table), label, 0, 1,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows, GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_FILL, GTK_FILL, 0, 0); GTK_FILL, GTK_FILL, 0, 0);
@ -549,7 +543,7 @@ gih_save_dialog (gint32 image_ID)
box = gtk_hbox_new (FALSE, 0); box = gtk_hbox_new (FALSE, 0);
sprintf (buffer, "%2d", gihparms.rows); g_snprintf (buffer, sizeof (buffer), "%2d", gihparms.rows);
label = gtk_label_new (buffer); label = gtk_label_new (buffer);
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
cellh_adjust.count_label = label; cellh_adjust.count_label = label;
@ -557,11 +551,11 @@ gih_save_dialog (gint32 image_ID)
cellh_adjust.other_count = &gihparms.cols; cellh_adjust.other_count = &gihparms.cols;
gtk_widget_show (label); gtk_widget_show (label);
label = gtk_label_new ( _(" rows of ")); label = gtk_label_new (_(" Rows of "));
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
gtk_widget_show (label); gtk_widget_show (label);
sprintf (buffer, "%2d", gihparms.cols); g_snprintf (buffer, sizeof (buffer), "%2d", gihparms.cols);
label = gtk_label_new (buffer); label = gtk_label_new (buffer);
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
cellw_adjust.count_label = label; cellw_adjust.count_label = label;
@ -569,15 +563,15 @@ gih_save_dialog (gint32 image_ID)
cellw_adjust.other_count = &gihparms.rows; cellw_adjust.other_count = &gihparms.rows;
gtk_widget_show (label); gtk_widget_show (label);
label = gtk_label_new ( _(" columns on each layer")); label = gtk_label_new (_(" Columns on each Layer"));
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
gtk_widget_show (label); gtk_widget_show (label);
label = gtk_label_new ( _(" (width mismatch!) ")); label = gtk_label_new (_(" (Width Mismatch!) "));
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
cellw_adjust.warning_label = label; cellw_adjust.warning_label = label;
label = gtk_label_new ( _(" (height mismatch!) ")); label = gtk_label_new (_(" (Height Mismatch!) "));
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
cellh_adjust.warning_label = label; cellh_adjust.warning_label = label;
@ -593,8 +587,8 @@ gih_save_dialog (gint32 image_ID)
gtk_table_resize (GTK_TABLE (table), gtk_table_resize (GTK_TABLE (table),
GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols); GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols);
label = gtk_label_new ( _("Dimension:")); label = gtk_label_new (_("Dimension:"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, gtk_table_attach (GTK_TABLE (table), label, 0, 1,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows, GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_FILL, GTK_FILL, 0, 0); GTK_FILL, GTK_FILL, 0, 0);
@ -623,30 +617,30 @@ gih_save_dialog (gint32 image_ID)
gtk_table_resize (GTK_TABLE (table), gtk_table_resize (GTK_TABLE (table),
GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols); GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols);
label = gtk_label_new ( _("Ranks:")); label = gtk_label_new (_("Ranks:"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, gtk_table_attach (GTK_TABLE (table), label, 0, 1,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows, GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_FILL, GTK_FILL, 0, 0); GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label); gtk_widget_show (label);
dimtable = gtk_table_new (PIXPIPE_MAXDIM, 1, FALSE); dimtable = gtk_table_new (1, PIXPIPE_MAXDIM, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (dimtable), 4);
for (i = 0; i < PIXPIPE_MAXDIM; i++) for (i = 0; i < PIXPIPE_MAXDIM; i++)
{ {
adjustment = gtk_adjustment_new (gihparms.rank[i], 0, 100, 1, 1, 1);
spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (adjustment), 1, 0);
gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinbutton),
GTK_SHADOW_NONE);
gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
gtk_widget_set_usize (spinbutton, 75, 0);
box = gtk_hbox_new (FALSE, 0); box = gtk_hbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, TRUE, 0);
gtk_table_attach (GTK_TABLE (dimtable), box, i, i + 1, 0, 1, gtk_table_attach (GTK_TABLE (dimtable), box, i, i + 1, 0, 1,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 3, 0); GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
(GtkSignalFunc) adjustment_callback, &gihparms.rank[i]);
gtk_widget_show (spinbutton);
gtk_widget_show (box); gtk_widget_show (box);
spinbutton = gimp_spin_button_new (&adjustment,
gihparms.rank[i], 0, 100, 1, 1, 1,
1, 0);
gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, TRUE, 0);
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
GTK_SIGNAL_FUNC (adjustment_callback),
&gihparms.rank[i]);
gtk_widget_show (spinbutton);
if (i == 0) if (i == 0)
{ {
if (gihparms.dim == 1) if (gihparms.dim == 1)
@ -667,8 +661,8 @@ gih_save_dialog (gint32 image_ID)
gtk_table_resize (GTK_TABLE (table), gtk_table_resize (GTK_TABLE (table),
GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols); GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols);
label = gtk_label_new ( _("Selection:")); label = gtk_label_new (_("Selection:"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, gtk_table_attach (GTK_TABLE (table), label, 0, 1,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows, GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_FILL, GTK_FILL, 0, 0); GTK_FILL, GTK_FILL, 0, 0);
@ -682,20 +676,22 @@ gih_save_dialog (gint32 image_ID)
cbitems = g_list_append (cbitems, "xtilt"); cbitems = g_list_append (cbitems, "xtilt");
cbitems = g_list_append (cbitems, "ytilt"); cbitems = g_list_append (cbitems, "ytilt");
box = gtk_hbox_new (FALSE, 0); box = gtk_hbox_new (FALSE, 4);
for (i = 0; i < PIXPIPE_MAXDIM; i++) for (i = 0; i < PIXPIPE_MAXDIM; i++)
{ {
cb = gtk_combo_new (); cb = gtk_combo_new ();
gtk_combo_set_popdown_strings (GTK_COMBO (cb), cbitems); gtk_combo_set_popdown_strings (GTK_COMBO (cb), cbitems);
if (gihparms.selection[i]) if (gihparms.selection[i])
gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (cb)->entry), gihparms.selection[i]); gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (cb)->entry)
, gihparms.selection[i]);
else else
gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (cb)->entry), "random"); gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (cb)->entry), "random");
gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (cb)->entry), FALSE); gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (cb)->entry), FALSE);
gtk_box_pack_start (GTK_BOX (box), cb, FALSE, TRUE, 2); gtk_box_pack_start (GTK_BOX (box), cb, FALSE, TRUE, 0);
gtk_signal_connect (GTK_OBJECT (GTK_COMBO (cb)->entry), "changed", gtk_signal_connect (GTK_OBJECT (GTK_COMBO (cb)->entry), "changed",
(GtkSignalFunc) cb_callback, &gihparms.selection[i]); GTK_SIGNAL_FUNC (cb_callback),
&gihparms.selection[i]);
gtk_widget_show (cb); gtk_widget_show (cb);
} }
@ -704,6 +700,9 @@ gih_save_dialog (gint32 image_ID)
GTK_SHRINK, GTK_EXPAND | GTK_FILL, 0, 0); GTK_SHRINK, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_widget_show (box); gtk_widget_show (box);
gtk_table_set_row_spacings (GTK_TABLE (table), 4);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_widget_show (dlg); gtk_widget_show (dlg);
gtk_main (); gtk_main ();
@ -1046,9 +1045,12 @@ run (char *name,
values[0].type = PARAM_STATUS; values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR; values[0].data.d_status = STATUS_CALLING_ERROR;
if (run_mode == RUN_INTERACTIVE) { if (run_mode == RUN_INTERACTIVE)
{
INIT_I18N_UI(); INIT_I18N_UI();
} else { }
else
{
INIT_I18N(); INIT_I18N();
} }
@ -1083,7 +1085,7 @@ run (char *name,
/* Possibly retrieve data */ /* Possibly retrieve data */
gimp_get_data ("file_gpb_save", &info); gimp_get_data ("file_gpb_save", &info);
if (!gpb_save_dialog ()) if (!gpb_save_dialog ())
return; goto finish_gpb;
break; break;
case RUN_NONINTERACTIVE: /* FIXME - need a real RUN_NONINTERACTIVE */ case RUN_NONINTERACTIVE: /* FIXME - need a real RUN_NONINTERACTIVE */
@ -1110,6 +1112,8 @@ run (char *name,
else else
status = STATUS_EXECUTION_ERROR; status = STATUS_EXECUTION_ERROR;
finish_gpb:
if (export == EXPORT_EXPORT) if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID); gimp_image_delete (image_ID);
} }
@ -1165,7 +1169,7 @@ run (char *name,
pixpipeparams_parse (pipe_parasite->data, &gihparms); pixpipeparams_parse (pipe_parasite->data, &gihparms);
if (!gih_save_dialog (image_ID)) if (!gih_save_dialog (image_ID))
return; goto finish_gih;
break; break;
case RUN_NONINTERACTIVE: /* FIXME - need a real RUN_NONINTERACTIVE */ case RUN_NONINTERACTIVE: /* FIXME - need a real RUN_NONINTERACTIVE */
@ -1197,8 +1201,11 @@ run (char *name,
else else
status = STATUS_EXECUTION_ERROR; status = STATUS_EXECUTION_ERROR;
finish_gih:
if (export == EXPORT_EXPORT) if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID); gimp_image_delete (image_ID);
} }
values[0].data.d_status = status; values[0].data.d_status = status;
} }

View File

@ -45,8 +45,9 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include "libgimp/gimp.h" #include <libgimp/gimp.h>
#include "libgimp/gimpui.h" #include <libgimp/gimpui.h>
#include <libgimp/gimplimits.h>
#include "libgimp/stdplugins-intl.h" #include "libgimp/stdplugins-intl.h"
@ -56,9 +57,6 @@
#define SCALE_WIDTH 150 #define SCALE_WIDTH 150
#define MAX_NUM_FRAMES 100 #define MAX_NUM_FRAMES 100
#define CHECK_SIZE 32
#define CHECK_LIGHT 170
#define CHECK_DARK 85
typedef struct typedef struct
{ {
@ -660,24 +658,26 @@ static void iwarp()
} }
} }
static guchar static guchar
iwarp_transparent_color(int x, int y) iwarp_transparent_color (gint x,
gint y)
{ {
if ((y % (GIMP_CHECK_SIZE * 4)) > (GIMP_CHECK_SIZE * 2))
if ((y % CHECK_SIZE) > (CHECK_SIZE / 2)) { {
if ((x % CHECK_SIZE) > (CHECK_SIZE / 2)) return CHECK_DARK; if ((x % (GIMP_CHECK_SIZE * 4)) > (GIMP_CHECK_SIZE * 2))
else return CHECK_LIGHT; return GIMP_CHECK_DARK * 255;
else
return GIMP_CHECK_LIGHT * 255;
} }
else else
if ((x % CHECK_SIZE) < (CHECK_SIZE / 2)) return CHECK_DARK; if ((x % (GIMP_CHECK_SIZE * 4)) < (GIMP_CHECK_SIZE * 2))
else return CHECK_LIGHT; return GIMP_CHECK_DARK * 255;
else
return GIMP_CHECK_LIGHT * 255;
} }
static void static void
iwarp_cpy_images() iwarp_cpy_images (void)
{ {
int i,j,k,p; int i,j,k,p;
gfloat alpha; gfloat alpha;
@ -685,23 +685,26 @@ iwarp_cpy_images()
if (image_bpp == 1 || image_bpp ==3) if (image_bpp == 1 || image_bpp ==3)
memcpy(dstimage,srcimage,preview_width *preview_height*preview_bpp); memcpy(dstimage,srcimage,preview_width *preview_height*preview_bpp);
else { else
{
for (i=0; i< preview_width; i++) for (i=0; i< preview_width; i++)
for (j=0; j< preview_height; j++) { for (j=0; j< preview_height; j++)
{
p = (j*preview_width+i) ; p = (j*preview_width+i) ;
srccolor = srcimage + p*image_bpp; srccolor = srcimage + p*image_bpp;
alpha = (gfloat)srccolor[image_bpp-1]/255; alpha = (gfloat)srccolor[image_bpp-1]/255;
dstcolor = dstimage + p*preview_bpp; dstcolor = dstimage + p*preview_bpp;
for (k=0; k <preview_bpp; k++) { for (k=0; k <preview_bpp; k++)
*dstcolor++ = (guchar)(alpha *srccolor[k]+(1.0-alpha)*iwarp_transparent_color(i,j)); {
*dstcolor++ = (guchar)
(alpha *srccolor[k]+(1.0-alpha)*iwarp_transparent_color(i,j));
} }
} }
} }
} }
static void static void
iwarp_init() iwarp_init (void)
{ {
int y,x,xi,i; int y,x,xi,i;
GPixelRgn srcrgn; GPixelRgn srcrgn;

View File

@ -68,6 +68,7 @@
#include <libgimp/gimp.h> #include <libgimp/gimp.h>
#include <libgimp/gimpui.h> #include <libgimp/gimpui.h>
#include <libgimp/gimplimits.h>
#include "libgimp/stdplugins-intl.h" #include "libgimp/stdplugins-intl.h"
@ -83,11 +84,6 @@
#define SCALE_WIDTH 200 #define SCALE_WIDTH 200
#define ENTRY_WIDTH 60 #define ENTRY_WIDTH 60
#define CHECK_SIZE 8
#define CHECK_DARK ((int) (1.0 / 3.0 * 255))
#define CHECK_LIGHT ((int) (2.0 / 3.0 * 255))
/***** Types *****/ /***** Types *****/
typedef struct typedef struct
@ -860,15 +856,15 @@ build_preview_source_image (void)
{ {
/* Checks */ /* Checks */
if ((x / CHECK_SIZE) & 1) if ((x / GIMP_CHECK_SIZE) & 1)
{ {
pcint.check_row_0[x] = CHECK_DARK; pcint.check_row_0[x] = GIMP_CHECK_DARK * 255;
pcint.check_row_1[x] = CHECK_LIGHT; pcint.check_row_1[x] = GIMP_CHECK_LIGHT * 255;
} }
else else
{ {
pcint.check_row_0[x] = CHECK_LIGHT; pcint.check_row_0[x] = GIMP_CHECK_LIGHT * 255;
pcint.check_row_1[x] = CHECK_DARK; pcint.check_row_1[x] = GIMP_CHECK_DARK * 255;
} }
/* Thumbnail image */ /* Thumbnail image */
@ -1108,7 +1104,7 @@ dialog_update_preview (void)
{ {
px = left; px = left;
if ((y / CHECK_SIZE) & 1) if ((y / GIMP_CHECK_SIZE) & 1)
check_ul = pcint.check_row_0; check_ul = pcint.check_row_0;
else else
check_ul = pcint.check_row_1; check_ul = pcint.check_row_1;

View File

@ -30,9 +30,7 @@
* preview_scroll_callback() - Update the preview when a scrollbar is moved. * preview_scroll_callback() - Update the preview when a scrollbar is moved.
* preview_update() - Update the preview window. * preview_update() - Update the preview window.
* preview_exit() - Free all memory used by the preview window... * preview_exit() - Free all memory used by the preview window...
* dialog_create_ivalue() - Create an integer value control...
* dialog_iscale_update() - Update the value field using the scale. * dialog_iscale_update() - Update the value field using the scale.
* dialog_ientry_update() - Update the value field using the text entry.
* dialog_ok_callback() - Start the filter... * dialog_ok_callback() - Start the filter...
* gray_filter() - Sharpen grayscale pixels. * gray_filter() - Sharpen grayscale pixels.
* graya_filter() - Sharpen grayscale+alpha pixels. * graya_filter() - Sharpen grayscale+alpha pixels.
@ -42,6 +40,26 @@
* Revision History: * Revision History:
* *
* $Log$ * $Log$
* Revision 1.16 2000/01/15 15:32:28 mitch
* 2000-01-15 Michael Natterer <mitch@gimp.org>
*
* * libgimp/gimpwidgets.[ch]: added a float adjustment callback.
*
* * plug-ins/common/bumpmap.c
* * plug-ins/common/depthmerge.c
* * plug-ins/common/despeckle.c
* * plug-ins/common/destripe.c
* * plug-ins/common/gpb.c
* * plug-ins/common/iwarp.c
* * plug-ins/common/polar.c
* * plug-ins/common/sharpen.c
* * plug-ins/common/tileit.c
* * plug-ins/common/whirlpinch.c
* * plug-ins/common/wind.c:
*
* - Some more hscale+spinbutton instead of hscale+entry widgets.
* - Get the CHECK_SIZE constants from libgimp in some plugins.
*
* Revision 1.15 2000/01/08 15:23:28 mitch * Revision 1.15 2000/01/08 15:23:28 mitch
* 2000-01-08 Michael Natterer <mitch@gimp.org> * 2000-01-08 Michael Natterer <mitch@gimp.org>
* *
@ -183,17 +201,10 @@
#include <libgimp/gimp.h> #include <libgimp/gimp.h>
#include <libgimp/gimpui.h> #include <libgimp/gimpui.h>
#include <libgimp/gimplimits.h>
#include "libgimp/stdplugins-intl.h" #include "libgimp/stdplugins-intl.h"
/*
* Macros...
*/
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
/* /*
* Constants... * Constants...
*/ */
@ -201,43 +212,42 @@
#define PLUG_IN_NAME "plug_in_sharpen" #define PLUG_IN_NAME "plug_in_sharpen"
#define PLUG_IN_VERSION "1.4.2 - 3 June 1998" #define PLUG_IN_VERSION "1.4.2 - 3 June 1998"
#define PREVIEW_SIZE 128 #define PREVIEW_SIZE 128
#define SCALE_WIDTH 64 #define SCALE_WIDTH 100
#define ENTRY_WIDTH 64
#define CHECK_SIZE 8
#define CHECK_DARK 85
#define CHECK_LIGHT 170
/* /*
* Local functions... * Local functions...
*/ */
static void query(void); static void query (void);
static void run(char *, int, GParam *, int *, GParam **); static void run (gchar *name,
static void compute_luts(void); gint nparams,
static void sharpen(void); GParam *param,
static gint sharpen_dialog(void); gint *nreturn_vals,
static void dialog_create_ivalue(char *, GtkTable *, int, gint *, int, int); GParam **returm_vals);
static void dialog_iscale_update(GtkAdjustment *, gint *);
static void dialog_ientry_update(GtkWidget *, gint *);
static void dialog_ok_callback(GtkWidget *, gpointer);
static void preview_init(void); static void compute_luts (void);
static void preview_exit(void); static void sharpen (void);
static void preview_update(void);
static void preview_scroll_callback(void); static gint sharpen_dialog (void);
static void dialog_iscale_update (GtkAdjustment *, gint *);
static void dialog_ok_callback (GtkWidget *, gpointer);
static void preview_init (void);
static void preview_exit (void);
static void preview_update (void);
static void preview_scroll_callback (void);
typedef gint32 intneg; typedef gint32 intneg;
typedef gint32 intpos; typedef gint32 intpos;
static void gray_filter(int width, guchar *src, guchar *dst, intneg *neg0, static void gray_filter (int width, guchar *src, guchar *dst, intneg *neg0,
intneg *neg1, intneg *neg2); intneg *neg1, intneg *neg2);
static void graya_filter(int width, guchar *src, guchar *dst, intneg *neg0, static void graya_filter (int width, guchar *src, guchar *dst, intneg *neg0,
intneg *neg1, intneg *neg2); intneg *neg1, intneg *neg2);
static void rgb_filter(int width, guchar *src, guchar *dst, intneg *neg0, static void rgb_filter (int width, guchar *src, guchar *dst, intneg *neg0,
intneg *neg1, intneg *neg2); intneg *neg1, intneg *neg2);
static void rgba_filter(int width, guchar *src, guchar *dst, intneg *neg0, static void rgba_filter (int width, guchar *src, guchar *dst, intneg *neg0,
intneg *neg1, intneg *neg2); intneg *neg1, intneg *neg2);
@ -246,12 +256,12 @@ static void rgba_filter(int width, guchar *src, guchar *dst, intneg *neg0,
*/ */
GPlugInInfo PLUG_IN_INFO = GPlugInInfo PLUG_IN_INFO =
{ {
NULL, /* init_proc */ NULL, /* init_proc */
NULL, /* quit_proc */ NULL, /* quit_proc */
query, /* query_proc */ query, /* query_proc */
run /* run_proc */ run /* run_proc */
}; };
GtkWidget *preview; /* Preview widget */ GtkWidget *preview; /* Preview widget */
int preview_width, /* Width of preview widget */ int preview_width, /* Width of preview widget */
@ -282,19 +292,10 @@ intneg neg_lut[256]; /* Negative coefficient LUT */
intpos pos_lut[256]; /* Positive coefficient LUT */ intpos pos_lut[256]; /* Positive coefficient LUT */
/* MAIN ()
* 'main()' - Main entry - just call gimp_main()...
*/
MAIN()
/*
* 'query()' - Respond to a plug-in query...
*/
static void static void
query(void) query (void)
{ {
static GParamDef args[] = static GParamDef args[] =
{ {
@ -309,7 +310,7 @@ query(void)
INIT_I18N(); INIT_I18N();
gimp_install_procedure(PLUG_IN_NAME, gimp_install_procedure (PLUG_IN_NAME,
_("Sharpen filter, typically used to \'sharpen\' a photographic image."), _("Sharpen filter, typically used to \'sharpen\' a photographic image."),
_("This plug-in selectively performs a convolution filter on an image."), _("This plug-in selectively performs a convolution filter on an image."),
"Michael Sweet <mike@easysw.com>", "Michael Sweet <mike@easysw.com>",
@ -317,26 +318,22 @@ query(void)
PLUG_IN_VERSION, PLUG_IN_VERSION,
N_("<Image>/Filters/Enhance/Sharpen..."), N_("<Image>/Filters/Enhance/Sharpen..."),
"RGB*, GRAY*", "RGB*, GRAY*",
PROC_PLUG_IN, nargs, nreturn_vals, args, return_vals); PROC_PLUG_IN,
nargs, nreturn_vals,
args, return_vals);
} }
/*
* 'run()' - Run the filter...
*/
static void static void
run(char *name, /* I - Name of filter program. */ run (gchar *name,
int nparams, /* I - Number of parameters passed in */ gint nparams,
GParam *param, /* I - Parameter values */ GParam *param,
int *nreturn_vals, /* O - Number of return values */ gint *nreturn_vals,
GParam **return_vals) /* O - Return values */ GParam **return_vals)
{ {
GRunModeType run_mode; /* Current run mode */ GRunModeType run_mode; /* Current run mode */
GStatusType status; /* Return status */ GStatusType status; /* Return status */
GParam *values; /* Return values */ GParam *values; /* Return values */
/* /*
* Initialize parameter data... * Initialize parameter data...
*/ */
@ -344,7 +341,7 @@ run(char *name, /* I - Name of filter program. */
status = STATUS_SUCCESS; status = STATUS_SUCCESS;
run_mode = param[0].data.d_int32; run_mode = param[0].data.d_int32;
values = g_new(GParam, 1); values = g_new (GParam, 1);
values[0].type = PARAM_STATUS; values[0].type = PARAM_STATUS;
values[0].data.d_status = status; values[0].data.d_status = status;
@ -375,13 +372,11 @@ run(char *name, /* I - Name of filter program. */
/* /*
* Possibly retrieve data... * Possibly retrieve data...
*/ */
gimp_get_data(PLUG_IN_NAME, &sharpen_percent); gimp_get_data(PLUG_IN_NAME, &sharpen_percent);
/* /*
* Get information from the dialog... * Get information from the dialog...
*/ */
if (!sharpen_dialog()) if (!sharpen_dialog())
return; return;
break; break;
@ -391,7 +386,6 @@ run(char *name, /* I - Name of filter program. */
/* /*
* Make sure all the arguments are present... * Make sure all the arguments are present...
*/ */
if (nparams != 4) if (nparams != 4)
status = STATUS_CALLING_ERROR; status = STATUS_CALLING_ERROR;
else else
@ -403,7 +397,6 @@ run(char *name, /* I - Name of filter program. */
/* /*
* Possibly retrieve data... * Possibly retrieve data...
*/ */
gimp_get_data(PLUG_IN_NAME, &sharpen_percent); gimp_get_data(PLUG_IN_NAME, &sharpen_percent);
break; break;
@ -424,29 +417,26 @@ run(char *name, /* I - Name of filter program. */
/* /*
* Set the tile cache size... * Set the tile cache size...
*/ */
gimp_tile_cache_ntiles(2 * (drawable->width + gimp_tile_width() - 1) / gimp_tile_cache_ntiles(2 * (drawable->width + gimp_tile_width() - 1) /
gimp_tile_width() + 1); gimp_tile_width() + 1);
/* /*
* Run! * Run!
*/ */
sharpen(); sharpen();
/* /*
* If run mode is interactive, flush displays... * If run mode is interactive, flush displays...
*/ */
if (run_mode != RUN_NONINTERACTIVE) if (run_mode != RUN_NONINTERACTIVE)
gimp_displays_flush(); gimp_displays_flush();
/* /*
* Store data... * Store data...
*/ */
if (run_mode == RUN_INTERACTIVE) if (run_mode == RUN_INTERACTIVE)
gimp_set_data(PLUG_IN_NAME, &sharpen_percent, sizeof(sharpen_percent)); gimp_set_data (PLUG_IN_NAME,
&sharpen_percent, sizeof (sharpen_percent));
} }
else else
status = STATUS_EXECUTION_ERROR; status = STATUS_EXECUTION_ERROR;
@ -455,23 +445,20 @@ run(char *name, /* I - Name of filter program. */
/* /*
* Reset the current run status... * Reset the current run status...
*/ */
values[0].data.d_status = status; values[0].data.d_status = status;
/* /*
* Detach from the drawable... * Detach from the drawable...
*/ */
gimp_drawable_detach(drawable); gimp_drawable_detach(drawable);
} }
static void static void
compute_luts(void) compute_luts (void)
{ {
int i, /* Looping var */ gint i; /* Looping var */
fact; /* 1 - sharpness */ gint fact; /* 1 - sharpness */
fact = 100 - sharpen_percent; fact = 100 - sharpen_percent;
if (fact < 1) if (fact < 1)
@ -484,13 +471,12 @@ compute_luts(void)
}; };
} }
/* /*
* 'sharpen()' - Sharpen an image using a convolution filter. * 'sharpen()' - Sharpen an image using a convolution filter.
*/ */
static void static void
sharpen(void) sharpen (void)
{ {
GPixelRgn src_rgn, /* Source image region */ GPixelRgn src_rgn, /* Source image region */
dst_rgn; /* Destination image region */ dst_rgn; /* Destination image region */
@ -508,11 +494,9 @@ sharpen(void)
filter = NULL; filter = NULL;
/* /*
* Let the user know what we're doing... * Let the user know what we're doing...
*/ */
gimp_progress_init( _("Sharpening...")); gimp_progress_init( _("Sharpening..."));
/* /*
@ -592,7 +576,8 @@ sharpen(void)
* Grab the next row... * Grab the next row...
*/ */
gimp_pixel_rgn_get_row(&src_rgn, src_rows[row], sel_x1, y + 1, sel_width); gimp_pixel_rgn_get_row (&src_rgn, src_rows[row],
sel_x1, y + 1, sel_width);
for (i = width, src_ptr = src_rows[row], neg_ptr = neg_rows[row]; for (i = width, src_ptr = src_rows[row], neg_ptr = neg_rows[row];
i > 0; i > 0;
i --, src_ptr ++, neg_ptr ++) i --, src_ptr ++, neg_ptr ++)
@ -668,26 +653,24 @@ sharpen(void)
static gint static gint
sharpen_dialog (void) sharpen_dialog (void)
{ {
GtkWidget *dialog, /* Dialog window */ GtkWidget *dialog;
*table, /* Table "container" for controls */ GtkWidget *table;
*ptable, /* Preview table */ GtkWidget *ptable;
*frame, /* Frame for preview */ GtkWidget *frame;
*scrollbar; /* Horizontal + vertical scroller */ GtkWidget *scrollbar;
gint argc; /* Fake argc for GUI */ GtkObject *adj;
gchar **argv; /* Fake argv for GUI */ gint argc;
guchar *color_cube; /* Preview color cube... */ gchar **argv;
guchar *color_cube;
gchar *title; gchar *title;
/*
* Initialize the program's display...
*/
argc = 1; argc = 1;
argv = g_new (gchar *, 1); argv = g_new (gchar *, 1);
argv[0] = g_strdup ("sharpen"); argv[0] = g_strdup ("sharpen");
gtk_init (&argc, &argv); gtk_init (&argc, &argv);
gtk_rc_parse (gimp_gtkrc ()); gtk_rc_parse (gimp_gtkrc ());
gdk_set_use_xshm (gimp_use_xshm ()); gdk_set_use_xshm (gimp_use_xshm ());
gtk_preview_set_gamma (gimp_gamma ()); gtk_preview_set_gamma (gimp_gamma ());
gtk_preview_set_install_cmap (gimp_install_cmap ()); gtk_preview_set_install_cmap (gimp_install_cmap ());
@ -698,10 +681,6 @@ sharpen_dialog (void)
gtk_widget_set_default_visual (gtk_preview_get_visual ()); gtk_widget_set_default_visual (gtk_preview_get_visual ());
gtk_widget_set_default_colormap (gtk_preview_get_cmap ()); gtk_widget_set_default_colormap (gtk_preview_get_cmap ());
/*
* Dialog window...
*/
title = g_strdup_printf (_("Sharpen - %s"), PLUG_IN_VERSION); title = g_strdup_printf (_("Sharpen - %s"), PLUG_IN_VERSION);
dialog = gimp_dialog_new (title, "sharpen", dialog = gimp_dialog_new (title, "sharpen",
gimp_plugin_help_func, "filters/sharpen.html", gimp_plugin_help_func, "filters/sharpen.html",
@ -787,12 +766,13 @@ sharpen_dialog (void)
* Sharpness control... * Sharpness control...
*/ */
dialog_create_ivalue (_("Sharpness:"), GTK_TABLE (table), 2, adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
&sharpen_percent, 1, 99); _("Sharpness:"), SCALE_WIDTH, 0,
sharpen_percent, 1, 99, 1, 10, 0,
/* NULL, NULL);
* Show it and wait for the user to do something... gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
*/ GTK_SIGNAL_FUNC (dialog_iscale_update),
&sharpen_percent);
gtk_widget_show (dialog); gtk_widget_show (dialog);
@ -801,23 +781,12 @@ sharpen_dialog (void)
gtk_main (); gtk_main ();
gdk_flush (); gdk_flush ();
/*
* Free the preview data...
*/
preview_exit (); preview_exit ();
/*
* Return ok/cancel...
*/
return run_filter; return run_filter;
} }
/* preview functions */
/*
* 'preview_init()' - Initialize the preview window...
*/
static void static void
preview_init(void) preview_init(void)
@ -843,13 +812,8 @@ preview_init(void)
preview_y2 = preview_y1 + preview_height; preview_y2 = preview_y1 + preview_height;
} }
/*
* 'preview_scroll_callback()' - Update the preview when a scrollbar is moved.
*/
static void static void
preview_scroll_callback(void) preview_scroll_callback (void)
{ {
preview_x1 = sel_x1 + GTK_ADJUSTMENT(hscroll_data)->value; preview_x1 = sel_x1 + GTK_ADJUSTMENT(hscroll_data)->value;
preview_y1 = sel_y1 + GTK_ADJUSTMENT(vscroll_data)->value; preview_y1 = sel_y1 + GTK_ADJUSTMENT(vscroll_data)->value;
@ -859,13 +823,8 @@ preview_scroll_callback(void)
preview_update(); preview_update();
} }
/*
* 'preview_update()' - Update the preview window.
*/
static void static void
preview_update(void) preview_update (void)
{ {
GPixelRgn src_rgn; /* Source image region */ GPixelRgn src_rgn; /* Source image region */
guchar *src_ptr, /* Current source pixel */ guchar *src_ptr, /* Current source pixel */
@ -963,10 +922,10 @@ preview_update(void)
image_ptr[0] = image_ptr[1] = image_ptr[2] = *dst_ptr; image_ptr[0] = image_ptr[1] = image_ptr[2] = *dst_ptr;
else else
{ {
if ((y & CHECK_SIZE) ^ (x & CHECK_SIZE)) if ((y & GIMP_CHECK_SIZE) ^ (x & GIMP_CHECK_SIZE))
check = CHECK_LIGHT; check = GIMP_CHECK_LIGHT * 255;
else else
check = CHECK_DARK; check = GIMP_CHECK_DARK * 255;
if (dst_ptr[1] == 0) if (dst_ptr[1] == 0)
image_ptr[0] = image_ptr[1] = image_ptr[2] = check; image_ptr[0] = image_ptr[1] = image_ptr[2] = check;
@ -996,10 +955,10 @@ preview_update(void)
} }
else else
{ {
if ((y & CHECK_SIZE) ^ (x & CHECK_SIZE)) if ((y & GIMP_CHECK_SIZE) ^ (x & GIMP_CHECK_SIZE))
check = CHECK_LIGHT; check = GIMP_CHECK_LIGHT * 255;
else else
check = CHECK_DARK; check = GIMP_CHECK_DARK * 255;
if (dst_ptr[3] == 0) if (dst_ptr[3] == 0)
image_ptr[0] = image_ptr[1] = image_ptr[2] = check; image_ptr[0] = image_ptr[1] = image_ptr[2] = check;
@ -1027,154 +986,30 @@ preview_update(void)
gdk_flush(); gdk_flush();
} }
/*
* 'preview_exit()' - Free all memory used by the preview window...
*/
static void static void
preview_exit(void) preview_exit (void)
{ {
g_free(preview_src); g_free (preview_src);
g_free(preview_neg); g_free (preview_neg);
g_free(preview_dst); g_free (preview_dst);
g_free(preview_image); g_free (preview_image);
} }
/* dialog callbacks */
/*
* 'dialog_create_ivalue()' - Create an integer value control...
*/
static void static void
dialog_create_ivalue (char *title, /* I - Label for control */ dialog_iscale_update (GtkAdjustment *adjustment,
GtkTable *table, /* I - Table container to use */ gint *value)
int row, /* I - Row # for container */
gint *value, /* I - Value holder */
int left, /* I - Minimum value for slider */
int right) /* I - Maximum value for slider */
{ {
GtkWidget *label, /* Control label */ gimp_int_adjustment_update (adjustment, value);
*scale, /* Scale widget */
*entry; /* Text widget */
GtkObject *scale_data; /* Scale data */
gchar buf[256]; /* String buffer */
/*
* Label...
*/
label = gtk_label_new (title);
gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
gtk_table_attach_defaults (table, label, 0, 1, row, row + 1);
gtk_widget_show(label);
/*
* Scale...
*/
scale_data = gtk_adjustment_new (*value, left, right, 1.0, 1.0, 1.0);
gtk_signal_connect (GTK_OBJECT (scale_data), "value_changed",
(GtkSignalFunc) dialog_iscale_update,
value);
scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data));
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_table_attach (table, scale, 1, 2, row, row + 1,
GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_CONTINUOUS);
gtk_widget_show (scale);
/*
* Text entry...
*/
entry = gtk_entry_new ();
gtk_object_set_user_data (GTK_OBJECT (entry), scale_data);
gtk_object_set_user_data (scale_data, entry);
gtk_widget_set_usize (entry, ENTRY_WIDTH, 0);
g_snprintf (buf, sizeof (buf), "%d", *value);
gtk_entry_set_text (GTK_ENTRY (entry), buf);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) dialog_ientry_update,
value);
gtk_table_attach_defaults (GTK_TABLE (table), entry, 2, 3, row, row + 1);
gtk_widget_show (entry);
}
/*
* 'dialog_iscale_update()' - Update the value field using the scale.
*/
static void
dialog_iscale_update (GtkAdjustment *adjustment, /* I - New value */
gint *value) /* I - Current value */
{
GtkWidget *entry; /* Text entry widget */
gchar buf[256]; /* Text buffer */
if (*value != adjustment->value)
{
*value = adjustment->value;
entry = gtk_object_get_user_data(GTK_OBJECT(adjustment));
g_snprintf (buf, sizeof (buf), "%d", *value);
gtk_signal_handler_block_by_data (GTK_OBJECT (entry), value);
gtk_entry_set_text (GTK_ENTRY (entry), buf);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (entry), value);
compute_luts (); compute_luts ();
preview_update (); preview_update ();
};
} }
/*
* 'dialog_ientry_update()' - Update the value field using the text entry.
*/
static void static void
dialog_ientry_update (GtkWidget *widget, /* I - Entry widget */ dialog_ok_callback (GtkWidget *widget,
gint *value) /* I - Current value */ gpointer data)
{
GtkAdjustment *adjustment;
gint new_value;
new_value = atoi (gtk_entry_get_text (GTK_ENTRY (widget)));
if (*value != new_value)
{
adjustment = gtk_object_get_user_data (GTK_OBJECT (widget));
if ((new_value >= adjustment->lower) &&
(new_value <= adjustment->upper))
{
*value = new_value;
adjustment->value = new_value;
gtk_signal_emit_by_name (GTK_OBJECT (adjustment), "value_changed");
compute_luts ();
preview_update ();
};
};
}
/*
* 'dialog_ok_callback()' - Start the filter...
*/
static void
dialog_ok_callback (GtkWidget *widget, /* I - OK button widget */
gpointer data) /* I - Dialog window */
{ {
run_filter = TRUE; run_filter = TRUE;
@ -1187,7 +1022,7 @@ dialog_ok_callback (GtkWidget *widget, /* I - OK button widget */
*/ */
static void static void
gray_filter(int width, /* I - Width of line in pixels */ gray_filter (gint width, /* I - Width of line in pixels */
guchar *src, /* I - Source line */ guchar *src, /* I - Source line */
guchar *dst, /* O - Destination line */ guchar *dst, /* O - Destination line */
intneg *neg0, /* I - Top negative coefficient line */ intneg *neg0, /* I - Top negative coefficient line */
@ -1196,7 +1031,6 @@ gray_filter(int width, /* I - Width of line in pixels */
{ {
intpos pixel; /* New pixel value */ intpos pixel; /* New pixel value */
*dst++ = *src++; *dst++ = *src++;
width -= 2; width -= 2;
@ -1222,13 +1056,12 @@ gray_filter(int width, /* I - Width of line in pixels */
*dst++ = *src++; *dst++ = *src++;
} }
/* /*
* 'graya_filter()' - Sharpen grayscale+alpha pixels. * 'graya_filter()' - Sharpen grayscale+alpha pixels.
*/ */
static void static void
graya_filter(int width, /* I - Width of line in pixels */ graya_filter(gint width, /* I - Width of line in pixels */
guchar *src, /* I - Source line */ guchar *src, /* I - Source line */
guchar *dst, /* O - Destination line */ guchar *dst, /* O - Destination line */
intneg *neg0, /* I - Top negative coefficient line */ intneg *neg0, /* I - Top negative coefficient line */
@ -1237,7 +1070,6 @@ graya_filter(int width, /* I - Width of line in pixels */
{ {
intpos pixel; /* New pixel value */ intpos pixel; /* New pixel value */
*dst++ = *src++; *dst++ = *src++;
*dst++ = *src++; *dst++ = *src++;
width -= 2; width -= 2;
@ -1266,13 +1098,12 @@ graya_filter(int width, /* I - Width of line in pixels */
*dst++ = *src++; *dst++ = *src++;
} }
/* /*
* 'rgb_filter()' - Sharpen RGB pixels. * 'rgb_filter()' - Sharpen RGB pixels.
*/ */
static void static void
rgb_filter(int width, /* I - Width of line in pixels */ rgb_filter (gint width, /* I - Width of line in pixels */
guchar *src, /* I - Source line */ guchar *src, /* I - Source line */
guchar *dst, /* O - Destination line */ guchar *dst, /* O - Destination line */
intneg *neg0, /* I - Top negative coefficient line */ intneg *neg0, /* I - Top negative coefficient line */
@ -1281,7 +1112,6 @@ rgb_filter(int width, /* I - Width of line in pixels */
{ {
intpos pixel; /* New pixel value */ intpos pixel; /* New pixel value */
*dst++ = *src++; *dst++ = *src++;
*dst++ = *src++; *dst++ = *src++;
*dst++ = *src++; *dst++ = *src++;
@ -1333,13 +1163,12 @@ rgb_filter(int width, /* I - Width of line in pixels */
*dst++ = *src++; *dst++ = *src++;
} }
/* /*
* 'rgba_filter()' - Sharpen RGBA pixels. * 'rgba_filter()' - Sharpen RGBA pixels.
*/ */
static void static void
rgba_filter(int width, /* I - Width of line in pixels */ rgba_filter(gint width, /* I - Width of line in pixels */
guchar *src, /* I - Source line */ guchar *src, /* I - Source line */
guchar *dst, /* O - Destination line */ guchar *dst, /* O - Destination line */
intneg *neg0, /* I - Top negative coefficient line */ intneg *neg0, /* I - Top negative coefficient line */
@ -1348,7 +1177,6 @@ rgba_filter(int width, /* I - Width of line in pixels */
{ {
intpos pixel; /* New pixel value */ intpos pixel; /* New pixel value */
*dst++ = *src++; *dst++ = *src++;
*dst++ = *src++; *dst++ = *src++;
*dst++ = *src++; *dst++ = *src++;
@ -1403,8 +1231,3 @@ rgba_filter(int width, /* I - Width of line in pixels */
*dst++ = *src++; *dst++ = *src++;
*dst++ = *src++; *dst++ = *src++;
} }
/*
* End of "$Id$".
*/

View File

@ -36,16 +36,19 @@
* 0.1 First version released. * 0.1 First version released.
*/ */
#include "config.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <signal.h> #include <signal.h>
#include "config.h"
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <libgimp/gimp.h> #include <libgimp/gimp.h>
#include <libgimp/gimpui.h> #include <libgimp/gimpui.h>
#include <libgimp/gimplimits.h>
#include "libgimp/stdplugins-intl.h" #include "libgimp/stdplugins-intl.h"
/***** Magic numbers *****/ /***** Magic numbers *****/
@ -54,11 +57,6 @@
#define SCALE_WIDTH 80 #define SCALE_WIDTH 80
#define ENTRY_WIDTH 25 #define ENTRY_WIDTH 25
/* Even more stuff from Quartics plugins */
#define CHECK_SIZE 8
#define CHECK_DARK ((int) (1.0 / 3.0 * 255))
#define CHECK_LIGHT ((int) (2.0 / 3.0 * 255))
#define MAX_SEGS 6 #define MAX_SEGS 6
#define PREVIEW_MASK GDK_EXPOSURE_MASK | \ #define PREVIEW_MASK GDK_EXPOSURE_MASK | \
@ -1275,12 +1273,12 @@ dialog_update_preview(void)
for (y = 0; y < preview_height; y++) { for (y = 0; y < preview_height; y++) {
if ((y / CHECK_SIZE) & 1) { if ((y / GIMP_CHECK_SIZE) & 1) {
check_0 = CHECK_DARK; check_0 = GIMP_CHECK_DARK * 255;
check_1 = CHECK_LIGHT; check_1 = GIMP_CHECK_LIGHT * 255;
} else { } else {
check_0 = CHECK_LIGHT; check_0 = GIMP_CHECK_LIGHT * 255;
check_1 = CHECK_DARK; check_1 = GIMP_CHECK_DARK * 255;
} }
do_tiles_preview(tint.preview_row, do_tiles_preview(tint.preview_row,
@ -1296,7 +1294,7 @@ dialog_update_preview(void)
for (i = 0, j = 0 ; i < sizeof(tint.preview_row); i += 4, j += 3 ) for (i = 0, j = 0 ; i < sizeof(tint.preview_row); i += 4, j += 3 )
{ {
gint alphaval; gint alphaval;
if (((i/4) / CHECK_SIZE) & 1) if (((i/4) / GIMP_CHECK_SIZE) & 1)
check = check_0; check = check_0;
else else
check = check_1; check = check_1;

View File

@ -58,6 +58,7 @@
#include <libgimp/gimp.h> #include <libgimp/gimp.h>
#include <libgimp/gimpui.h> #include <libgimp/gimpui.h>
#include <libgimp/gimplimits.h>
#define PLUG_IN_NAME "plug_in_whirl_pinch" #define PLUG_IN_NAME "plug_in_whirl_pinch"
#define PLUG_IN_VERSION "May 1997, 2.09" #define PLUG_IN_VERSION "May 1997, 2.09"
@ -68,11 +69,6 @@
#define SCALE_WIDTH 200 #define SCALE_WIDTH 200
#define ENTRY_WIDTH 60 #define ENTRY_WIDTH 60
#define CHECK_SIZE 8
#define CHECK_DARK ((int) (1.0 / 3.0 * 255))
#define CHECK_LIGHT ((int) (2.0 / 3.0 * 255))
/***** Types *****/ /***** Types *****/
typedef struct typedef struct
@ -747,15 +743,15 @@ build_preview_source_image (void)
{ {
/* Checks */ /* Checks */
if ((x / CHECK_SIZE) & 1) if ((x / GIMP_CHECK_SIZE) & 1)
{ {
wpint.check_row_0[x] = CHECK_DARK; wpint.check_row_0[x] = GIMP_CHECK_DARK * 255;
wpint.check_row_1[x] = CHECK_LIGHT; wpint.check_row_1[x] = GIMP_CHECK_LIGHT * 255;
} }
else else
{ {
wpint.check_row_0[x] = CHECK_LIGHT; wpint.check_row_0[x] = GIMP_CHECK_LIGHT * 255;
wpint.check_row_1[x] = CHECK_DARK; wpint.check_row_1[x] = GIMP_CHECK_DARK * 255;
} }
/* Thumbnail image */ /* Thumbnail image */
@ -959,12 +955,12 @@ dialog_update_preview (void)
{ {
px = left; px = left;
if ((y / CHECK_SIZE) & 1) if ((y / GIMP_CHECK_SIZE) & 1)
check_ul = wpint.check_row_0; check_ul = wpint.check_row_0;
else else
check_ul = wpint.check_row_1; check_ul = wpint.check_row_1;
if (((preview_height - y - 1) / CHECK_SIZE) & 1) if (((preview_height - y - 1) / GIMP_CHECK_SIZE) & 1)
check_lr = wpint.check_row_0; check_lr = wpint.check_row_0;
else else
check_lr = wpint.check_row_1; check_lr = wpint.check_row_1;

View File

@ -35,7 +35,6 @@
#define COMPARE_WIDTH 3 #define COMPARE_WIDTH 3
#define ENTRY_WIDTH 40
#define SCALE_WIDTH 200 #define SCALE_WIDTH 200
#define MIN_THRESHOLD 0 #define MIN_THRESHOLD 0
#define MAX_THRESHOLD 50 #define MAX_THRESHOLD 50
@ -74,8 +73,11 @@ typedef enum
static void query (void); static void query (void);
static void run (char *name, int nparams, GParam *param, static void run (gchar *name,
int *nreturn_vals, GParam **return_vals); gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals);
static void dialog_box (void); static void dialog_box (void);
static gint render_effect (GDrawable *drawable); static gint render_effect (GDrawable *drawable);
@ -88,17 +90,17 @@ static gint render_blast_row (guchar *buffer, gint bytes, gint lpi,
gint strength, edge_t edge); gint strength, edge_t edge);
static void render_wind_row (guchar *sb, gint bytes, gint lpi, gint threshold, static void render_wind_row (guchar *sb, gint bytes, gint lpi, gint threshold,
gint strength, edge_t edge); gint strength, edge_t edge);
static void msg_ok_callback (GtkWidget *widget, gpointer data); static void msg_ok_callback (GtkWidget *widget, gpointer data);
static void ok_callback (GtkWidget *widget, gpointer data); static void ok_callback (GtkWidget *widget, gpointer data);
static void entry_callback (GtkWidget *widget, gpointer data);
static void radio_button_alg_callback (GtkWidget *widget, gpointer data);
static void radio_button_direction_callback (GtkWidget *widget, gpointer data);
static void get_derivative (guchar *pixel_R1, guchar *pixel_R2, static void get_derivative (guchar *pixel_R1, guchar *pixel_R2,
edge_t edge, gint *derivative_R, edge_t edge, gint *derivative_R,
gint *derivative_G, gint *derivative_B); gint *derivative_G, gint *derivative_B);
static gint threshold_exceeded (guchar *pixel_R1, guchar *pixel_R2, static gint threshold_exceeded (guchar *pixel_R1, guchar *pixel_R2,
edge_t edge, gint threshold); edge_t edge, gint threshold);
static void reverse_buffer (guchar *buffer, gint length, gint bytes); static void reverse_buffer (guchar *buffer, gint length, gint bytes);
static void modal_message_box (gchar *text); static void modal_message_box (gchar *text);
GPlugInInfo PLUG_IN_INFO = GPlugInInfo PLUG_IN_INFO =
@ -159,7 +161,7 @@ query (void)
static int nargs = sizeof(args) / sizeof(args[0]); static int nargs = sizeof(args) / sizeof(args[0]);
static int nreturn_vals = 0; static int nreturn_vals = 0;
gimp_install_procedure("plug_in_wind", gimp_install_procedure ("plug_in_wind",
"Renders a wind effect.", "Renders a wind effect.",
"Renders a wind effect.", "Renders a wind effect.",
"Nigel Wetten", "Nigel Wetten",
@ -170,7 +172,6 @@ query (void)
PROC_PLUG_IN, PROC_PLUG_IN,
nargs, nreturn_vals, nargs, nreturn_vals,
args, return_vals); args, return_vals);
return;
} }
static void static void
@ -710,94 +711,14 @@ ok_callback (GtkWidget *widget,
} }
} }
static void
entry_callback (GtkWidget *widget,
gpointer data)
{
GtkAdjustment *adjustment;
gint new_value;
new_value = atoi (gtk_entry_get_text (GTK_ENTRY (widget)));
if (*(gint *) data != new_value)
{
*(gint *) data = new_value;
adjustment = gtk_object_get_user_data (GTK_OBJECT (widget));
if ((new_value >= adjustment-> lower)
&& (new_value <= adjustment->upper))
{
adjustment->value = new_value;
gtk_signal_handler_block_by_data (GTK_OBJECT (adjustment), data);
gtk_signal_emit_by_name (GTK_OBJECT (adjustment), "value_changed");
gtk_signal_handler_unblock_by_data (GTK_OBJECT (adjustment), data);
}
}
}
static void
radio_button_alg_callback (GtkWidget *widget,
gpointer data)
{
if (GTK_TOGGLE_BUTTON (widget)->active)
{
config.alg = (algorithm_t) data;
}
}
static void
radio_button_direction_callback (GtkWidget *widget,
gpointer data)
{
if (GTK_TOGGLE_BUTTON (widget)->active)
{
config.direction = (direction_t) data;
}
}
static void
radio_button_edge_callback (GtkWidget *widget,
gpointer data)
{
if (GTK_TOGGLE_BUTTON (widget)->active)
{
config.edge = (edge_t) data;
}
}
static void
adjustment_callback (GtkAdjustment *adjustment,
gpointer data)
{
GtkWidget *entry;
gchar buffer[50];
if (*(gint *)data != adjustment->value)
{
*(gint *) data = adjustment->value;
entry = gtk_object_get_user_data (GTK_OBJECT (adjustment));
g_snprintf (buffer, sizeof (buffer), "%d", *(gint *) data);
gtk_signal_handler_block_by_data (GTK_OBJECT (entry), data);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (entry), data);
}
}
static void static void
dialog_box (void) dialog_box (void)
{ {
GtkWidget *main_vbox; GtkWidget *main_vbox;
GtkWidget *vbox;
GtkWidget *table; GtkWidget *table;
GtkObject *adjustment; GtkObject *adj;
GtkWidget *scale;
GtkWidget *rbutton;
GtkWidget *frame; GtkWidget *frame;
GtkWidget *dlg; GtkWidget *dlg;
GtkWidget *label;
GtkWidget *entry;
GSList *list;
gchar *text_label;
gchar buffer[12];
gchar **argv; gchar **argv;
gint argc; gint argc;
@ -839,7 +760,7 @@ dialog_box (void)
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_box_pack_start (GTK_BOX(main_vbox), frame, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX(main_vbox), frame, FALSE, FALSE, 0);
table = gtk_table_new (3, 2, FALSE); table = gtk_table_new (2, 3, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4); gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_table_set_row_spacings (GTK_TABLE (table), 2); gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_container_set_border_width (GTK_CONTAINER(table), 4); gtk_container_set_border_width (GTK_CONTAINER(table), 4);
@ -849,71 +770,27 @@ dialog_box (void)
slider and entry for threshold slider and entry for threshold
***************************************************/ ***************************************************/
label = gtk_label_new ("Threshold:"); adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
gtk_misc_set_alignment (GTK_MISC(label), 1.0, 0.5); "Threshold:", SCALE_WIDTH, 0,
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); config.threshold,
gtk_widget_show (label); MIN_THRESHOLD, MAX_THRESHOLD, 1.0, 10, 0,
THRESHOLD_TEXT, NULL);
adjustment = gtk_adjustment_new (config.threshold, MIN_THRESHOLD, gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
MAX_THRESHOLD, 1.0, 1.0, 0); GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
(GtkSignalFunc) adjustment_callback,
&config.threshold); &config.threshold);
scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_table_attach (GTK_TABLE (table), scale, 1, 2, 0, 1, GTK_FILL, 0, 0, 0);
gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_CONTINUOUS);
gtk_widget_show (scale);
gimp_help_set_help_data (scale, THRESHOLD_TEXT, NULL);
entry = gtk_entry_new ();
gtk_object_set_user_data (GTK_OBJECT (entry), adjustment);
gtk_object_set_user_data (GTK_OBJECT (adjustment), entry);
gtk_widget_set_usize (entry, ENTRY_WIDTH, 0);
g_snprintf (buffer, sizeof (buffer), "%i", config.threshold);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gtk_signal_connect(GTK_OBJECT (entry), "changed",
GTK_SIGNAL_FUNC (entry_callback),
(gpointer) &config.threshold);
gtk_table_attach (GTK_TABLE (table), entry, 2, 3, 0, 1, GTK_FILL, 0, 0, 0);
gtk_widget_show (entry);
gimp_help_set_help_data (entry, THRESHOLD_TEXT, NULL);
/***************************************************** /*****************************************************
slider and entry for strength of wind slider and entry for strength of wind
****************************************************/ ****************************************************/
label = gtk_label_new ("Strength:"); adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
gtk_misc_set_alignment (GTK_MISC(label), 1.0, 0.5); "Strength:", SCALE_WIDTH, 0,
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_FILL, 0, 0, 0); config.strength,
gtk_widget_show (label); MIN_STRENGTH, MAX_STRENGTH, 1.0, 10.0, 0,
STRENGTH_TEXT, NULL);
adjustment = gtk_adjustment_new (config.strength, MIN_STRENGTH, gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
MAX_STRENGTH, 1.0, 1.0, 0); GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
(GtkSignalFunc) adjustment_callback,
&config.strength); &config.strength);
scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_table_attach (GTK_TABLE (table), scale, 1, 2, 1, 2, GTK_FILL, 0, 0, 0);
gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_CONTINUOUS);
gtk_widget_show (scale);
gimp_help_set_help_data (scale, STRENGTH_TEXT, NULL);
entry = gtk_entry_new ();
gtk_object_set_user_data (GTK_OBJECT (entry), adjustment);
gtk_object_set_user_data (GTK_OBJECT (adjustment), entry);
gtk_widget_set_usize (entry, ENTRY_WIDTH, 0);
g_snprintf (buffer, sizeof (buffer), "%i", config.strength);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
GTK_SIGNAL_FUNC (entry_callback),
(gpointer) &config.strength);
gtk_table_attach (GTK_TABLE (table), entry, 2, 3, 1, 2, GTK_FILL, 0, 0, 0);
gtk_widget_show (entry);
gimp_help_set_help_data (entry, STRENGTH_TEXT, NULL);
gtk_widget_show (table); gtk_widget_show (table);
gtk_widget_show (frame); gtk_widget_show (frame);
@ -930,124 +807,52 @@ dialog_box (void)
radio buttons for choosing wind rendering algorithm radio buttons for choosing wind rendering algorithm
******************************************************/ ******************************************************/
frame = gtk_frame_new ("Style"); frame = gimp_radio_group_new2 (TRUE, "Style",
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN); gimp_radio_button_update,
gtk_table_attach (GTK_TABLE(table), frame, 0, 1, 0, 1, &config.alg, (gpointer) config.alg,
"Wind", (gpointer) RENDER_WIND, NULL,
"Blast", (gpointer) RENDER_BLAST, NULL,
NULL);
gtk_table_attach (GTK_TABLE (table), frame, 0, 1, 0, 1,
GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0);
vbox = gtk_vbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
text_label = "Wind";
rbutton = gtk_radio_button_new_with_label (NULL, text_label);
list = gtk_radio_button_group (GTK_RADIO_BUTTON (rbutton));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rbutton),
config.alg == RENDER_WIND ? TRUE : FALSE);
gtk_signal_connect (GTK_OBJECT (rbutton), "toggled",
GTK_SIGNAL_FUNC (radio_button_alg_callback),
(gpointer) RENDER_WIND);
gtk_box_pack_start (GTK_BOX (vbox), rbutton, FALSE, FALSE, 0);
gtk_widget_show (rbutton);
gimp_help_set_help_data (rbutton, WIND_TEXT, NULL);
text_label = "Blast";
rbutton = gtk_radio_button_new_with_label (list, text_label);
list = gtk_radio_button_group (GTK_RADIO_BUTTON (rbutton));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (rbutton),
config.alg == RENDER_BLAST ? TRUE : FALSE);
gtk_signal_connect (GTK_OBJECT (rbutton), "toggled",
GTK_SIGNAL_FUNC (radio_button_alg_callback),
(gpointer) RENDER_BLAST);
gtk_box_pack_start (GTK_BOX (vbox), rbutton, FALSE, FALSE, 0);
gtk_widget_show (rbutton);
gimp_help_set_help_data (rbutton, BLAST_TEXT, NULL);
gtk_widget_show (vbox);
gtk_widget_show (frame); gtk_widget_show (frame);
/****************************************************** /******************************************************
radio buttons for choosing LEFT or RIGHT radio buttons for choosing LEFT or RIGHT
**************************************************/ **************************************************/
frame = gtk_frame_new ("Direction");
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN); frame = gimp_radio_group_new2 (TRUE, "Direction",
gimp_radio_button_update,
&config.direction, (gpointer) config.direction,
"Left", (gpointer) LEFT, NULL,
"Right", (gpointer) RIGHT, NULL,
NULL);
gtk_table_attach (GTK_TABLE (table), frame, 1, 2, 0, 1, gtk_table_attach (GTK_TABLE (table), frame, 1, 2, 0, 1,
GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0);
vbox = gtk_vbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
rbutton = gtk_radio_button_new_with_label (NULL, "Left");
list = gtk_radio_button_group (GTK_RADIO_BUTTON (rbutton));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rbutton),
config.direction == LEFT ? TRUE : FALSE);
gtk_signal_connect (GTK_OBJECT (rbutton), "toggled",
GTK_SIGNAL_FUNC (radio_button_direction_callback),
(gpointer) LEFT);
gtk_box_pack_start (GTK_BOX (vbox), rbutton, FALSE, FALSE, 0);
gtk_widget_show (rbutton);
gimp_help_set_help_data (rbutton, LEFT_TEXT, NULL);
rbutton = gtk_radio_button_new_with_label (list, "Right");
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rbutton),
config.direction == RIGHT ? TRUE : FALSE);
gtk_signal_connect (GTK_OBJECT (rbutton), "toggled",
GTK_SIGNAL_FUNC (radio_button_direction_callback),
(gpointer) RIGHT);
gtk_box_pack_start (GTK_BOX (vbox), rbutton, FALSE, FALSE, 0);
gtk_widget_show(rbutton);
gimp_help_set_help_data (rbutton, RIGHT_TEXT, NULL);
gtk_widget_show (vbox);
gtk_widget_show (frame); gtk_widget_show (frame);
/***************************************************** /*****************************************************
radio buttons for choosing BOTH, LEADING, TRAILING radio buttons for choosing BOTH, LEADING, TRAILING
***************************************************/ ***************************************************/
frame = gtk_frame_new ("Edge Affected"); frame = gimp_radio_group_new2 (TRUE, "Edge Affected",
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN); gimp_radio_button_update,
&config.edge, (gpointer) config.edge,
"Leading", (gpointer) LEADING, NULL,
"Trailing", (gpointer) TRAILING, NULL,
"Both", (gpointer) BOTH, NULL,
NULL);
gtk_table_attach (GTK_TABLE (table), frame, 2, 3, 0, 1, gtk_table_attach (GTK_TABLE (table), frame, 2, 3, 0, 1,
GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0);
vbox = gtk_vbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
rbutton = gtk_radio_button_new_with_label (NULL, "Leading");
list = gtk_radio_button_group (GTK_RADIO_BUTTON (rbutton));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rbutton),
config.edge == LEADING ? TRUE : FALSE);
gtk_signal_connect (GTK_OBJECT (rbutton), "toggled",
GTK_SIGNAL_FUNC (radio_button_edge_callback),
(gpointer) LEADING);
gtk_box_pack_start (GTK_BOX (vbox), rbutton, FALSE, FALSE, 0);
gtk_widget_show (rbutton);
gimp_help_set_help_data (rbutton, LEADING_TEXT, NULL);
rbutton = gtk_radio_button_new_with_label (list, "Trailing");
list = gtk_radio_button_group (GTK_RADIO_BUTTON (rbutton));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rbutton),
config.edge == TRAILING ? TRUE : FALSE);
gtk_signal_connect (GTK_OBJECT (rbutton), "toggled",
GTK_SIGNAL_FUNC (radio_button_edge_callback),
(gpointer) TRAILING);
gtk_box_pack_start (GTK_BOX (vbox), rbutton, FALSE, FALSE, 0);
gtk_widget_show (rbutton);
gimp_help_set_help_data (rbutton, TRAILING_TEXT, NULL);
rbutton = gtk_radio_button_new_with_label (list, "Both");
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rbutton),
config.edge == BOTH ? TRUE : FALSE);
gtk_signal_connect (GTK_OBJECT (rbutton), "toggled",
GTK_SIGNAL_FUNC (radio_button_edge_callback),
(gpointer) BOTH);
gtk_box_pack_start (GTK_BOX (vbox), rbutton, FALSE, FALSE, 0);
gtk_widget_show (rbutton);
gimp_help_set_help_data (rbutton, BOTH_TEXT, NULL);
gtk_widget_show (vbox);
gtk_widget_show (frame); gtk_widget_show (frame);
gtk_widget_show (table); gtk_widget_show (table);
@ -1055,6 +860,4 @@ dialog_box (void)
gtk_main (); gtk_main ();
gdk_flush (); gdk_flush ();
return;
} }