1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* $Id: tif_zip.c,v 1.33 2014-12-25 18:29:11 erouault Exp $ */ 2ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 3ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Copyright (c) 1995-1997 Sam Leffler 5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Copyright (c) 1995-1997 Silicon Graphics, Inc. 6ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Permission to use, copy, modify, distribute, and sell this software and 8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * its documentation for any purpose is hereby granted without fee, provided 9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * that (i) the above copyright notices and this permission notice appear in 10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * all copies of the software and related documentation, and (ii) the names of 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Sam Leffler and Silicon Graphics may not be used in any advertising or 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * publicity relating to the software without the specific, prior written 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * permission of Sam Leffler and Silicon Graphics. 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * OF THIS SOFTWARE. 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "tiffiop.h" 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef ZIP_SUPPORT 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * TIFF Library. 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * ZIP (aka Deflate) Compression Support 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * This file is simply an interface to the zlib library written by 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Jean-loup Gailly and Mark Adler. You must use version 1.0 or later 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * of the library: this code assumes the 1.0 API and also depends on 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * the ability to write the zlib header multiple times (one per strip) 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * which was not possible with versions prior to 0.95. Note also that 39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * older versions of this codec avoided this bug by suppressing the header 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * entirely. This means that files written with the old library cannot 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * be read; they should be converted to a different compression scheme 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * and then reconverted. 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * The data format used by the zlib library is described in the files 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available in the 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * directory ftp://ftp.uu.net/pub/archiving/zip/doc. The library was 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * last found at ftp://ftp.uu.net/pub/archiving/zip/zlib/zlib-0.99.tar.gz. 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "tif_predict.h" 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "../zlib_v128/zlib.h" 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <stdio.h> 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Sigh, ZLIB_VERSION is defined as a string so there's no 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * way to do a proper check here. Instead we guess based 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * on the presence of #defines that were added between the 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * 0.95 and 1.0 distributions. 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if !defined(Z_NO_COMPRESSION) || !defined(Z_DEFLATED) 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#error "Antiquated ZLIB software; you must use version 1.0 or later" 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define SAFE_MSG(sp) ((sp)->stream.msg == NULL ? "" : (sp)->stream.msg) 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * State block for each open TIFF 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * file using ZIP compression/decompression. 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmanntypedef struct { 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFPredictorState predict; 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann z_stream stream; 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int zipquality; /* compression level */ 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int state; /* state flags */ 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define ZSTATE_INIT_DECODE 0x01 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define ZSTATE_INIT_ENCODE 0x02 77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFVGetMethod vgetparent; /* super-class method */ 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFVSetMethod vsetparent; /* super-class method */ 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} ZIPState; 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define ZState(tif) ((ZIPState*) (tif)->tif_data) 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define DecoderState(tif) ZState(tif) 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define EncoderState(tif) ZState(tif) 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s); 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int ZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s); 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannZIPFixupTags(TIFF* tif) 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (void) tif; 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (1); 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannZIPSetupDecode(TIFF* tif) 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static const char module[] = "ZIPSetupDecode"; 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ZIPState* sp = DecoderState(tif); 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(sp != NULL); 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* if we were last encoding, terminate this mode */ 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (sp->state & ZSTATE_INIT_ENCODE) { 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann deflateEnd(&sp->stream); 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->state = 0; 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (inflateInit(&sp->stream) != Z_OK) { 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFErrorExt(tif->tif_clientdata, module, "%s", SAFE_MSG(sp)); 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (0); 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->state |= ZSTATE_INIT_DECODE; 115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (1); 116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* 120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Setup state for decoding a strip. 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannZIPPreDecode(TIFF* tif, uint16 s) 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static const char module[] = "ZIPPreDecode"; 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ZIPState* sp = DecoderState(tif); 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (void) s; 129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(sp != NULL); 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if( (sp->state & ZSTATE_INIT_DECODE) == 0 ) 132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_setupdecode( tif ); 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.next_in = tif->tif_rawdata; 135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(sizeof(sp->stream.avail_in)==4); /* if this assert gets raised, 136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann we need to simplify this code to reflect a ZLib that is likely updated 137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann to deal with 8byte memory sizes, though this code will respond 138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann apropriately even before we simplify it */ 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.avail_in = (uInt) tif->tif_rawcc; 140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((tmsize_t)sp->stream.avail_in != tif->tif_rawcc) 141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size"); 143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (0); 144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (inflateReset(&sp->stream) == Z_OK); 146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int 149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s) 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static const char module[] = "ZIPDecode"; 152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ZIPState* sp = DecoderState(tif); 153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (void) s; 155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(sp != NULL); 156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(sp->state == ZSTATE_INIT_DECODE); 157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.next_in = tif->tif_rawcp; 159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.avail_in = (uInt) tif->tif_rawcc; 160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.next_out = op; 162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(sizeof(sp->stream.avail_out)==4); /* if this assert gets raised, 163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann we need to simplify this code to reflect a ZLib that is likely updated 164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann to deal with 8byte memory sizes, though this code will respond 165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann apropriately even before we simplify it */ 166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.avail_out = (uInt) occ; 167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((tmsize_t)sp->stream.avail_out != occ) 168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size"); 170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (0); 171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann do { 173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int state = inflate(&sp->stream, Z_PARTIAL_FLUSH); 174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (state == Z_STREAM_END) 175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (state == Z_DATA_ERROR) { 177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFErrorExt(tif->tif_clientdata, module, 178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann "Decoding error at scanline %lu, %s", 179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (unsigned long) tif->tif_row, SAFE_MSG(sp)); 180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (inflateSync(&sp->stream) != Z_OK) 181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (0); 182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (state != Z_OK) { 185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFErrorExt(tif->tif_clientdata, module, 186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann "ZLib error: %s", SAFE_MSG(sp)); 187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (0); 188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } while (sp->stream.avail_out > 0); 190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (sp->stream.avail_out != 0) { 191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFErrorExt(tif->tif_clientdata, module, 192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann "Not enough data at scanline %lu (short " TIFF_UINT64_FORMAT " bytes)", 193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (unsigned long) tif->tif_row, (TIFF_UINT64_T) sp->stream.avail_out); 194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (0); 195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_rawcp = sp->stream.next_in; 198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_rawcc = sp->stream.avail_in; 199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (1); 201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int 204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannZIPSetupEncode(TIFF* tif) 205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static const char module[] = "ZIPSetupEncode"; 207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ZIPState* sp = EncoderState(tif); 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(sp != NULL); 210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (sp->state & ZSTATE_INIT_DECODE) { 211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann inflateEnd(&sp->stream); 212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->state = 0; 213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (deflateInit(&sp->stream, sp->zipquality) != Z_OK) { 216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFErrorExt(tif->tif_clientdata, module, "%s", SAFE_MSG(sp)); 217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (0); 218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->state |= ZSTATE_INIT_ENCODE; 220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (1); 221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* 225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Reset encoding state at the start of a strip. 226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int 228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannZIPPreEncode(TIFF* tif, uint16 s) 229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static const char module[] = "ZIPPreEncode"; 231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ZIPState *sp = EncoderState(tif); 232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (void) s; 234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(sp != NULL); 235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if( sp->state != ZSTATE_INIT_ENCODE ) 236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_setupencode( tif ); 237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.next_out = tif->tif_rawdata; 239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(sizeof(sp->stream.avail_out)==4); /* if this assert gets raised, 240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann we need to simplify this code to reflect a ZLib that is likely updated 241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann to deal with 8byte memory sizes, though this code will respond 242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann apropriately even before we simplify it */ 243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.avail_out = tif->tif_rawdatasize; 244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) 245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size"); 247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (0); 248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (deflateReset(&sp->stream) == Z_OK); 250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* 253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Encode a chunk of pixels. 254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int 256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) 257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static const char module[] = "ZIPEncode"; 259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ZIPState *sp = EncoderState(tif); 260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(sp != NULL); 262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(sp->state == ZSTATE_INIT_ENCODE); 263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (void) s; 265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.next_in = bp; 266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(sizeof(sp->stream.avail_in)==4); /* if this assert gets raised, 267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann we need to simplify this code to reflect a ZLib that is likely updated 268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann to deal with 8byte memory sizes, though this code will respond 269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann apropriately even before we simplify it */ 270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.avail_in = (uInt) cc; 271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((tmsize_t)sp->stream.avail_in != cc) 272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size"); 274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (0); 275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann do { 277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) { 278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFErrorExt(tif->tif_clientdata, module, 279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann "Encoder error: %s", 280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SAFE_MSG(sp)); 281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (0); 282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (sp->stream.avail_out == 0) { 284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_rawcc = tif->tif_rawdatasize; 285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFFlushData1(tif); 286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.next_out = tif->tif_rawdata; 287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.avail_out = (uInt) tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in ZIPPreEncode */ 288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } while (sp->stream.avail_in > 0); 290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (1); 291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* 294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Finish off an encoded strip by flushing the last 295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * string and tacking on an End Of Information code. 296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int 298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannZIPPostEncode(TIFF* tif) 299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static const char module[] = "ZIPPostEncode"; 301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ZIPState *sp = EncoderState(tif); 302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int state; 303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.avail_in = 0; 305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann do { 306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann state = deflate(&sp->stream, Z_FINISH); 307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (state) { 308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case Z_STREAM_END: 309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case Z_OK: 310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) 311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_rawcc = tif->tif_rawdatasize - sp->stream.avail_out; 313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFFlushData1(tif); 314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.next_out = tif->tif_rawdata; 315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.avail_out = (uInt) tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in ZIPPreEncode */ 316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann default: 319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFErrorExt(tif->tif_clientdata, module, 320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann "ZLib error: %s", SAFE_MSG(sp)); 321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (0); 322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } while (state != Z_STREAM_END); 324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (1); 325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic void 328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannZIPCleanup(TIFF* tif) 329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ZIPState* sp = ZState(tif); 331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert(sp != 0); 333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (void)TIFFPredictorCleanup(tif); 335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_tagmethods.vgetfield = sp->vgetparent; 337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_tagmethods.vsetfield = sp->vsetparent; 338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (sp->state & ZSTATE_INIT_ENCODE) { 340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann deflateEnd(&sp->stream); 341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->state = 0; 342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if( sp->state & ZSTATE_INIT_DECODE) { 343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann inflateEnd(&sp->stream); 344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->state = 0; 345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _TIFFfree(sp); 347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_data = NULL; 348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _TIFFSetDefaultCompressionState(tif); 350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int 353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannZIPVSetField(TIFF* tif, uint32 tag, va_list ap) 354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static const char module[] = "ZIPVSetField"; 356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ZIPState* sp = ZState(tif); 357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (tag) { 359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case TIFFTAG_ZIPQUALITY: 360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->zipquality = (int) va_arg(ap, int); 361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ( sp->state&ZSTATE_INIT_ENCODE ) { 362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (deflateParams(&sp->stream, 363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->zipquality, Z_DEFAULT_STRATEGY) != Z_OK) { 364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s", 365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SAFE_MSG(sp)); 366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (0); 367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (1); 370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann default: 371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (*sp->vsetparent)(tif, tag, ap); 372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /*NOTREACHED*/ 374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int 377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannZIPVGetField(TIFF* tif, uint32 tag, va_list ap) 378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ZIPState* sp = ZState(tif); 380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (tag) { 382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case TIFFTAG_ZIPQUALITY: 383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *va_arg(ap, int*) = sp->zipquality; 384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann default: 386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (*sp->vgetparent)(tif, tag, ap); 387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (1); 389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic const TIFFField zipFields[] = { 392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { TIFFTAG_ZIPQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL }, 393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}; 394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint 396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannTIFFInitZIP(TIFF* tif, int scheme) 397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{ 398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static const char module[] = "TIFFInitZIP"; 399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ZIPState* sp; 400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann assert( (scheme == COMPRESSION_DEFLATE) 402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann || (scheme == COMPRESSION_ADOBE_DEFLATE)); 403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* 405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Merge codec-specific tag information. 406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!_TIFFMergeFields(tif, zipFields, TIFFArrayCount(zipFields))) { 408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFErrorExt(tif->tif_clientdata, module, 409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann "Merging Deflate codec-specific tags failed"); 410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* 414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Allocate state block so tag methods have storage to record values. 415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_data = (uint8*) _TIFFmalloc(sizeof (ZIPState)); 417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (tif->tif_data == NULL) 418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann goto bad; 419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp = ZState(tif); 420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.zalloc = NULL; 421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.zfree = NULL; 422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.opaque = NULL; 423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->stream.data_type = Z_BINARY; 424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* 426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Override parent get/set field methods. 427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->vgetparent = tif->tif_tagmethods.vgetfield; 429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_tagmethods.vgetfield = ZIPVGetField; /* hook for codec tags */ 430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->vsetparent = tif->tif_tagmethods.vsetfield; 431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_tagmethods.vsetfield = ZIPVSetField; /* hook for codec tags */ 432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* Default values for codec-specific fields */ 434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->zipquality = Z_DEFAULT_COMPRESSION; /* default comp. level */ 435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sp->state = 0; 436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* 438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Install codec methods. 439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_fixuptags = ZIPFixupTags; 441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_setupdecode = ZIPSetupDecode; 442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_predecode = ZIPPreDecode; 443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_decoderow = ZIPDecode; 444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_decodestrip = ZIPDecode; 445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_decodetile = ZIPDecode; 446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_setupencode = ZIPSetupEncode; 447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_preencode = ZIPPreEncode; 448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_postencode = ZIPPostEncode; 449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_encoderow = ZIPEncode; 450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_encodestrip = ZIPEncode; 451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_encodetile = ZIPEncode; 452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann tif->tif_cleanup = ZIPCleanup; 453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* 454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Setup predictor setup. 455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (void) TIFFPredictorInit(tif); 457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (1); 458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannbad: 459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TIFFErrorExt(tif->tif_clientdata, module, 460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann "No space for ZIP state block"); 461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (0); 462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif /* ZIP_SUPORT */ 464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* vim: set ts=8 sts=8 sw=8 noet: */ 466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* 467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Local Variables: 468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * mode: c 469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * c-basic-offset: 8 470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * fill-column: 78 471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * End: 472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */ 473