summaryrefslogtreecommitdiff
path: root/source/fitz/load-tiff.c
diff options
context:
space:
mode:
authorMichael Vrhel <michael.vrhel@artifex.com>2017-10-17 16:43:15 -0700
committerRobin Watts <robin.watts@artifex.com>2017-10-25 10:58:35 +0100
commitba492ede82d91cae0b7531b37e1ae10b96152f26 (patch)
tree53a71a95a2a6ba25c44a16a25119a64380064956 /source/fitz/load-tiff.c
parent589e2576b1e2f8282fb87a878a9c60ada996048d (diff)
downloadmupdf-ba492ede82d91cae0b7531b37e1ae10b96152f26.tar.xz
Use ICC profile in tiff file if present
Diffstat (limited to 'source/fitz/load-tiff.c')
-rw-r--r--source/fitz/load-tiff.c98
1 files changed, 60 insertions, 38 deletions
diff --git a/source/fitz/load-tiff.c b/source/fitz/load-tiff.c
index 38ff57c3..6a8dd40e 100644
--- a/source/fitz/load-tiff.c
+++ b/source/fitz/load-tiff.c
@@ -1133,45 +1133,67 @@ tiff_decode_ifd(fz_context *ctx, struct tiff *tiff)
tiff->stride = (tiff->imagewidth * tiff->samplesperpixel * tiff->bitspersample + 7) / 8;
tiff->tilestride = (tiff->tilewidth * tiff->samplesperpixel * tiff->bitspersample + 7) / 8;
- switch (tiff->photometric)
+ if (tiff->profile)
{
- case 0: /* WhiteIsZero -- inverted */
- tiff->colorspace = fz_device_gray(ctx);
- break;
- case 1: /* BlackIsZero */
- tiff->colorspace = fz_device_gray(ctx);
- break;
- case 2: /* RGB */
- tiff->colorspace = fz_device_rgb(ctx);
- break;
- case 3: /* RGBPal */
- tiff->colorspace = fz_device_rgb(ctx);
- break;
- case 5: /* CMYK */
- tiff->colorspace = fz_device_cmyk(ctx);
- break;
- case 6: /* YCbCr */
- /* it's probably a jpeg ... we let jpeg convert to rgb */
- tiff->colorspace = fz_device_rgb(ctx);
- break;
- case 8: /* Direct L*a*b* encoding. a*, b* signed values */
- case 9: /* ICC Style L*a*b* encoding */
- tiff->colorspace = fz_device_lab(ctx);
- break;
- case 32844: /* SGI CIE Log 2 L (16bpp Greyscale) */
- tiff->colorspace = fz_device_gray(ctx);
- if (tiff->bitspersample != 8)
- tiff->bitspersample = 8;
- tiff->stride >>= 1;
- break;
- case 32845: /* SGI CIE Log 2 L, u, v (24bpp or 32bpp) */
- tiff->colorspace = fz_device_rgb(ctx);
- if (tiff->bitspersample != 8)
- tiff->bitspersample = 8;
- tiff->stride >>= 1;
- break;
- default:
- fz_throw(ctx, FZ_ERROR_GENERIC, "unknown photometric: %d", tiff->photometric);
+ fz_buffer *buff = NULL;
+
+ fz_try(ctx)
+ {
+ buff = fz_new_buffer_from_copied_data(ctx, tiff->profile, tiff->profilesize);
+ tiff->colorspace = fz_new_icc_colorspace(ctx, NULL, 0, buff);
+ }
+ fz_always(ctx)
+ fz_drop_buffer(ctx, buff);
+ fz_catch(ctx)
+ {
+ fz_warn(ctx, "Failed to read ICC Profile from tiff");
+ fz_drop_colorspace(ctx, tiff->colorspace);
+ tiff->colorspace = NULL;
+ }
+ }
+
+ if (tiff->colorspace == NULL)
+ {
+ switch (tiff->photometric)
+ {
+ case 0: /* WhiteIsZero -- inverted */
+ tiff->colorspace = fz_device_gray(ctx);
+ break;
+ case 1: /* BlackIsZero */
+ tiff->colorspace = fz_device_gray(ctx);
+ break;
+ case 2: /* RGB */
+ tiff->colorspace = fz_device_rgb(ctx);
+ break;
+ case 3: /* RGBPal */
+ tiff->colorspace = fz_device_rgb(ctx);
+ break;
+ case 5: /* CMYK */
+ tiff->colorspace = fz_device_cmyk(ctx);
+ break;
+ case 6: /* YCbCr */
+ /* it's probably a jpeg ... we let jpeg convert to rgb */
+ tiff->colorspace = fz_device_rgb(ctx);
+ break;
+ case 8: /* Direct L*a*b* encoding. a*, b* signed values */
+ case 9: /* ICC Style L*a*b* encoding */
+ tiff->colorspace = fz_device_lab(ctx);
+ break;
+ case 32844: /* SGI CIE Log 2 L (16bpp Greyscale) */
+ tiff->colorspace = fz_device_gray(ctx);
+ if (tiff->bitspersample != 8)
+ tiff->bitspersample = 8;
+ tiff->stride >>= 1;
+ break;
+ case 32845: /* SGI CIE Log 2 L, u, v (24bpp or 32bpp) */
+ tiff->colorspace = fz_device_rgb(ctx);
+ if (tiff->bitspersample != 8)
+ tiff->bitspersample = 8;
+ tiff->stride >>= 1;
+ break;
+ default:
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown photometric: %d", tiff->photometric);
+ }
}
switch (tiff->resolutionunit)