summaryrefslogtreecommitdiff
path: root/source/pdf/pdf-image.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2014-05-06 13:05:04 +0200
committerTor Andersson <tor.andersson@artifex.com>2014-05-06 13:05:04 +0200
commitae20681b54c54755d14cd4631ed13b2a19eeaa67 (patch)
tree853e4e32f5a64774167c2f7ab5d687bd20b78995 /source/pdf/pdf-image.c
parent68e0819c1ad2475e822825e8510a7bd9d0420d61 (diff)
downloadmupdf-ae20681b54c54755d14cd4631ed13b2a19eeaa67.tar.xz
Fix 694909: revert "Force colorspaces to match with JPX images." and ...
... instead convert a JPEG2000 used as a soft mask into grayscale. This is more robust than trusting the PDF specified colorspace over the internal JPX colorspace. The spec implies that in a colorspace conflict, the internal JPX colorspace should be used. The PDF colorspace may be a DeviceN or Separation colorspace. DeviceN and Separation colorspaces are not valid destination colorspaces, so we may not always be able to convert the internal JPX colorspace into the PDF specified colorspace. Converting from the internal colorspace into grayscale is more robust, and solves the issue that the original commit was intended to fix.
Diffstat (limited to 'source/pdf/pdf-image.c')
-rw-r--r--source/pdf/pdf-image.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/source/pdf/pdf-image.c b/source/pdf/pdf-image.c
index bb663ba2..9f4195e4 100644
--- a/source/pdf/pdf-image.c
+++ b/source/pdf/pdf-image.c
@@ -40,7 +40,15 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
{
fz_pixmap *mask_pixmap;
if (image->n != 2)
- fz_throw(ctx, FZ_ERROR_GENERIC, "soft mask must be grayscale");
+ {
+ fz_pixmap *gray;
+ fz_irect bbox;
+ fz_warn(ctx, "soft mask should be grayscale");
+ gray = fz_new_pixmap_with_bbox(ctx, fz_device_gray(ctx), fz_pixmap_bbox(ctx, image->tile, &bbox));
+ fz_convert_pixmap(ctx, gray, image->tile);
+ fz_drop_pixmap(ctx, image->tile);
+ image->tile = gray;
+ }
mask_pixmap = fz_alpha_from_gray(ctx, image->tile, 1);
fz_drop_pixmap(ctx, image->tile);
image->tile = mask_pixmap;