44#include "libdeflate.h"
46#define LIBDEFLATE_MAX_COMPRESSION_LEVEL 12
56#if !defined(Z_NO_COMPRESSION) || !defined(Z_DEFLATED)
57#error "Antiquated ZLIB software; you must use version 1.0 or later"
60#define SAFE_MSG(sp) ((sp)->stream.msg == NULL ? "" : (sp)->stream.msg)
78 struct libdeflate_decompressor *libdeflate_dec;
79 struct libdeflate_compressor *libdeflate_enc;
81#define ZSTATE_INIT_DECODE 0x01
82#define ZSTATE_INIT_ENCODE 0x02
88#define GetZIPState(tif) ((ZIPState *)(tif)->tif_data)
89#define ZIPDecoderState(tif) GetZIPState(tif)
90#define ZIPEncoderState(tif) GetZIPState(tif)
95static int ZIPFixupTags(
TIFF *tif)
101static int ZIPSetupDecode(
TIFF *tif)
103 static const char module[] =
"ZIPSetupDecode";
104 ZIPState *
sp = ZIPDecoderState(tif);
109 if (
sp->state & ZSTATE_INIT_ENCODE)
118 if ((
sp->state & ZSTATE_INIT_DECODE) == 0 &&
126 sp->state |= ZSTATE_INIT_DECODE;
133 return a <
b ?
a :
b;
146 ZIPState *
sp = ZIPDecoderState(tif);
151 if ((
sp->state & ZSTATE_INIT_DECODE) == 0)
154#if LIBDEFLATE_SUPPORT
155 sp->libdeflate_state = -1;
158 assert(
sizeof(
sp->stream.avail_in) == 4);
162 sp->stream.avail_in = TIFF_CLAMP_UINT64_TO_INT32_MAX(tif->
tif_rawcc);
173 static const char module[] =
"ZIPDecode";
174 ZIPState *
sp = ZIPDecoderState(tif);
178 assert(
sp->state == ZSTATE_INIT_DECODE);
184 "ZIPDecode: Scanline %" PRIu32 " cannot be read due to "
190#if LIBDEFLATE_SUPPORT
191 if (
sp->libdeflate_state == 1)
200 if (
sp->libdeflate_state == 0)
228 enum libdeflate_result
res;
229 if (
sp->libdeflate_dec ==
NULL)
231 sp->libdeflate_dec = libdeflate_alloc_decompressor();
232 if (
sp->libdeflate_dec ==
NULL)
238 sp->libdeflate_state = 1;
240 res = libdeflate_zlib_decompress(
sp->libdeflate_dec, tif->
tif_rawcp,
252 if (
res != LIBDEFLATE_SUCCESS &&
253 res != LIBDEFLATE_INSUFFICIENT_SPACE)
265 sp->libdeflate_state = 0;
270 sp->stream.next_out =
op;
271 assert(
sizeof(
sp->stream.avail_out) == 4);
278 uInt avail_in_before = TIFF_CLAMP_UINT64_TO_INT32_MAX(tif->
tif_rawcc);
279 uInt avail_out_before = TIFF_CLAMP_UINT64_TO_INT32_MAX(occ);
280 sp->stream.avail_in = avail_in_before;
281 sp->stream.avail_out = avail_out_before;
283 tif->
tif_rawcc -= (avail_in_before -
sp->stream.avail_in);
284 occ -= (avail_out_before -
sp->stream.avail_out);
289 memset(
sp->stream.next_out, 0, (
size_t)occ);
291 (
unsigned long)tif->
tif_row, SAFE_MSG(
sp));
297 memset(
sp->stream.next_out, 0, (
size_t)occ);
306 "Not enough data at scanline %lu (short %" PRIu64
309 memset(
sp->stream.next_out, 0, (
size_t)occ);
319static int ZIPSetupEncode(
TIFF *tif)
321 static const char module[] =
"ZIPSetupEncode";
322 ZIPState *
sp = ZIPEncoderState(tif);
326 if (
sp->state & ZSTATE_INIT_DECODE)
332 cappedQuality =
sp->zipquality;
343 sp->state |= ZSTATE_INIT_ENCODE;
353 ZIPState *
sp = ZIPEncoderState(tif);
357 if (
sp->state != ZSTATE_INIT_ENCODE)
360#if LIBDEFLATE_SUPPORT
361 sp->libdeflate_state = -1;
364 assert(
sizeof(
sp->stream.avail_out) == 4);
379 static const char module[] =
"ZIPEncode";
380 ZIPState *
sp = ZIPEncoderState(tif);
383 assert(
sp->state == ZSTATE_INIT_ENCODE);
387#if LIBDEFLATE_SUPPORT
388 if (
sp->libdeflate_state == 1)
397 if (
sp->libdeflate_state == 0)
429 size_t nCompressedBytes;
430 if (
sp->libdeflate_enc ==
NULL)
434 sp->libdeflate_enc = libdeflate_alloc_compressor(
436 :
sp->zipquality >= 6 &&
sp->zipquality <= 9
439 if (
sp->libdeflate_enc ==
NULL)
452 if (libdeflate_zlib_compress_bound(
sp->libdeflate_enc, (
size_t)
cc) >
458 sp->libdeflate_state = 1;
459 nCompressedBytes = libdeflate_zlib_compress(
463 if (nCompressedBytes == 0)
478 sp->libdeflate_state = 0;
481 sp->stream.next_in = bp;
482 assert(
sizeof(
sp->stream.avail_in) == 4);
488 uInt avail_in_before = TIFF_CLAMP_UINT64_TO_INT32_MAX(
cc);
489 sp->stream.avail_in = avail_in_before;
495 if (
sp->stream.avail_out == 0)
501 sp->stream.avail_out =
504 cc -= (avail_in_before -
sp->stream.avail_in);
513static int ZIPPostEncode(
TIFF *tif)
515 static const char module[] =
"ZIPPostEncode";
516 ZIPState *
sp = ZIPEncoderState(tif);
519#if LIBDEFLATE_SUPPORT
520 if (
sp->libdeflate_state == 1)
524 sp->stream.avail_in = 0;
539 sp->stream.avail_out =
553static void ZIPCleanup(
TIFF *tif)
555 ZIPState *
sp = GetZIPState(tif);
564 if (
sp->state & ZSTATE_INIT_ENCODE)
569 else if (
sp->state & ZSTATE_INIT_DECODE)
575#if LIBDEFLATE_SUPPORT
576 if (
sp->libdeflate_dec)
577 libdeflate_free_decompressor(
sp->libdeflate_dec);
578 if (
sp->libdeflate_enc)
579 libdeflate_free_compressor(
sp->libdeflate_enc);
590 static const char module[] =
"ZIPVSetField";
591 ZIPState *
sp = GetZIPState(tif);
598 sp->zipquality > LIBDEFLATE_MAX_COMPRESSION_LEVEL)
602 "Invalid ZipQuality value. Should be in [-1,%d] range",
603 LIBDEFLATE_MAX_COMPRESSION_LEVEL);
607 if (
sp->state & ZSTATE_INIT_ENCODE)
609 int cappedQuality =
sp->zipquality;
620#if LIBDEFLATE_SUPPORT
621 if (
sp->libdeflate_enc)
623 libdeflate_free_compressor(
sp->libdeflate_enc);
624 sp->libdeflate_enc =
NULL;
638#if !LIBDEFLATE_SUPPORT
642 "DeflateCodec = DEFLATE_SUBCODEC_LIBDEFLATE "
643 "unsupported in this build");
650 return (*
sp->vsetparent)(tif,
tag,
ap);
657 ZIPState *
sp = GetZIPState(tif);
670 return (*
sp->vgetparent)(tif,
tag,
ap);
682static void *TIFF_zalloc(
void *opaque,
unsigned int items,
unsigned int size)
684 static const char module[] =
"TIFF_zalloc";
696static void TIFF_zfree(
void *opaque,
void *
ptr)
703 static const char module[] =
"TIFFInitZIP";
718 "Merging Deflate codec-specific tags failed");
728 sp = GetZIPState(tif);
729 sp->stream.zalloc = TIFF_zalloc;
730 sp->stream.zfree = TIFF_zfree;
731 sp->stream.opaque = tif;
745#if LIBDEFLATE_SUPPORT
int ZEXPORT deflateReset(z_streamp strm)
int ZEXPORT deflateParams(z_streamp strm, int level, int strategy)
static int inflateReset(z_streamp strm)
int inflate(z_streamp strm, int flush)
int inflateEnd(z_streamp strm)
#define Z_DEFAULT_STRATEGY
#define Z_BEST_COMPRESSION
int deflate(z_streamp strm, int flush) DECLSPEC_HIDDEN
int deflateEnd(z_streamp strm) DECLSPEC_HIDDEN
#define Z_DEFAULT_COMPRESSION
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
#define inflateInit(strm)
#define deflateInit(strm, level)
TIFFCodeMethod tif_encodestrip
TIFFCodeMethod tif_encodetile
TIFFTagMethods tif_tagmethods
TIFFPreMethod tif_preencode
TIFFBoolMethod tif_fixuptags
TIFFPreMethod tif_predecode
TIFFCodeMethod tif_decodestrip
TIFFCodeMethod tif_decoderow
TIFFBoolMethod tif_setupencode
TIFFBoolMethod tif_postencode
TIFFCodeMethod tif_encoderow
TIFFVoidMethod tif_cleanup
TIFFBoolMethod tif_setupdecode
TIFFCodeMethod tif_decodetile
void _TIFFSetDefaultCompressionState(TIFF *tif)
int _TIFFMergeFields(TIFF *tif, const TIFFField info[], uint32_t n)
void TIFFErrorExtR(TIFF *tif, const char *module, const char *fmt,...)
void _TIFFfreeExt(TIFF *tif, void *p)
void * _TIFFmallocExt(TIFF *tif, tmsize_t s)
void * _TIFFcallocExt(TIFF *tif, tmsize_t nmemb, tmsize_t siz)
int TIFFPredictorCleanup(TIFF *tif)
int TIFFPredictorInit(TIFF *tif)
uint64_t TIFFVStripSize64(TIFF *tif, uint32_t nrows)
uint64_t TIFFTileSize64(TIFF *tif)
int TIFFFlushData1(TIFF *tif)
#define COMPRESSION_DEFLATE
#define DEFLATE_SUBCODEC_LIBDEFLATE
#define COMPRESSION_ADOBE_DEFLATE
#define TIFFTAG_DEFLATE_SUBCODEC
#define TIFFTAG_ZIPQUALITY
#define DEFLATE_SUBCODEC_ZLIB
int(* TIFFVSetMethod)(TIFF *, uint32_t, va_list)
int(* TIFFVGetMethod)(TIFF *, uint32_t, va_list)
#define TIFFArrayCount(a)
void int int ULONGLONG int va_list * ap