xref: /aosp_15_r20/external/pdfium/third_party/libtiff/tif_lzw.c (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker /*
2*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 1988-1997 Sam Leffler
3*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
4*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 2022 Even Rouault
5*3ac0a46fSAndroid Build Coastguard Worker  *
6*3ac0a46fSAndroid Build Coastguard Worker  * Permission to use, copy, modify, distribute, and sell this software and
7*3ac0a46fSAndroid Build Coastguard Worker  * its documentation for any purpose is hereby granted without fee, provided
8*3ac0a46fSAndroid Build Coastguard Worker  * that (i) the above copyright notices and this permission notice appear in
9*3ac0a46fSAndroid Build Coastguard Worker  * all copies of the software and related documentation, and (ii) the names of
10*3ac0a46fSAndroid Build Coastguard Worker  * Sam Leffler and Silicon Graphics may not be used in any advertising or
11*3ac0a46fSAndroid Build Coastguard Worker  * publicity relating to the software without the specific, prior written
12*3ac0a46fSAndroid Build Coastguard Worker  * permission of Sam Leffler and Silicon Graphics.
13*3ac0a46fSAndroid Build Coastguard Worker  *
14*3ac0a46fSAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
15*3ac0a46fSAndroid Build Coastguard Worker  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
16*3ac0a46fSAndroid Build Coastguard Worker  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
17*3ac0a46fSAndroid Build Coastguard Worker  *
18*3ac0a46fSAndroid Build Coastguard Worker  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
19*3ac0a46fSAndroid Build Coastguard Worker  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
20*3ac0a46fSAndroid Build Coastguard Worker  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
21*3ac0a46fSAndroid Build Coastguard Worker  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
22*3ac0a46fSAndroid Build Coastguard Worker  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
23*3ac0a46fSAndroid Build Coastguard Worker  * OF THIS SOFTWARE.
24*3ac0a46fSAndroid Build Coastguard Worker  */
25*3ac0a46fSAndroid Build Coastguard Worker 
26*3ac0a46fSAndroid Build Coastguard Worker #include "tiffiop.h"
27*3ac0a46fSAndroid Build Coastguard Worker #ifdef LZW_SUPPORT
28*3ac0a46fSAndroid Build Coastguard Worker /*
29*3ac0a46fSAndroid Build Coastguard Worker  * TIFF Library.
30*3ac0a46fSAndroid Build Coastguard Worker  * Rev 5.0 Lempel-Ziv & Welch Compression Support
31*3ac0a46fSAndroid Build Coastguard Worker  *
32*3ac0a46fSAndroid Build Coastguard Worker  * This code is derived from the compress program whose code is
33*3ac0a46fSAndroid Build Coastguard Worker  * derived from software contributed to Berkeley by James A. Woods,
34*3ac0a46fSAndroid Build Coastguard Worker  * derived from original work by Spencer Thomas and Joseph Orost.
35*3ac0a46fSAndroid Build Coastguard Worker  *
36*3ac0a46fSAndroid Build Coastguard Worker  * The original Berkeley copyright notice appears below in its entirety.
37*3ac0a46fSAndroid Build Coastguard Worker  */
38*3ac0a46fSAndroid Build Coastguard Worker #include "tif_predict.h"
39*3ac0a46fSAndroid Build Coastguard Worker 
40*3ac0a46fSAndroid Build Coastguard Worker #include <stdbool.h>
41*3ac0a46fSAndroid Build Coastguard Worker #include <stdio.h>
42*3ac0a46fSAndroid Build Coastguard Worker #include <stdlib.h>
43*3ac0a46fSAndroid Build Coastguard Worker 
44*3ac0a46fSAndroid Build Coastguard Worker /* Select the plausible largest natural integer type for the architecture */
45*3ac0a46fSAndroid Build Coastguard Worker #define SIZEOF_WORDTYPE SIZEOF_SIZE_T
46*3ac0a46fSAndroid Build Coastguard Worker typedef size_t WordType;
47*3ac0a46fSAndroid Build Coastguard Worker 
48*3ac0a46fSAndroid Build Coastguard Worker /*
49*3ac0a46fSAndroid Build Coastguard Worker  * NB: The 5.0 spec describes a different algorithm than Aldus
50*3ac0a46fSAndroid Build Coastguard Worker  *     implements.  Specifically, Aldus does code length transitions
51*3ac0a46fSAndroid Build Coastguard Worker  *     one code earlier than should be done (for real LZW).
52*3ac0a46fSAndroid Build Coastguard Worker  *     Earlier versions of this library implemented the correct
53*3ac0a46fSAndroid Build Coastguard Worker  *     LZW algorithm, but emitted codes in a bit order opposite
54*3ac0a46fSAndroid Build Coastguard Worker  *     to the TIFF spec.  Thus, to maintain compatibility w/ Aldus
55*3ac0a46fSAndroid Build Coastguard Worker  *     we interpret MSB-LSB ordered codes to be images written w/
56*3ac0a46fSAndroid Build Coastguard Worker  *     old versions of this library, but otherwise adhere to the
57*3ac0a46fSAndroid Build Coastguard Worker  *     Aldus "off by one" algorithm.
58*3ac0a46fSAndroid Build Coastguard Worker  *
59*3ac0a46fSAndroid Build Coastguard Worker  * Future revisions to the TIFF spec are expected to "clarify this issue".
60*3ac0a46fSAndroid Build Coastguard Worker  */
61*3ac0a46fSAndroid Build Coastguard Worker #define LZW_COMPAT /* include backwards compatibility code */
62*3ac0a46fSAndroid Build Coastguard Worker 
63*3ac0a46fSAndroid Build Coastguard Worker #define MAXCODE(n) ((1L << (n)) - 1)
64*3ac0a46fSAndroid Build Coastguard Worker /*
65*3ac0a46fSAndroid Build Coastguard Worker  * The TIFF spec specifies that encoded bit
66*3ac0a46fSAndroid Build Coastguard Worker  * strings range from 9 to 12 bits.
67*3ac0a46fSAndroid Build Coastguard Worker  */
68*3ac0a46fSAndroid Build Coastguard Worker #define BITS_MIN 9  /* start with 9 bits */
69*3ac0a46fSAndroid Build Coastguard Worker #define BITS_MAX 12 /* max of 12 bit strings */
70*3ac0a46fSAndroid Build Coastguard Worker /* predefined codes */
71*3ac0a46fSAndroid Build Coastguard Worker #define CODE_CLEAR 256 /* code to clear string table */
72*3ac0a46fSAndroid Build Coastguard Worker #define CODE_EOI 257   /* end-of-information code */
73*3ac0a46fSAndroid Build Coastguard Worker #define CODE_FIRST 258 /* first free code entry */
74*3ac0a46fSAndroid Build Coastguard Worker #define CODE_MAX MAXCODE(BITS_MAX)
75*3ac0a46fSAndroid Build Coastguard Worker #define HSIZE 9001L /* 91% occupancy */
76*3ac0a46fSAndroid Build Coastguard Worker #define HSHIFT (13 - 8)
77*3ac0a46fSAndroid Build Coastguard Worker #ifdef LZW_COMPAT
78*3ac0a46fSAndroid Build Coastguard Worker /* NB: +1024 is for compatibility with old files */
79*3ac0a46fSAndroid Build Coastguard Worker #define CSIZE (MAXCODE(BITS_MAX) + 1024L)
80*3ac0a46fSAndroid Build Coastguard Worker #else
81*3ac0a46fSAndroid Build Coastguard Worker #define CSIZE (MAXCODE(BITS_MAX) + 1L)
82*3ac0a46fSAndroid Build Coastguard Worker #endif
83*3ac0a46fSAndroid Build Coastguard Worker 
84*3ac0a46fSAndroid Build Coastguard Worker /*
85*3ac0a46fSAndroid Build Coastguard Worker  * State block for each open TIFF file using LZW
86*3ac0a46fSAndroid Build Coastguard Worker  * compression/decompression.  Note that the predictor
87*3ac0a46fSAndroid Build Coastguard Worker  * state block must be first in this data structure.
88*3ac0a46fSAndroid Build Coastguard Worker  */
89*3ac0a46fSAndroid Build Coastguard Worker typedef struct
90*3ac0a46fSAndroid Build Coastguard Worker {
91*3ac0a46fSAndroid Build Coastguard Worker     TIFFPredictorState predict; /* predictor super class */
92*3ac0a46fSAndroid Build Coastguard Worker 
93*3ac0a46fSAndroid Build Coastguard Worker     unsigned short nbits;    /* # of bits/code */
94*3ac0a46fSAndroid Build Coastguard Worker     unsigned short maxcode;  /* maximum code for lzw_nbits */
95*3ac0a46fSAndroid Build Coastguard Worker     unsigned short free_ent; /* next free entry in hash table */
96*3ac0a46fSAndroid Build Coastguard Worker     WordType nextdata;       /* next bits of i/o */
97*3ac0a46fSAndroid Build Coastguard Worker     long nextbits;           /* # of valid bits in lzw_nextdata */
98*3ac0a46fSAndroid Build Coastguard Worker 
99*3ac0a46fSAndroid Build Coastguard Worker     int rw_mode; /* preserve rw_mode from init */
100*3ac0a46fSAndroid Build Coastguard Worker } LZWBaseState;
101*3ac0a46fSAndroid Build Coastguard Worker 
102*3ac0a46fSAndroid Build Coastguard Worker #define lzw_nbits base.nbits
103*3ac0a46fSAndroid Build Coastguard Worker #define lzw_maxcode base.maxcode
104*3ac0a46fSAndroid Build Coastguard Worker #define lzw_free_ent base.free_ent
105*3ac0a46fSAndroid Build Coastguard Worker #define lzw_nextdata base.nextdata
106*3ac0a46fSAndroid Build Coastguard Worker #define lzw_nextbits base.nextbits
107*3ac0a46fSAndroid Build Coastguard Worker 
108*3ac0a46fSAndroid Build Coastguard Worker /*
109*3ac0a46fSAndroid Build Coastguard Worker  * Encoding-specific state.
110*3ac0a46fSAndroid Build Coastguard Worker  */
111*3ac0a46fSAndroid Build Coastguard Worker typedef uint16_t hcode_t; /* codes fit in 16 bits */
112*3ac0a46fSAndroid Build Coastguard Worker typedef struct
113*3ac0a46fSAndroid Build Coastguard Worker {
114*3ac0a46fSAndroid Build Coastguard Worker     long hash;
115*3ac0a46fSAndroid Build Coastguard Worker     hcode_t code;
116*3ac0a46fSAndroid Build Coastguard Worker } hash_t;
117*3ac0a46fSAndroid Build Coastguard Worker 
118*3ac0a46fSAndroid Build Coastguard Worker /*
119*3ac0a46fSAndroid Build Coastguard Worker  * Decoding-specific state.
120*3ac0a46fSAndroid Build Coastguard Worker  */
121*3ac0a46fSAndroid Build Coastguard Worker typedef struct code_ent
122*3ac0a46fSAndroid Build Coastguard Worker {
123*3ac0a46fSAndroid Build Coastguard Worker     struct code_ent *next;
124*3ac0a46fSAndroid Build Coastguard Worker     unsigned short length; /* string len, including this token */
125*3ac0a46fSAndroid Build Coastguard Worker     /* firstchar should be placed immediately before value in this structure */
126*3ac0a46fSAndroid Build Coastguard Worker     unsigned char firstchar; /* first token of string */
127*3ac0a46fSAndroid Build Coastguard Worker     unsigned char value;     /* data value */
128*3ac0a46fSAndroid Build Coastguard Worker     bool repeated;
129*3ac0a46fSAndroid Build Coastguard Worker } code_t;
130*3ac0a46fSAndroid Build Coastguard Worker 
131*3ac0a46fSAndroid Build Coastguard Worker typedef int (*decodeFunc)(TIFF *, uint8_t *, tmsize_t, uint16_t);
132*3ac0a46fSAndroid Build Coastguard Worker 
133*3ac0a46fSAndroid Build Coastguard Worker typedef struct
134*3ac0a46fSAndroid Build Coastguard Worker {
135*3ac0a46fSAndroid Build Coastguard Worker     LZWBaseState base;
136*3ac0a46fSAndroid Build Coastguard Worker 
137*3ac0a46fSAndroid Build Coastguard Worker     /* Decoding specific data */
138*3ac0a46fSAndroid Build Coastguard Worker     long dec_nbitsmask;     /* lzw_nbits 1 bits, right adjusted */
139*3ac0a46fSAndroid Build Coastguard Worker     tmsize_t dec_restart;   /* restart count */
140*3ac0a46fSAndroid Build Coastguard Worker     uint64_t dec_bitsleft;  /* available bits in raw data */
141*3ac0a46fSAndroid Build Coastguard Worker     tmsize_t old_tif_rawcc; /* value of tif_rawcc at the end of the previous
142*3ac0a46fSAndroid Build Coastguard Worker                                TIFLZWDecode() call */
143*3ac0a46fSAndroid Build Coastguard Worker     decodeFunc dec_decode;  /* regular or backwards compatible */
144*3ac0a46fSAndroid Build Coastguard Worker     code_t *dec_codep;      /* current recognized code */
145*3ac0a46fSAndroid Build Coastguard Worker     code_t *dec_oldcodep;   /* previously recognized code */
146*3ac0a46fSAndroid Build Coastguard Worker     code_t *dec_free_entp;  /* next free entry */
147*3ac0a46fSAndroid Build Coastguard Worker     code_t *dec_maxcodep;   /* max available entry */
148*3ac0a46fSAndroid Build Coastguard Worker     code_t *dec_codetab;    /* kept separate for small machines */
149*3ac0a46fSAndroid Build Coastguard Worker     int read_error; /* whether a read error has occurred, and which should cause
150*3ac0a46fSAndroid Build Coastguard Worker                        further reads in the same strip/tile to be aborted */
151*3ac0a46fSAndroid Build Coastguard Worker 
152*3ac0a46fSAndroid Build Coastguard Worker     /* Encoding specific data */
153*3ac0a46fSAndroid Build Coastguard Worker     int enc_oldcode;         /* last code encountered */
154*3ac0a46fSAndroid Build Coastguard Worker     tmsize_t enc_checkpoint; /* point at which to clear table */
155*3ac0a46fSAndroid Build Coastguard Worker #define CHECK_GAP 10000      /* enc_ratio check interval */
156*3ac0a46fSAndroid Build Coastguard Worker     tmsize_t enc_ratio;      /* current compression ratio */
157*3ac0a46fSAndroid Build Coastguard Worker     tmsize_t enc_incount;    /* (input) data bytes encoded */
158*3ac0a46fSAndroid Build Coastguard Worker     tmsize_t enc_outcount;   /* encoded (output) bytes */
159*3ac0a46fSAndroid Build Coastguard Worker     uint8_t *enc_rawlimit;   /* bound on tif_rawdata buffer */
160*3ac0a46fSAndroid Build Coastguard Worker     hash_t *enc_hashtab;     /* kept separate for small machines */
161*3ac0a46fSAndroid Build Coastguard Worker } LZWCodecState;
162*3ac0a46fSAndroid Build Coastguard Worker 
163*3ac0a46fSAndroid Build Coastguard Worker #define LZWState(tif) ((LZWBaseState *)(tif)->tif_data)
164*3ac0a46fSAndroid Build Coastguard Worker #define DecoderState(tif) ((LZWCodecState *)LZWState(tif))
165*3ac0a46fSAndroid Build Coastguard Worker #define EncoderState(tif) ((LZWCodecState *)LZWState(tif))
166*3ac0a46fSAndroid Build Coastguard Worker 
167*3ac0a46fSAndroid Build Coastguard Worker static int LZWDecode(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s);
168*3ac0a46fSAndroid Build Coastguard Worker #ifdef LZW_COMPAT
169*3ac0a46fSAndroid Build Coastguard Worker static int LZWDecodeCompat(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s);
170*3ac0a46fSAndroid Build Coastguard Worker #endif
171*3ac0a46fSAndroid Build Coastguard Worker static void cl_hash(LZWCodecState *);
172*3ac0a46fSAndroid Build Coastguard Worker 
173*3ac0a46fSAndroid Build Coastguard Worker /*
174*3ac0a46fSAndroid Build Coastguard Worker  * LZW Decoder.
175*3ac0a46fSAndroid Build Coastguard Worker  */
176*3ac0a46fSAndroid Build Coastguard Worker 
LZWFixupTags(TIFF * tif)177*3ac0a46fSAndroid Build Coastguard Worker static int LZWFixupTags(TIFF *tif)
178*3ac0a46fSAndroid Build Coastguard Worker {
179*3ac0a46fSAndroid Build Coastguard Worker     (void)tif;
180*3ac0a46fSAndroid Build Coastguard Worker     return (1);
181*3ac0a46fSAndroid Build Coastguard Worker }
182*3ac0a46fSAndroid Build Coastguard Worker 
LZWSetupDecode(TIFF * tif)183*3ac0a46fSAndroid Build Coastguard Worker static int LZWSetupDecode(TIFF *tif)
184*3ac0a46fSAndroid Build Coastguard Worker {
185*3ac0a46fSAndroid Build Coastguard Worker     static const char module[] = "LZWSetupDecode";
186*3ac0a46fSAndroid Build Coastguard Worker     LZWCodecState *sp = DecoderState(tif);
187*3ac0a46fSAndroid Build Coastguard Worker     int code;
188*3ac0a46fSAndroid Build Coastguard Worker 
189*3ac0a46fSAndroid Build Coastguard Worker     if (sp == NULL)
190*3ac0a46fSAndroid Build Coastguard Worker     {
191*3ac0a46fSAndroid Build Coastguard Worker         /*
192*3ac0a46fSAndroid Build Coastguard Worker          * Allocate state block so tag methods have storage to record
193*3ac0a46fSAndroid Build Coastguard Worker          * values.
194*3ac0a46fSAndroid Build Coastguard Worker          */
195*3ac0a46fSAndroid Build Coastguard Worker         tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(LZWCodecState));
196*3ac0a46fSAndroid Build Coastguard Worker         if (tif->tif_data == NULL)
197*3ac0a46fSAndroid Build Coastguard Worker         {
198*3ac0a46fSAndroid Build Coastguard Worker             TIFFErrorExtR(tif, module, "No space for LZW state block");
199*3ac0a46fSAndroid Build Coastguard Worker             return (0);
200*3ac0a46fSAndroid Build Coastguard Worker         }
201*3ac0a46fSAndroid Build Coastguard Worker 
202*3ac0a46fSAndroid Build Coastguard Worker         sp = DecoderState(tif);
203*3ac0a46fSAndroid Build Coastguard Worker         sp->dec_codetab = NULL;
204*3ac0a46fSAndroid Build Coastguard Worker         sp->dec_decode = NULL;
205*3ac0a46fSAndroid Build Coastguard Worker 
206*3ac0a46fSAndroid Build Coastguard Worker         /*
207*3ac0a46fSAndroid Build Coastguard Worker          * Setup predictor setup.
208*3ac0a46fSAndroid Build Coastguard Worker          */
209*3ac0a46fSAndroid Build Coastguard Worker         (void)TIFFPredictorInit(tif);
210*3ac0a46fSAndroid Build Coastguard Worker     }
211*3ac0a46fSAndroid Build Coastguard Worker 
212*3ac0a46fSAndroid Build Coastguard Worker     if (sp->dec_codetab == NULL)
213*3ac0a46fSAndroid Build Coastguard Worker     {
214*3ac0a46fSAndroid Build Coastguard Worker         sp->dec_codetab = (code_t *)_TIFFmallocExt(tif, CSIZE * sizeof(code_t));
215*3ac0a46fSAndroid Build Coastguard Worker         if (sp->dec_codetab == NULL)
216*3ac0a46fSAndroid Build Coastguard Worker         {
217*3ac0a46fSAndroid Build Coastguard Worker             TIFFErrorExtR(tif, module, "No space for LZW code table");
218*3ac0a46fSAndroid Build Coastguard Worker             return (0);
219*3ac0a46fSAndroid Build Coastguard Worker         }
220*3ac0a46fSAndroid Build Coastguard Worker         /*
221*3ac0a46fSAndroid Build Coastguard Worker          * Pre-load the table.
222*3ac0a46fSAndroid Build Coastguard Worker          */
223*3ac0a46fSAndroid Build Coastguard Worker         code = 255;
224*3ac0a46fSAndroid Build Coastguard Worker         do
225*3ac0a46fSAndroid Build Coastguard Worker         {
226*3ac0a46fSAndroid Build Coastguard Worker             sp->dec_codetab[code].firstchar = (unsigned char)code;
227*3ac0a46fSAndroid Build Coastguard Worker             sp->dec_codetab[code].value = (unsigned char)code;
228*3ac0a46fSAndroid Build Coastguard Worker             sp->dec_codetab[code].repeated = true;
229*3ac0a46fSAndroid Build Coastguard Worker             sp->dec_codetab[code].length = 1;
230*3ac0a46fSAndroid Build Coastguard Worker             sp->dec_codetab[code].next = NULL;
231*3ac0a46fSAndroid Build Coastguard Worker         } while (code--);
232*3ac0a46fSAndroid Build Coastguard Worker         /*
233*3ac0a46fSAndroid Build Coastguard Worker          * Zero-out the unused entries  */
234*3ac0a46fSAndroid Build Coastguard Worker         /* Silence false positive */
235*3ac0a46fSAndroid Build Coastguard Worker         /* coverity[overrun-buffer-arg] */
236*3ac0a46fSAndroid Build Coastguard Worker         memset(&sp->dec_codetab[CODE_CLEAR], 0,
237*3ac0a46fSAndroid Build Coastguard Worker                (CODE_FIRST - CODE_CLEAR) * sizeof(code_t));
238*3ac0a46fSAndroid Build Coastguard Worker     }
239*3ac0a46fSAndroid Build Coastguard Worker     return (1);
240*3ac0a46fSAndroid Build Coastguard Worker }
241*3ac0a46fSAndroid Build Coastguard Worker 
242*3ac0a46fSAndroid Build Coastguard Worker /*
243*3ac0a46fSAndroid Build Coastguard Worker  * Setup state for decoding a strip.
244*3ac0a46fSAndroid Build Coastguard Worker  */
LZWPreDecode(TIFF * tif,uint16_t s)245*3ac0a46fSAndroid Build Coastguard Worker static int LZWPreDecode(TIFF *tif, uint16_t s)
246*3ac0a46fSAndroid Build Coastguard Worker {
247*3ac0a46fSAndroid Build Coastguard Worker     static const char module[] = "LZWPreDecode";
248*3ac0a46fSAndroid Build Coastguard Worker     LZWCodecState *sp = DecoderState(tif);
249*3ac0a46fSAndroid Build Coastguard Worker 
250*3ac0a46fSAndroid Build Coastguard Worker     (void)s;
251*3ac0a46fSAndroid Build Coastguard Worker     assert(sp != NULL);
252*3ac0a46fSAndroid Build Coastguard Worker     if (sp->dec_codetab == NULL)
253*3ac0a46fSAndroid Build Coastguard Worker     {
254*3ac0a46fSAndroid Build Coastguard Worker         tif->tif_setupdecode(tif);
255*3ac0a46fSAndroid Build Coastguard Worker         if (sp->dec_codetab == NULL)
256*3ac0a46fSAndroid Build Coastguard Worker             return (0);
257*3ac0a46fSAndroid Build Coastguard Worker     }
258*3ac0a46fSAndroid Build Coastguard Worker 
259*3ac0a46fSAndroid Build Coastguard Worker     /*
260*3ac0a46fSAndroid Build Coastguard Worker      * Check for old bit-reversed codes.
261*3ac0a46fSAndroid Build Coastguard Worker      */
262*3ac0a46fSAndroid Build Coastguard Worker     if (tif->tif_rawcc >= 2 && tif->tif_rawdata[0] == 0 &&
263*3ac0a46fSAndroid Build Coastguard Worker         (tif->tif_rawdata[1] & 0x1))
264*3ac0a46fSAndroid Build Coastguard Worker     {
265*3ac0a46fSAndroid Build Coastguard Worker #ifdef LZW_COMPAT
266*3ac0a46fSAndroid Build Coastguard Worker         if (!sp->dec_decode)
267*3ac0a46fSAndroid Build Coastguard Worker         {
268*3ac0a46fSAndroid Build Coastguard Worker             TIFFWarningExtR(tif, module, "Old-style LZW codes, convert file");
269*3ac0a46fSAndroid Build Coastguard Worker             /*
270*3ac0a46fSAndroid Build Coastguard Worker              * Override default decoding methods with
271*3ac0a46fSAndroid Build Coastguard Worker              * ones that deal with the old coding.
272*3ac0a46fSAndroid Build Coastguard Worker              * Otherwise the predictor versions set
273*3ac0a46fSAndroid Build Coastguard Worker              * above will call the compatibility routines
274*3ac0a46fSAndroid Build Coastguard Worker              * through the dec_decode method.
275*3ac0a46fSAndroid Build Coastguard Worker              */
276*3ac0a46fSAndroid Build Coastguard Worker             tif->tif_decoderow = LZWDecodeCompat;
277*3ac0a46fSAndroid Build Coastguard Worker             tif->tif_decodestrip = LZWDecodeCompat;
278*3ac0a46fSAndroid Build Coastguard Worker             tif->tif_decodetile = LZWDecodeCompat;
279*3ac0a46fSAndroid Build Coastguard Worker             /*
280*3ac0a46fSAndroid Build Coastguard Worker              * If doing horizontal differencing, must
281*3ac0a46fSAndroid Build Coastguard Worker              * re-setup the predictor logic since we
282*3ac0a46fSAndroid Build Coastguard Worker              * switched the basic decoder methods...
283*3ac0a46fSAndroid Build Coastguard Worker              */
284*3ac0a46fSAndroid Build Coastguard Worker             (*tif->tif_setupdecode)(tif);
285*3ac0a46fSAndroid Build Coastguard Worker             sp->dec_decode = LZWDecodeCompat;
286*3ac0a46fSAndroid Build Coastguard Worker         }
287*3ac0a46fSAndroid Build Coastguard Worker         sp->lzw_maxcode = MAXCODE(BITS_MIN);
288*3ac0a46fSAndroid Build Coastguard Worker #else  /* !LZW_COMPAT */
289*3ac0a46fSAndroid Build Coastguard Worker         if (!sp->dec_decode)
290*3ac0a46fSAndroid Build Coastguard Worker         {
291*3ac0a46fSAndroid Build Coastguard Worker             TIFFErrorExtR(tif, module, "Old-style LZW codes not supported");
292*3ac0a46fSAndroid Build Coastguard Worker             sp->dec_decode = LZWDecode;
293*3ac0a46fSAndroid Build Coastguard Worker         }
294*3ac0a46fSAndroid Build Coastguard Worker         return (0);
295*3ac0a46fSAndroid Build Coastguard Worker #endif /* !LZW_COMPAT */
296*3ac0a46fSAndroid Build Coastguard Worker     }
297*3ac0a46fSAndroid Build Coastguard Worker     else
298*3ac0a46fSAndroid Build Coastguard Worker     {
299*3ac0a46fSAndroid Build Coastguard Worker         sp->lzw_maxcode = MAXCODE(BITS_MIN) - 1;
300*3ac0a46fSAndroid Build Coastguard Worker         sp->dec_decode = LZWDecode;
301*3ac0a46fSAndroid Build Coastguard Worker     }
302*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_nbits = BITS_MIN;
303*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_nextbits = 0;
304*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_nextdata = 0;
305*3ac0a46fSAndroid Build Coastguard Worker 
306*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_restart = 0;
307*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_nbitsmask = MAXCODE(BITS_MIN);
308*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_bitsleft = 0;
309*3ac0a46fSAndroid Build Coastguard Worker     sp->old_tif_rawcc = 0;
310*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_free_entp = sp->dec_codetab - 1; // + CODE_FIRST;
311*3ac0a46fSAndroid Build Coastguard Worker     /*
312*3ac0a46fSAndroid Build Coastguard Worker      * Zero entries that are not yet filled in.  We do
313*3ac0a46fSAndroid Build Coastguard Worker      * this to guard against bogus input data that causes
314*3ac0a46fSAndroid Build Coastguard Worker      * us to index into undefined entries.  If you can
315*3ac0a46fSAndroid Build Coastguard Worker      * come up with a way to safely bounds-check input codes
316*3ac0a46fSAndroid Build Coastguard Worker      * while decoding then you can remove this operation.
317*3ac0a46fSAndroid Build Coastguard Worker      */
318*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_oldcodep = &sp->dec_codetab[0];
319*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_maxcodep = &sp->dec_codetab[sp->dec_nbitsmask - 1];
320*3ac0a46fSAndroid Build Coastguard Worker     sp->read_error = 0;
321*3ac0a46fSAndroid Build Coastguard Worker     return (1);
322*3ac0a46fSAndroid Build Coastguard Worker }
323*3ac0a46fSAndroid Build Coastguard Worker 
324*3ac0a46fSAndroid Build Coastguard Worker /*
325*3ac0a46fSAndroid Build Coastguard Worker  * Decode a "hunk of data".
326*3ac0a46fSAndroid Build Coastguard Worker  */
327*3ac0a46fSAndroid Build Coastguard Worker 
328*3ac0a46fSAndroid Build Coastguard Worker /* Get the next 32 or 64-bit from the input data */
329*3ac0a46fSAndroid Build Coastguard Worker #ifdef WORDS_BIGENDIAN
330*3ac0a46fSAndroid Build Coastguard Worker #define GetNextData(nextdata, bp) memcpy(&nextdata, bp, sizeof(nextdata))
331*3ac0a46fSAndroid Build Coastguard Worker #elif SIZEOF_WORDTYPE == 8
332*3ac0a46fSAndroid Build Coastguard Worker #if defined(__GNUC__) && defined(__x86_64__)
333*3ac0a46fSAndroid Build Coastguard Worker #define GetNextData(nextdata, bp)                                              \
334*3ac0a46fSAndroid Build Coastguard Worker     nextdata = __builtin_bswap64(*(uint64_t *)(bp))
335*3ac0a46fSAndroid Build Coastguard Worker #elif defined(_M_X64)
336*3ac0a46fSAndroid Build Coastguard Worker #define GetNextData(nextdata, bp) nextdata = _byteswap_uint64(*(uint64_t *)(bp))
337*3ac0a46fSAndroid Build Coastguard Worker #elif defined(__GNUC__)
338*3ac0a46fSAndroid Build Coastguard Worker #define GetNextData(nextdata, bp)                                              \
339*3ac0a46fSAndroid Build Coastguard Worker     memcpy(&nextdata, bp, sizeof(nextdata));                                   \
340*3ac0a46fSAndroid Build Coastguard Worker     nextdata = __builtin_bswap64(nextdata)
341*3ac0a46fSAndroid Build Coastguard Worker #else
342*3ac0a46fSAndroid Build Coastguard Worker #define GetNextData(nextdata, bp)                                              \
343*3ac0a46fSAndroid Build Coastguard Worker     nextdata = (((uint64_t)bp[0]) << 56) | (((uint64_t)bp[1]) << 48) |         \
344*3ac0a46fSAndroid Build Coastguard Worker                (((uint64_t)bp[2]) << 40) | (((uint64_t)bp[3]) << 32) |         \
345*3ac0a46fSAndroid Build Coastguard Worker                (((uint64_t)bp[4]) << 24) | (((uint64_t)bp[5]) << 16) |         \
346*3ac0a46fSAndroid Build Coastguard Worker                (((uint64_t)bp[6]) << 8) | (((uint64_t)bp[7]))
347*3ac0a46fSAndroid Build Coastguard Worker #endif
348*3ac0a46fSAndroid Build Coastguard Worker #elif SIZEOF_WORDTYPE == 4
349*3ac0a46fSAndroid Build Coastguard Worker #if defined(__GNUC__) && defined(__i386__)
350*3ac0a46fSAndroid Build Coastguard Worker #define GetNextData(nextdata, bp)                                              \
351*3ac0a46fSAndroid Build Coastguard Worker     nextdata = __builtin_bswap32(*(uint32_t *)(bp))
352*3ac0a46fSAndroid Build Coastguard Worker #elif defined(_M_X86)
353*3ac0a46fSAndroid Build Coastguard Worker #define GetNextData(nextdata, bp)                                              \
354*3ac0a46fSAndroid Build Coastguard Worker     nextdata = _byteswap_ulong(*(unsigned long *)(bp))
355*3ac0a46fSAndroid Build Coastguard Worker #elif defined(__GNUC__)
356*3ac0a46fSAndroid Build Coastguard Worker #define GetNextData(nextdata, bp)                                              \
357*3ac0a46fSAndroid Build Coastguard Worker     memcpy(&nextdata, bp, sizeof(nextdata));                                   \
358*3ac0a46fSAndroid Build Coastguard Worker     nextdata = __builtin_bswap32(nextdata)
359*3ac0a46fSAndroid Build Coastguard Worker #else
360*3ac0a46fSAndroid Build Coastguard Worker #define GetNextData(nextdata, bp)                                              \
361*3ac0a46fSAndroid Build Coastguard Worker     nextdata = (((uint32_t)bp[0]) << 24) | (((uint32_t)bp[1]) << 16) |         \
362*3ac0a46fSAndroid Build Coastguard Worker                (((uint32_t)bp[2]) << 8) | (((uint32_t)bp[3]))
363*3ac0a46fSAndroid Build Coastguard Worker #endif
364*3ac0a46fSAndroid Build Coastguard Worker #else
365*3ac0a46fSAndroid Build Coastguard Worker #error "Unhandled SIZEOF_WORDTYPE"
366*3ac0a46fSAndroid Build Coastguard Worker #endif
367*3ac0a46fSAndroid Build Coastguard Worker 
368*3ac0a46fSAndroid Build Coastguard Worker #define GetNextCodeLZW()                                                       \
369*3ac0a46fSAndroid Build Coastguard Worker     do                                                                         \
370*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
371*3ac0a46fSAndroid Build Coastguard Worker         nextbits -= nbits;                                                     \
372*3ac0a46fSAndroid Build Coastguard Worker         if (nextbits < 0)                                                      \
373*3ac0a46fSAndroid Build Coastguard Worker         {                                                                      \
374*3ac0a46fSAndroid Build Coastguard Worker             if (dec_bitsleft >= 8 * SIZEOF_WORDTYPE)                           \
375*3ac0a46fSAndroid Build Coastguard Worker             {                                                                  \
376*3ac0a46fSAndroid Build Coastguard Worker                 unsigned codetmp = (unsigned)(nextdata << (-nextbits));        \
377*3ac0a46fSAndroid Build Coastguard Worker                 GetNextData(nextdata, bp);                                     \
378*3ac0a46fSAndroid Build Coastguard Worker                 bp += SIZEOF_WORDTYPE;                                         \
379*3ac0a46fSAndroid Build Coastguard Worker                 nextbits += 8 * SIZEOF_WORDTYPE;                               \
380*3ac0a46fSAndroid Build Coastguard Worker                 dec_bitsleft -= 8 * SIZEOF_WORDTYPE;                           \
381*3ac0a46fSAndroid Build Coastguard Worker                 code = (WordType)((codetmp | (nextdata >> nextbits)) &         \
382*3ac0a46fSAndroid Build Coastguard Worker                                   nbitsmask);                                  \
383*3ac0a46fSAndroid Build Coastguard Worker                 break;                                                         \
384*3ac0a46fSAndroid Build Coastguard Worker             }                                                                  \
385*3ac0a46fSAndroid Build Coastguard Worker             else                                                               \
386*3ac0a46fSAndroid Build Coastguard Worker             {                                                                  \
387*3ac0a46fSAndroid Build Coastguard Worker                 if (dec_bitsleft < 8)                                          \
388*3ac0a46fSAndroid Build Coastguard Worker                 {                                                              \
389*3ac0a46fSAndroid Build Coastguard Worker                     goto no_eoi;                                               \
390*3ac0a46fSAndroid Build Coastguard Worker                 }                                                              \
391*3ac0a46fSAndroid Build Coastguard Worker                 nextdata = (nextdata << 8) | *(bp)++;                          \
392*3ac0a46fSAndroid Build Coastguard Worker                 nextbits += 8;                                                 \
393*3ac0a46fSAndroid Build Coastguard Worker                 dec_bitsleft -= 8;                                             \
394*3ac0a46fSAndroid Build Coastguard Worker                 if (nextbits < 0)                                              \
395*3ac0a46fSAndroid Build Coastguard Worker                 {                                                              \
396*3ac0a46fSAndroid Build Coastguard Worker                     if (dec_bitsleft < 8)                                      \
397*3ac0a46fSAndroid Build Coastguard Worker                     {                                                          \
398*3ac0a46fSAndroid Build Coastguard Worker                         goto no_eoi;                                           \
399*3ac0a46fSAndroid Build Coastguard Worker                     }                                                          \
400*3ac0a46fSAndroid Build Coastguard Worker                     nextdata = (nextdata << 8) | *(bp)++;                      \
401*3ac0a46fSAndroid Build Coastguard Worker                     nextbits += 8;                                             \
402*3ac0a46fSAndroid Build Coastguard Worker                     dec_bitsleft -= 8;                                         \
403*3ac0a46fSAndroid Build Coastguard Worker                 }                                                              \
404*3ac0a46fSAndroid Build Coastguard Worker             }                                                                  \
405*3ac0a46fSAndroid Build Coastguard Worker         }                                                                      \
406*3ac0a46fSAndroid Build Coastguard Worker         code = (WordType)((nextdata >> nextbits) & nbitsmask);                 \
407*3ac0a46fSAndroid Build Coastguard Worker     } while (0)
408*3ac0a46fSAndroid Build Coastguard Worker 
LZWDecode(TIFF * tif,uint8_t * op0,tmsize_t occ0,uint16_t s)409*3ac0a46fSAndroid Build Coastguard Worker static int LZWDecode(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s)
410*3ac0a46fSAndroid Build Coastguard Worker {
411*3ac0a46fSAndroid Build Coastguard Worker     static const char module[] = "LZWDecode";
412*3ac0a46fSAndroid Build Coastguard Worker     LZWCodecState *sp = DecoderState(tif);
413*3ac0a46fSAndroid Build Coastguard Worker     uint8_t *op = (uint8_t *)op0;
414*3ac0a46fSAndroid Build Coastguard Worker     tmsize_t occ = occ0;
415*3ac0a46fSAndroid Build Coastguard Worker     uint8_t *bp;
416*3ac0a46fSAndroid Build Coastguard Worker     long nbits, nextbits, nbitsmask;
417*3ac0a46fSAndroid Build Coastguard Worker     WordType nextdata;
418*3ac0a46fSAndroid Build Coastguard Worker     code_t *free_entp, *maxcodep, *oldcodep;
419*3ac0a46fSAndroid Build Coastguard Worker 
420*3ac0a46fSAndroid Build Coastguard Worker     (void)s;
421*3ac0a46fSAndroid Build Coastguard Worker     assert(sp != NULL);
422*3ac0a46fSAndroid Build Coastguard Worker     assert(sp->dec_codetab != NULL);
423*3ac0a46fSAndroid Build Coastguard Worker 
424*3ac0a46fSAndroid Build Coastguard Worker     if (sp->read_error)
425*3ac0a46fSAndroid Build Coastguard Worker     {
426*3ac0a46fSAndroid Build Coastguard Worker         TIFFErrorExtR(tif, module,
427*3ac0a46fSAndroid Build Coastguard Worker                       "LZWDecode: Scanline %" PRIu32 " cannot be read due to "
428*3ac0a46fSAndroid Build Coastguard Worker                       "previous error",
429*3ac0a46fSAndroid Build Coastguard Worker                       tif->tif_row);
430*3ac0a46fSAndroid Build Coastguard Worker         return 0;
431*3ac0a46fSAndroid Build Coastguard Worker     }
432*3ac0a46fSAndroid Build Coastguard Worker 
433*3ac0a46fSAndroid Build Coastguard Worker     /*
434*3ac0a46fSAndroid Build Coastguard Worker      * Restart interrupted output operation.
435*3ac0a46fSAndroid Build Coastguard Worker      */
436*3ac0a46fSAndroid Build Coastguard Worker     if (sp->dec_restart)
437*3ac0a46fSAndroid Build Coastguard Worker     {
438*3ac0a46fSAndroid Build Coastguard Worker         tmsize_t residue;
439*3ac0a46fSAndroid Build Coastguard Worker 
440*3ac0a46fSAndroid Build Coastguard Worker         code_t *codep = sp->dec_codep;
441*3ac0a46fSAndroid Build Coastguard Worker         residue = codep->length - sp->dec_restart;
442*3ac0a46fSAndroid Build Coastguard Worker         if (residue > occ)
443*3ac0a46fSAndroid Build Coastguard Worker         {
444*3ac0a46fSAndroid Build Coastguard Worker             /*
445*3ac0a46fSAndroid Build Coastguard Worker              * Residue from previous decode is sufficient
446*3ac0a46fSAndroid Build Coastguard Worker              * to satisfy decode request.  Skip to the
447*3ac0a46fSAndroid Build Coastguard Worker              * start of the decoded string, place decoded
448*3ac0a46fSAndroid Build Coastguard Worker              * values in the output buffer, and return.
449*3ac0a46fSAndroid Build Coastguard Worker              */
450*3ac0a46fSAndroid Build Coastguard Worker             sp->dec_restart += occ;
451*3ac0a46fSAndroid Build Coastguard Worker             do
452*3ac0a46fSAndroid Build Coastguard Worker             {
453*3ac0a46fSAndroid Build Coastguard Worker                 codep = codep->next;
454*3ac0a46fSAndroid Build Coastguard Worker             } while (--residue > occ && codep);
455*3ac0a46fSAndroid Build Coastguard Worker             if (codep)
456*3ac0a46fSAndroid Build Coastguard Worker             {
457*3ac0a46fSAndroid Build Coastguard Worker                 uint8_t *tp = op + occ;
458*3ac0a46fSAndroid Build Coastguard Worker                 do
459*3ac0a46fSAndroid Build Coastguard Worker                 {
460*3ac0a46fSAndroid Build Coastguard Worker                     *--tp = codep->value;
461*3ac0a46fSAndroid Build Coastguard Worker                     codep = codep->next;
462*3ac0a46fSAndroid Build Coastguard Worker                 } while (--occ && codep);
463*3ac0a46fSAndroid Build Coastguard Worker             }
464*3ac0a46fSAndroid Build Coastguard Worker             return (1);
465*3ac0a46fSAndroid Build Coastguard Worker         }
466*3ac0a46fSAndroid Build Coastguard Worker         /*
467*3ac0a46fSAndroid Build Coastguard Worker          * Residue satisfies only part of the decode request.
468*3ac0a46fSAndroid Build Coastguard Worker          */
469*3ac0a46fSAndroid Build Coastguard Worker         op += residue;
470*3ac0a46fSAndroid Build Coastguard Worker         occ -= residue;
471*3ac0a46fSAndroid Build Coastguard Worker         uint8_t *tp = op;
472*3ac0a46fSAndroid Build Coastguard Worker         do
473*3ac0a46fSAndroid Build Coastguard Worker         {
474*3ac0a46fSAndroid Build Coastguard Worker             *--tp = codep->value;
475*3ac0a46fSAndroid Build Coastguard Worker             codep = codep->next;
476*3ac0a46fSAndroid Build Coastguard Worker         } while (--residue && codep);
477*3ac0a46fSAndroid Build Coastguard Worker         sp->dec_restart = 0;
478*3ac0a46fSAndroid Build Coastguard Worker     }
479*3ac0a46fSAndroid Build Coastguard Worker 
480*3ac0a46fSAndroid Build Coastguard Worker     bp = (uint8_t *)tif->tif_rawcp;
481*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_bitsleft += (((uint64_t)tif->tif_rawcc - sp->old_tif_rawcc) << 3);
482*3ac0a46fSAndroid Build Coastguard Worker     uint64_t dec_bitsleft = sp->dec_bitsleft;
483*3ac0a46fSAndroid Build Coastguard Worker     nbits = sp->lzw_nbits;
484*3ac0a46fSAndroid Build Coastguard Worker     nextdata = sp->lzw_nextdata;
485*3ac0a46fSAndroid Build Coastguard Worker     nextbits = sp->lzw_nextbits;
486*3ac0a46fSAndroid Build Coastguard Worker     nbitsmask = sp->dec_nbitsmask;
487*3ac0a46fSAndroid Build Coastguard Worker     oldcodep = sp->dec_oldcodep;
488*3ac0a46fSAndroid Build Coastguard Worker     free_entp = sp->dec_free_entp;
489*3ac0a46fSAndroid Build Coastguard Worker     maxcodep = sp->dec_maxcodep;
490*3ac0a46fSAndroid Build Coastguard Worker     code_t *const dec_codetab = sp->dec_codetab;
491*3ac0a46fSAndroid Build Coastguard Worker     code_t *codep;
492*3ac0a46fSAndroid Build Coastguard Worker 
493*3ac0a46fSAndroid Build Coastguard Worker     if (occ == 0)
494*3ac0a46fSAndroid Build Coastguard Worker     {
495*3ac0a46fSAndroid Build Coastguard Worker         goto after_loop;
496*3ac0a46fSAndroid Build Coastguard Worker     }
497*3ac0a46fSAndroid Build Coastguard Worker 
498*3ac0a46fSAndroid Build Coastguard Worker begin:
499*3ac0a46fSAndroid Build Coastguard Worker {
500*3ac0a46fSAndroid Build Coastguard Worker     WordType code;
501*3ac0a46fSAndroid Build Coastguard Worker     GetNextCodeLZW();
502*3ac0a46fSAndroid Build Coastguard Worker     codep = dec_codetab + code;
503*3ac0a46fSAndroid Build Coastguard Worker     if (code >= CODE_FIRST)
504*3ac0a46fSAndroid Build Coastguard Worker         goto code_above_or_equal_to_258;
505*3ac0a46fSAndroid Build Coastguard Worker     if (code < 256)
506*3ac0a46fSAndroid Build Coastguard Worker         goto code_below_256;
507*3ac0a46fSAndroid Build Coastguard Worker     if (code == CODE_EOI)
508*3ac0a46fSAndroid Build Coastguard Worker         goto after_loop;
509*3ac0a46fSAndroid Build Coastguard Worker     goto code_clear;
510*3ac0a46fSAndroid Build Coastguard Worker 
511*3ac0a46fSAndroid Build Coastguard Worker code_below_256:
512*3ac0a46fSAndroid Build Coastguard Worker {
513*3ac0a46fSAndroid Build Coastguard Worker     if (codep > free_entp)
514*3ac0a46fSAndroid Build Coastguard Worker         goto error_code;
515*3ac0a46fSAndroid Build Coastguard Worker     free_entp->next = oldcodep;
516*3ac0a46fSAndroid Build Coastguard Worker     free_entp->firstchar = oldcodep->firstchar;
517*3ac0a46fSAndroid Build Coastguard Worker     free_entp->length = oldcodep->length + 1;
518*3ac0a46fSAndroid Build Coastguard Worker     free_entp->value = (uint8_t)code;
519*3ac0a46fSAndroid Build Coastguard Worker     free_entp->repeated =
520*3ac0a46fSAndroid Build Coastguard Worker         (bool)(oldcodep->repeated & (oldcodep->value == code));
521*3ac0a46fSAndroid Build Coastguard Worker     if (++free_entp > maxcodep)
522*3ac0a46fSAndroid Build Coastguard Worker     {
523*3ac0a46fSAndroid Build Coastguard Worker         if (++nbits > BITS_MAX) /* should not happen for a conformant encoder */
524*3ac0a46fSAndroid Build Coastguard Worker             nbits = BITS_MAX;
525*3ac0a46fSAndroid Build Coastguard Worker         nbitsmask = MAXCODE(nbits);
526*3ac0a46fSAndroid Build Coastguard Worker         maxcodep = dec_codetab + nbitsmask - 1;
527*3ac0a46fSAndroid Build Coastguard Worker         if (free_entp >= &dec_codetab[CSIZE])
528*3ac0a46fSAndroid Build Coastguard Worker         {
529*3ac0a46fSAndroid Build Coastguard Worker             /* At that point, the next valid states are either EOI or a */
530*3ac0a46fSAndroid Build Coastguard Worker             /* CODE_CLEAR. If a regular code is read, at the next */
531*3ac0a46fSAndroid Build Coastguard Worker             /* attempt at registering a new entry, we will error out */
532*3ac0a46fSAndroid Build Coastguard Worker             /* due to setting free_entp before any valid code */
533*3ac0a46fSAndroid Build Coastguard Worker             free_entp = dec_codetab - 1;
534*3ac0a46fSAndroid Build Coastguard Worker         }
535*3ac0a46fSAndroid Build Coastguard Worker     }
536*3ac0a46fSAndroid Build Coastguard Worker     oldcodep = codep;
537*3ac0a46fSAndroid Build Coastguard Worker     *op++ = (uint8_t)code;
538*3ac0a46fSAndroid Build Coastguard Worker     occ--;
539*3ac0a46fSAndroid Build Coastguard Worker     if (occ == 0)
540*3ac0a46fSAndroid Build Coastguard Worker         goto after_loop;
541*3ac0a46fSAndroid Build Coastguard Worker     goto begin;
542*3ac0a46fSAndroid Build Coastguard Worker }
543*3ac0a46fSAndroid Build Coastguard Worker 
544*3ac0a46fSAndroid Build Coastguard Worker code_above_or_equal_to_258:
545*3ac0a46fSAndroid Build Coastguard Worker {
546*3ac0a46fSAndroid Build Coastguard Worker     /*
547*3ac0a46fSAndroid Build Coastguard Worker      * Add the new entry to the code table.
548*3ac0a46fSAndroid Build Coastguard Worker      */
549*3ac0a46fSAndroid Build Coastguard Worker 
550*3ac0a46fSAndroid Build Coastguard Worker     if (codep >= free_entp)
551*3ac0a46fSAndroid Build Coastguard Worker     {
552*3ac0a46fSAndroid Build Coastguard Worker         if (codep != free_entp)
553*3ac0a46fSAndroid Build Coastguard Worker             goto error_code;
554*3ac0a46fSAndroid Build Coastguard Worker         free_entp->value = oldcodep->firstchar;
555*3ac0a46fSAndroid Build Coastguard Worker     }
556*3ac0a46fSAndroid Build Coastguard Worker     else
557*3ac0a46fSAndroid Build Coastguard Worker     {
558*3ac0a46fSAndroid Build Coastguard Worker         free_entp->value = codep->firstchar;
559*3ac0a46fSAndroid Build Coastguard Worker     }
560*3ac0a46fSAndroid Build Coastguard Worker     free_entp->repeated =
561*3ac0a46fSAndroid Build Coastguard Worker         (bool)(oldcodep->repeated & (oldcodep->value == free_entp->value));
562*3ac0a46fSAndroid Build Coastguard Worker     free_entp->next = oldcodep;
563*3ac0a46fSAndroid Build Coastguard Worker 
564*3ac0a46fSAndroid Build Coastguard Worker     free_entp->firstchar = oldcodep->firstchar;
565*3ac0a46fSAndroid Build Coastguard Worker     free_entp->length = oldcodep->length + 1;
566*3ac0a46fSAndroid Build Coastguard Worker     if (++free_entp > maxcodep)
567*3ac0a46fSAndroid Build Coastguard Worker     {
568*3ac0a46fSAndroid Build Coastguard Worker         if (++nbits > BITS_MAX) /* should not happen for a conformant encoder */
569*3ac0a46fSAndroid Build Coastguard Worker             nbits = BITS_MAX;
570*3ac0a46fSAndroid Build Coastguard Worker         nbitsmask = MAXCODE(nbits);
571*3ac0a46fSAndroid Build Coastguard Worker         maxcodep = dec_codetab + nbitsmask - 1;
572*3ac0a46fSAndroid Build Coastguard Worker         if (free_entp >= &dec_codetab[CSIZE])
573*3ac0a46fSAndroid Build Coastguard Worker         {
574*3ac0a46fSAndroid Build Coastguard Worker             /* At that point, the next valid states are either EOI or a */
575*3ac0a46fSAndroid Build Coastguard Worker             /* CODE_CLEAR. If a regular code is read, at the next */
576*3ac0a46fSAndroid Build Coastguard Worker             /* attempt at registering a new entry, we will error out */
577*3ac0a46fSAndroid Build Coastguard Worker             /* due to setting free_entp before any valid code */
578*3ac0a46fSAndroid Build Coastguard Worker             free_entp = dec_codetab - 1;
579*3ac0a46fSAndroid Build Coastguard Worker         }
580*3ac0a46fSAndroid Build Coastguard Worker     }
581*3ac0a46fSAndroid Build Coastguard Worker     oldcodep = codep;
582*3ac0a46fSAndroid Build Coastguard Worker 
583*3ac0a46fSAndroid Build Coastguard Worker     /*
584*3ac0a46fSAndroid Build Coastguard Worker      * Code maps to a string, copy string
585*3ac0a46fSAndroid Build Coastguard Worker      * value to output (written in reverse).
586*3ac0a46fSAndroid Build Coastguard Worker      */
587*3ac0a46fSAndroid Build Coastguard Worker     /* tiny bit faster on x86_64 to store in unsigned short than int */
588*3ac0a46fSAndroid Build Coastguard Worker     unsigned short len = codep->length;
589*3ac0a46fSAndroid Build Coastguard Worker 
590*3ac0a46fSAndroid Build Coastguard Worker     if (len < 3) /* equivalent to len == 2 given all other conditions */
591*3ac0a46fSAndroid Build Coastguard Worker     {
592*3ac0a46fSAndroid Build Coastguard Worker         if (occ <= 2)
593*3ac0a46fSAndroid Build Coastguard Worker         {
594*3ac0a46fSAndroid Build Coastguard Worker             if (occ == 2)
595*3ac0a46fSAndroid Build Coastguard Worker             {
596*3ac0a46fSAndroid Build Coastguard Worker                 memcpy(op, &(codep->firstchar), 2);
597*3ac0a46fSAndroid Build Coastguard Worker                 op += 2;
598*3ac0a46fSAndroid Build Coastguard Worker                 occ -= 2;
599*3ac0a46fSAndroid Build Coastguard Worker                 goto after_loop;
600*3ac0a46fSAndroid Build Coastguard Worker             }
601*3ac0a46fSAndroid Build Coastguard Worker             goto too_short_buffer;
602*3ac0a46fSAndroid Build Coastguard Worker         }
603*3ac0a46fSAndroid Build Coastguard Worker 
604*3ac0a46fSAndroid Build Coastguard Worker         memcpy(op, &(codep->firstchar), 2);
605*3ac0a46fSAndroid Build Coastguard Worker         op += 2;
606*3ac0a46fSAndroid Build Coastguard Worker         occ -= 2;
607*3ac0a46fSAndroid Build Coastguard Worker         goto begin; /* we can save the comparison occ > 0 */
608*3ac0a46fSAndroid Build Coastguard Worker     }
609*3ac0a46fSAndroid Build Coastguard Worker 
610*3ac0a46fSAndroid Build Coastguard Worker     if (len == 3)
611*3ac0a46fSAndroid Build Coastguard Worker     {
612*3ac0a46fSAndroid Build Coastguard Worker         if (occ <= 3)
613*3ac0a46fSAndroid Build Coastguard Worker         {
614*3ac0a46fSAndroid Build Coastguard Worker             if (occ == 3)
615*3ac0a46fSAndroid Build Coastguard Worker             {
616*3ac0a46fSAndroid Build Coastguard Worker                 op[0] = codep->firstchar;
617*3ac0a46fSAndroid Build Coastguard Worker                 op[1] = codep->next->value;
618*3ac0a46fSAndroid Build Coastguard Worker                 op[2] = codep->value;
619*3ac0a46fSAndroid Build Coastguard Worker                 op += 3;
620*3ac0a46fSAndroid Build Coastguard Worker                 occ -= 3;
621*3ac0a46fSAndroid Build Coastguard Worker                 goto after_loop;
622*3ac0a46fSAndroid Build Coastguard Worker             }
623*3ac0a46fSAndroid Build Coastguard Worker             goto too_short_buffer;
624*3ac0a46fSAndroid Build Coastguard Worker         }
625*3ac0a46fSAndroid Build Coastguard Worker 
626*3ac0a46fSAndroid Build Coastguard Worker         op[0] = codep->firstchar;
627*3ac0a46fSAndroid Build Coastguard Worker         op[1] = codep->next->value;
628*3ac0a46fSAndroid Build Coastguard Worker         op[2] = codep->value;
629*3ac0a46fSAndroid Build Coastguard Worker         op += 3;
630*3ac0a46fSAndroid Build Coastguard Worker         occ -= 3;
631*3ac0a46fSAndroid Build Coastguard Worker         goto begin; /* we can save the comparison occ > 0 */
632*3ac0a46fSAndroid Build Coastguard Worker     }
633*3ac0a46fSAndroid Build Coastguard Worker 
634*3ac0a46fSAndroid Build Coastguard Worker     if (len > occ)
635*3ac0a46fSAndroid Build Coastguard Worker     {
636*3ac0a46fSAndroid Build Coastguard Worker         goto too_short_buffer;
637*3ac0a46fSAndroid Build Coastguard Worker     }
638*3ac0a46fSAndroid Build Coastguard Worker 
639*3ac0a46fSAndroid Build Coastguard Worker     if (codep->repeated)
640*3ac0a46fSAndroid Build Coastguard Worker     {
641*3ac0a46fSAndroid Build Coastguard Worker         memset(op, codep->value, len);
642*3ac0a46fSAndroid Build Coastguard Worker         op += len;
643*3ac0a46fSAndroid Build Coastguard Worker         occ -= len;
644*3ac0a46fSAndroid Build Coastguard Worker         if (occ == 0)
645*3ac0a46fSAndroid Build Coastguard Worker             goto after_loop;
646*3ac0a46fSAndroid Build Coastguard Worker         goto begin;
647*3ac0a46fSAndroid Build Coastguard Worker     }
648*3ac0a46fSAndroid Build Coastguard Worker 
649*3ac0a46fSAndroid Build Coastguard Worker     uint8_t *tp = op + len;
650*3ac0a46fSAndroid Build Coastguard Worker 
651*3ac0a46fSAndroid Build Coastguard Worker     assert(len >= 4);
652*3ac0a46fSAndroid Build Coastguard Worker 
653*3ac0a46fSAndroid Build Coastguard Worker     *--tp = codep->value;
654*3ac0a46fSAndroid Build Coastguard Worker     codep = codep->next;
655*3ac0a46fSAndroid Build Coastguard Worker     *--tp = codep->value;
656*3ac0a46fSAndroid Build Coastguard Worker     codep = codep->next;
657*3ac0a46fSAndroid Build Coastguard Worker     *--tp = codep->value;
658*3ac0a46fSAndroid Build Coastguard Worker     codep = codep->next;
659*3ac0a46fSAndroid Build Coastguard Worker     *--tp = codep->value;
660*3ac0a46fSAndroid Build Coastguard Worker     if (tp > op)
661*3ac0a46fSAndroid Build Coastguard Worker     {
662*3ac0a46fSAndroid Build Coastguard Worker         do
663*3ac0a46fSAndroid Build Coastguard Worker         {
664*3ac0a46fSAndroid Build Coastguard Worker             codep = codep->next;
665*3ac0a46fSAndroid Build Coastguard Worker             *--tp = codep->value;
666*3ac0a46fSAndroid Build Coastguard Worker         } while (tp > op);
667*3ac0a46fSAndroid Build Coastguard Worker     }
668*3ac0a46fSAndroid Build Coastguard Worker 
669*3ac0a46fSAndroid Build Coastguard Worker     assert(occ >= len);
670*3ac0a46fSAndroid Build Coastguard Worker     op += len;
671*3ac0a46fSAndroid Build Coastguard Worker     occ -= len;
672*3ac0a46fSAndroid Build Coastguard Worker     if (occ == 0)
673*3ac0a46fSAndroid Build Coastguard Worker         goto after_loop;
674*3ac0a46fSAndroid Build Coastguard Worker     goto begin;
675*3ac0a46fSAndroid Build Coastguard Worker }
676*3ac0a46fSAndroid Build Coastguard Worker 
677*3ac0a46fSAndroid Build Coastguard Worker code_clear:
678*3ac0a46fSAndroid Build Coastguard Worker {
679*3ac0a46fSAndroid Build Coastguard Worker     free_entp = dec_codetab + CODE_FIRST;
680*3ac0a46fSAndroid Build Coastguard Worker     nbits = BITS_MIN;
681*3ac0a46fSAndroid Build Coastguard Worker     nbitsmask = MAXCODE(BITS_MIN);
682*3ac0a46fSAndroid Build Coastguard Worker     maxcodep = dec_codetab + nbitsmask - 1;
683*3ac0a46fSAndroid Build Coastguard Worker     do
684*3ac0a46fSAndroid Build Coastguard Worker     {
685*3ac0a46fSAndroid Build Coastguard Worker         GetNextCodeLZW();
686*3ac0a46fSAndroid Build Coastguard Worker     } while (code == CODE_CLEAR); /* consecutive CODE_CLEAR codes */
687*3ac0a46fSAndroid Build Coastguard Worker     if (code == CODE_EOI)
688*3ac0a46fSAndroid Build Coastguard Worker         goto after_loop;
689*3ac0a46fSAndroid Build Coastguard Worker     if (code > CODE_EOI)
690*3ac0a46fSAndroid Build Coastguard Worker     {
691*3ac0a46fSAndroid Build Coastguard Worker         goto error_code;
692*3ac0a46fSAndroid Build Coastguard Worker     }
693*3ac0a46fSAndroid Build Coastguard Worker     *op++ = (uint8_t)code;
694*3ac0a46fSAndroid Build Coastguard Worker     occ--;
695*3ac0a46fSAndroid Build Coastguard Worker     oldcodep = dec_codetab + code;
696*3ac0a46fSAndroid Build Coastguard Worker     if (occ == 0)
697*3ac0a46fSAndroid Build Coastguard Worker         goto after_loop;
698*3ac0a46fSAndroid Build Coastguard Worker     goto begin;
699*3ac0a46fSAndroid Build Coastguard Worker }
700*3ac0a46fSAndroid Build Coastguard Worker }
701*3ac0a46fSAndroid Build Coastguard Worker 
702*3ac0a46fSAndroid Build Coastguard Worker too_short_buffer:
703*3ac0a46fSAndroid Build Coastguard Worker {
704*3ac0a46fSAndroid Build Coastguard Worker     /*
705*3ac0a46fSAndroid Build Coastguard Worker      * String is too long for decode buffer,
706*3ac0a46fSAndroid Build Coastguard Worker      * locate portion that will fit, copy to
707*3ac0a46fSAndroid Build Coastguard Worker      * the decode buffer, and setup restart
708*3ac0a46fSAndroid Build Coastguard Worker      * logic for the next decoding call.
709*3ac0a46fSAndroid Build Coastguard Worker      */
710*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_codep = codep;
711*3ac0a46fSAndroid Build Coastguard Worker     do
712*3ac0a46fSAndroid Build Coastguard Worker     {
713*3ac0a46fSAndroid Build Coastguard Worker         codep = codep->next;
714*3ac0a46fSAndroid Build Coastguard Worker     } while (codep->length > occ);
715*3ac0a46fSAndroid Build Coastguard Worker 
716*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_restart = occ;
717*3ac0a46fSAndroid Build Coastguard Worker     uint8_t *tp = op + occ;
718*3ac0a46fSAndroid Build Coastguard Worker     do
719*3ac0a46fSAndroid Build Coastguard Worker     {
720*3ac0a46fSAndroid Build Coastguard Worker         *--tp = codep->value;
721*3ac0a46fSAndroid Build Coastguard Worker         codep = codep->next;
722*3ac0a46fSAndroid Build Coastguard Worker     } while (--occ);
723*3ac0a46fSAndroid Build Coastguard Worker }
724*3ac0a46fSAndroid Build Coastguard Worker 
725*3ac0a46fSAndroid Build Coastguard Worker after_loop:
726*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_rawcc -= (tmsize_t)((uint8_t *)bp - tif->tif_rawcp);
727*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_rawcp = (uint8_t *)bp;
728*3ac0a46fSAndroid Build Coastguard Worker     sp->old_tif_rawcc = tif->tif_rawcc;
729*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_bitsleft = dec_bitsleft;
730*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_nbits = (unsigned short)nbits;
731*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_nextdata = nextdata;
732*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_nextbits = nextbits;
733*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_nbitsmask = nbitsmask;
734*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_oldcodep = oldcodep;
735*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_free_entp = free_entp;
736*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_maxcodep = maxcodep;
737*3ac0a46fSAndroid Build Coastguard Worker 
738*3ac0a46fSAndroid Build Coastguard Worker     if (occ > 0)
739*3ac0a46fSAndroid Build Coastguard Worker     {
740*3ac0a46fSAndroid Build Coastguard Worker         TIFFErrorExtR(tif, module,
741*3ac0a46fSAndroid Build Coastguard Worker                       "Not enough data at scanline %" PRIu32 " (short %" PRIu64
742*3ac0a46fSAndroid Build Coastguard Worker                       " bytes)",
743*3ac0a46fSAndroid Build Coastguard Worker                       tif->tif_row, (uint64_t)occ);
744*3ac0a46fSAndroid Build Coastguard Worker         return (0);
745*3ac0a46fSAndroid Build Coastguard Worker     }
746*3ac0a46fSAndroid Build Coastguard Worker     return (1);
747*3ac0a46fSAndroid Build Coastguard Worker 
748*3ac0a46fSAndroid Build Coastguard Worker no_eoi:
749*3ac0a46fSAndroid Build Coastguard Worker     sp->read_error = 1;
750*3ac0a46fSAndroid Build Coastguard Worker     TIFFErrorExtR(tif, module,
751*3ac0a46fSAndroid Build Coastguard Worker                   "LZWDecode: Strip %" PRIu32 " not terminated with EOI code",
752*3ac0a46fSAndroid Build Coastguard Worker                   tif->tif_curstrip);
753*3ac0a46fSAndroid Build Coastguard Worker     return 0;
754*3ac0a46fSAndroid Build Coastguard Worker error_code:
755*3ac0a46fSAndroid Build Coastguard Worker     sp->read_error = 1;
756*3ac0a46fSAndroid Build Coastguard Worker     TIFFErrorExtR(tif, tif->tif_name, "Using code not yet in table");
757*3ac0a46fSAndroid Build Coastguard Worker     return 0;
758*3ac0a46fSAndroid Build Coastguard Worker }
759*3ac0a46fSAndroid Build Coastguard Worker 
760*3ac0a46fSAndroid Build Coastguard Worker #ifdef LZW_COMPAT
761*3ac0a46fSAndroid Build Coastguard Worker 
762*3ac0a46fSAndroid Build Coastguard Worker /*
763*3ac0a46fSAndroid Build Coastguard Worker  * This check shouldn't be necessary because each
764*3ac0a46fSAndroid Build Coastguard Worker  * strip is suppose to be terminated with CODE_EOI.
765*3ac0a46fSAndroid Build Coastguard Worker  */
766*3ac0a46fSAndroid Build Coastguard Worker #define NextCode(_tif, _sp, _bp, _code, _get, dec_bitsleft)                    \
767*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
768*3ac0a46fSAndroid Build Coastguard Worker         if (dec_bitsleft < (uint64_t)nbits)                                    \
769*3ac0a46fSAndroid Build Coastguard Worker         {                                                                      \
770*3ac0a46fSAndroid Build Coastguard Worker             TIFFWarningExtR(_tif, module,                                      \
771*3ac0a46fSAndroid Build Coastguard Worker                             "LZWDecode: Strip %" PRIu32                        \
772*3ac0a46fSAndroid Build Coastguard Worker                             " not terminated with EOI code",                   \
773*3ac0a46fSAndroid Build Coastguard Worker                             _tif->tif_curstrip);                               \
774*3ac0a46fSAndroid Build Coastguard Worker             _code = CODE_EOI;                                                  \
775*3ac0a46fSAndroid Build Coastguard Worker         }                                                                      \
776*3ac0a46fSAndroid Build Coastguard Worker         else                                                                   \
777*3ac0a46fSAndroid Build Coastguard Worker         {                                                                      \
778*3ac0a46fSAndroid Build Coastguard Worker             _get(_sp, _bp, _code);                                             \
779*3ac0a46fSAndroid Build Coastguard Worker             dec_bitsleft -= nbits;                                             \
780*3ac0a46fSAndroid Build Coastguard Worker         }                                                                      \
781*3ac0a46fSAndroid Build Coastguard Worker     }
782*3ac0a46fSAndroid Build Coastguard Worker 
783*3ac0a46fSAndroid Build Coastguard Worker /*
784*3ac0a46fSAndroid Build Coastguard Worker  * Decode a "hunk of data" for old images.
785*3ac0a46fSAndroid Build Coastguard Worker  */
786*3ac0a46fSAndroid Build Coastguard Worker #define GetNextCodeCompat(sp, bp, code)                                        \
787*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
788*3ac0a46fSAndroid Build Coastguard Worker         nextdata |= (unsigned long)*(bp)++ << nextbits;                        \
789*3ac0a46fSAndroid Build Coastguard Worker         nextbits += 8;                                                         \
790*3ac0a46fSAndroid Build Coastguard Worker         if (nextbits < nbits)                                                  \
791*3ac0a46fSAndroid Build Coastguard Worker         {                                                                      \
792*3ac0a46fSAndroid Build Coastguard Worker             nextdata |= (unsigned long)*(bp)++ << nextbits;                    \
793*3ac0a46fSAndroid Build Coastguard Worker             nextbits += 8;                                                     \
794*3ac0a46fSAndroid Build Coastguard Worker         }                                                                      \
795*3ac0a46fSAndroid Build Coastguard Worker         code = (hcode_t)(nextdata & nbitsmask);                                \
796*3ac0a46fSAndroid Build Coastguard Worker         nextdata >>= nbits;                                                    \
797*3ac0a46fSAndroid Build Coastguard Worker         nextbits -= nbits;                                                     \
798*3ac0a46fSAndroid Build Coastguard Worker     }
799*3ac0a46fSAndroid Build Coastguard Worker 
LZWDecodeCompat(TIFF * tif,uint8_t * op0,tmsize_t occ0,uint16_t s)800*3ac0a46fSAndroid Build Coastguard Worker static int LZWDecodeCompat(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s)
801*3ac0a46fSAndroid Build Coastguard Worker {
802*3ac0a46fSAndroid Build Coastguard Worker     static const char module[] = "LZWDecodeCompat";
803*3ac0a46fSAndroid Build Coastguard Worker     LZWCodecState *sp = DecoderState(tif);
804*3ac0a46fSAndroid Build Coastguard Worker     uint8_t *op = (uint8_t *)op0;
805*3ac0a46fSAndroid Build Coastguard Worker     tmsize_t occ = occ0;
806*3ac0a46fSAndroid Build Coastguard Worker     uint8_t *tp;
807*3ac0a46fSAndroid Build Coastguard Worker     uint8_t *bp;
808*3ac0a46fSAndroid Build Coastguard Worker     int code, nbits;
809*3ac0a46fSAndroid Build Coastguard Worker     int len;
810*3ac0a46fSAndroid Build Coastguard Worker     long nextbits, nbitsmask;
811*3ac0a46fSAndroid Build Coastguard Worker     WordType nextdata;
812*3ac0a46fSAndroid Build Coastguard Worker     code_t *codep, *free_entp, *maxcodep, *oldcodep;
813*3ac0a46fSAndroid Build Coastguard Worker 
814*3ac0a46fSAndroid Build Coastguard Worker     (void)s;
815*3ac0a46fSAndroid Build Coastguard Worker     assert(sp != NULL);
816*3ac0a46fSAndroid Build Coastguard Worker 
817*3ac0a46fSAndroid Build Coastguard Worker     /*
818*3ac0a46fSAndroid Build Coastguard Worker      * Restart interrupted output operation.
819*3ac0a46fSAndroid Build Coastguard Worker      */
820*3ac0a46fSAndroid Build Coastguard Worker     if (sp->dec_restart)
821*3ac0a46fSAndroid Build Coastguard Worker     {
822*3ac0a46fSAndroid Build Coastguard Worker         tmsize_t residue;
823*3ac0a46fSAndroid Build Coastguard Worker 
824*3ac0a46fSAndroid Build Coastguard Worker         codep = sp->dec_codep;
825*3ac0a46fSAndroid Build Coastguard Worker         residue = codep->length - sp->dec_restart;
826*3ac0a46fSAndroid Build Coastguard Worker         if (residue > occ)
827*3ac0a46fSAndroid Build Coastguard Worker         {
828*3ac0a46fSAndroid Build Coastguard Worker             /*
829*3ac0a46fSAndroid Build Coastguard Worker              * Residue from previous decode is sufficient
830*3ac0a46fSAndroid Build Coastguard Worker              * to satisfy decode request.  Skip to the
831*3ac0a46fSAndroid Build Coastguard Worker              * start of the decoded string, place decoded
832*3ac0a46fSAndroid Build Coastguard Worker              * values in the output buffer, and return.
833*3ac0a46fSAndroid Build Coastguard Worker              */
834*3ac0a46fSAndroid Build Coastguard Worker             sp->dec_restart += occ;
835*3ac0a46fSAndroid Build Coastguard Worker             do
836*3ac0a46fSAndroid Build Coastguard Worker             {
837*3ac0a46fSAndroid Build Coastguard Worker                 codep = codep->next;
838*3ac0a46fSAndroid Build Coastguard Worker             } while (--residue > occ);
839*3ac0a46fSAndroid Build Coastguard Worker             tp = op + occ;
840*3ac0a46fSAndroid Build Coastguard Worker             do
841*3ac0a46fSAndroid Build Coastguard Worker             {
842*3ac0a46fSAndroid Build Coastguard Worker                 *--tp = codep->value;
843*3ac0a46fSAndroid Build Coastguard Worker                 codep = codep->next;
844*3ac0a46fSAndroid Build Coastguard Worker             } while (--occ);
845*3ac0a46fSAndroid Build Coastguard Worker             return (1);
846*3ac0a46fSAndroid Build Coastguard Worker         }
847*3ac0a46fSAndroid Build Coastguard Worker         /*
848*3ac0a46fSAndroid Build Coastguard Worker          * Residue satisfies only part of the decode request.
849*3ac0a46fSAndroid Build Coastguard Worker          */
850*3ac0a46fSAndroid Build Coastguard Worker         op += residue;
851*3ac0a46fSAndroid Build Coastguard Worker         occ -= residue;
852*3ac0a46fSAndroid Build Coastguard Worker         tp = op;
853*3ac0a46fSAndroid Build Coastguard Worker         do
854*3ac0a46fSAndroid Build Coastguard Worker         {
855*3ac0a46fSAndroid Build Coastguard Worker             *--tp = codep->value;
856*3ac0a46fSAndroid Build Coastguard Worker             codep = codep->next;
857*3ac0a46fSAndroid Build Coastguard Worker         } while (--residue);
858*3ac0a46fSAndroid Build Coastguard Worker         sp->dec_restart = 0;
859*3ac0a46fSAndroid Build Coastguard Worker     }
860*3ac0a46fSAndroid Build Coastguard Worker 
861*3ac0a46fSAndroid Build Coastguard Worker     bp = (uint8_t *)tif->tif_rawcp;
862*3ac0a46fSAndroid Build Coastguard Worker 
863*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_bitsleft += (((uint64_t)tif->tif_rawcc - sp->old_tif_rawcc) << 3);
864*3ac0a46fSAndroid Build Coastguard Worker     uint64_t dec_bitsleft = sp->dec_bitsleft;
865*3ac0a46fSAndroid Build Coastguard Worker 
866*3ac0a46fSAndroid Build Coastguard Worker     nbits = sp->lzw_nbits;
867*3ac0a46fSAndroid Build Coastguard Worker     nextdata = sp->lzw_nextdata;
868*3ac0a46fSAndroid Build Coastguard Worker     nextbits = sp->lzw_nextbits;
869*3ac0a46fSAndroid Build Coastguard Worker     nbitsmask = sp->dec_nbitsmask;
870*3ac0a46fSAndroid Build Coastguard Worker     oldcodep = sp->dec_oldcodep;
871*3ac0a46fSAndroid Build Coastguard Worker     free_entp = sp->dec_free_entp;
872*3ac0a46fSAndroid Build Coastguard Worker     maxcodep = sp->dec_maxcodep;
873*3ac0a46fSAndroid Build Coastguard Worker 
874*3ac0a46fSAndroid Build Coastguard Worker     while (occ > 0)
875*3ac0a46fSAndroid Build Coastguard Worker     {
876*3ac0a46fSAndroid Build Coastguard Worker         NextCode(tif, sp, bp, code, GetNextCodeCompat, dec_bitsleft);
877*3ac0a46fSAndroid Build Coastguard Worker         if (code == CODE_EOI)
878*3ac0a46fSAndroid Build Coastguard Worker             break;
879*3ac0a46fSAndroid Build Coastguard Worker         if (code == CODE_CLEAR)
880*3ac0a46fSAndroid Build Coastguard Worker         {
881*3ac0a46fSAndroid Build Coastguard Worker             do
882*3ac0a46fSAndroid Build Coastguard Worker             {
883*3ac0a46fSAndroid Build Coastguard Worker                 free_entp = sp->dec_codetab + CODE_FIRST;
884*3ac0a46fSAndroid Build Coastguard Worker                 _TIFFmemset(free_entp, 0,
885*3ac0a46fSAndroid Build Coastguard Worker                             (CSIZE - CODE_FIRST) * sizeof(code_t));
886*3ac0a46fSAndroid Build Coastguard Worker                 nbits = BITS_MIN;
887*3ac0a46fSAndroid Build Coastguard Worker                 nbitsmask = MAXCODE(BITS_MIN);
888*3ac0a46fSAndroid Build Coastguard Worker                 maxcodep = sp->dec_codetab + nbitsmask;
889*3ac0a46fSAndroid Build Coastguard Worker                 NextCode(tif, sp, bp, code, GetNextCodeCompat, dec_bitsleft);
890*3ac0a46fSAndroid Build Coastguard Worker             } while (code == CODE_CLEAR); /* consecutive CODE_CLEAR codes */
891*3ac0a46fSAndroid Build Coastguard Worker             if (code == CODE_EOI)
892*3ac0a46fSAndroid Build Coastguard Worker                 break;
893*3ac0a46fSAndroid Build Coastguard Worker             if (code > CODE_CLEAR)
894*3ac0a46fSAndroid Build Coastguard Worker             {
895*3ac0a46fSAndroid Build Coastguard Worker                 TIFFErrorExtR(
896*3ac0a46fSAndroid Build Coastguard Worker                     tif, tif->tif_name,
897*3ac0a46fSAndroid Build Coastguard Worker                     "LZWDecode: Corrupted LZW table at scanline %" PRIu32,
898*3ac0a46fSAndroid Build Coastguard Worker                     tif->tif_row);
899*3ac0a46fSAndroid Build Coastguard Worker                 return (0);
900*3ac0a46fSAndroid Build Coastguard Worker             }
901*3ac0a46fSAndroid Build Coastguard Worker             *op++ = (uint8_t)code;
902*3ac0a46fSAndroid Build Coastguard Worker             occ--;
903*3ac0a46fSAndroid Build Coastguard Worker             oldcodep = sp->dec_codetab + code;
904*3ac0a46fSAndroid Build Coastguard Worker             continue;
905*3ac0a46fSAndroid Build Coastguard Worker         }
906*3ac0a46fSAndroid Build Coastguard Worker         codep = sp->dec_codetab + code;
907*3ac0a46fSAndroid Build Coastguard Worker 
908*3ac0a46fSAndroid Build Coastguard Worker         /*
909*3ac0a46fSAndroid Build Coastguard Worker          * Add the new entry to the code table.
910*3ac0a46fSAndroid Build Coastguard Worker          */
911*3ac0a46fSAndroid Build Coastguard Worker         if (free_entp < &sp->dec_codetab[0] ||
912*3ac0a46fSAndroid Build Coastguard Worker             free_entp >= &sp->dec_codetab[CSIZE])
913*3ac0a46fSAndroid Build Coastguard Worker         {
914*3ac0a46fSAndroid Build Coastguard Worker             TIFFErrorExtR(tif, module,
915*3ac0a46fSAndroid Build Coastguard Worker                           "Corrupted LZW table at scanline %" PRIu32,
916*3ac0a46fSAndroid Build Coastguard Worker                           tif->tif_row);
917*3ac0a46fSAndroid Build Coastguard Worker             return (0);
918*3ac0a46fSAndroid Build Coastguard Worker         }
919*3ac0a46fSAndroid Build Coastguard Worker 
920*3ac0a46fSAndroid Build Coastguard Worker         free_entp->next = oldcodep;
921*3ac0a46fSAndroid Build Coastguard Worker         if (free_entp->next < &sp->dec_codetab[0] ||
922*3ac0a46fSAndroid Build Coastguard Worker             free_entp->next >= &sp->dec_codetab[CSIZE])
923*3ac0a46fSAndroid Build Coastguard Worker         {
924*3ac0a46fSAndroid Build Coastguard Worker             TIFFErrorExtR(tif, module,
925*3ac0a46fSAndroid Build Coastguard Worker                           "Corrupted LZW table at scanline %" PRIu32,
926*3ac0a46fSAndroid Build Coastguard Worker                           tif->tif_row);
927*3ac0a46fSAndroid Build Coastguard Worker             return (0);
928*3ac0a46fSAndroid Build Coastguard Worker         }
929*3ac0a46fSAndroid Build Coastguard Worker         free_entp->firstchar = free_entp->next->firstchar;
930*3ac0a46fSAndroid Build Coastguard Worker         free_entp->length = free_entp->next->length + 1;
931*3ac0a46fSAndroid Build Coastguard Worker         free_entp->value =
932*3ac0a46fSAndroid Build Coastguard Worker             (codep < free_entp) ? codep->firstchar : free_entp->firstchar;
933*3ac0a46fSAndroid Build Coastguard Worker         if (++free_entp > maxcodep)
934*3ac0a46fSAndroid Build Coastguard Worker         {
935*3ac0a46fSAndroid Build Coastguard Worker             if (++nbits > BITS_MAX) /* should not happen */
936*3ac0a46fSAndroid Build Coastguard Worker                 nbits = BITS_MAX;
937*3ac0a46fSAndroid Build Coastguard Worker             nbitsmask = MAXCODE(nbits);
938*3ac0a46fSAndroid Build Coastguard Worker             maxcodep = sp->dec_codetab + nbitsmask;
939*3ac0a46fSAndroid Build Coastguard Worker         }
940*3ac0a46fSAndroid Build Coastguard Worker         oldcodep = codep;
941*3ac0a46fSAndroid Build Coastguard Worker         if (code >= 256)
942*3ac0a46fSAndroid Build Coastguard Worker         {
943*3ac0a46fSAndroid Build Coastguard Worker             /*
944*3ac0a46fSAndroid Build Coastguard Worker              * Code maps to a string, copy string
945*3ac0a46fSAndroid Build Coastguard Worker              * value to output (written in reverse).
946*3ac0a46fSAndroid Build Coastguard Worker              */
947*3ac0a46fSAndroid Build Coastguard Worker             if (codep->length == 0)
948*3ac0a46fSAndroid Build Coastguard Worker             {
949*3ac0a46fSAndroid Build Coastguard Worker                 TIFFErrorExtR(
950*3ac0a46fSAndroid Build Coastguard Worker                     tif, module,
951*3ac0a46fSAndroid Build Coastguard Worker                     "Wrong length of decoded "
952*3ac0a46fSAndroid Build Coastguard Worker                     "string: data probably corrupted at scanline %" PRIu32,
953*3ac0a46fSAndroid Build Coastguard Worker                     tif->tif_row);
954*3ac0a46fSAndroid Build Coastguard Worker                 return (0);
955*3ac0a46fSAndroid Build Coastguard Worker             }
956*3ac0a46fSAndroid Build Coastguard Worker             if (codep->length > occ)
957*3ac0a46fSAndroid Build Coastguard Worker             {
958*3ac0a46fSAndroid Build Coastguard Worker                 /*
959*3ac0a46fSAndroid Build Coastguard Worker                  * String is too long for decode buffer,
960*3ac0a46fSAndroid Build Coastguard Worker                  * locate portion that will fit, copy to
961*3ac0a46fSAndroid Build Coastguard Worker                  * the decode buffer, and setup restart
962*3ac0a46fSAndroid Build Coastguard Worker                  * logic for the next decoding call.
963*3ac0a46fSAndroid Build Coastguard Worker                  */
964*3ac0a46fSAndroid Build Coastguard Worker                 sp->dec_codep = codep;
965*3ac0a46fSAndroid Build Coastguard Worker                 do
966*3ac0a46fSAndroid Build Coastguard Worker                 {
967*3ac0a46fSAndroid Build Coastguard Worker                     codep = codep->next;
968*3ac0a46fSAndroid Build Coastguard Worker                 } while (codep->length > occ);
969*3ac0a46fSAndroid Build Coastguard Worker                 sp->dec_restart = occ;
970*3ac0a46fSAndroid Build Coastguard Worker                 tp = op + occ;
971*3ac0a46fSAndroid Build Coastguard Worker                 do
972*3ac0a46fSAndroid Build Coastguard Worker                 {
973*3ac0a46fSAndroid Build Coastguard Worker                     *--tp = codep->value;
974*3ac0a46fSAndroid Build Coastguard Worker                     codep = codep->next;
975*3ac0a46fSAndroid Build Coastguard Worker                 } while (--occ);
976*3ac0a46fSAndroid Build Coastguard Worker                 break;
977*3ac0a46fSAndroid Build Coastguard Worker             }
978*3ac0a46fSAndroid Build Coastguard Worker             len = codep->length;
979*3ac0a46fSAndroid Build Coastguard Worker             tp = op + len;
980*3ac0a46fSAndroid Build Coastguard Worker             do
981*3ac0a46fSAndroid Build Coastguard Worker             {
982*3ac0a46fSAndroid Build Coastguard Worker                 *--tp = codep->value;
983*3ac0a46fSAndroid Build Coastguard Worker                 codep = codep->next;
984*3ac0a46fSAndroid Build Coastguard Worker             } while (codep && tp > op);
985*3ac0a46fSAndroid Build Coastguard Worker             assert(occ >= len);
986*3ac0a46fSAndroid Build Coastguard Worker             op += len;
987*3ac0a46fSAndroid Build Coastguard Worker             occ -= len;
988*3ac0a46fSAndroid Build Coastguard Worker         }
989*3ac0a46fSAndroid Build Coastguard Worker         else
990*3ac0a46fSAndroid Build Coastguard Worker         {
991*3ac0a46fSAndroid Build Coastguard Worker             *op++ = (uint8_t)code;
992*3ac0a46fSAndroid Build Coastguard Worker             occ--;
993*3ac0a46fSAndroid Build Coastguard Worker         }
994*3ac0a46fSAndroid Build Coastguard Worker     }
995*3ac0a46fSAndroid Build Coastguard Worker 
996*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_rawcc -= (tmsize_t)((uint8_t *)bp - tif->tif_rawcp);
997*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_rawcp = (uint8_t *)bp;
998*3ac0a46fSAndroid Build Coastguard Worker 
999*3ac0a46fSAndroid Build Coastguard Worker     sp->old_tif_rawcc = tif->tif_rawcc;
1000*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_bitsleft = dec_bitsleft;
1001*3ac0a46fSAndroid Build Coastguard Worker 
1002*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_nbits = (unsigned short)nbits;
1003*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_nextdata = nextdata;
1004*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_nextbits = nextbits;
1005*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_nbitsmask = nbitsmask;
1006*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_oldcodep = oldcodep;
1007*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_free_entp = free_entp;
1008*3ac0a46fSAndroid Build Coastguard Worker     sp->dec_maxcodep = maxcodep;
1009*3ac0a46fSAndroid Build Coastguard Worker 
1010*3ac0a46fSAndroid Build Coastguard Worker     if (occ > 0)
1011*3ac0a46fSAndroid Build Coastguard Worker     {
1012*3ac0a46fSAndroid Build Coastguard Worker         TIFFErrorExtR(tif, module,
1013*3ac0a46fSAndroid Build Coastguard Worker                       "Not enough data at scanline %" PRIu32 " (short %" PRIu64
1014*3ac0a46fSAndroid Build Coastguard Worker                       " bytes)",
1015*3ac0a46fSAndroid Build Coastguard Worker                       tif->tif_row, (uint64_t)occ);
1016*3ac0a46fSAndroid Build Coastguard Worker         return (0);
1017*3ac0a46fSAndroid Build Coastguard Worker     }
1018*3ac0a46fSAndroid Build Coastguard Worker     return (1);
1019*3ac0a46fSAndroid Build Coastguard Worker }
1020*3ac0a46fSAndroid Build Coastguard Worker #endif /* LZW_COMPAT */
1021*3ac0a46fSAndroid Build Coastguard Worker 
1022*3ac0a46fSAndroid Build Coastguard Worker /*
1023*3ac0a46fSAndroid Build Coastguard Worker  * LZW Encoding.
1024*3ac0a46fSAndroid Build Coastguard Worker  */
1025*3ac0a46fSAndroid Build Coastguard Worker 
LZWSetupEncode(TIFF * tif)1026*3ac0a46fSAndroid Build Coastguard Worker static int LZWSetupEncode(TIFF *tif)
1027*3ac0a46fSAndroid Build Coastguard Worker {
1028*3ac0a46fSAndroid Build Coastguard Worker     static const char module[] = "LZWSetupEncode";
1029*3ac0a46fSAndroid Build Coastguard Worker     LZWCodecState *sp = EncoderState(tif);
1030*3ac0a46fSAndroid Build Coastguard Worker 
1031*3ac0a46fSAndroid Build Coastguard Worker     assert(sp != NULL);
1032*3ac0a46fSAndroid Build Coastguard Worker     sp->enc_hashtab = (hash_t *)_TIFFmallocExt(tif, HSIZE * sizeof(hash_t));
1033*3ac0a46fSAndroid Build Coastguard Worker     if (sp->enc_hashtab == NULL)
1034*3ac0a46fSAndroid Build Coastguard Worker     {
1035*3ac0a46fSAndroid Build Coastguard Worker         TIFFErrorExtR(tif, module, "No space for LZW hash table");
1036*3ac0a46fSAndroid Build Coastguard Worker         return (0);
1037*3ac0a46fSAndroid Build Coastguard Worker     }
1038*3ac0a46fSAndroid Build Coastguard Worker     return (1);
1039*3ac0a46fSAndroid Build Coastguard Worker }
1040*3ac0a46fSAndroid Build Coastguard Worker 
1041*3ac0a46fSAndroid Build Coastguard Worker /*
1042*3ac0a46fSAndroid Build Coastguard Worker  * Reset encoding state at the start of a strip.
1043*3ac0a46fSAndroid Build Coastguard Worker  */
LZWPreEncode(TIFF * tif,uint16_t s)1044*3ac0a46fSAndroid Build Coastguard Worker static int LZWPreEncode(TIFF *tif, uint16_t s)
1045*3ac0a46fSAndroid Build Coastguard Worker {
1046*3ac0a46fSAndroid Build Coastguard Worker     LZWCodecState *sp = EncoderState(tif);
1047*3ac0a46fSAndroid Build Coastguard Worker 
1048*3ac0a46fSAndroid Build Coastguard Worker     (void)s;
1049*3ac0a46fSAndroid Build Coastguard Worker     assert(sp != NULL);
1050*3ac0a46fSAndroid Build Coastguard Worker 
1051*3ac0a46fSAndroid Build Coastguard Worker     if (sp->enc_hashtab == NULL)
1052*3ac0a46fSAndroid Build Coastguard Worker     {
1053*3ac0a46fSAndroid Build Coastguard Worker         tif->tif_setupencode(tif);
1054*3ac0a46fSAndroid Build Coastguard Worker     }
1055*3ac0a46fSAndroid Build Coastguard Worker 
1056*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_nbits = BITS_MIN;
1057*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_maxcode = MAXCODE(BITS_MIN);
1058*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_free_ent = CODE_FIRST;
1059*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_nextbits = 0;
1060*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_nextdata = 0;
1061*3ac0a46fSAndroid Build Coastguard Worker     sp->enc_checkpoint = CHECK_GAP;
1062*3ac0a46fSAndroid Build Coastguard Worker     sp->enc_ratio = 0;
1063*3ac0a46fSAndroid Build Coastguard Worker     sp->enc_incount = 0;
1064*3ac0a46fSAndroid Build Coastguard Worker     sp->enc_outcount = 0;
1065*3ac0a46fSAndroid Build Coastguard Worker     /*
1066*3ac0a46fSAndroid Build Coastguard Worker      * The 4 here insures there is space for 2 max-sized
1067*3ac0a46fSAndroid Build Coastguard Worker      * codes in LZWEncode and LZWPostDecode.
1068*3ac0a46fSAndroid Build Coastguard Worker      */
1069*3ac0a46fSAndroid Build Coastguard Worker     sp->enc_rawlimit = tif->tif_rawdata + tif->tif_rawdatasize - 1 - 4;
1070*3ac0a46fSAndroid Build Coastguard Worker     cl_hash(sp);                   /* clear hash table */
1071*3ac0a46fSAndroid Build Coastguard Worker     sp->enc_oldcode = (hcode_t)-1; /* generates CODE_CLEAR in LZWEncode */
1072*3ac0a46fSAndroid Build Coastguard Worker     return (1);
1073*3ac0a46fSAndroid Build Coastguard Worker }
1074*3ac0a46fSAndroid Build Coastguard Worker 
1075*3ac0a46fSAndroid Build Coastguard Worker #define CALCRATIO(sp, rat)                                                     \
1076*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
1077*3ac0a46fSAndroid Build Coastguard Worker         if (incount > 0x007fffff)                                              \
1078*3ac0a46fSAndroid Build Coastguard Worker         { /* NB: shift will overflow */                                        \
1079*3ac0a46fSAndroid Build Coastguard Worker             rat = outcount >> 8;                                               \
1080*3ac0a46fSAndroid Build Coastguard Worker             rat = (rat == 0 ? 0x7fffffff : incount / rat);                     \
1081*3ac0a46fSAndroid Build Coastguard Worker         }                                                                      \
1082*3ac0a46fSAndroid Build Coastguard Worker         else                                                                   \
1083*3ac0a46fSAndroid Build Coastguard Worker             rat = (incount << 8) / outcount;                                   \
1084*3ac0a46fSAndroid Build Coastguard Worker     }
1085*3ac0a46fSAndroid Build Coastguard Worker 
1086*3ac0a46fSAndroid Build Coastguard Worker /* Explicit 0xff masking to make icc -check=conversions happy */
1087*3ac0a46fSAndroid Build Coastguard Worker #define PutNextCode(op, c)                                                     \
1088*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
1089*3ac0a46fSAndroid Build Coastguard Worker         nextdata = (nextdata << nbits) | c;                                    \
1090*3ac0a46fSAndroid Build Coastguard Worker         nextbits += nbits;                                                     \
1091*3ac0a46fSAndroid Build Coastguard Worker         *op++ = (unsigned char)((nextdata >> (nextbits - 8)) & 0xff);          \
1092*3ac0a46fSAndroid Build Coastguard Worker         nextbits -= 8;                                                         \
1093*3ac0a46fSAndroid Build Coastguard Worker         if (nextbits >= 8)                                                     \
1094*3ac0a46fSAndroid Build Coastguard Worker         {                                                                      \
1095*3ac0a46fSAndroid Build Coastguard Worker             *op++ = (unsigned char)((nextdata >> (nextbits - 8)) & 0xff);      \
1096*3ac0a46fSAndroid Build Coastguard Worker             nextbits -= 8;                                                     \
1097*3ac0a46fSAndroid Build Coastguard Worker         }                                                                      \
1098*3ac0a46fSAndroid Build Coastguard Worker         outcount += nbits;                                                     \
1099*3ac0a46fSAndroid Build Coastguard Worker     }
1100*3ac0a46fSAndroid Build Coastguard Worker 
1101*3ac0a46fSAndroid Build Coastguard Worker /*
1102*3ac0a46fSAndroid Build Coastguard Worker  * Encode a chunk of pixels.
1103*3ac0a46fSAndroid Build Coastguard Worker  *
1104*3ac0a46fSAndroid Build Coastguard Worker  * Uses an open addressing double hashing (no chaining) on the
1105*3ac0a46fSAndroid Build Coastguard Worker  * prefix code/next character combination.  We do a variant of
1106*3ac0a46fSAndroid Build Coastguard Worker  * Knuth's algorithm D (vol. 3, sec. 6.4) along with G. Knott's
1107*3ac0a46fSAndroid Build Coastguard Worker  * relatively-prime secondary probe.  Here, the modular division
1108*3ac0a46fSAndroid Build Coastguard Worker  * first probe is gives way to a faster exclusive-or manipulation.
1109*3ac0a46fSAndroid Build Coastguard Worker  * Also do block compression with an adaptive reset, whereby the
1110*3ac0a46fSAndroid Build Coastguard Worker  * code table is cleared when the compression ratio decreases,
1111*3ac0a46fSAndroid Build Coastguard Worker  * but after the table fills.  The variable-length output codes
1112*3ac0a46fSAndroid Build Coastguard Worker  * are re-sized at this point, and a CODE_CLEAR is generated
1113*3ac0a46fSAndroid Build Coastguard Worker  * for the decoder.
1114*3ac0a46fSAndroid Build Coastguard Worker  */
LZWEncode(TIFF * tif,uint8_t * bp,tmsize_t cc,uint16_t s)1115*3ac0a46fSAndroid Build Coastguard Worker static int LZWEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
1116*3ac0a46fSAndroid Build Coastguard Worker {
1117*3ac0a46fSAndroid Build Coastguard Worker     register LZWCodecState *sp = EncoderState(tif);
1118*3ac0a46fSAndroid Build Coastguard Worker     register long fcode;
1119*3ac0a46fSAndroid Build Coastguard Worker     register hash_t *hp;
1120*3ac0a46fSAndroid Build Coastguard Worker     register int h, c;
1121*3ac0a46fSAndroid Build Coastguard Worker     hcode_t ent;
1122*3ac0a46fSAndroid Build Coastguard Worker     long disp;
1123*3ac0a46fSAndroid Build Coastguard Worker     tmsize_t incount, outcount, checkpoint;
1124*3ac0a46fSAndroid Build Coastguard Worker     WordType nextdata;
1125*3ac0a46fSAndroid Build Coastguard Worker     long nextbits;
1126*3ac0a46fSAndroid Build Coastguard Worker     int free_ent, maxcode, nbits;
1127*3ac0a46fSAndroid Build Coastguard Worker     uint8_t *op;
1128*3ac0a46fSAndroid Build Coastguard Worker     uint8_t *limit;
1129*3ac0a46fSAndroid Build Coastguard Worker 
1130*3ac0a46fSAndroid Build Coastguard Worker     (void)s;
1131*3ac0a46fSAndroid Build Coastguard Worker     if (sp == NULL)
1132*3ac0a46fSAndroid Build Coastguard Worker         return (0);
1133*3ac0a46fSAndroid Build Coastguard Worker 
1134*3ac0a46fSAndroid Build Coastguard Worker     assert(sp->enc_hashtab != NULL);
1135*3ac0a46fSAndroid Build Coastguard Worker 
1136*3ac0a46fSAndroid Build Coastguard Worker     /*
1137*3ac0a46fSAndroid Build Coastguard Worker      * Load local state.
1138*3ac0a46fSAndroid Build Coastguard Worker      */
1139*3ac0a46fSAndroid Build Coastguard Worker     incount = sp->enc_incount;
1140*3ac0a46fSAndroid Build Coastguard Worker     outcount = sp->enc_outcount;
1141*3ac0a46fSAndroid Build Coastguard Worker     checkpoint = sp->enc_checkpoint;
1142*3ac0a46fSAndroid Build Coastguard Worker     nextdata = sp->lzw_nextdata;
1143*3ac0a46fSAndroid Build Coastguard Worker     nextbits = sp->lzw_nextbits;
1144*3ac0a46fSAndroid Build Coastguard Worker     free_ent = sp->lzw_free_ent;
1145*3ac0a46fSAndroid Build Coastguard Worker     maxcode = sp->lzw_maxcode;
1146*3ac0a46fSAndroid Build Coastguard Worker     nbits = sp->lzw_nbits;
1147*3ac0a46fSAndroid Build Coastguard Worker     op = tif->tif_rawcp;
1148*3ac0a46fSAndroid Build Coastguard Worker     limit = sp->enc_rawlimit;
1149*3ac0a46fSAndroid Build Coastguard Worker     ent = (hcode_t)sp->enc_oldcode;
1150*3ac0a46fSAndroid Build Coastguard Worker 
1151*3ac0a46fSAndroid Build Coastguard Worker     if (ent == (hcode_t)-1 && cc > 0)
1152*3ac0a46fSAndroid Build Coastguard Worker     {
1153*3ac0a46fSAndroid Build Coastguard Worker         /*
1154*3ac0a46fSAndroid Build Coastguard Worker          * NB: This is safe because it can only happen
1155*3ac0a46fSAndroid Build Coastguard Worker          *     at the start of a strip where we know there
1156*3ac0a46fSAndroid Build Coastguard Worker          *     is space in the data buffer.
1157*3ac0a46fSAndroid Build Coastguard Worker          */
1158*3ac0a46fSAndroid Build Coastguard Worker         PutNextCode(op, CODE_CLEAR);
1159*3ac0a46fSAndroid Build Coastguard Worker         ent = *bp++;
1160*3ac0a46fSAndroid Build Coastguard Worker         cc--;
1161*3ac0a46fSAndroid Build Coastguard Worker         incount++;
1162*3ac0a46fSAndroid Build Coastguard Worker     }
1163*3ac0a46fSAndroid Build Coastguard Worker     while (cc > 0)
1164*3ac0a46fSAndroid Build Coastguard Worker     {
1165*3ac0a46fSAndroid Build Coastguard Worker         c = *bp++;
1166*3ac0a46fSAndroid Build Coastguard Worker         cc--;
1167*3ac0a46fSAndroid Build Coastguard Worker         incount++;
1168*3ac0a46fSAndroid Build Coastguard Worker         fcode = ((long)c << BITS_MAX) + ent;
1169*3ac0a46fSAndroid Build Coastguard Worker         h = (c << HSHIFT) ^ ent; /* xor hashing */
1170*3ac0a46fSAndroid Build Coastguard Worker #ifdef _WINDOWS
1171*3ac0a46fSAndroid Build Coastguard Worker         /*
1172*3ac0a46fSAndroid Build Coastguard Worker          * Check hash index for an overflow.
1173*3ac0a46fSAndroid Build Coastguard Worker          */
1174*3ac0a46fSAndroid Build Coastguard Worker         if (h >= HSIZE)
1175*3ac0a46fSAndroid Build Coastguard Worker             h -= HSIZE;
1176*3ac0a46fSAndroid Build Coastguard Worker #endif
1177*3ac0a46fSAndroid Build Coastguard Worker         hp = &sp->enc_hashtab[h];
1178*3ac0a46fSAndroid Build Coastguard Worker         if (hp->hash == fcode)
1179*3ac0a46fSAndroid Build Coastguard Worker         {
1180*3ac0a46fSAndroid Build Coastguard Worker             ent = hp->code;
1181*3ac0a46fSAndroid Build Coastguard Worker             continue;
1182*3ac0a46fSAndroid Build Coastguard Worker         }
1183*3ac0a46fSAndroid Build Coastguard Worker         if (hp->hash >= 0)
1184*3ac0a46fSAndroid Build Coastguard Worker         {
1185*3ac0a46fSAndroid Build Coastguard Worker             /*
1186*3ac0a46fSAndroid Build Coastguard Worker              * Primary hash failed, check secondary hash.
1187*3ac0a46fSAndroid Build Coastguard Worker              */
1188*3ac0a46fSAndroid Build Coastguard Worker             disp = HSIZE - h;
1189*3ac0a46fSAndroid Build Coastguard Worker             if (h == 0)
1190*3ac0a46fSAndroid Build Coastguard Worker                 disp = 1;
1191*3ac0a46fSAndroid Build Coastguard Worker             do
1192*3ac0a46fSAndroid Build Coastguard Worker             {
1193*3ac0a46fSAndroid Build Coastguard Worker                 /*
1194*3ac0a46fSAndroid Build Coastguard Worker                  * Avoid pointer arithmetic because of
1195*3ac0a46fSAndroid Build Coastguard Worker                  * wraparound problems with segments.
1196*3ac0a46fSAndroid Build Coastguard Worker                  */
1197*3ac0a46fSAndroid Build Coastguard Worker                 if ((h -= disp) < 0)
1198*3ac0a46fSAndroid Build Coastguard Worker                     h += HSIZE;
1199*3ac0a46fSAndroid Build Coastguard Worker                 hp = &sp->enc_hashtab[h];
1200*3ac0a46fSAndroid Build Coastguard Worker                 if (hp->hash == fcode)
1201*3ac0a46fSAndroid Build Coastguard Worker                 {
1202*3ac0a46fSAndroid Build Coastguard Worker                     ent = hp->code;
1203*3ac0a46fSAndroid Build Coastguard Worker                     goto hit;
1204*3ac0a46fSAndroid Build Coastguard Worker                 }
1205*3ac0a46fSAndroid Build Coastguard Worker             } while (hp->hash >= 0);
1206*3ac0a46fSAndroid Build Coastguard Worker         }
1207*3ac0a46fSAndroid Build Coastguard Worker         /*
1208*3ac0a46fSAndroid Build Coastguard Worker          * New entry, emit code and add to table.
1209*3ac0a46fSAndroid Build Coastguard Worker          */
1210*3ac0a46fSAndroid Build Coastguard Worker         /*
1211*3ac0a46fSAndroid Build Coastguard Worker          * Verify there is space in the buffer for the code
1212*3ac0a46fSAndroid Build Coastguard Worker          * and any potential Clear code that might be emitted
1213*3ac0a46fSAndroid Build Coastguard Worker          * below.  The value of limit is setup so that there
1214*3ac0a46fSAndroid Build Coastguard Worker          * are at least 4 bytes free--room for 2 codes.
1215*3ac0a46fSAndroid Build Coastguard Worker          */
1216*3ac0a46fSAndroid Build Coastguard Worker         if (op > limit)
1217*3ac0a46fSAndroid Build Coastguard Worker         {
1218*3ac0a46fSAndroid Build Coastguard Worker             tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
1219*3ac0a46fSAndroid Build Coastguard Worker             if (!TIFFFlushData1(tif))
1220*3ac0a46fSAndroid Build Coastguard Worker                 return 0;
1221*3ac0a46fSAndroid Build Coastguard Worker             op = tif->tif_rawdata;
1222*3ac0a46fSAndroid Build Coastguard Worker         }
1223*3ac0a46fSAndroid Build Coastguard Worker         PutNextCode(op, ent);
1224*3ac0a46fSAndroid Build Coastguard Worker         ent = (hcode_t)c;
1225*3ac0a46fSAndroid Build Coastguard Worker         hp->code = (hcode_t)(free_ent++);
1226*3ac0a46fSAndroid Build Coastguard Worker         hp->hash = fcode;
1227*3ac0a46fSAndroid Build Coastguard Worker         if (free_ent == CODE_MAX - 1)
1228*3ac0a46fSAndroid Build Coastguard Worker         {
1229*3ac0a46fSAndroid Build Coastguard Worker             /* table is full, emit clear code and reset */
1230*3ac0a46fSAndroid Build Coastguard Worker             cl_hash(sp);
1231*3ac0a46fSAndroid Build Coastguard Worker             sp->enc_ratio = 0;
1232*3ac0a46fSAndroid Build Coastguard Worker             incount = 0;
1233*3ac0a46fSAndroid Build Coastguard Worker             outcount = 0;
1234*3ac0a46fSAndroid Build Coastguard Worker             free_ent = CODE_FIRST;
1235*3ac0a46fSAndroid Build Coastguard Worker             PutNextCode(op, CODE_CLEAR);
1236*3ac0a46fSAndroid Build Coastguard Worker             nbits = BITS_MIN;
1237*3ac0a46fSAndroid Build Coastguard Worker             maxcode = MAXCODE(BITS_MIN);
1238*3ac0a46fSAndroid Build Coastguard Worker         }
1239*3ac0a46fSAndroid Build Coastguard Worker         else
1240*3ac0a46fSAndroid Build Coastguard Worker         {
1241*3ac0a46fSAndroid Build Coastguard Worker             /*
1242*3ac0a46fSAndroid Build Coastguard Worker              * If the next entry is going to be too big for
1243*3ac0a46fSAndroid Build Coastguard Worker              * the code size, then increase it, if possible.
1244*3ac0a46fSAndroid Build Coastguard Worker              */
1245*3ac0a46fSAndroid Build Coastguard Worker             if (free_ent > maxcode)
1246*3ac0a46fSAndroid Build Coastguard Worker             {
1247*3ac0a46fSAndroid Build Coastguard Worker                 nbits++;
1248*3ac0a46fSAndroid Build Coastguard Worker                 assert(nbits <= BITS_MAX);
1249*3ac0a46fSAndroid Build Coastguard Worker                 maxcode = (int)MAXCODE(nbits);
1250*3ac0a46fSAndroid Build Coastguard Worker             }
1251*3ac0a46fSAndroid Build Coastguard Worker             else if (incount >= checkpoint)
1252*3ac0a46fSAndroid Build Coastguard Worker             {
1253*3ac0a46fSAndroid Build Coastguard Worker                 tmsize_t rat;
1254*3ac0a46fSAndroid Build Coastguard Worker                 /*
1255*3ac0a46fSAndroid Build Coastguard Worker                  * Check compression ratio and, if things seem
1256*3ac0a46fSAndroid Build Coastguard Worker                  * to be slipping, clear the hash table and
1257*3ac0a46fSAndroid Build Coastguard Worker                  * reset state.  The compression ratio is a
1258*3ac0a46fSAndroid Build Coastguard Worker                  * 24+8-bit fractional number.
1259*3ac0a46fSAndroid Build Coastguard Worker                  */
1260*3ac0a46fSAndroid Build Coastguard Worker                 checkpoint = incount + CHECK_GAP;
1261*3ac0a46fSAndroid Build Coastguard Worker                 CALCRATIO(sp, rat);
1262*3ac0a46fSAndroid Build Coastguard Worker                 if (rat <= sp->enc_ratio)
1263*3ac0a46fSAndroid Build Coastguard Worker                 {
1264*3ac0a46fSAndroid Build Coastguard Worker                     cl_hash(sp);
1265*3ac0a46fSAndroid Build Coastguard Worker                     sp->enc_ratio = 0;
1266*3ac0a46fSAndroid Build Coastguard Worker                     incount = 0;
1267*3ac0a46fSAndroid Build Coastguard Worker                     outcount = 0;
1268*3ac0a46fSAndroid Build Coastguard Worker                     free_ent = CODE_FIRST;
1269*3ac0a46fSAndroid Build Coastguard Worker                     PutNextCode(op, CODE_CLEAR);
1270*3ac0a46fSAndroid Build Coastguard Worker                     nbits = BITS_MIN;
1271*3ac0a46fSAndroid Build Coastguard Worker                     maxcode = MAXCODE(BITS_MIN);
1272*3ac0a46fSAndroid Build Coastguard Worker                 }
1273*3ac0a46fSAndroid Build Coastguard Worker                 else
1274*3ac0a46fSAndroid Build Coastguard Worker                     sp->enc_ratio = rat;
1275*3ac0a46fSAndroid Build Coastguard Worker             }
1276*3ac0a46fSAndroid Build Coastguard Worker         }
1277*3ac0a46fSAndroid Build Coastguard Worker     hit:;
1278*3ac0a46fSAndroid Build Coastguard Worker     }
1279*3ac0a46fSAndroid Build Coastguard Worker 
1280*3ac0a46fSAndroid Build Coastguard Worker     /*
1281*3ac0a46fSAndroid Build Coastguard Worker      * Restore global state.
1282*3ac0a46fSAndroid Build Coastguard Worker      */
1283*3ac0a46fSAndroid Build Coastguard Worker     sp->enc_incount = incount;
1284*3ac0a46fSAndroid Build Coastguard Worker     sp->enc_outcount = outcount;
1285*3ac0a46fSAndroid Build Coastguard Worker     sp->enc_checkpoint = checkpoint;
1286*3ac0a46fSAndroid Build Coastguard Worker     sp->enc_oldcode = ent;
1287*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_nextdata = nextdata;
1288*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_nextbits = nextbits;
1289*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_free_ent = (unsigned short)free_ent;
1290*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_maxcode = (unsigned short)maxcode;
1291*3ac0a46fSAndroid Build Coastguard Worker     sp->lzw_nbits = (unsigned short)nbits;
1292*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_rawcp = op;
1293*3ac0a46fSAndroid Build Coastguard Worker     return (1);
1294*3ac0a46fSAndroid Build Coastguard Worker }
1295*3ac0a46fSAndroid Build Coastguard Worker 
1296*3ac0a46fSAndroid Build Coastguard Worker /*
1297*3ac0a46fSAndroid Build Coastguard Worker  * Finish off an encoded strip by flushing the last
1298*3ac0a46fSAndroid Build Coastguard Worker  * string and tacking on an End Of Information code.
1299*3ac0a46fSAndroid Build Coastguard Worker  */
LZWPostEncode(TIFF * tif)1300*3ac0a46fSAndroid Build Coastguard Worker static int LZWPostEncode(TIFF *tif)
1301*3ac0a46fSAndroid Build Coastguard Worker {
1302*3ac0a46fSAndroid Build Coastguard Worker     register LZWCodecState *sp = EncoderState(tif);
1303*3ac0a46fSAndroid Build Coastguard Worker     uint8_t *op = tif->tif_rawcp;
1304*3ac0a46fSAndroid Build Coastguard Worker     long nextbits = sp->lzw_nextbits;
1305*3ac0a46fSAndroid Build Coastguard Worker     WordType nextdata = sp->lzw_nextdata;
1306*3ac0a46fSAndroid Build Coastguard Worker     tmsize_t outcount = sp->enc_outcount;
1307*3ac0a46fSAndroid Build Coastguard Worker     int nbits = sp->lzw_nbits;
1308*3ac0a46fSAndroid Build Coastguard Worker 
1309*3ac0a46fSAndroid Build Coastguard Worker     if (op > sp->enc_rawlimit)
1310*3ac0a46fSAndroid Build Coastguard Worker     {
1311*3ac0a46fSAndroid Build Coastguard Worker         tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
1312*3ac0a46fSAndroid Build Coastguard Worker         if (!TIFFFlushData1(tif))
1313*3ac0a46fSAndroid Build Coastguard Worker             return 0;
1314*3ac0a46fSAndroid Build Coastguard Worker         op = tif->tif_rawdata;
1315*3ac0a46fSAndroid Build Coastguard Worker     }
1316*3ac0a46fSAndroid Build Coastguard Worker     if (sp->enc_oldcode != (hcode_t)-1)
1317*3ac0a46fSAndroid Build Coastguard Worker     {
1318*3ac0a46fSAndroid Build Coastguard Worker         int free_ent = sp->lzw_free_ent;
1319*3ac0a46fSAndroid Build Coastguard Worker 
1320*3ac0a46fSAndroid Build Coastguard Worker         PutNextCode(op, sp->enc_oldcode);
1321*3ac0a46fSAndroid Build Coastguard Worker         sp->enc_oldcode = (hcode_t)-1;
1322*3ac0a46fSAndroid Build Coastguard Worker         free_ent++;
1323*3ac0a46fSAndroid Build Coastguard Worker 
1324*3ac0a46fSAndroid Build Coastguard Worker         if (free_ent == CODE_MAX - 1)
1325*3ac0a46fSAndroid Build Coastguard Worker         {
1326*3ac0a46fSAndroid Build Coastguard Worker             /* table is full, emit clear code and reset */
1327*3ac0a46fSAndroid Build Coastguard Worker             outcount = 0;
1328*3ac0a46fSAndroid Build Coastguard Worker             PutNextCode(op, CODE_CLEAR);
1329*3ac0a46fSAndroid Build Coastguard Worker             nbits = BITS_MIN;
1330*3ac0a46fSAndroid Build Coastguard Worker         }
1331*3ac0a46fSAndroid Build Coastguard Worker         else
1332*3ac0a46fSAndroid Build Coastguard Worker         {
1333*3ac0a46fSAndroid Build Coastguard Worker             /*
1334*3ac0a46fSAndroid Build Coastguard Worker              * If the next entry is going to be too big for
1335*3ac0a46fSAndroid Build Coastguard Worker              * the code size, then increase it, if possible.
1336*3ac0a46fSAndroid Build Coastguard Worker              */
1337*3ac0a46fSAndroid Build Coastguard Worker             if (free_ent > sp->lzw_maxcode)
1338*3ac0a46fSAndroid Build Coastguard Worker             {
1339*3ac0a46fSAndroid Build Coastguard Worker                 nbits++;
1340*3ac0a46fSAndroid Build Coastguard Worker                 assert(nbits <= BITS_MAX);
1341*3ac0a46fSAndroid Build Coastguard Worker             }
1342*3ac0a46fSAndroid Build Coastguard Worker         }
1343*3ac0a46fSAndroid Build Coastguard Worker     }
1344*3ac0a46fSAndroid Build Coastguard Worker     PutNextCode(op, CODE_EOI);
1345*3ac0a46fSAndroid Build Coastguard Worker     /* Explicit 0xff masking to make icc -check=conversions happy */
1346*3ac0a46fSAndroid Build Coastguard Worker     if (nextbits > 0)
1347*3ac0a46fSAndroid Build Coastguard Worker         *op++ = (unsigned char)((nextdata << (8 - nextbits)) & 0xff);
1348*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
1349*3ac0a46fSAndroid Build Coastguard Worker     (void)outcount;
1350*3ac0a46fSAndroid Build Coastguard Worker     return (1);
1351*3ac0a46fSAndroid Build Coastguard Worker }
1352*3ac0a46fSAndroid Build Coastguard Worker 
1353*3ac0a46fSAndroid Build Coastguard Worker /*
1354*3ac0a46fSAndroid Build Coastguard Worker  * Reset encoding hash table.
1355*3ac0a46fSAndroid Build Coastguard Worker  */
cl_hash(LZWCodecState * sp)1356*3ac0a46fSAndroid Build Coastguard Worker static void cl_hash(LZWCodecState *sp)
1357*3ac0a46fSAndroid Build Coastguard Worker {
1358*3ac0a46fSAndroid Build Coastguard Worker     register hash_t *hp = &sp->enc_hashtab[HSIZE - 1];
1359*3ac0a46fSAndroid Build Coastguard Worker     register long i = HSIZE - 8;
1360*3ac0a46fSAndroid Build Coastguard Worker 
1361*3ac0a46fSAndroid Build Coastguard Worker     do
1362*3ac0a46fSAndroid Build Coastguard Worker     {
1363*3ac0a46fSAndroid Build Coastguard Worker         i -= 8;
1364*3ac0a46fSAndroid Build Coastguard Worker         hp[-7].hash = -1;
1365*3ac0a46fSAndroid Build Coastguard Worker         hp[-6].hash = -1;
1366*3ac0a46fSAndroid Build Coastguard Worker         hp[-5].hash = -1;
1367*3ac0a46fSAndroid Build Coastguard Worker         hp[-4].hash = -1;
1368*3ac0a46fSAndroid Build Coastguard Worker         hp[-3].hash = -1;
1369*3ac0a46fSAndroid Build Coastguard Worker         hp[-2].hash = -1;
1370*3ac0a46fSAndroid Build Coastguard Worker         hp[-1].hash = -1;
1371*3ac0a46fSAndroid Build Coastguard Worker         hp[0].hash = -1;
1372*3ac0a46fSAndroid Build Coastguard Worker         hp -= 8;
1373*3ac0a46fSAndroid Build Coastguard Worker     } while (i >= 0);
1374*3ac0a46fSAndroid Build Coastguard Worker     for (i += 8; i > 0; i--, hp--)
1375*3ac0a46fSAndroid Build Coastguard Worker         hp->hash = -1;
1376*3ac0a46fSAndroid Build Coastguard Worker }
1377*3ac0a46fSAndroid Build Coastguard Worker 
LZWCleanup(TIFF * tif)1378*3ac0a46fSAndroid Build Coastguard Worker static void LZWCleanup(TIFF *tif)
1379*3ac0a46fSAndroid Build Coastguard Worker {
1380*3ac0a46fSAndroid Build Coastguard Worker     (void)TIFFPredictorCleanup(tif);
1381*3ac0a46fSAndroid Build Coastguard Worker 
1382*3ac0a46fSAndroid Build Coastguard Worker     assert(tif->tif_data != 0);
1383*3ac0a46fSAndroid Build Coastguard Worker 
1384*3ac0a46fSAndroid Build Coastguard Worker     if (DecoderState(tif)->dec_codetab)
1385*3ac0a46fSAndroid Build Coastguard Worker         _TIFFfreeExt(tif, DecoderState(tif)->dec_codetab);
1386*3ac0a46fSAndroid Build Coastguard Worker 
1387*3ac0a46fSAndroid Build Coastguard Worker     if (EncoderState(tif)->enc_hashtab)
1388*3ac0a46fSAndroid Build Coastguard Worker         _TIFFfreeExt(tif, EncoderState(tif)->enc_hashtab);
1389*3ac0a46fSAndroid Build Coastguard Worker 
1390*3ac0a46fSAndroid Build Coastguard Worker     _TIFFfreeExt(tif, tif->tif_data);
1391*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_data = NULL;
1392*3ac0a46fSAndroid Build Coastguard Worker 
1393*3ac0a46fSAndroid Build Coastguard Worker     _TIFFSetDefaultCompressionState(tif);
1394*3ac0a46fSAndroid Build Coastguard Worker }
1395*3ac0a46fSAndroid Build Coastguard Worker 
TIFFInitLZW(TIFF * tif,int scheme)1396*3ac0a46fSAndroid Build Coastguard Worker int TIFFInitLZW(TIFF *tif, int scheme)
1397*3ac0a46fSAndroid Build Coastguard Worker {
1398*3ac0a46fSAndroid Build Coastguard Worker     static const char module[] = "TIFFInitLZW";
1399*3ac0a46fSAndroid Build Coastguard Worker     (void)scheme;
1400*3ac0a46fSAndroid Build Coastguard Worker     assert(scheme == COMPRESSION_LZW);
1401*3ac0a46fSAndroid Build Coastguard Worker     /*
1402*3ac0a46fSAndroid Build Coastguard Worker      * Allocate state block so tag methods have storage to record values.
1403*3ac0a46fSAndroid Build Coastguard Worker      */
1404*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(LZWCodecState));
1405*3ac0a46fSAndroid Build Coastguard Worker     if (tif->tif_data == NULL)
1406*3ac0a46fSAndroid Build Coastguard Worker         goto bad;
1407*3ac0a46fSAndroid Build Coastguard Worker     DecoderState(tif)->dec_codetab = NULL;
1408*3ac0a46fSAndroid Build Coastguard Worker     DecoderState(tif)->dec_decode = NULL;
1409*3ac0a46fSAndroid Build Coastguard Worker     EncoderState(tif)->enc_hashtab = NULL;
1410*3ac0a46fSAndroid Build Coastguard Worker     LZWState(tif)->rw_mode = tif->tif_mode;
1411*3ac0a46fSAndroid Build Coastguard Worker 
1412*3ac0a46fSAndroid Build Coastguard Worker     /*
1413*3ac0a46fSAndroid Build Coastguard Worker      * Install codec methods.
1414*3ac0a46fSAndroid Build Coastguard Worker      */
1415*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_fixuptags = LZWFixupTags;
1416*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_setupdecode = LZWSetupDecode;
1417*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_predecode = LZWPreDecode;
1418*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_decoderow = LZWDecode;
1419*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_decodestrip = LZWDecode;
1420*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_decodetile = LZWDecode;
1421*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_setupencode = LZWSetupEncode;
1422*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_preencode = LZWPreEncode;
1423*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_postencode = LZWPostEncode;
1424*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_encoderow = LZWEncode;
1425*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_encodestrip = LZWEncode;
1426*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_encodetile = LZWEncode;
1427*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_cleanup = LZWCleanup;
1428*3ac0a46fSAndroid Build Coastguard Worker     /*
1429*3ac0a46fSAndroid Build Coastguard Worker      * Setup predictor setup.
1430*3ac0a46fSAndroid Build Coastguard Worker      */
1431*3ac0a46fSAndroid Build Coastguard Worker     (void)TIFFPredictorInit(tif);
1432*3ac0a46fSAndroid Build Coastguard Worker     return (1);
1433*3ac0a46fSAndroid Build Coastguard Worker bad:
1434*3ac0a46fSAndroid Build Coastguard Worker     TIFFErrorExtR(tif, module, "No space for LZW state block");
1435*3ac0a46fSAndroid Build Coastguard Worker     return (0);
1436*3ac0a46fSAndroid Build Coastguard Worker }
1437*3ac0a46fSAndroid Build Coastguard Worker 
1438*3ac0a46fSAndroid Build Coastguard Worker /*
1439*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 1985, 1986 The Regents of the University of California.
1440*3ac0a46fSAndroid Build Coastguard Worker  * All rights reserved.
1441*3ac0a46fSAndroid Build Coastguard Worker  *
1442*3ac0a46fSAndroid Build Coastguard Worker  * This code is derived from software contributed to Berkeley by
1443*3ac0a46fSAndroid Build Coastguard Worker  * James A. Woods, derived from original work by Spencer Thomas
1444*3ac0a46fSAndroid Build Coastguard Worker  * and Joseph Orost.
1445*3ac0a46fSAndroid Build Coastguard Worker  *
1446*3ac0a46fSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms are permitted
1447*3ac0a46fSAndroid Build Coastguard Worker  * provided that the above copyright notice and this paragraph are
1448*3ac0a46fSAndroid Build Coastguard Worker  * duplicated in all such forms and that any documentation,
1449*3ac0a46fSAndroid Build Coastguard Worker  * advertising materials, and other materials related to such
1450*3ac0a46fSAndroid Build Coastguard Worker  * distribution and use acknowledge that the software was developed
1451*3ac0a46fSAndroid Build Coastguard Worker  * by the University of California, Berkeley.  The name of the
1452*3ac0a46fSAndroid Build Coastguard Worker  * University may not be used to endorse or promote products derived
1453*3ac0a46fSAndroid Build Coastguard Worker  * from this software without specific prior written permission.
1454*3ac0a46fSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
1455*3ac0a46fSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
1456*3ac0a46fSAndroid Build Coastguard Worker  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
1457*3ac0a46fSAndroid Build Coastguard Worker  */
1458*3ac0a46fSAndroid Build Coastguard Worker #endif /* LZW_SUPPORT */
1459