diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2017-10-24 16:00:54 +0200 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2017-10-25 10:58:36 +0100 |
commit | 531f7ea84daa607e370757d82d8bf7e300fc76b5 (patch) | |
tree | b621cbb5797639a343e3b46d35ec842aa4450535 /source/fitz/load-tiff.c | |
parent | 75be08bcb490e9b68ef598372ff659ad960f6335 (diff) | |
download | mupdf-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.c | 26 |
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) { |