summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/fitz/colorspace.c2
-rw-r--r--source/fitz/image.c15
-rw-r--r--source/pdf/pdf-image.c9
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;