factored out common code. Reduced indentation level by closing a switch

2004-09-08  Sven Neumann  <sven@gimp.org>

	* libgimpwidgets/gimppreviewarea.c: factored out common code.
	Reduced indentation level by closing a switch earlier.
This commit is contained in:
Sven Neumann 2004-09-08 12:37:09 +00:00 committed by Sven Neumann
parent c59a6de934
commit 1a9fdcda80
3 changed files with 323 additions and 337 deletions

View File

@ -1,6 +1,11 @@
2004-09-08 Sven Neumann <sven@gimp.org>
* libgimpwidgets/gimppreviewarea.c: factored out common code.
Reduced indentation level by closing a switch earlier.
2004-09-08 DindinX <david@dindinx.org>
* libgimpwidgets/gimppreviewarea.c: (gimp_preview_area_blend)
* libgimpwidgets/gimppreviewarea.c: (gimp_preview_area_blend)
use gimp_preview_area_draw when the opacity is 0 or 255, instead of
duplicating code.

View File

@ -66,6 +66,11 @@ static gboolean gimp_preview_area_expose (GtkWidget *widget,
static GtkDrawingAreaClass *parent_class = NULL;
#define CHECK_COLOR(area, row, col) \
(((((area)->offset_y + (row)) & size) ^ \
(((area)->offset_x + (col)) & size)) ? dark : light)
GType
gimp_preview_area_get_type (void)
{
@ -259,6 +264,30 @@ gimp_preview_area_expose (GtkWidget *widget,
return FALSE;
}
static gint
gimp_preview_area_image_type_bytes (GimpImageType type)
{
switch (type)
{
case GIMP_GRAY_IMAGE:
case GIMP_INDEXED_IMAGE:
return 1;
case GIMP_GRAYA_IMAGE:
case GIMP_INDEXEDA_IMAGE:
return 2;
case GIMP_RGB_IMAGE:
return 3;
case GIMP_RGBA_IMAGE:
return 4;
default:
g_return_val_if_reached (0);
break;
}
}
/**
* gimp_preview_area_new:
@ -320,31 +349,11 @@ gimp_preview_area_draw (GimpPreviewArea *area,
if (x < 0)
{
gint bpp;
gint bpp = gimp_preview_area_image_type_bytes (type);
switch (type)
{
case GIMP_GRAY_IMAGE:
case GIMP_INDEXED_IMAGE:
bpp = 1;
break;
case GIMP_GRAYA_IMAGE:
case GIMP_INDEXEDA_IMAGE:
bpp = 2;
break;
case GIMP_RGB_IMAGE:
bpp = 3;
break;
case GIMP_RGBA_IMAGE:
bpp = 4;
break;
default:
g_return_if_reached ();
break;
}
buf += x * bpp;
buf += x * bpp;
width -= x;
x = 0;
}
@ -353,8 +362,9 @@ gimp_preview_area_draw (GimpPreviewArea *area,
if (y < 0)
{
buf += y * rowstride;
buf += y * rowstride;
height -= y;
y = 0;
}
@ -370,10 +380,6 @@ gimp_preview_area_draw (GimpPreviewArea *area,
size = 1 << (2 + area->check_size);
gimp_checks_get_shades (area->check_type, &light, &dark);
#define CHECK_COLOR(area, row, col) \
(((((area)->offset_y + (row)) & size) ^ \
(((area)->offset_x + (col)) & size)) ? dark : light)
src = buf;
dest = area->buf + x * 3 + y * area->rowstride;
@ -608,303 +614,292 @@ gimp_preview_area_blend (GimpPreviewArea *area,
return;
default:
if (x + width < 0 || x >= area->width)
return;
break;
}
if (y + height < 0 || y >= area->height)
return;
if (x + width < 0 || x >= area->width)
return;
if (x < 0)
if (y + height < 0 || y >= area->height)
return;
if (x < 0)
{
gint bpp = gimp_preview_area_image_type_bytes (type);
buf1 += x * bpp;
buf2 += x * bpp;
width -= x;
x = 0;
}
if (x + width > area->width)
width = area->width - x;
if (y < 0)
{
buf1 += y * rowstride1;
buf2 += y * rowstride2;
height -= y;
y = 0;
}
if (y + height > area->height)
height = area->height - y;
if (! area->buf)
{
area->rowstride = ((area->width * 3) + 3) & ~3;
area->buf = g_new (guchar, area->rowstride * area->height);
}
size = 1 << (2 + area->check_size);
gimp_checks_get_shades (area->check_type, &light, &dark);
src1 = buf1;
src2 = buf2;
dest = area->buf + x * 3 + y * area->rowstride;
switch (type)
{
case GIMP_RGB_IMAGE:
for (row = 0; row < height; row++)
{
gint bpp;
const guchar *s1 = src1;
const guchar *s2 = src2;
guchar *d = dest;
switch (type)
for (col = x; col < x + width; col++, s1 += 3, s2 += 3, d+= 3)
{
case GIMP_GRAY_IMAGE:
case GIMP_INDEXED_IMAGE:
bpp = 1;
break;
case GIMP_GRAYA_IMAGE:
case GIMP_INDEXEDA_IMAGE:
bpp = 2;
break;
case GIMP_RGB_IMAGE:
bpp = 3;
break;
case GIMP_RGBA_IMAGE:
bpp = 4;
break;
default:
g_return_if_reached ();
break;
d[0] = ((s1[0] << 8) + (s2[0] - s1[0]) * opacity) >> 8;
d[1] = ((s1[1] << 8) + (s2[1] - s1[1]) * opacity) >> 8;
d[2] = ((s1[2] << 8) + (s2[2] - s1[2]) * opacity) >> 8;
}
buf1 += x * bpp;
buf2 += x * bpp;
width -= x;
x = 0;
src1 += rowstride1;
src2 += rowstride2;
dest += area->rowstride;
}
break;
if (x + width > area->width)
width = area->width - x;
if (y < 0)
case GIMP_RGBA_IMAGE:
for (row = y; row < y + height; row++)
{
buf1 += y * rowstride1;
buf2 += y * rowstride2;
height -= y;
y = 0;
}
const guchar *s1 = src1;
const guchar *s2 = src2;
guchar *d = dest;
if (y + height > area->height)
height = area->height - y;
if (! area->buf)
{
area->rowstride = ((area->width * 3) + 3) & ~3;
area->buf = g_new (guchar, area->rowstride * area->height);
}
size = 1 << (2 + area->check_size);
gimp_checks_get_shades (area->check_type, &light, &dark);
#define CHECK_COLOR(area, row, col) \
(((((area)->offset_y + (row)) & size) ^ \
(((area)->offset_x + (col)) & size)) ? dark : light)
src1 = buf1;
src2 = buf2;
dest = area->buf + x * 3 + y * area->rowstride;
switch (type)
{
case GIMP_RGB_IMAGE:
for (row = 0; row < height; row++)
for (col = x; col < x + width; col++, s1 += 4, s2 += 4, d+= 3)
{
const guchar *s1 = src1;
const guchar *s2 = src2;
guchar *d = dest;
guchar inter[4];
for (col = x; col < x + width; col++, s1 += 3, s2 += 3, d+= 3)
inter[3] = ((s1[3] << 8) + (s2[3] - s1[3]) * opacity) >> 8;
if (inter[3])
{
d[0] = ((s1[0] << 8) + (s2[0] - s1[0]) * opacity) >> 8;
d[1] = ((s1[1] << 8) + (s2[1] - s1[1]) * opacity) >> 8;
d[2] = ((s1[2] << 8) + (s2[2] - s1[2]) * opacity) >> 8;
}
src1 += rowstride1;
src2 += rowstride2;
dest += area->rowstride;
}
break;
case GIMP_RGBA_IMAGE:
for (row = y; row < y + height; row++)
{
const guchar *s1 = src1;
const guchar *s2 = src2;
guchar *d = dest;
for (col = x; col < x + width; col++, s1 += 4, s2 += 4, d+= 3)
{
guchar inter[4];
inter[3] = ((s1[3] << 8) + (s2[3] - s1[3]) * opacity) >> 8;
if (inter[3])
for (i=0 ; i<3 ; i++)
{
for (i=0 ; i<3 ; i++)
{
gushort a = s1[i] * s1[3];
gushort b = s2[i] * s2[3];
gushort a = s1[i] * s1[3];
gushort b = s2[i] * s2[3];
inter[i] = (((a << 8) + (b - a) * opacity) >> 8) / inter[3];
}
}
else
inter[0] = inter[1] = inter[2] = 0;
switch (inter[3])
{
case 0:
d[0] = d[1] = d[2] = CHECK_COLOR (area, row, col);
break;
case 255:
d[0] = inter[0];
d[1] = inter[1];
d[2] = inter[2];
break;
default:
{
register guint alpha = inter[3] + 1;
register guint check = CHECK_COLOR (area, row, col);
d[0] = ((check << 8) + (inter[0] - check) * alpha) >> 8;
d[1] = ((check << 8) + (inter[1] - check) * alpha) >> 8;
d[2] = ((check << 8) + (inter[2] - check) * alpha) >> 8;
}
break;
inter[i] =
(((a << 8) + (b - a) * opacity) >> 8) / inter[3];
}
}
src1 += rowstride1;
src2 += rowstride2;
dest += area->rowstride;
}
break;
case GIMP_GRAY_IMAGE:
for (row = 0; row < height; row++)
{
const guchar *s1 = src1;
const guchar *s2 = src2;
guchar *d = dest;
for (col = 0; col < width; col++, s1++, s2++, d += 3)
else
{
d[0] = d[1] = d[2] = ((s1[0] << 8) + (s2[0] - s1[0]) * opacity) >> 8;
inter[0] = inter[1] = inter[2] = 0;
}
src1 += rowstride1;
src2 += rowstride2;
dest += area->rowstride;
}
break;
case GIMP_GRAYA_IMAGE:
for (row = y; row < y + height; row++)
{
const guchar *s1 = src1;
const guchar *s2 = src2;
guchar *d = dest;
for (col = x; col < x + width; col++, s1 += 2, s2 += 2, d+= 3)
switch (inter[3])
{
guchar inter[1];
case 0:
d[0] = d[1] = d[2] = CHECK_COLOR (area, row, col);
break;
inter[1] = ((s1[1] << 8) + (s2[1] - s1[1]) * opacity) >> 8;
case 255:
d[0] = inter[0];
d[1] = inter[1];
d[2] = inter[2];
break;
if (inter[1])
{
gushort a = s1[0] * s1[1];
gushort b = s2[0] * s2[1];
inter[0] = (((a << 8) + (b - a) * opacity) >> 8) / inter[1];
}
else
inter[0] = 0;
switch (inter[1])
default:
{
case 0:
d[0] = d[1] = d[2] = CHECK_COLOR (area, row, col);
break;
register guint alpha = inter[3] + 1;
register guint check = CHECK_COLOR (area, row, col);
case 255:
d[0] = d[1] = d[2] = inter[0];
break;
default:
{
register guint alpha = inter[1] + 1;
register guint check = CHECK_COLOR (area, row, col);
d[0] = d[1] = d[2] = ((check << 8) + (inter[0] - check) * alpha) >> 8;
}
break;
d[0] = ((check << 8) + (inter[0] - check) * alpha) >> 8;
d[1] = ((check << 8) + (inter[1] - check) * alpha) >> 8;
d[2] = ((check << 8) + (inter[2] - check) * alpha) >> 8;
}
break;
}
}
src1 += rowstride1;
src2 += rowstride2;
dest += area->rowstride;
}
break;
case GIMP_GRAY_IMAGE:
for (row = 0; row < height; row++)
{
const guchar *s1 = src1;
const guchar *s2 = src2;
guchar *d = dest;
for (col = 0; col < width; col++, s1++, s2++, d += 3)
{
d[0] = d[1] = d[2] =
((s1[0] << 8) + (s2[0] - s1[0]) * opacity) >> 8;
}
src1 += rowstride1;
src2 += rowstride2;
dest += area->rowstride;
}
break;
case GIMP_GRAYA_IMAGE:
for (row = y; row < y + height; row++)
{
const guchar *s1 = src1;
const guchar *s2 = src2;
guchar *d = dest;
for (col = x; col < x + width; col++, s1 += 2, s2 += 2, d+= 3)
{
guchar inter[1];
inter[1] = ((s1[1] << 8) + (s2[1] - s1[1]) * opacity) >> 8;
if (inter[1])
{
gushort a = s1[0] * s1[1];
gushort b = s2[0] * s2[1];
inter[0] = (((a << 8) + (b - a) * opacity) >> 8) / inter[1];
}
else
{
inter[0] = 0;
}
src1 += rowstride1;
src2 += rowstride2;
dest += area->rowstride;
}
break;
case GIMP_INDEXED_IMAGE:
g_return_if_fail (area->cmap != NULL);
for (row = 0; row < height; row++)
{
const guchar *s1 = src1;
const guchar *s2 = src2;
guchar *d = dest;
for (col = 0; col < width; col++, s1++, s2++, d += 3)
switch (inter[1])
{
const guchar *cmap1 = area->cmap + 3 * s1[0];
const guchar *cmap2 = area->cmap + 3 * s2[0];
case 0:
d[0] = d[1] = d[2] = CHECK_COLOR (area, row, col);
break;
d[0] = ((cmap1[0] << 8) + (cmap2[0] - cmap1[0]) * opacity) >> 8;
d[1] = ((cmap1[1] << 8) + (cmap2[1] - cmap1[1]) * opacity) >> 8;
d[2] = ((cmap1[2] << 8) + (cmap2[2] - cmap1[2]) * opacity) >> 8;
}
case 255:
d[0] = d[1] = d[2] = inter[0];
break;
src1 += rowstride1;
src2 += rowstride2;
dest += area->rowstride;
}
break;
case GIMP_INDEXEDA_IMAGE:
g_return_if_fail (area->cmap != NULL);
for (row = y; row < y + height; row++)
{
const guchar *s1 = src1;
const guchar *s2 = src2;
guchar *d = dest;
for (col = x; col < x + width; col++, s1 += 2, s2 += 2, d += 3)
{
const guchar *cmap1 = area->cmap + 3 * s1[0];
const guchar *cmap2 = area->cmap + 3 * s2[0];
guchar inter[4];
inter[3] = ((s1[1] << 8) + (s2[1] - s1[1]) * opacity) >> 8;
if (inter[3])
{
for (i = 0 ; i < 3 ; i++)
{
gushort a = cmap1[i] * s1[1];
gushort b = cmap2[i] * s2[1];
inter[i] = (((a << 8) + (b - a) * opacity) >> 8) / inter[3];
}
}
else
inter[0] = inter[1] = inter[2] = 0;
switch (inter[3])
default:
{
case 0:
d[0] = d[1] = d[2] = CHECK_COLOR (area, row, col);
break;
register guint alpha = inter[1] + 1;
register guint check = CHECK_COLOR (area, row, col);
case 255:
d[0] = inter[0];
d[1] = inter[1];
d[2] = inter[2];
break;
default:
{
register guint alpha = inter[3] + 1;
register guint check = CHECK_COLOR (area, row, col);
d[0] = ((check << 8) + (inter[0] - check) * alpha) >> 8;
d[1] = ((check << 8) + (inter[1] - check) * alpha) >> 8;
d[2] = ((check << 8) + (inter[2] - check) * alpha) >> 8;
}
break;
d[0] = d[1] = d[2] =
((check << 8) + (inter[0] - check) * alpha) >> 8;
}
break;
}
}
src1 += rowstride1;
src2 += rowstride2;
dest += area->rowstride;
}
break;
case GIMP_INDEXED_IMAGE:
g_return_if_fail (area->cmap != NULL);
for (row = 0; row < height; row++)
{
const guchar *s1 = src1;
const guchar *s2 = src2;
guchar *d = dest;
for (col = 0; col < width; col++, s1++, s2++, d += 3)
{
const guchar *cmap1 = area->cmap + 3 * s1[0];
const guchar *cmap2 = area->cmap + 3 * s2[0];
d[0] = ((cmap1[0] << 8) + (cmap2[0] - cmap1[0]) * opacity) >> 8;
d[1] = ((cmap1[1] << 8) + (cmap2[1] - cmap1[1]) * opacity) >> 8;
d[2] = ((cmap1[2] << 8) + (cmap2[2] - cmap1[2]) * opacity) >> 8;
}
src1 += rowstride1;
src2 += rowstride2;
dest += area->rowstride;
}
break;
case GIMP_INDEXEDA_IMAGE:
g_return_if_fail (area->cmap != NULL);
for (row = y; row < y + height; row++)
{
const guchar *s1 = src1;
const guchar *s2 = src2;
guchar *d = dest;
for (col = x; col < x + width; col++, s1 += 2, s2 += 2, d += 3)
{
const guchar *cmap1 = area->cmap + 3 * s1[0];
const guchar *cmap2 = area->cmap + 3 * s2[0];
guchar inter[4];
inter[3] = ((s1[1] << 8) + (s2[1] - s1[1]) * opacity) >> 8;
if (inter[3])
{
for (i = 0 ; i < 3 ; i++)
{
gushort a = cmap1[i] * s1[1];
gushort b = cmap2[i] * s2[1];
inter[i] =
(((a << 8) + (b - a) * opacity) >> 8) / inter[3];
}
}
else
{
inter[0] = inter[1] = inter[2] = 0;
}
src1 += rowstride1;
src2 += rowstride2;
dest += area->rowstride;
switch (inter[3])
{
case 0:
d[0] = d[1] = d[2] = CHECK_COLOR (area, row, col);
break;
case 255:
d[0] = inter[0];
d[1] = inter[1];
d[2] = inter[2];
break;
default:
{
register guint alpha = inter[3] + 1;
register guint check = CHECK_COLOR (area, row, col);
d[0] = ((check << 8) + (inter[0] - check) * alpha) >> 8;
d[1] = ((check << 8) + (inter[1] - check) * alpha) >> 8;
d[2] = ((check << 8) + (inter[2] - check) * alpha) >> 8;
}
break;
}
}
break;
src1 += rowstride1;
src2 += rowstride2;
dest += area->rowstride;
}
break;
}
@ -977,33 +972,13 @@ gimp_preview_area_mask (GimpPreviewArea *area,
if (x < 0)
{
gint bpp;
gint bpp = gimp_preview_area_image_type_bytes (type);
switch (type)
{
case GIMP_GRAY_IMAGE:
case GIMP_INDEXED_IMAGE:
bpp = 1;
break;
case GIMP_GRAYA_IMAGE:
case GIMP_INDEXEDA_IMAGE:
bpp = 2;
break;
case GIMP_RGB_IMAGE:
bpp = 3;
break;
case GIMP_RGBA_IMAGE:
bpp = 4;
break;
default:
g_return_if_reached ();
break;
}
buf1 += x * bpp;
buf2 += x * bpp;
mask += x;
buf1 += x * bpp;
buf2 += x * bpp;
mask += x;
width -= x;
x = 0;
}
@ -1012,10 +987,11 @@ gimp_preview_area_mask (GimpPreviewArea *area,
if (y < 0)
{
buf1 += y * rowstride1;
buf2 += y * rowstride2;
mask += y * rowstride_mask;
buf1 += y * rowstride1;
buf2 += y * rowstride2;
mask += y * rowstride_mask;
height -= y;
y = 0;
}
@ -1031,14 +1007,10 @@ gimp_preview_area_mask (GimpPreviewArea *area,
size = 1 << (2 + area->check_size);
gimp_checks_get_shades (area->check_type, &light, &dark);
#define CHECK_COLOR(area, row, col) \
(((((area)->offset_y + (row)) & size) ^ \
(((area)->offset_x + (col)) & size)) ? dark : light)
src1 = buf1;
src2 = buf2;
src_mask = mask;
dest = area->buf + x * 3 + y * area->rowstride;
dest = area->buf + x * 3 + y * area->rowstride;
switch (type)
{
@ -1059,7 +1031,7 @@ gimp_preview_area_mask (GimpPreviewArea *area,
src1 += rowstride1;
src2 += rowstride2;
src_mask += rowstride_mask;
dest += area->rowstride;
dest += area->rowstride;
}
break;
@ -1140,7 +1112,8 @@ gimp_preview_area_mask (GimpPreviewArea *area,
gushort a = s1[i] * s1[3];
gushort b = s2[i] * s2[3];
inter[i] = (((a << 8) + (b - a) * m[0]) >> 8) / inter[3];
inter[i] =
(((a << 8) + (b - a) * m[0]) >> 8) / inter[3];
}
}
@ -1175,7 +1148,7 @@ gimp_preview_area_mask (GimpPreviewArea *area,
src1 += rowstride1;
src2 += rowstride2;
src_mask += rowstride_mask;
dest += area->rowstride;
dest += area->rowstride;
}
break;
@ -1195,12 +1168,12 @@ gimp_preview_area_mask (GimpPreviewArea *area,
src1 += rowstride1;
src2 += rowstride2;
src_mask += rowstride_mask;
dest += area->rowstride;
dest += area->rowstride;
}
break;
case GIMP_GRAYA_IMAGE:
for (row = y; row < y + height; row++)
for (row = y; row < y + height; row++)
{
const guchar *s1 = src1;
const guchar *s2 = src2;
@ -1268,10 +1241,13 @@ gimp_preview_area_mask (GimpPreviewArea *area,
gushort a = s1[0] * s1[1];
gushort b = s2[0] * s2[1];
inter[0] = (((a << 8) + (b - a) * m[0]) >> 8) / inter[1];
inter[0] =
(((a << 8) + (b - a) * m[0]) >> 8) / inter[1];
}
else
{
inter[0] = 0;
}
else
inter[0] = 0;
switch (inter[1])
{
@ -1288,7 +1264,8 @@ gimp_preview_area_mask (GimpPreviewArea *area,
register guint alpha = inter[1] + 1;
register guint check = CHECK_COLOR (area, row, col);
d[0] = d[1] = d[2] = ((check << 8) + (inter[0] - check) * alpha) >> 8;
d[0] = d[1] = d[2] =
((check << 8) + (inter[0] - check) * alpha) >> 8;
}
break;
}
@ -1300,7 +1277,7 @@ gimp_preview_area_mask (GimpPreviewArea *area,
src1 += rowstride1;
src2 += rowstride2;
src_mask += rowstride_mask;
dest += area->rowstride;
dest += area->rowstride;
}
break;
@ -1326,7 +1303,7 @@ gimp_preview_area_mask (GimpPreviewArea *area,
src1 += rowstride1;
src2 += rowstride2;
src_mask += rowstride_mask;
dest += area->rowstride;
dest += area->rowstride;
}
break;
@ -1411,11 +1388,14 @@ gimp_preview_area_mask (GimpPreviewArea *area,
gushort a = cmap1[i] * s1[1];
gushort b = cmap2[i] * s2[1];
inter[i] = (((a << 8) + (b - a) * m[0]) >> 8) / inter[3];
inter[i] =
(((a << 8) + (b - a) * m[0]) >> 8) / inter[3];
}
}
else
inter[0] = inter[1] = inter[2] = 0;
else
{
inter[0] = inter[1] = inter[2] = 0;
}
switch (inter[3])
{
@ -1448,7 +1428,7 @@ gimp_preview_area_mask (GimpPreviewArea *area,
src1 += rowstride1;
src2 += rowstride2;
src_mask += rowstride_mask;
dest += area->rowstride;
dest += area->rowstride;
}
break;
}

View File

@ -199,11 +199,12 @@ test_run (GtkWidget *area,
gdk_flush ();
total_time = g_timer_elapsed (timer, NULL) - start_time;
g_print ("%-16s "
"fill: %5.2fs, %8.1f fps, %8.2f megapixels/s\n",
"fill : %5.2fs, %8.1f fps, %8.2f megapixels/s\n",
"Color fill",
total_time,
num_iters / total_time,
num_iters * (WIDTH * HEIGHT * 1e-6) / total_time);
g_print ("\n");
g_free (buf);
}