From ba492ede82d91cae0b7531b37e1ae10b96152f26 Mon Sep 17 00:00:00 2001 From: Michael Vrhel Date: Tue, 17 Oct 2017 16:43:15 -0700 Subject: Use ICC profile in tiff file if present --- source/fitz/load-tiff.c | 98 ++++++++++++++++++++++++++++++------------------- 1 file 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) -- cgit v1.2.3