From 7bda73a415c43f79d6c9d4c520fc5de83227f2af Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 12 Jul 2005 22:34:25 +0000 Subject: [PATCH] Patch from Andrew Johnson to speed up vertical gradients. Fixes #169982. 2005-07-12 Elijah Newren 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. --- ChangeLog | 13 +++++ src/gradient.c | 127 ++++++++++++++----------------------------------- 2 files changed, 48 insertions(+), 92 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9e7fad145..10f0f81ac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2005-07-12 Elijah Newren + + 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 Patch from Björn Lindqvist to split up main() into more manageable diff --git a/src/gradient.c b/src/gradient.c index a18836462..0b7443871 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>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>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>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>16; - gg = g>>16; - bb = b>>16; - if (k>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