From deac1b9b44977b9e8db758d01867bf8a3ca922ce Mon Sep 17 00:00:00 2001 From: Robin Watts Date: Tue, 27 Nov 2012 18:47:14 +0000 Subject: Tweak image color conversion Use just 1 loop rather than 2, and count downwards as this is faster on most architectures. For the 'hash tabled memoized' general case, the time taken to form the hashes is significant. Add some code to check that the pixel isn't the same as the one we just did and bypass the hash. --- fitz/res_colorspace.c | 69 +++++++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 32 deletions(-) (limited to 'fitz') diff --git a/fitz/res_colorspace.c b/fitz/res_colorspace.c index 81b08e54..04d895d3 100644 --- a/fitz/res_colorspace.c +++ b/fitz/res_colorspace.c @@ -711,6 +711,7 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src) float dstv[FZ_MAX_COLORS]; int srcn, dstn; int y, x, k, i; + unsigned int xy; fz_colorspace *ss = src->colorspace; fz_colorspace *ds = dst->colorspace; @@ -725,44 +726,40 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src) srcn = ss->n; dstn = ds->n; + xy = (unsigned int)(src->w * src->h); + /* Special case for Lab colorspace (scaling of components to float) */ if (!strcmp(ss->name, "Lab") && srcn == 3) { - for (y = 0; y < src->h; y++) + for (; xy > 0; xy--) { - for (x = 0; x < src->w; x++) - { - srcv[0] = *s++ / 255.0f * 100; - srcv[1] = *s++ - 128; - srcv[2] = *s++ - 128; + srcv[0] = *s++ / 255.0f * 100; + srcv[1] = *s++ - 128; + srcv[2] = *s++ - 128; - fz_convert_color(ctx, ds, dstv, ss, srcv); + fz_convert_color(ctx, ds, dstv, ss, srcv); - for (k = 0; k < dstn; k++) - *d++ = dstv[k] * 255; + for (k = 0; k < dstn; k++) + *d++ = dstv[k] * 255; - *d++ = *s++; - } + *d++ = *s++; } } /* Brute-force for small images */ - else if (src->w * src->h < 256) + else if (xy < 256) { - for (y = 0; y < src->h; y++) + for (; xy > 0; xy--) { - for (x = 0; x < src->w; x++) - { - for (k = 0; k < srcn; k++) - srcv[k] = *s++ / 255.0f; + for (k = 0; k < srcn; k++) + srcv[k] = *s++ / 255.0f; - fz_convert_color(ctx, ds, dstv, ss, srcv); + fz_convert_color(ctx, ds, dstv, ss, srcv); - for (k = 0; k < dstn; k++) - *d++ = dstv[k] * 255; + for (k = 0; k < dstn; k++) + *d++ = dstv[k] * 255; - *d++ = *s++; - } + *d++ = *s++; } } @@ -779,15 +776,12 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src) lookup[i * dstn + k] = dstv[k] * 255; } - for (y = 0; y < src->h; y++) + for (; xy > 0; xy--) { - for (x = 0; x < src->w; x++) - { - i = *s++; - for (k = 0; k < dstn; k++) - *d++ = lookup[i * dstn + k]; - *d++ = *s++; - } + i = *s++; + for (k = 0; k < dstn; k++) + *d++ = lookup[i * dstn + k]; + *d++ = *s++; } } @@ -796,13 +790,24 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src) { fz_hash_table *lookup; unsigned char *color; + unsigned char dummy = s[0] ^ 255; + unsigned char *sold = &dummy; lookup = fz_new_hash_table(ctx, 509, srcn, -1); - for (y = 0; y < src->h; y++) + for (; xy > 0; xy--) { - for (x = 0; x < src->w; x++) + if (*s == *sold && memcmp(sold,s,srcn) == 0) + { + sold = s; + memcpy(d, d-dstn-1, dstn); + d += dstn; + s += srcn; + *d++ = *s++; + } + else { + sold = s; color = fz_hash_find(ctx, lookup, s); if (color) { -- cgit v1.2.3