48
48
#include "config.h"
58
50
#include <libgimp/gimp.h>
59
51
#include <libgimp/gimpui.h>
61
53
#include "libgimp/stdplugins-intl.h"
64
#define PLUG_IN_NAME "plug_in_whirl_pinch"
56
#define PLUG_IN_PROC "plug-in-whirl-pinch"
57
#define PLUG_IN_BINARY "whirlpinch"
65
58
#define PLUG_IN_VERSION "May 1997, 2.09"
66
#define HELP_ID "plug-in-whirl-pinch"
68
60
/***** Magic numbers *****/
70
62
#define SCALE_WIDTH 200
71
#define ENTRY_WIDTH 60
73
64
/***** Types *****/
138
static GimpParamDef args[] =
127
static const GimpParamDef args[] =
140
{ GIMP_PDB_INT32, "run_mode", "Interactive, non-interactive" },
141
{ GIMP_PDB_IMAGE, "image", "Input image" },
142
{ GIMP_PDB_DRAWABLE, "drawable", "Input drawable" },
143
{ GIMP_PDB_FLOAT, "whirl", "Whirl angle (degrees)" },
144
{ GIMP_PDB_FLOAT, "pinch", "Pinch amount" },
145
{ GIMP_PDB_FLOAT, "radius", "Radius (1.0 is the largest circle that fits in the image, "
146
"and 2.0 goes all the way to the corners)" }
129
{ GIMP_PDB_INT32, "run-mode", "Interactive, non-interactive" },
130
{ GIMP_PDB_IMAGE, "image", "Input image" },
131
{ GIMP_PDB_DRAWABLE, "drawable", "Input drawable" },
132
{ GIMP_PDB_FLOAT, "whirl", "Whirl angle (degrees)" },
133
{ GIMP_PDB_FLOAT, "pinch", "Pinch amount" },
134
{ GIMP_PDB_FLOAT, "radius", "Radius (1.0 is the largest circle that fits in the image, and 2.0 goes all the way to the corners)" }
149
gimp_install_procedure (PLUG_IN_NAME,
150
"Distort an image by whirling and pinching",
137
gimp_install_procedure (PLUG_IN_PROC,
138
N_("Distort an image by whirling and pinching"),
151
139
"Distorts the image by whirling and pinching, which "
152
140
"are two common center-based, circular distortions. "
153
141
"Whirling is like projecting the image onto the "
198
186
img_bpp = gimp_drawable_bpp (drawable->drawable_id);
199
187
img_has_alpha = gimp_drawable_has_alpha (drawable->drawable_id);
201
gimp_drawable_mask_bounds (drawable->drawable_id,
202
&sel_x1, &sel_y1, &sel_x2, &sel_y2);
189
if (! gimp_drawable_mask_intersect (drawable->drawable_id,
190
&sel_x1, &sel_y1, &sel_x2, &sel_y2))
192
g_message (_("Region affected by plug-in is empty"));
204
196
/* Set the tile cache size */
205
197
gimp_tile_cache_ntiles (2 * drawable->ntile_cols);
240
232
case GIMP_RUN_INTERACTIVE:
241
233
/* Possibly retrieve data */
242
gimp_get_data (PLUG_IN_NAME, &wpvals);
234
gimp_get_data (PLUG_IN_PROC, &wpvals);
244
236
/* Get information from the dialog */
245
237
if (!whirl_pinch_dialog (drawable))
289
281
if (run_mode == GIMP_RUN_INTERACTIVE)
290
gimp_set_data (PLUG_IN_NAME, &wpvals, sizeof (whirl_pinch_vals_t));
282
gimp_set_data (PLUG_IN_PROC, &wpvals, sizeof (whirl_pinch_vals_t));
292
284
else if (status == GIMP_PDB_SUCCESS)
293
285
status = GIMP_PDB_EXECUTION_ERROR;
346
338
max_progress = sel_width * sel_height;
348
gimp_progress_init (_("Whirling and Pinching..."));
340
gimp_progress_init (_("Whirling and pinching"));
350
342
whirl = wpvals.whirl * G_PI / 180;
351
343
radius2 = radius * radius * wpvals.radius;
533
gimp_ui_init ("whirlpinch", TRUE);
525
gimp_ui_init (PLUG_IN_BINARY, TRUE);
535
dialog = gimp_dialog_new (_("Whirl and Pinch"), "whirlpinch",
527
dialog = gimp_dialog_new (_("Whirl and Pinch"), PLUG_IN_BINARY,
537
gimp_standard_help_func, HELP_ID,
529
gimp_standard_help_func, PLUG_IN_PROC,
539
531
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
540
532
GTK_STOCK_OK, GTK_RESPONSE_OK,
536
gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
541
gimp_window_set_transient (GTK_WINDOW (dialog));
544
543
main_vbox = gtk_vbox_new (FALSE, 12);
545
544
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 12);
546
545
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox);
547
546
gtk_widget_show (main_vbox);
549
preview = gimp_aspect_preview_new (drawable, &wpvals.preview);
548
preview = gimp_zoom_preview_new (drawable);
550
549
gtk_box_pack_start_defaults (GTK_BOX (main_vbox), preview);
551
550
gtk_widget_show (preview);
552
551
g_signal_connect_swapped (preview, "invalidated",
565
564
wpvals.whirl, -360.0, 360.0, 1.0, 15.0, 2,
568
g_signal_connect (adj, "value_changed",
567
g_signal_connect (adj, "value-changed",
569
568
G_CALLBACK (gimp_double_adjustment_update),
571
g_signal_connect_swapped (adj, "value_changed",
570
g_signal_connect_swapped (adj, "value-changed",
572
571
G_CALLBACK (gimp_preview_invalidate),
577
576
wpvals.pinch, -1.0, 1.0, 0.01, 0.1, 3,
580
g_signal_connect (adj, "value_changed",
579
g_signal_connect (adj, "value-changed",
581
580
G_CALLBACK (gimp_double_adjustment_update),
583
g_signal_connect_swapped (adj, "value_changed",
582
g_signal_connect_swapped (adj, "value-changed",
584
583
G_CALLBACK (gimp_preview_invalidate),
589
588
wpvals.radius, 0.0, 2.0, 0.01, 0.1, 3,
592
g_signal_connect (adj, "value_changed",
591
g_signal_connect (adj, "value-changed",
593
592
G_CALLBACK (gimp_double_adjustment_update),
595
g_signal_connect_swapped (adj, "value_changed",
594
g_signal_connect_swapped (adj, "value-changed",
596
595
G_CALLBACK (gimp_preview_invalidate),
658
657
bottom = sel_y2 - 1;
661
gimp_preview_get_size (preview, &width, &height);
662
src = gimp_drawable_get_thumbnail_data (drawable->drawable_id,
663
&width, &height, &img_bpp);
660
src = gimp_zoom_preview_get_source (GIMP_ZOOM_PREVIEW (preview),
661
&width, &height, &img_bpp);
664
662
dest = g_new (guchar, width * height * img_bpp);
666
664
dx = (right - left) / (width - 1);