From 12ce1bf85d6577fc4cca23c99064763704f6a7a7 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Sun, 25 Jul 2010 13:04:41 +0000 Subject: Never scale the components of indexed images. Let decodetile use maxval for scaling and use 24.8 fixed point math. --- draw/imageunpack.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'draw') diff --git a/draw/imageunpack.c b/draw/imageunpack.c index 6d09253b..a1afe49b 100644 --- a/draw/imageunpack.c +++ b/draw/imageunpack.c @@ -161,24 +161,24 @@ fz_unpacktile(fz_pixmap *dst, unsigned char * restrict src, int n, int depth, in /* Apply decode array */ void -fz_decodetile(fz_pixmap *pix, float *decode) +fz_decodetile(fz_pixmap *pix, float *decode, int maxval) { - int min[FZ_MAXCOLORS + 2]; - int max[FZ_MAXCOLORS + 2]; - int sub[FZ_MAXCOLORS + 2]; + int min[FZ_MAXCOLORS]; + int max[FZ_MAXCOLORS]; + int sub[FZ_MAXCOLORS]; unsigned char *p = pix->samples; int len = pix->w * pix->h; - int n = pix->n; + int n = pix->n - 1; int needed; int k; needed = 0; for (k = 0; k < n; k++) { - min[k] = decode[k * 2] * 255; - max[k] = decode[k * 2 + 1] * 255; - sub[k] = max[k] - min[k]; - needed |= min[k] != 0 || max[k] != 255; + min[k] = decode[k * 2] * 256; + max[k] = decode[k * 2 + 1] * 256; + sub[k] = (max[k] - min[k]) / maxval; + needed |= min[k] != 0 || max[k] != maxval * 256; } if (!needed) @@ -187,7 +187,8 @@ fz_decodetile(fz_pixmap *pix, float *decode) while (len--) { for (k = 0; k < n; k++) - p[k] = min[k] + fz_mul255(sub[k], p[k]); - p += n; + p[k] = (min[k] + (((p[k] << 8) * sub[k]) >> 8)) >> 8; + p += n + 1; } } + -- cgit v1.2.3