diff options
Diffstat (limited to 'src/libtiff/tif_zip.c')
-rw-r--r-- | src/libtiff/tif_zip.c | 64 |
1 files changed, 15 insertions, 49 deletions
diff --git a/src/libtiff/tif_zip.c b/src/libtiff/tif_zip.c index 35ae791..62f32ab 100644 --- a/src/libtiff/tif_zip.c +++ b/src/libtiff/tif_zip.c @@ -1,4 +1,4 @@ -/* $Id: tif_zip.c,v 1.3 2009/12/11 15:17:41 scuri Exp $ */ +/* $Id: tif_zip.c,v 1.4 2010/01/26 15:56:36 scuri Exp $ */ /* * Copyright (c) 1995-1997 Sam Leffler @@ -70,8 +70,7 @@ typedef struct { z_stream stream; int zipquality; /* compression level */ int state; /* state flags */ -#define ZSTATE_INIT_DECODE 0x01 -#define ZSTATE_INIT_ENCODE 0x02 +#define ZSTATE_INIT 0x1 /* zlib setup successfully */ TIFFVGetMethod vgetparent; /* super-class method */ TIFFVSetMethod vsetparent; /* super-class method */ @@ -91,18 +90,11 @@ ZIPSetupDecode(TIFF* tif) static const char module[] = "ZIPSetupDecode"; assert(sp != NULL); - - /* if we were last encoding, terminate this mode */ - if (sp->state & ZSTATE_INIT_ENCODE) { - deflateEnd(&sp->stream); - sp->state = 0; - } - if (inflateInit(&sp->stream) != Z_OK) { TIFFErrorExt(tif->tif_clientdata, module, "%s: %s", tif->tif_name, sp->stream.msg); return (0); } else { - sp->state |= ZSTATE_INIT_DECODE; + sp->state |= ZSTATE_INIT; return (1); } } @@ -117,10 +109,6 @@ ZIPPreDecode(TIFF* tif, tsample_t s) (void) s; assert(sp != NULL); - - if( (sp->state & ZSTATE_INIT_DECODE) == 0 ) - tif->tif_setupdecode( tif ); - sp->stream.next_in = tif->tif_rawdata; sp->stream.avail_in = tif->tif_rawcc; return (inflateReset(&sp->stream) == Z_OK); @@ -134,8 +122,6 @@ ZIPDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s) (void) s; assert(sp != NULL); - assert(sp->state == ZSTATE_INIT_DECODE); - sp->stream.next_out = op; sp->stream.avail_out = occ; do { @@ -172,16 +158,11 @@ ZIPSetupEncode(TIFF* tif) static const char module[] = "ZIPSetupEncode"; assert(sp != NULL); - if (sp->state & ZSTATE_INIT_DECODE) { - inflateEnd(&sp->stream); - sp->state = 0; - } - if (deflateInit(&sp->stream, sp->zipquality) != Z_OK) { TIFFErrorExt(tif->tif_clientdata, module, "%s: %s", tif->tif_name, sp->stream.msg); return (0); } else { - sp->state |= ZSTATE_INIT_ENCODE; + sp->state |= ZSTATE_INIT; return (1); } } @@ -196,9 +177,6 @@ ZIPPreEncode(TIFF* tif, tsample_t s) (void) s; assert(sp != NULL); - if( sp->state != ZSTATE_INIT_ENCODE ) - tif->tif_setupencode( tif ); - sp->stream.next_out = tif->tif_rawdata; sp->stream.avail_out = tif->tif_rawdatasize; return (deflateReset(&sp->stream) == Z_OK); @@ -213,9 +191,6 @@ ZIPEncode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) ZIPState *sp = EncoderState(tif); static const char module[] = "ZIPEncode"; - assert(sp != NULL); - assert(sp->state == ZSTATE_INIT_ENCODE); - (void) s; sp->stream.next_in = bp; sp->stream.avail_in = cc; @@ -282,12 +257,12 @@ ZIPCleanup(TIFF* tif) tif->tif_tagmethods.vgetfield = sp->vgetparent; tif->tif_tagmethods.vsetfield = sp->vsetparent; - if (sp->state & ZSTATE_INIT_ENCODE) { - deflateEnd(&sp->stream); - sp->state = 0; - } else if( sp->state & ZSTATE_INIT_DECODE) { - inflateEnd(&sp->stream); - sp->state = 0; + if (sp->state&ZSTATE_INIT) { + /* NB: avoid problems in the library */ + if (tif->tif_mode == O_RDONLY) + inflateEnd(&sp->stream); + else + deflateEnd(&sp->stream); } _TIFFfree(sp); tif->tif_data = NULL; @@ -304,7 +279,7 @@ ZIPVSetField(TIFF* tif, ttag_t tag, va_list ap) switch (tag) { case TIFFTAG_ZIPQUALITY: sp->zipquality = va_arg(ap, int); - if ( sp->state&ZSTATE_INIT_ENCODE ) { + if (tif->tif_mode != O_RDONLY && (sp->state&ZSTATE_INIT)) { if (deflateParams(&sp->stream, sp->zipquality, Z_DEFAULT_STRATEGY) != Z_OK) { TIFFErrorExt(tif->tif_clientdata, module, "%s: zlib error: %s", @@ -342,23 +317,12 @@ static const TIFFFieldInfo zipFieldInfo[] = { int TIFFInitZIP(TIFF* tif, int scheme) { - static const char module[] = "TIFFInitZIP"; ZIPState* sp; assert( (scheme == COMPRESSION_DEFLATE) || (scheme == COMPRESSION_ADOBE_DEFLATE)); /* - * Merge codec-specific tag information. - */ - if (!_TIFFMergeFieldInfo(tif, zipFieldInfo, - TIFFArrayCount(zipFieldInfo))) { - TIFFErrorExt(tif->tif_clientdata, module, - "Merging Deflate codec-specific tags failed"); - return 0; - } - - /* * Allocate state block so tag methods have storage to record values. */ tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (ZIPState)); @@ -371,8 +335,10 @@ TIFFInitZIP(TIFF* tif, int scheme) sp->stream.data_type = Z_BINARY; /* - * Override parent get/set field methods. + * Merge codec-specific tag information and + * override parent get/set field methods. */ + _TIFFMergeFieldInfo(tif, zipFieldInfo, TIFFArrayCount(zipFieldInfo)); sp->vgetparent = tif->tif_tagmethods.vgetfield; tif->tif_tagmethods.vgetfield = ZIPVGetField; /* hook for codec tags */ sp->vsetparent = tif->tif_tagmethods.vsetfield; @@ -403,7 +369,7 @@ TIFFInitZIP(TIFF* tif, int scheme) (void) TIFFPredictorInit(tif); return (1); bad: - TIFFErrorExt(tif->tif_clientdata, module, + TIFFErrorExt(tif->tif_clientdata, "TIFFInitZIP", "No space for ZIP state block"); return (0); } |