code cleanup based on a patch from Maurits Rijk <lpeek.mrijk@consunet.nl>

2002-02-21  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/glasstile.c: code cleanup based on a patch from
	Maurits Rijk <lpeek.mrijk@consunet.nl> (#72051).
This commit is contained in:
Sven Neumann 2002-02-21 14:50:24 +00:00 committed by Sven Neumann
parent 41e2a3258b
commit 9e2f55bc1f
2 changed files with 105 additions and 146 deletions

View File

@ -1,3 +1,8 @@
2002-02-21 Sven Neumann <sven@gimp.org>
* plug-ins/common/glasstile.c: code cleanup based on a patch from
Maurits Rijk <lpeek.mrijk@consunet.nl> (#72051).
2002-02-21 Michael Natterer <mitch@gimp.org> 2002-02-21 Michael Natterer <mitch@gimp.org>
Implemented #66921 (needs gimp-*-refresh in PDB) Implemented #66921 (needs gimp-*-refresh in PDB)

View File

@ -84,7 +84,14 @@ static void glass_ok_callback (GtkWidget *widget,
static void fill_preview_with_thumb (GtkWidget *preview_widget, static void fill_preview_with_thumb (GtkWidget *preview_widget,
gint32 drawable_ID); gint32 drawable_ID);
static GtkWidget *preview_widget (GimpDrawable *drawable);
static void preview_do_row (gint row,
gint width,
guchar *even,
guchar *odd,
guchar *src);
static GtkWidget * preview_widget (GimpDrawable *drawable);
static void glasstile (GimpDrawable *drawable, static void glasstile (GimpDrawable *drawable,
gboolean preview_mode); gboolean preview_mode);
@ -108,7 +115,6 @@ static GlassInterface gt_int =
}; };
/* preview */ /* preview */
static guchar *preview_bits;
static GtkWidget *preview; static GtkWidget *preview;
static gdouble preview_scale_x; static gdouble preview_scale_x;
static gdouble preview_scale_y; static gdouble preview_scale_y;
@ -135,7 +141,8 @@ query (void)
gimp_install_procedure ("plug_in_glasstile", gimp_install_procedure ("plug_in_glasstile",
"Divide the image into square glassblocks", "Divide the image into square glassblocks",
"Divide the image into square glassblocks in which the image is refracted.", "Divide the image into square glassblocks in "
"which the image is refracted.",
"Karl-Johan Andersson", /* Author */ "Karl-Johan Andersson", /* Author */
"Karl-Johan Andersson", /* Copyright */ "Karl-Johan Andersson", /* Copyright */
"May 2000", "May 2000",
@ -217,9 +224,10 @@ run (gchar *name,
gimp_drawable_is_gray (drawable->drawable_id)) gimp_drawable_is_gray (drawable->drawable_id))
{ {
gimp_progress_init ( _("Glass Tile...")); gimp_progress_init ( _("Glass Tile..."));
gimp_tile_cache_ntiles (2 * (drawable->width / gimp_tile_width () + 1)); gimp_tile_cache_ntiles (2 *
(drawable->width / gimp_tile_width () + 1));
glasstile (drawable, 0); glasstile (drawable, FALSE);
if (run_mode != GIMP_RUN_NONINTERACTIVE) if (run_mode != GIMP_RUN_NONINTERACTIVE)
gimp_displays_flush (); gimp_displays_flush ();
@ -228,13 +236,11 @@ run (gchar *name,
{ {
gimp_set_data ("plug_in_glasstile", &gtvals, gimp_set_data ("plug_in_glasstile", &gtvals,
sizeof (GlassValues)); sizeof (GlassValues));
g_free (preview_bits);
g_free (preview_cache); g_free (preview_cache);
} }
} }
else else
{ {
/* gimp_message ("glasstile: cannot operate on indexed color images"); */
status = GIMP_PDB_EXECUTION_ERROR; status = GIMP_PDB_EXECUTION_ERROR;
} }
} }
@ -274,7 +280,8 @@ glass_dialog (GimpDrawable *drawable)
main_vbox = gtk_vbox_new (FALSE, 3); main_vbox = gtk_vbox_new (FALSE, 3);
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0); gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), main_vbox, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox),
main_vbox, TRUE, TRUE, 0);
gtk_widget_show (main_vbox); gtk_widget_show (main_vbox);
frame = gtk_frame_new (_("Preview")); frame = gtk_frame_new (_("Preview"));
@ -289,7 +296,7 @@ glass_dialog (GimpDrawable *drawable)
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_container_add (GTK_CONTAINER (abox), frame); gtk_container_add (GTK_CONTAINER (abox), frame);
gtk_widget_show (frame); gtk_widget_show (frame);
preview = preview_widget (drawable); /* we are here */ preview = preview_widget (drawable);
gtk_container_add (GTK_CONTAINER (frame), preview); gtk_container_add (GTK_CONTAINER (frame), preview);
glasstile (drawable, TRUE); /* filter routine, initial pass */ glasstile (drawable, TRUE); /* filter routine, initial pass */
gtk_widget_show (preview); gtk_widget_show (preview);
@ -359,14 +366,11 @@ glass_ok_callback (GtkWidget *widget,
static GtkWidget * static GtkWidget *
preview_widget (GimpDrawable *drawable) preview_widget (GimpDrawable *drawable)
{ {
gint size;
GtkWidget *preview; GtkWidget *preview;
preview = gtk_preview_new (GTK_PREVIEW_COLOR); preview = gtk_preview_new (GTK_PREVIEW_COLOR);
fill_preview_with_thumb (preview, drawable->drawable_id); fill_preview_with_thumb (preview, drawable->drawable_id);
size = GTK_PREVIEW (preview)->rowstride * GTK_PREVIEW (preview)->buffer_height;
preview_bits = g_malloc (size);
memcpy (preview_bits, GTK_PREVIEW (preview)->buffer, size);
return preview; return preview;
} }
@ -375,94 +379,37 @@ static void
fill_preview_with_thumb (GtkWidget *widget, fill_preview_with_thumb (GtkWidget *widget,
gint32 drawable_ID) gint32 drawable_ID)
{ {
guchar *drawable_data; gint bpp;
gint bpp; gint y;
gint x,y; gint width = PREVIEW_SIZE;
gint width = PREVIEW_SIZE; gint height = PREVIEW_SIZE;
gint height = PREVIEW_SIZE; guchar *src;
guchar *src; guchar *even;
gdouble r, g, b, a; guchar *odd;
gdouble c0, c1;
guchar *p0, *p1;
guchar *even, *odd;
bpp = 0; /* Only returned */ preview_cache =
drawable_data =
gimp_drawable_get_thumbnail_data (drawable_ID, &width, &height, &bpp); gimp_drawable_get_thumbnail_data (drawable_ID, &width, &height, &bpp);
if (width < 1 || height < 1) if (width < 1 || height < 1)
return; return;
preview_cache = drawable_data; preview = widget;
preview_cache_rowstride = width * bpp; preview_cache_rowstride = width * bpp;
preview_cache_bpp = bpp; preview_cache_bpp = bpp;
gtk_preview_size (GTK_PREVIEW (widget), width, height); gtk_preview_size (GTK_PREVIEW (widget), width, height);
preview_scale_x = (gdouble)width / (gdouble)gimp_drawable_width (drawable_ID); preview_scale_x =
preview_scale_y = (gdouble)height / (gdouble)gimp_drawable_height (drawable_ID); (gdouble) width / (gdouble) gimp_drawable_width (drawable_ID);
preview_scale_y =
(gdouble) height / (gdouble) gimp_drawable_height (drawable_ID);
src = preview_cache;
even = g_malloc (width * 3); even = g_malloc (width * 3);
odd = g_malloc (width * 3); odd = g_malloc (width * 3);
src = drawable_data;
for (y = 0; y < height; y++) for (y = 0; y < height; y++)
{ {
p0 = even; preview_do_row (y, width, even, odd, src);
p1 = odd;
for (x = 0; x < width; x++)
{
if(bpp == 4)
{
r = ((gdouble)src[x*4+0])/255.0;
g = ((gdouble)src[x*4+1])/255.0;
b = ((gdouble)src[x*4+2])/255.0;
a = ((gdouble)src[x*4+3])/255.0;
}
else if(bpp == 3)
{
r = ((gdouble)src[x*3+0])/255.0;
g = ((gdouble)src[x*3+1])/255.0;
b = ((gdouble)src[x*3+2])/255.0;
a = 1.0;
}
else
{
r = ((gdouble)src[x*bpp+0])/255.0;
g = b = r;
if(bpp == 2)
a = ((gdouble)src[x*bpp+1])/255.0;
else
a = 1.0;
}
if ((x / GIMP_CHECK_SIZE_SM) & 1)
{
c0 = GIMP_CHECK_LIGHT;
c1 = GIMP_CHECK_DARK;
}
else
{
c0 = GIMP_CHECK_DARK;
c1 = GIMP_CHECK_LIGHT;
}
*p0++ = (c0 + (r - c0) * a) * 255.0;
*p0++ = (c0 + (g - c0) * a) * 255.0;
*p0++ = (c0 + (b - c0) * a) * 255.0;
*p1++ = (c1 + (r - c1) * a) * 255.0;
*p1++ = (c1 + (g - c1) * a) * 255.0;
*p1++ = (c1 + (b - c1) * a) * 255.0;
} /* for */
if ((y / GIMP_CHECK_SIZE_SM) & 1)
gtk_preview_draw_row (GTK_PREVIEW (widget), (guchar *)odd, 0, y, width);
else
gtk_preview_draw_row (GTK_PREVIEW (widget), (guchar *)even, 0, y, width);
src += width * bpp; src += width * bpp;
} }
@ -471,44 +418,52 @@ fill_preview_with_thumb (GtkWidget *widget,
} }
static void static void
preview_do_row(gint row, preview_do_row (gint row,
gint width, gint width,
guchar *even, guchar *even,
guchar *odd, guchar *odd,
guchar *src) guchar *src)
{ {
gint x; gint x;
guchar *p0 = even; guchar *p0 = even;
guchar *p1 = odd; guchar *p1 = odd;
gdouble r, g, b, a;
gdouble r, g, b, a; gdouble c0, c1;
gdouble c0, c1;
for (x = 0; x < width; x++) for (x = 0; x < width; x++)
{ {
if (preview_cache_bpp == 4) switch (preview_cache_bpp)
{ {
r = ((gdouble)src[x*4+0]) / 255.0; case 4:
g = ((gdouble)src[x*4+1]) / 255.0; r = ((gdouble) src[x*4]) / 255.0;
b = ((gdouble)src[x*4+2]) / 255.0; g = ((gdouble) src[x*4 + 1]) / 255.0;
a = ((gdouble)src[x*4+3]) / 255.0; b = ((gdouble) src[x*4 + 2]) / 255.0;
} a = ((gdouble) src[x*4 + 3]) / 255.0;
else if (preview_cache_bpp == 3) break;
{
r = ((gdouble)src[x*3+0]) / 255.0; case 3:
g = ((gdouble)src[x*3+1]) / 255.0; r = ((gdouble) src[x*3]) / 255.0;
b = ((gdouble)src[x*3+2]) / 255.0; g = ((gdouble) src[x*3 + 1]) / 255.0;
b = ((gdouble) src[x*3 + 2]) / 255.0;
a = 1.0; a = 1.0;
} break;
else
{ case 2:
r = ((gdouble)src[x*preview_cache_bpp+0]) / 255.0; r = ((gdouble)src[x*2]) / 255.0;
g = b = r; g = b = r;
if (preview_cache_bpp == 2) a = ((gdouble)src[x*2 + 1]) / 255.0;
a = ((gdouble)src[x*preview_cache_bpp+1]) / 255.0; break;
else
a = 1.0; case 1:
r = ((gdouble)src[x*2]) / 255.0;
g = b = r;
a = 1.0;
break;
default:
r = g = b = a = 1.0; /* just to please the compiler */
g_assert_not_reached ();
break;
} }
if ((x / GIMP_CHECK_SIZE) & 1) if ((x / GIMP_CHECK_SIZE) & 1)
@ -529,31 +484,32 @@ preview_do_row(gint row,
*p1++ = (c1 + (r - c1) * a) * 255.0; *p1++ = (c1 + (r - c1) * a) * 255.0;
*p1++ = (c1 + (g - c1) * a) * 255.0; *p1++ = (c1 + (g - c1) * a) * 255.0;
*p1++ = (c1 + (b - c1) * a) * 255.0; *p1++ = (c1 + (b - c1) * a) * 255.0;
}
} /* for */
if ((row / GIMP_CHECK_SIZE) & 1) if ((row / GIMP_CHECK_SIZE) & 1)
{ {
gtk_preview_draw_row (GTK_PREVIEW (preview), (guchar *)odd, 0, row, width); gtk_preview_draw_row (GTK_PREVIEW (preview),
(guchar *) odd, 0, row, width);
} }
else else
{ {
gtk_preview_draw_row (GTK_PREVIEW (preview), (guchar *)even, 0, row, width); gtk_preview_draw_row (GTK_PREVIEW (preview),
(guchar *) even, 0, row, width);
} }
} }
/* - Filter function - I wish all filter functions had a pmode :) */ /* - Filter function - I wish all filter functions had a pmode :) */
static void static void
glasstile (GimpDrawable *drawable, glasstile (GimpDrawable *drawable,
gboolean preview_mode) gboolean preview_mode)
{ {
GimpPixelRgn srcPR, destPR; GimpPixelRgn srcPR, destPR;
gint width, height; gint width, height;
gint bytes; gint bytes;
guchar *dest, *d; guchar *dest, *d;
guchar *cur_row; guchar *cur_row;
gint row, col, i, iwidth; gint row, col, i, iwidth;
gint x1, y1, x2, y2; gint x1, y1, x2, y2;
guchar *odd = NULL; guchar *odd = NULL;
guchar *even = NULL; guchar *even = NULL;
@ -607,7 +563,7 @@ glasstile (GimpDrawable *drawable,
yhalv = ruthojd / 2; yhalv = ruthojd / 2;
cbytes = bytes; cbytes = bytes;
if (cbytes % 2 == 0) if (! (cbytes & 1))
cbytes--; cbytes--;
iwidth = width - x1; iwidth = width - x1;
@ -623,7 +579,7 @@ glasstile (GimpDrawable *drawable,
d = dest; d = dest;
ypixel2 = ymitt + yoffs * 2; ypixel2 = ymitt + yoffs * 2;
if(ypixel2 < 0) if (ypixel2 < 0)
ypixel2 = 0; ypixel2 = 0;
if (preview_mode) if (preview_mode)
@ -650,8 +606,7 @@ glasstile (GimpDrawable *drawable,
if (yoffs == yhalv) if (yoffs == yhalv)
{ {
ymitt += ruthojd; ymitt += ruthojd;
yoffs =- yhalv; yoffs = - (yhalv + yplus);
yoffs -= yplus;
} }
xmitt = 0; xmitt = 0;
@ -672,7 +627,7 @@ glasstile (GimpDrawable *drawable,
else else
{ {
for (i = 0; i < bytes; i++) for (i = 0; i < bytes; i++)
d[xpixel1 + i]=cur_row[xpixel1 + i]; d[xpixel1 + i] = cur_row[xpixel1 + i];
} }
xoffs++; xoffs++;
@ -680,28 +635,26 @@ glasstile (GimpDrawable *drawable,
if (xoffs == xhalv) if (xoffs == xhalv)
{ {
xmitt += rutbredd; xmitt += rutbredd;
xoffs =- xhalv; xoffs = - (xhalv + xplus);
xoffs -= xplus;
} }
} }
/* Store the dest */ /* Store the dest */
if (preview_mode) if (preview_mode)
preview_do_row(row,width,even,odd,dest); {
preview_do_row (row, width, even, odd, dest);
}
else else
gimp_pixel_rgn_set_row (&destPR, dest, x1, row, iwidth); {
gimp_pixel_rgn_set_row (&destPR, dest, x1, row, iwidth);
if ((row % 5) == 0 && !preview_mode) if ((row % 5) == 0)
gimp_progress_update ((double) row / (double) (y2 - y1)); gimp_progress_update ((gdouble) row / (gdouble) (y2 - y1));
}
} }
g_free (even);
if(even) g_free (odd);
g_free(even);
if(odd)
g_free(odd);
/* Update region */ /* Update region */
if (preview_mode) if (preview_mode)
@ -712,7 +665,8 @@ glasstile (GimpDrawable *drawable,
{ {
gimp_drawable_flush (drawable); gimp_drawable_flush (drawable);
gimp_drawable_merge_shadow (drawable->drawable_id, TRUE); 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,
x1, y1, (x2 - x1), (y2 - y1));
} }
g_free (cur_row); g_free (cur_row);