mirror of https://github.com/GNOME/gimp.git
Bug 155733 - need to check return values of gimp_drawable_mask_bounds()
Mask intersect fixes for some plug-ins.
This commit is contained in:
parent
4e8c93246a
commit
2084b13369
|
@ -353,24 +353,23 @@ sobel (GimpDrawable *drawable,
|
|||
guchar *next_row, *nr;
|
||||
guchar *tmp;
|
||||
gint row, col;
|
||||
gint x1, y1, x2, y2;
|
||||
gint x, y;
|
||||
gboolean alpha;
|
||||
gint counter;
|
||||
guchar *preview_buffer = NULL;
|
||||
|
||||
if (preview)
|
||||
{
|
||||
gimp_preview_get_position (preview, &x1, &y1);
|
||||
gimp_preview_get_position (preview, &x, &y);
|
||||
gimp_preview_get_size (preview, &width, &height);
|
||||
x2 = x1 + width;
|
||||
y2 = y1 + height;
|
||||
}
|
||||
else
|
||||
{
|
||||
gimp_drawable_mask_bounds (drawable->drawable_id, &x1, &y1, &x2, &y2);
|
||||
if (! gimp_drawable_mask_intersect (drawable->drawable_id,
|
||||
&x, &y, &width, &height))
|
||||
return;
|
||||
|
||||
gimp_progress_init (_("Sobel edge detecting"));
|
||||
width = x2 - x1;
|
||||
height = y2 - y1;
|
||||
}
|
||||
|
||||
/* Get the size of the input image. (This will/must be the same
|
||||
|
@ -405,14 +404,14 @@ sobel (GimpDrawable *drawable,
|
|||
cr = cur_row + bytes;
|
||||
nr = next_row + bytes;
|
||||
|
||||
sobel_prepare_row (&srcPR, pr, x1, y1 - 1, width);
|
||||
sobel_prepare_row (&srcPR, cr, x1, y1, width);
|
||||
sobel_prepare_row (&srcPR, pr, x, y - 1, width);
|
||||
sobel_prepare_row (&srcPR, cr, x, y, width);
|
||||
counter =0;
|
||||
/* loop through the rows, applying the sobel convolution */
|
||||
for (row = y1; row < y2; row++)
|
||||
for (row = y; row < y + height; row++)
|
||||
{
|
||||
/* prepare the next row */
|
||||
sobel_prepare_row (&srcPR, nr, x1, row + 1, width);
|
||||
sobel_prepare_row (&srcPR, nr, x, row + 1, width);
|
||||
|
||||
d = dest;
|
||||
for (col = 0; col < width * bytes; col++)
|
||||
|
@ -450,16 +449,16 @@ sobel (GimpDrawable *drawable,
|
|||
/* store the dest */
|
||||
if (preview)
|
||||
{
|
||||
memcpy (preview_buffer + width * (row - y1) * bytes,
|
||||
memcpy (preview_buffer + width * (row - y) * bytes,
|
||||
dest,
|
||||
width * bytes);
|
||||
}
|
||||
else
|
||||
{
|
||||
gimp_pixel_rgn_set_row (&destPR, dest, x1, row, width);
|
||||
gimp_pixel_rgn_set_row (&destPR, dest, x, row, width);
|
||||
|
||||
if ((row % 20) == 0)
|
||||
gimp_progress_update ((double) row / (double) (y2 - y1));
|
||||
gimp_progress_update ((double) row / (double) height);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -474,7 +473,7 @@ sobel (GimpDrawable *drawable,
|
|||
/* update the sobeled region */
|
||||
gimp_drawable_flush (drawable);
|
||||
gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
|
||||
gimp_drawable_update (drawable->drawable_id, x1, y1, width, height);
|
||||
gimp_drawable_update (drawable->drawable_id, x, y, width, height);
|
||||
}
|
||||
|
||||
g_free (prev_row);
|
||||
|
|
|
@ -480,22 +480,20 @@ randomize (GimpDrawable *drawable,
|
|||
guchar *next_row, *nr;
|
||||
guchar *tmp;
|
||||
gint row, col;
|
||||
gint x1, y1, x2, y2;
|
||||
gint x, y;
|
||||
gint cnt;
|
||||
gint i, j, k;
|
||||
|
||||
if (preview)
|
||||
{
|
||||
gimp_preview_get_position (preview, &x1, &y1);
|
||||
gimp_preview_get_position (preview, &x, &y);
|
||||
gimp_preview_get_size (preview, &width, &height);
|
||||
x2 = x1 + width;
|
||||
y2 = y1 + height;
|
||||
}
|
||||
else
|
||||
{
|
||||
gimp_drawable_mask_bounds (drawable->drawable_id, &x1, &y1, &x2, &y2);
|
||||
width = (x2 - x1);
|
||||
height = (y2 - y1);
|
||||
if (! gimp_drawable_mask_intersect (drawable->drawable_id,
|
||||
&x, &y, &width, &height))
|
||||
return;
|
||||
}
|
||||
|
||||
bytes = drawable->bpp;
|
||||
|
@ -503,17 +501,17 @@ randomize (GimpDrawable *drawable,
|
|||
/*
|
||||
* allocate row buffers
|
||||
*/
|
||||
prev_row = g_new (guchar, (x2 - x1 + 2) * bytes);
|
||||
cur_row = g_new (guchar, (x2 - x1 + 2) * bytes);
|
||||
next_row = g_new (guchar, (x2 - x1 + 2) * bytes);
|
||||
dest = g_new (guchar, (x2 - x1) * bytes);
|
||||
prev_row = g_new (guchar, (width + 2) * bytes);
|
||||
cur_row = g_new (guchar, (width + 2) * bytes);
|
||||
next_row = g_new (guchar, (width + 2) * bytes);
|
||||
dest = g_new (guchar, width * bytes);
|
||||
|
||||
/*
|
||||
* initialize the pixel regions
|
||||
*/
|
||||
gimp_pixel_rgn_init (&srcPR, drawable, x1, y1, width, height, FALSE, FALSE);
|
||||
gimp_pixel_rgn_init (&destPR, drawable, x1, y1, width, height, TRUE, TRUE);
|
||||
gimp_pixel_rgn_init (&destPR2, drawable, x1, y1, width, height, TRUE, TRUE);
|
||||
gimp_pixel_rgn_init (&srcPR, drawable, x, y, width, height, FALSE, FALSE);
|
||||
gimp_pixel_rgn_init (&destPR, drawable, x, y, width, height, TRUE, TRUE);
|
||||
gimp_pixel_rgn_init (&destPR2, drawable, x, y, width, height, TRUE, TRUE);
|
||||
sp = &srcPR;
|
||||
dp = &destPR;
|
||||
tp = NULL;
|
||||
|
@ -527,18 +525,18 @@ randomize (GimpDrawable *drawable,
|
|||
/*
|
||||
* prepare the first row and previous row
|
||||
*/
|
||||
randomize_prepare_row (sp, pr, x1, y1 - 1, (x2 - x1));
|
||||
randomize_prepare_row (sp, cr, x1, y1, (x2 - x1));
|
||||
randomize_prepare_row (sp, pr, x, y - 1, width);
|
||||
randomize_prepare_row (sp, cr, x, y, width);
|
||||
/*
|
||||
* loop through the rows, applying the selected convolution
|
||||
*/
|
||||
for (row = y1; row < y2; row++)
|
||||
for (row = y; row < y + height; row++)
|
||||
{
|
||||
/* prepare the next row */
|
||||
randomize_prepare_row (sp, nr, x1, row + 1, (x2 - x1));
|
||||
randomize_prepare_row (sp, nr, x, row + 1, width);
|
||||
|
||||
d = dest;
|
||||
for (col = 0; col < (x2 - x1); col++)
|
||||
for (col = 0; col < width; col++)
|
||||
{
|
||||
if (g_rand_int_range (gr, 0, 100) <= (gint) pivals.rndm_pct)
|
||||
{
|
||||
|
@ -636,7 +634,7 @@ randomize (GimpDrawable *drawable,
|
|||
* Save the modified row, shuffle the row pointers, and every
|
||||
* so often, update the progress meter.
|
||||
*/
|
||||
gimp_pixel_rgn_set_row (dp, dest, x1, row, (x2 - x1));
|
||||
gimp_pixel_rgn_set_row (dp, dest, x, row, width);
|
||||
|
||||
tmp = pr;
|
||||
pr = cr;
|
||||
|
@ -646,7 +644,7 @@ randomize (GimpDrawable *drawable,
|
|||
if (! preview && PROG_UPDATE_TIME)
|
||||
{
|
||||
gdouble base = (gdouble) cnt / pivals.rndm_rcount;
|
||||
gdouble inc = (gdouble) row / ((y2 - y1) * pivals.rndm_rcount);
|
||||
gdouble inc = (gdouble) row / (height * pivals.rndm_rcount);
|
||||
|
||||
gimp_progress_update (base + inc);
|
||||
}
|
||||
|
@ -687,7 +685,7 @@ randomize (GimpDrawable *drawable,
|
|||
{
|
||||
gimp_drawable_flush (drawable);
|
||||
gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
|
||||
gimp_drawable_update (drawable->drawable_id, x1, y1, (x2 - x1), (y2 - y1));
|
||||
gimp_drawable_update (drawable->drawable_id, x, y, width, height);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -82,10 +82,8 @@ gdouble xbild;
|
|||
gdouble ybild;
|
||||
gdouble xdiff;
|
||||
gdouble ydiff;
|
||||
gint sel_x1;
|
||||
gint sel_y1;
|
||||
gint sel_x2;
|
||||
gint sel_y2;
|
||||
gint sel_x;
|
||||
gint sel_y;
|
||||
gint preview_width;
|
||||
gint preview_height;
|
||||
gdouble *gg;
|
||||
|
@ -281,11 +279,10 @@ run (const gchar *name,
|
|||
/* Get the specified drawable */
|
||||
drawable = gimp_drawable_get (param[2].data.d_drawable);
|
||||
|
||||
gimp_drawable_mask_bounds (drawable->drawable_id,
|
||||
&sel_x1, &sel_y1, &sel_x2, &sel_y2);
|
||||
|
||||
sel_width = sel_x2 - sel_x1;
|
||||
sel_height = sel_y2 - sel_y1;
|
||||
if (! gimp_drawable_mask_intersect (drawable->drawable_id,
|
||||
&sel_x, &sel_y,
|
||||
&sel_width, &sel_height))
|
||||
return;
|
||||
|
||||
/* Calculate preview size */
|
||||
if (sel_width > sel_height)
|
||||
|
|
|
@ -92,8 +92,8 @@ MazeValues mvals =
|
|||
|
||||
GRand *gr;
|
||||
|
||||
guint sel_w;
|
||||
guint sel_h;
|
||||
gint sel_w;
|
||||
gint sel_h;
|
||||
|
||||
|
||||
MAIN ()
|
||||
|
@ -147,7 +147,7 @@ run (const gchar *name,
|
|||
GimpDrawable *drawable;
|
||||
GimpRunMode run_mode;
|
||||
GimpPDBStatusType status = GIMP_PDB_SUCCESS;
|
||||
gint x1, y1, x2, y2;
|
||||
gint x, y;
|
||||
|
||||
#ifdef MAZE_DEBUG
|
||||
g_print("maze PID: %d\n",getpid());
|
||||
|
@ -166,17 +166,19 @@ run (const gchar *name,
|
|||
|
||||
drawable = gimp_drawable_get (param[2].data.d_drawable);
|
||||
|
||||
/* get the selection width and height for the GUI. Return if the
|
||||
* selection and drawable do not intersect.
|
||||
*/
|
||||
if (! gimp_drawable_mask_intersect (drawable->drawable_id,
|
||||
&x, &y, &sel_w, &sel_h))
|
||||
return;
|
||||
|
||||
switch (run_mode)
|
||||
{
|
||||
case GIMP_RUN_INTERACTIVE:
|
||||
/* Possibly retrieve data */
|
||||
gimp_get_data (PLUG_IN_PROC, &mvals);
|
||||
|
||||
/* The interface needs to know the dimensions of the image... */
|
||||
gimp_drawable_mask_bounds (drawable->drawable_id, &x1, &y1, &x2, &y2);
|
||||
sel_w = x2 - x1;
|
||||
sel_h = y2 - y1;
|
||||
|
||||
/* Acquire info with a dialog */
|
||||
if (! maze_dialog ())
|
||||
{
|
||||
|
|
|
@ -60,8 +60,8 @@ enum CellTypes {
|
|||
};
|
||||
|
||||
extern MazeValues mvals;
|
||||
extern guint sel_w;
|
||||
extern guint sel_h;
|
||||
extern gint sel_w;
|
||||
extern gint sel_h;
|
||||
extern GRand *gr;
|
||||
|
||||
|
||||
|
|
|
@ -159,7 +159,7 @@ static const guint8 *curl_pixbufs[] =
|
|||
|
||||
static GtkWidget *curl_image = NULL;
|
||||
|
||||
static gint sel_x1, sel_y1, sel_x2, sel_y2;
|
||||
static gint sel_x, sel_y;
|
||||
static gint true_sel_width, true_sel_height;
|
||||
static gint sel_width, sel_height;
|
||||
static gint drawable_position;
|
||||
|
@ -262,8 +262,10 @@ run (const gchar *name,
|
|||
drawable_id = param[2].data.d_drawable;
|
||||
image_id = param[1].data.d_image;
|
||||
|
||||
if (gimp_drawable_is_rgb (drawable_id)
|
||||
|| gimp_drawable_is_gray (drawable_id))
|
||||
if ((gimp_drawable_is_rgb (drawable_id) ||
|
||||
gimp_drawable_is_gray (drawable_id)) &&
|
||||
gimp_drawable_mask_intersect (drawable_id, &sel_x, &sel_y,
|
||||
&true_sel_width, &true_sel_height))
|
||||
{
|
||||
switch (run_mode)
|
||||
{
|
||||
|
@ -648,13 +650,6 @@ init_calculation (gint32 drawable_id)
|
|||
image_layers[drawable_position] != drawable_id)
|
||||
drawable_position++;
|
||||
|
||||
/* Get the bounds of the active selection */
|
||||
gimp_drawable_mask_bounds (drawable_id,
|
||||
&sel_x1, &sel_y1, &sel_x2, &sel_y2);
|
||||
|
||||
true_sel_width = sel_x2 - sel_x1;
|
||||
true_sel_height = sel_y2 - sel_y1;
|
||||
|
||||
switch (curl.orientation)
|
||||
{
|
||||
case CURL_ORIENTATION_VERTICAL:
|
||||
|
@ -747,7 +742,7 @@ do_curl_effect (gint32 drawable_id)
|
|||
gimp_drawable_fill (curl_layer->drawable_id, GIMP_TRANSPARENT_FILL);
|
||||
|
||||
gimp_drawable_offsets (drawable_id, &x1, &y1);
|
||||
gimp_layer_set_offsets (curl_layer->drawable_id, sel_x1 + x1, sel_y1 + y1);
|
||||
gimp_layer_set_offsets (curl_layer->drawable_id, sel_x + x1, sel_y + y1);
|
||||
gimp_tile_cache_ntiles (2 * (curl_layer->width / gimp_tile_width () + 1));
|
||||
|
||||
gimp_pixel_rgn_init (&dest_rgn, curl_layer,
|
||||
|
@ -941,10 +936,10 @@ clear_curled_region (gint32 drawable_id)
|
|||
|
||||
gimp_tile_cache_ntiles (2 * (drawable->width / gimp_tile_width () + 1));
|
||||
gimp_pixel_rgn_init (&src_rgn, drawable,
|
||||
sel_x1, sel_y1, true_sel_width, true_sel_height,
|
||||
sel_x, sel_y, true_sel_width, true_sel_height,
|
||||
FALSE, FALSE);
|
||||
gimp_pixel_rgn_init (&dest_rgn, drawable,
|
||||
sel_x1, sel_y1, true_sel_width, true_sel_height,
|
||||
sel_x, sel_y, true_sel_width, true_sel_height,
|
||||
TRUE, TRUE);
|
||||
alpha_pos = dest_rgn.bpp - 1;
|
||||
|
||||
|
@ -967,16 +962,16 @@ clear_curled_region (gint32 drawable_id)
|
|||
{
|
||||
case CURL_ORIENTATION_VERTICAL:
|
||||
x = (CURL_EDGE_RIGHT (curl.edge) ?
|
||||
x1 - sel_x1 : sel_width - 1 - (x1 - sel_x1));
|
||||
x1 - sel_x : sel_width - 1 - (x1 - sel_x));
|
||||
y = (CURL_EDGE_UPPER (curl.edge) ?
|
||||
y1 - sel_y1 : sel_height - 1 - (y1 - sel_y1));
|
||||
y1 - sel_y : sel_height - 1 - (y1 - sel_y));
|
||||
break;
|
||||
|
||||
case CURL_ORIENTATION_HORIZONTAL:
|
||||
x = (CURL_EDGE_LOWER (curl.edge) ?
|
||||
y1 - sel_y1 : sel_width - 1 - (y1 - sel_y1));
|
||||
y1 - sel_y : sel_width - 1 - (y1 - sel_y));
|
||||
y = (CURL_EDGE_LEFT (curl.edge) ?
|
||||
x1 - sel_x1 : sel_height - 1 - (x1 - sel_x1));
|
||||
x1 - sel_x : sel_height - 1 - (x1 - sel_x));
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1012,7 +1007,8 @@ clear_curled_region (gint32 drawable_id)
|
|||
gimp_drawable_flush (drawable);
|
||||
gimp_drawable_merge_shadow (drawable_id, TRUE);
|
||||
gimp_drawable_update (drawable_id,
|
||||
sel_x1, sel_y1, true_sel_width, true_sel_height);
|
||||
sel_x, sel_y,
|
||||
true_sel_width, true_sel_height);
|
||||
gimp_drawable_detach (drawable);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue