22
22
#include "config.h"
26
24
#include <libgimp/gimp.h>
27
25
#include <libgimp/gimpui.h>
29
27
#include "libgimp/stdplugins-intl.h"
30
#define PLUG_IN_PROC "plug-in-checkerboard"
31
#define PLUG_IN_BINARY "checkerboard"
32
32
#define SPIN_BUTTON_WIDTH 8
34
35
/* Variables set in dialog box */
35
36
typedef struct data
42
43
static void query (void);
43
44
static void run (const gchar *name,
45
const GimpParam *param,
47
GimpParam **return_vals);
46
const GimpParam *param,
48
GimpParam **return_vals);
49
static void do_checkerboard_pattern (GimpDrawable *drawable);
50
static void do_checkerboard_pattern (GimpDrawable *drawable,
51
GimpPreview *preview);
50
52
static gint inblock (gint pos,
53
static gboolean checkerboard_dialog (gint32 image_ID,
55
static gboolean checkerboard_dialog (gint32 image_ID,
54
56
GimpDrawable *drawable);
55
static void check_size_update_callback (GtkWidget *widget,
59
GimpPlugInInfo PLUG_IN_INFO =
57
static void check_size_update_callback (GtkWidget *widget);
60
const GimpPlugInInfo PLUG_IN_INFO =
61
62
NULL, /* init_proc */
62
63
NULL, /* quit_proc */
78
static GimpParamDef args[] =
79
static const GimpParamDef args[] =
80
{ GIMP_PDB_INT32, "run_mode", "Interactive, non-interactive" },
81
{ GIMP_PDB_IMAGE, "image", "Input image (unused)" },
82
{ GIMP_PDB_DRAWABLE, "drawable", "Input drawable" },
83
{ GIMP_PDB_INT32, "check_mode", "Regular or Psychobilly" },
84
{ GIMP_PDB_INT32, "check_size", "Size of the checks" }
81
{ GIMP_PDB_INT32, "run-mode", "Interactive, non-interactive" },
82
{ GIMP_PDB_IMAGE, "image", "Input image (unused)" },
83
{ GIMP_PDB_DRAWABLE, "drawable", "Input drawable" },
84
{ GIMP_PDB_INT32, "check-mode", "Regular or Psychobilly" },
85
{ GIMP_PDB_INT32, "check-size", "Size of the checks" }
87
gimp_install_procedure ("plug_in_checkerboard",
88
"Adds a checkerboard pattern to an image",
90
"Brent Burton & the Edward Blevins",
91
"Brent Burton & the Edward Blevins",
93
N_("_Checkerboard..."),
96
G_N_ELEMENTS (args), 0,
88
gimp_install_procedure (PLUG_IN_PROC,
89
N_("Create a checkerboard pattern"),
91
"Brent Burton & the Edward Blevins",
92
"Brent Burton & the Edward Blevins",
94
N_("_Checkerboard..."),
97
G_N_ELEMENTS (args), 0,
99
gimp_plugin_menu_register ("plug_in_checkerboard",
100
"<Image>/Filters/Render/Pattern");
100
gimp_plugin_menu_register (PLUG_IN_PROC, "<Image>/Filters/Render/Pattern");
129
129
switch (run_mode)
131
131
case GIMP_RUN_INTERACTIVE:
132
gimp_get_data ("plug_in_checkerboard", &cvals);
132
gimp_get_data (PLUG_IN_PROC, &cvals);
133
133
if (! checkerboard_dialog (image_ID, drawable))
135
gimp_drawable_detach (drawable);
135
gimp_drawable_detach (drawable);
140
140
case GIMP_RUN_NONINTERACTIVE:
141
141
if (nparams != 5)
142
status = GIMP_PDB_CALLING_ERROR;
142
status = GIMP_PDB_CALLING_ERROR;
143
143
if (status == GIMP_PDB_SUCCESS)
145
cvals.mode = param[3].data.d_int32;
146
cvals.size = param[4].data.d_int32;
145
cvals.mode = param[3].data.d_int32;
146
cvals.size = param[4].data.d_int32;
150
150
case GIMP_RUN_WITH_LAST_VALS:
151
gimp_get_data ("plug_in_checkerboard", &cvals);
151
gimp_get_data (PLUG_IN_PROC, &cvals);
158
158
if (gimp_drawable_is_rgb (drawable->drawable_id) ||
159
159
gimp_drawable_is_gray (drawable->drawable_id))
161
gimp_progress_init (_("Adding Checkerboard..."));
161
gimp_progress_init (_("Adding checkerboard"));
163
do_checkerboard_pattern(drawable);
163
do_checkerboard_pattern (drawable, NULL);
165
165
if (run_mode != GIMP_RUN_NONINTERACTIVE)
166
gimp_displays_flush ();
166
gimp_displays_flush ();
168
168
if (run_mode == GIMP_RUN_INTERACTIVE)
169
gimp_set_data ("plug_in_checkerboard", &cvals, sizeof (CheckVals));
169
gimp_set_data (PLUG_IN_PROC, &cvals, sizeof (CheckVals));
238
iter = gimp_rgn_iterator_new (drawable, 0);
239
gimp_rgn_iterator_dest (iter, checkerboard_func, ¶m);
240
gimp_rgn_iterator_free (iter);
249
gimp_preview_get_position (preview, &x1, &y1);
250
gimp_preview_get_size (preview, &width, &height);
252
buffer = g_new (guchar, width * height * bpp);
254
for (i = 0; i < width * height; i++)
256
checkerboard_func (x1 + i % width,
261
gimp_preview_draw_buffer (preview, buffer, width * bpp);
266
iter = gimp_rgn_iterator_new (drawable, 0);
267
gimp_rgn_iterator_dest (iter, checkerboard_func, ¶m);
268
gimp_rgn_iterator_free (iter);
244
273
inblock (gint pos,
247
static gint *in = NULL; /* initialized first time */
276
static gint *in = NULL; /* initialized first time */
277
static gint len = -1;
250
279
/* avoid a FP exception */
283
if (in && len != size * size)
256
290
* Initialize the array; since we'll be called thousands of
257
291
* times with the same size value, precompute the array.
261
gint cell = 1; /* cell value */
295
gint cell = 1; /* cell value */
264
298
in = g_new (gint, len);
268
302
* j is current number of blocks to fill in with a 1 or 0.
269
303
* k is just counter for the j cells.
272
for (j=1; j<=size; j++ )
280
for ( j=size-1; j>=1; j--)
306
for (j = 1; j <= size; j++)
308
for (k = 0; k < j; k++)
314
for (j = size - 1; j >= 1; j--)
316
for (k = 0; k < j; k++)
290
324
/* place pos within 0..(len-1) grid and return the value. */
291
return in[ pos % (len-1) ];
325
return in[pos % (len - 1)];
295
329
checkerboard_dialog (gint32 image_ID,
296
330
GimpDrawable *drawable)
300
335
GtkWidget *toggle;
301
336
GtkWidget *size_entry;
302
gint size, width, height;
337
gint size, width, height;
308
gimp_ui_init ("checkerboard", FALSE);
310
dlg = gimp_dialog_new (_("Checkerboard"), "checkerboard",
312
gimp_standard_help_func, "plug-in-checkerboard",
314
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
315
GTK_STOCK_OK, GTK_RESPONSE_OK,
319
/* Get the image resolution and unit */
320
gimp_image_get_resolution (image_ID, &xres, &yres);
321
unit = gimp_image_get_unit (image_ID);
323
width = gimp_drawable_width (drawable->drawable_id);
324
height = gimp_drawable_height (drawable->drawable_id);
325
size = MIN (width, height);
343
gimp_ui_init (PLUG_IN_BINARY, FALSE);
345
dialog = gimp_dialog_new (_("Checkerboard"), PLUG_IN_BINARY,
347
gimp_standard_help_func, PLUG_IN_PROC,
349
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
350
GTK_STOCK_OK, GTK_RESPONSE_OK,
354
gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
359
gimp_window_set_transient (GTK_WINDOW (dialog));
327
361
vbox = gtk_vbox_new (FALSE, 12);
328
362
gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
329
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), vbox, TRUE, TRUE, 0);
363
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox);
330
364
gtk_widget_show (vbox);
366
preview = gimp_drawable_preview_new (drawable, NULL);
367
gtk_container_add (GTK_CONTAINER (vbox), preview);
368
gtk_widget_show (preview);
369
g_signal_connect_swapped (preview, "invalidated",
370
G_CALLBACK (do_checkerboard_pattern),
332
373
toggle = gtk_check_button_new_with_mnemonic (_("_Psychobilly"));
333
374
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
334
375
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), cvals.mode);
337
378
g_signal_connect (toggle, "toggled",
338
379
G_CALLBACK (gimp_toggle_button_update),
381
g_signal_connect_swapped (toggle, "toggled",
382
G_CALLBACK (gimp_preview_invalidate),
385
/* Get the image resolution and unit */
386
gimp_image_get_resolution (image_ID, &xres, &yres);
387
unit = gimp_image_get_unit (image_ID);
389
width = gimp_drawable_width (drawable->drawable_id);
390
height = gimp_drawable_height (drawable->drawable_id);
391
size = MIN (width, height);
341
393
size_entry = gimp_size_entry_new (1, unit, "%a",
342
394
TRUE, TRUE, FALSE, SPIN_BUTTON_WIDTH,
364
416
gimp_size_entry_attach_label (GIMP_SIZE_ENTRY (size_entry),
365
417
_("_Size:"), 1, 0, 0.0);
367
g_signal_connect (size_entry, "value_changed",
419
g_signal_connect (size_entry, "value-changed",
368
420
G_CALLBACK (check_size_update_callback),
422
g_signal_connect_swapped (size_entry, "value-changed",
423
G_CALLBACK (gimp_preview_invalidate),
371
gtk_container_add (GTK_CONTAINER (vbox), size_entry);
426
gtk_box_pack_start (GTK_BOX (vbox), size_entry, FALSE, FALSE, 0);
372
427
gtk_widget_show (size_entry);
374
gtk_widget_show (dlg);
376
run = (gimp_dialog_run (GIMP_DIALOG (dlg)) == GTK_RESPONSE_OK);
378
gtk_widget_destroy (dlg);
429
gtk_widget_show (dialog);
431
run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);
433
gtk_widget_destroy (dialog);
384
check_size_update_callback (GtkWidget *widget,
439
check_size_update_callback (GtkWidget *widget)
387
441
cvals.size = gimp_size_entry_get_refval (GIMP_SIZE_ENTRY (widget), 0);