From cbdb9dc747ff7e7c9e187e056c4077edae629729 Mon Sep 17 00:00:00 2001 From: Robin Watts Date: Wed, 2 Aug 2017 18:17:41 +0100 Subject: Don't apply default decode array to ICC Lab image data. Adjust the decode array to allow for the fact that the default decode is done by the ICC code. --- source/fitz/colorspace.c | 2 +- source/fitz/image.c | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) (limited to 'source/fitz') diff --git a/source/fitz/colorspace.c b/source/fitz/colorspace.c index ceec805e..9d5c93ab 100644 --- a/source/fitz/colorspace.c +++ b/source/fitz/colorspace.c @@ -679,7 +679,7 @@ clamp_lab(const fz_colorspace *cs, const float *src, float *dst) dst[i] = fz_clamp(src[i], i ? -128 : 0, i ? 127 : 100); } -static int fz_colorspace_is_lab(fz_context *ctx, const fz_colorspace *cs) +int fz_colorspace_is_lab(fz_context *ctx, const fz_colorspace *cs) { return cs && cs->to_ccs == lab_to_rgb; } diff --git a/source/fitz/image.c b/source/fitz/image.c index 2e59e401..b4fd2112 100644 --- a/source/fitz/image.c +++ b/source/fitz/image.c @@ -803,9 +803,22 @@ fz_new_image_of_size(fz_context *ctx, int w, int h, int bpc, fz_colorspace *colo image->decode[2*i+1] = maxval; } } + /* ICC spaces have the default decode arrays pickled into them. + * For most spaces this is fine, because [ 0 1 0 1 0 1 ] is + * idempotent. For Lab, however, we need to adjust it. */ + if (fz_colorspace_is_lab_icc(ctx, colorspace)) + { + /* Undo the default decode array of [0 100 -128 127 -128 127] */ + image->decode[0] = image->decode[0]/100.0f; + image->decode[1] = image->decode[1]/100.0f; + image->decode[2] = (image->decode[2]+128)/255.0f; + image->decode[3] = (image->decode[3]+128)/255.0f; + image->decode[4] = (image->decode[4]+128)/255.0f; + image->decode[5] = (image->decode[5]+128)/255.0f; + } for (i = 0; i < image->n; i++) { - if (image->decode[i * 2] * 255 != 0 || image->decode[i * 2 + 1] * 255 != 255) + if (image->decode[i * 2] != 0 || image->decode[i * 2 + 1] != 1) break; } if (i != image->n) -- cgit v1.2.3