summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElijah Newren <newren@gmail.com>2005-07-12 22:34:25 +0000
committerElijah Newren <newren@src.gnome.org>2005-07-12 22:34:25 +0000
commit7bda73a415c43f79d6c9d4c520fc5de83227f2af (patch)
treee02e126f639de95f9c8485e306e99e4ae0a96174
parent0e956c674f32154b121d100152ae533520216a77 (diff)
downloadmetacity-7bda73a415c43f79d6c9d4c520fc5de83227f2af.tar.gz
Patch from Andrew Johnson to speed up vertical gradients. Fixes #169982.
2005-07-12 Elijah Newren <newren@gmail.com> Patch from Andrew Johnson to speed up vertical gradients. Fixes #169982. * src/gradient.c: (meta_gradient_create_interwoven): (meta_gradient_create_vertical): (meta_gradient_create_multi_vertical): use memcpy instead of really long loops to set values in memory to a given pattern.
-rw-r--r--ChangeLog13
-rw-r--r--src/gradient.c127
2 files changed, 48 insertions, 92 deletions
diff --git a/ChangeLog b/ChangeLog
index 9e7fad14..10f0f81a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
2005-07-12 Elijah Newren <newren@gmail.com>
+ Patch from Andrew Johnson to speed up vertical gradients. Fixes
+ #169982.
+
+ * src/gradient.c:
+ (meta_gradient_create_interwoven):
+ (meta_gradient_create_vertical):
+ (meta_gradient_create_multi_vertical):
+
+ use memcpy instead of really long loops to set values in memory to
+ a given pattern.
+
+2005-07-12 Elijah Newren <newren@gmail.com>
+
Patch from Björn Lindqvist to split up main() into more manageable
chunks and make use of GOpt. Closes #305331.
diff --git a/src/gradient.c b/src/gradient.c
index a1883646..0b744387 100644
--- a/src/gradient.c
+++ b/src/gradient.c
@@ -166,7 +166,6 @@ meta_gradient_create_interwoven (int width,
long r2, g2, b2, dr2, dg2, db2;
GdkPixbuf *pixbuf;
unsigned char *ptr;
- unsigned char rr, gg, bb;
unsigned char *pixels;
int rowstride;
@@ -199,37 +198,21 @@ meta_gradient_create_interwoven (int width,
if (k == 0)
{
- rr = r1>>16;
- gg = g1>>16;
- bb = b1>>16;
+ ptr[0] = (unsigned char) r1>>16;
+ ptr[1] = (unsigned char) g1>>16;
+ ptr[2] = (unsigned char) b1>>16;
}
else
{
- rr = r2>>16;
- gg = g2>>16;
- bb = b2>>16;
- }
- for (j=0; j<width/8; j++)
- {
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- }
- switch (width%8)
- {
- case 7: *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- case 6: *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- case 5: *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- case 4: *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- case 3: *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- case 2: *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- case 1: *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
+ ptr[0] = (unsigned char) r2>>16;
+ ptr[1] = (unsigned char) g2>>16;
+ ptr[2] = (unsigned char) b2>>16;
}
+
+ for (j=1; j <= width/2; j *= 2)
+ memcpy (&(ptr[j*3]), ptr, j*3);
+ memcpy (&(ptr[j*3]), ptr, (width - j)*3);
+
if (++l == ll)
{
if (k == 0)
@@ -346,7 +329,6 @@ meta_gradient_create_vertical (int width, int height,
long r, g, b, dr, dg, db;
GdkPixbuf *pixbuf;
unsigned char *ptr;
- unsigned char rr, gg, bb;
int r0, g0, b0;
int rf, gf, bf;
int rowstride;
@@ -378,30 +360,14 @@ meta_gradient_create_vertical (int width, int height,
{
ptr = pixels + i * rowstride;
- rr = r>>16;
- gg = g>>16;
- bb = b>>16;
- for (j=0; j<width/8; j++)
- {
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- }
- switch (width%8)
- {
- case 7: *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- case 6: *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- case 5: *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- case 4: *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- case 3: *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- case 2: *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- case 1: *(ptr++) = rr; *(ptr++) = gg; *(ptr++) = bb;
- }
+ ptr[0] = (unsigned char)(r>>16);
+ ptr[1] = (unsigned char)(g>>16);
+ ptr[2] = (unsigned char)(b>>16);
+
+ for (j=1; j <= width/2; j *= 2)
+ memcpy (&(ptr[j*3]), ptr, j*3);
+ memcpy (&(ptr[j*3]), ptr, (width - j)*3);
+
r+=dr;
g+=dg;
b+=db;
@@ -565,9 +531,7 @@ meta_gradient_create_multi_vertical (int width, int height,
unsigned char *ptr, *tmp, *pixels;
int height2;
int x;
- unsigned char rr, gg, bb;
int rowstride;
- int pad;
g_return_val_if_fail (count > 2, NULL);
@@ -577,7 +541,6 @@ meta_gradient_create_multi_vertical (int width, int height,
pixels = gdk_pixbuf_get_pixels (pixbuf);
rowstride = gdk_pixbuf_get_rowstride (pixbuf);
- pad = rowstride - (width * 3);
ptr = pixels;
if (count > height)
@@ -602,25 +565,15 @@ meta_gradient_create_multi_vertical (int width, int height,
for (j=0; j<height2; j++)
{
- rr = r>>16;
- gg = g>>16;
- bb = b>>16;
+ ptr[0] = (unsigned char)(r>>16);
+ ptr[1] = (unsigned char)(g>>16);
+ ptr[2] = (unsigned char)(b>>16);
- for (x=0; x<width/4; x++)
- {
- *ptr++ = rr; *ptr++ = gg; *ptr++ = bb;
- *ptr++ = rr; *ptr++ = gg; *ptr++ = bb;
- *ptr++ = rr; *ptr++ = gg; *ptr++ = bb;
- *ptr++ = rr; *ptr++ = gg; *ptr++ = bb;
- }
- switch (width%4)
- {
- case 3: *ptr++ = rr; *ptr++ = gg; *ptr++ = bb;
- case 2: *ptr++ = rr; *ptr++ = gg; *ptr++ = bb;
- case 1: *ptr++ = rr; *ptr++ = gg; *ptr++ = bb;
- }
+ for (x=1; x <= width/2; x *= 2)
+ memcpy (&(ptr[x*3]), ptr, x*3);
+ memcpy (&(ptr[x*3]), ptr, (width - x)*3);
- ptr += pad;
+ ptr += rowstride;
r += dr;
g += dg;
@@ -632,29 +585,19 @@ meta_gradient_create_multi_vertical (int width, int height,
b = colors[i].blue << 8;
}
- rr = r>>16;
- gg = g>>16;
- bb = b>>16;
-
if (k<height)
{
tmp = ptr;
- for (x=0; x<width/4; x++)
- {
- *ptr++ = rr; *ptr++ = gg; *ptr++ = bb;
- *ptr++ = rr; *ptr++ = gg; *ptr++ = bb;
- *ptr++ = rr; *ptr++ = gg; *ptr++ = bb;
- *ptr++ = rr; *ptr++ = gg; *ptr++ = bb;
- }
- switch (width%4)
- {
- case 3: *ptr++ = rr; *ptr++ = gg; *ptr++ = bb;
- case 2: *ptr++ = rr; *ptr++ = gg; *ptr++ = bb;
- case 1: *ptr++ = rr; *ptr++ = gg; *ptr++ = bb;
- default: break;
- }
- ptr += pad;
+ ptr[0] = (unsigned char) r>>16;
+ ptr[1] = (unsigned char) g>>16;
+ ptr[2] = (unsigned char) b>>16;
+
+ for (x=1; x <= width/2; x *= 2)
+ memcpy (&(ptr[x*3]), ptr, x*3);
+ memcpy (&(ptr[x*3]), ptr, (width - x)*3);
+
+ ptr += rowstride;
for (j=k+1; j<height; j++)
{