summaryrefslogtreecommitdiff
path: root/draw
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2010-07-25 13:04:41 +0000
committerTor Andersson <tor@ghostscript.com>2010-07-25 13:04:41 +0000
commit12ce1bf85d6577fc4cca23c99064763704f6a7a7 (patch)
treedf6aba63ebc01860e1147c7ff607afdcb121a5e9 /draw
parent7742213fc276bd8a8d638fd9486d8573f74b59f0 (diff)
downloadmupdf-12ce1bf85d6577fc4cca23c99064763704f6a7a7.tar.xz
Never scale the components of indexed images. Let decodetile use maxval for scaling and use 24.8 fixed point math.
Diffstat (limited to 'draw')
-rw-r--r--draw/imageunpack.c23
1 files changed, 12 insertions, 11 deletions
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;
}
}
+