81
static GimpParamDef args [] =
76
static const GimpParamDef args [] =
83
{ GIMP_PDB_INT32, "run_mode", "Interactive, non-interactive" },
78
{ GIMP_PDB_INT32, "run-mode", "Interactive, non-interactive" },
84
79
{ GIMP_PDB_IMAGE, "image", "Input image (not used)" },
85
80
{ GIMP_PDB_DRAWABLE, "drawable", "Input drawable" },
86
81
{ GIMP_PDB_INT32, "threshold", "Threshold" }
89
gimp_install_procedure (PLUG_IN_NAME,
92
"Shuji Narazaki (narazaki@InetQ.or.jp)",
95
N_("_Threshold Alpha..."),
98
G_N_ELEMENTS (args), 0,
84
gimp_install_procedure (PLUG_IN_PROC,
85
N_("Make transparency all-or-nothing"),
87
"Shuji Narazaki (narazaki@InetQ.or.jp)",
90
N_("_Threshold Alpha..."),
93
G_N_ELEMENTS (args), 0,
101
gimp_plugin_menu_register (PLUG_IN_NAME,
96
gimp_plugin_menu_register (PLUG_IN_PROC,
102
97
"<Image>/Layer/Transparency/Modify");
130
127
case GIMP_RUN_INTERACTIVE:
131
128
/* Since a channel might be selected, we must check wheter RGB or not. */
132
if (gimp_layer_get_preserve_trans (drawable_id))
134
g_message (_("The layer preserves transparency."));
137
if (!gimp_drawable_is_rgb (drawable_id) &&
138
!gimp_drawable_is_gray (drawable_id))
140
g_message (_("RGBA/GRAYA drawable is not selected."));
143
gimp_get_data (PLUG_IN_NAME, &VALS);
144
if (! threshold_alpha_dialog ())
129
if (gimp_layer_get_lock_alpha (drawable->drawable_id))
131
g_message (_("The layer has its alpha channel locked."));
134
if (!gimp_drawable_is_rgb (drawable->drawable_id) &&
135
!gimp_drawable_is_gray (drawable->drawable_id))
137
g_message (_("RGBA/GRAYA drawable is not selected."));
140
gimp_get_data (PLUG_IN_PROC, &VALS);
141
if (! threshold_alpha_dialog (drawable))
148
145
case GIMP_RUN_NONINTERACTIVE:
149
146
if (nparams != 4)
151
status = GIMP_PDB_CALLING_ERROR;
148
status = GIMP_PDB_CALLING_ERROR;
155
VALS.threshold = param[3].data.d_int32;
152
VALS.threshold = param[3].data.d_int32;
159
156
case GIMP_RUN_WITH_LAST_VALS:
160
gimp_get_data (PLUG_IN_NAME, &VALS);
157
gimp_get_data (PLUG_IN_PROC, &VALS);
164
161
if (status == GIMP_PDB_SUCCESS)
166
status = threshold_alpha (drawable_id);
168
if (run_mode != GIMP_RUN_NONINTERACTIVE)
169
gimp_displays_flush ();
170
if (run_mode == GIMP_RUN_INTERACTIVE && status == GIMP_PDB_SUCCESS)
171
gimp_set_data (PLUG_IN_NAME, &VALS, sizeof (ValueType));
163
if (gimp_drawable_has_alpha (drawable->drawable_id))
165
gimp_progress_init (_("Coloring transparency"));
167
threshold_alpha (drawable, NULL);
169
if (run_mode != GIMP_RUN_NONINTERACTIVE)
170
gimp_displays_flush ();
171
if (run_mode == GIMP_RUN_INTERACTIVE && status == GIMP_PDB_SUCCESS)
172
gimp_set_data (PLUG_IN_PROC, &VALS, sizeof (ValueType));
176
status = GIMP_PDB_EXECUTION_ERROR;
178
gimp_drawable_detach (drawable);
174
181
values[0].type = GIMP_PDB_STATUS;
179
186
threshold_alpha_func (const guchar *src,
186
for (gap = GPOINTER_TO_INT(data); gap; gap--)
190
for (bpp--; bpp; bpp--)
187
191
*dest++ = *src++;
188
192
*dest = (VALS.threshold < *src) ? 255 : 0;
191
static GimpPDBStatusType
192
threshold_alpha (gint32 drawable_id)
196
threshold_alpha (GimpDrawable *drawable,
197
GimpPreview *preview)
194
GimpDrawable *drawable;
197
drawable = gimp_drawable_get (drawable_id);
198
if (! gimp_drawable_has_alpha (drawable_id))
199
return GIMP_PDB_EXECUTION_ERROR;
201
gimp_tile_cache_ntiles (2 * (drawable->width / gimp_tile_width () + 1));
202
gimp_progress_init (_("Threshold Alpha: Coloring Transparency..."));
204
gap = (gimp_drawable_is_rgb (drawable_id)) ? 3 : 1;
206
gimp_rgn_iterate2 (drawable, 0 /* unused */, threshold_alpha_func,
207
GINT_TO_POINTER(gap));
209
gimp_drawable_detach (drawable);
211
return GIMP_PDB_SUCCESS;
201
GimpPixelRgn src_rgn;
208
gimp_preview_get_position (preview, &x1, &y1);
209
gimp_preview_get_size (preview, &width, &height);
213
src = g_new (guchar, width * height * bpp);
214
dst = g_new (guchar, width * height * bpp);
216
gimp_pixel_rgn_init (&src_rgn, drawable,
217
x1, y1, width, height,
219
gimp_pixel_rgn_get_rect (&src_rgn, src, x1, y1, width, height);
221
for (i = 0; i < width * height; i++)
222
threshold_alpha_func (src + i * bpp, dst + i * bpp, bpp);
224
gimp_preview_draw_buffer (preview, dst, width * bpp);
231
gimp_rgn_iterate2 (drawable, 0 /* unused */,
232
(GimpRgnFunc2)threshold_alpha_func, NULL);
215
threshold_alpha_dialog (void)
237
threshold_alpha_dialog (GimpDrawable *drawable)
240
GtkWidget *main_vbox;
218
242
GtkWidget *table;
222
gimp_ui_init (SHORT_NAME, FALSE);
224
dlg = gimp_dialog_new (_("Threshold Alpha"), SHORT_NAME,
226
gimp_standard_help_func, HELP_ID,
228
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
229
GTK_STOCK_OK, GTK_RESPONSE_OK,
246
gimp_ui_init (PLUG_IN_BINARY, FALSE);
248
dialog = gimp_dialog_new (_("Threshold Alpha"), PLUG_IN_BINARY,
250
gimp_standard_help_func, PLUG_IN_PROC,
252
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
253
GTK_STOCK_OK, GTK_RESPONSE_OK,
257
gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
262
gimp_window_set_transient (GTK_WINDOW (dialog));
264
main_vbox = gtk_vbox_new (FALSE, 12);
265
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 12);
266
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox);
267
gtk_widget_show (main_vbox);
269
preview = gimp_drawable_preview_new (drawable, NULL);
270
gtk_box_pack_start (GTK_BOX (main_vbox), preview, TRUE, TRUE, 0);
271
gtk_widget_show (preview);
272
g_signal_connect_swapped (preview, "invalidated",
273
G_CALLBACK (threshold_alpha),
233
276
table = gtk_table_new (1 ,3, FALSE);
234
277
gtk_table_set_col_spacings (GTK_TABLE (table), 6);
235
278
gtk_container_set_border_width (GTK_CONTAINER (table), 12);
236
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), table, FALSE, FALSE, 0); gtk_widget_show (table);
279
gtk_box_pack_start (GTK_BOX (main_vbox), table, FALSE, FALSE, 0);
280
gtk_widget_show (table);
238
282
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
239
_("Threshold:"), SCALE_WIDTH, 0,
240
VALS.threshold, 0, 255, 1, 8, 0,
243
g_signal_connect (adj, "value_changed",
283
_("Threshold:"), SCALE_WIDTH, 0,
284
VALS.threshold, 0, 255, 1, 8, 0,
287
g_signal_connect (adj, "value-changed",
244
288
G_CALLBACK (gimp_int_adjustment_update),
245
289
&VALS.threshold);
247
gtk_widget_show (dlg);
249
run = (gimp_dialog_run (GIMP_DIALOG (dlg)) == GTK_RESPONSE_OK);
251
gtk_widget_destroy (dlg);
290
g_signal_connect_swapped (adj, "value-changed",
291
G_CALLBACK (gimp_preview_invalidate),
294
gtk_widget_show (dialog);
296
run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);
298
gtk_widget_destroy (dialog);