summaryrefslogtreecommitdiff
path: root/source/fitz/colorspace.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2016-05-24 13:46:28 +0100
committerRobin Watts <robin.watts@artifex.com>2016-05-26 10:36:35 +0100
commitee972fbfa1093fe2e8641dc450e1c20347df2b04 (patch)
tree8ff2a934f13e3804a28e21ce5bd0eabfde5b549d /source/fitz/colorspace.c
parentdff58514f30b10850bab0205580af98ec3217d64 (diff)
downloadmupdf-ee972fbfa1093fe2e8641dc450e1c20347df2b04.tar.xz
Avoid unnecessary alphas when decompressing images from streams.
Diffstat (limited to 'source/fitz/colorspace.c')
-rw-r--r--source/fitz/colorspace.c14
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;