diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/fitz/colorspace.c | 2 | ||||
-rw-r--r-- | source/fitz/image.c | 15 | ||||
-rw-r--r-- | source/pdf/pdf-image.c | 9 |
3 files changed, 24 insertions, 2 deletions
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) diff --git a/source/pdf/pdf-image.c b/source/pdf/pdf-image.c index 48c78d96..b7768074 100644 --- a/source/pdf/pdf-image.c +++ b/source/pdf/pdf-image.c @@ -115,6 +115,15 @@ pdf_load_image_imp(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *di for (i = 0; i < n * 2; i++) decode[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i)); } + else if (fz_colorspace_is_lab(ctx, colorspace) || fz_colorspace_is_lab_icc(ctx, colorspace)) + { + decode[0] = 0; + decode[1] = 100; + decode[2] = -128; + decode[3] = 127; + decode[4] = -128; + decode[5] = 127; + } else { float maxval = indexed ? (1 << bpc) - 1 : 1; |