summaryrefslogtreecommitdiff
path: root/source/fitz/load-tiff.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2017-10-24 16:00:54 +0200
committerRobin Watts <robin.watts@artifex.com>2017-10-25 10:58:36 +0100
commit531f7ea84daa607e370757d82d8bf7e300fc76b5 (patch)
treeb621cbb5797639a343e3b46d35ec842aa4450535 /source/fitz/load-tiff.c
parent75be08bcb490e9b68ef598372ff659ad960f6335 (diff)
downloadmupdf-531f7ea84daa607e370757d82d8bf7e300fc76b5.tar.xz
Fix colorspace reference counting in fz_load_*_info.
These are called from fz_new_image_from_buffer.
Diffstat (limited to 'source/fitz/load-tiff.c')
-rw-r--r--source/fitz/load-tiff.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/source/fitz/load-tiff.c b/source/fitz/load-tiff.c
index 6a8dd40e..80abd6f1 100644
--- a/source/fitz/load-tiff.c
+++ b/source/fitz/load-tiff.c
@@ -1157,36 +1157,36 @@ tiff_decode_ifd(fz_context *ctx, struct tiff *tiff)
switch (tiff->photometric)
{
case 0: /* WhiteIsZero -- inverted */
- tiff->colorspace = fz_device_gray(ctx);
+ tiff->colorspace = fz_keep_colorspace(ctx, fz_device_gray(ctx));
break;
case 1: /* BlackIsZero */
- tiff->colorspace = fz_device_gray(ctx);
+ tiff->colorspace = fz_keep_colorspace(ctx, fz_device_gray(ctx));
break;
case 2: /* RGB */
- tiff->colorspace = fz_device_rgb(ctx);
+ tiff->colorspace = fz_keep_colorspace(ctx, fz_device_rgb(ctx));
break;
case 3: /* RGBPal */
- tiff->colorspace = fz_device_rgb(ctx);
+ tiff->colorspace = fz_keep_colorspace(ctx, fz_device_rgb(ctx));
break;
case 5: /* CMYK */
- tiff->colorspace = fz_device_cmyk(ctx);
+ tiff->colorspace = fz_keep_colorspace(ctx, 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);
+ tiff->colorspace = fz_keep_colorspace(ctx, 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);
+ tiff->colorspace = fz_keep_colorspace(ctx, fz_device_lab(ctx));
break;
case 32844: /* SGI CIE Log 2 L (16bpp Greyscale) */
- tiff->colorspace = fz_device_gray(ctx);
+ tiff->colorspace = fz_keep_colorspace(ctx, 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);
+ tiff->colorspace = fz_keep_colorspace(ctx, fz_device_rgb(ctx));
if (tiff->bitspersample != 8)
tiff->bitspersample = 8;
tiff->stride >>= 1;
@@ -1416,9 +1416,11 @@ fz_load_tiff_info_subimage(fz_context *ctx, const unsigned char *buf, size_t len
*xresp = (tiff.xresolution ? tiff.xresolution : 96);
*yresp = (tiff.yresolution ? tiff.yresolution : 96);
if (tiff.extrasamples /* == 2 */)
- *cspacep = fz_device_rgb(ctx);
- else
- *cspacep = tiff.colorspace;
+ {
+ fz_drop_colorspace(ctx, tiff.colorspace);
+ tiff.colorspace = fz_keep_colorspace(ctx, fz_device_rgb(ctx));
+ }
+ *cspacep = tiff.colorspace;
}
fz_always(ctx)
{