diff options
author | Robin Watts <robin.watts@artifex.com> | 2016-05-24 13:46:28 +0100 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2016-05-26 10:36:35 +0100 |
commit | ee972fbfa1093fe2e8641dc450e1c20347df2b04 (patch) | |
tree | 8ff2a934f13e3804a28e21ce5bd0eabfde5b549d /source/fitz/colorspace.c | |
parent | dff58514f30b10850bab0205580af98ec3217d64 (diff) | |
download | mupdf-ee972fbfa1093fe2e8641dc450e1c20347df2b04.tar.xz |
Avoid unnecessary alphas when decompressing images from streams.
Diffstat (limited to 'source/fitz/colorspace.c')
-rw-r--r-- | source/fitz/colorspace.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/source/fitz/colorspace.c b/source/fitz/colorspace.c index b4d511e8..7923446a 100644 --- a/source/fitz/colorspace.c +++ b/source/fitz/colorspace.c @@ -1930,31 +1930,32 @@ fz_new_indexed_colorspace(fz_context *ctx, fz_colorspace *base, int high, unsign } fz_pixmap * -fz_expand_indexed_pixmap(fz_context *ctx, fz_pixmap *src) +fz_expand_indexed_pixmap(fz_context *ctx, const fz_pixmap *src, int alpha) { struct indexed *idx; fz_pixmap *dst; - unsigned char *s, *d; + const unsigned char *s; + unsigned char *d; int y, x, k, n, high; unsigned char *lookup; fz_irect bbox; int s_line_inc, d_line_inc; assert(src->colorspace->to_rgb == indexed_to_rgb); - assert(src->n == 2); + assert(src->n == 1 + alpha); idx = src->colorspace->data; high = idx->high; lookup = idx->lookup; n = idx->base->n; - dst = fz_new_pixmap_with_bbox(ctx, idx->base, fz_pixmap_bbox(ctx, src, &bbox), src->alpha); + dst = fz_new_pixmap_with_bbox(ctx, idx->base, fz_pixmap_bbox(ctx, src, &bbox), alpha); s = src->samples; d = dst->samples; s_line_inc = src->stride - src->w * src->n; d_line_inc = dst->stride - dst->w * dst->n; - if (src->alpha) + if (alpha) { for (y = 0; y < src->h; y++) { @@ -1962,9 +1963,10 @@ fz_expand_indexed_pixmap(fz_context *ctx, fz_pixmap *src) { int v = *s++; int a = *s++; + int aa = a + (a>>7); v = fz_mini(v, high); for (k = 0; k < n; k++) - *d++ = fz_mul255(lookup[v * n + k], a); + *d++ = (aa * lookup[v * n + k] + 128)>>8; *d++ = a; } s += s_line_inc; |