xref: /aosp_15_r20/external/pdfium/third_party/libtiff/tif_fax3.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker /*
2*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 1990-1997 Sam Leffler
3*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
4*3ac0a46fSAndroid Build Coastguard Worker  *
5*3ac0a46fSAndroid Build Coastguard Worker  * Permission to use, copy, modify, distribute, and sell this software and
6*3ac0a46fSAndroid Build Coastguard Worker  * its documentation for any purpose is hereby granted without fee, provided
7*3ac0a46fSAndroid Build Coastguard Worker  * that (i) the above copyright notices and this permission notice appear in
8*3ac0a46fSAndroid Build Coastguard Worker  * all copies of the software and related documentation, and (ii) the names of
9*3ac0a46fSAndroid Build Coastguard Worker  * Sam Leffler and Silicon Graphics may not be used in any advertising or
10*3ac0a46fSAndroid Build Coastguard Worker  * publicity relating to the software without the specific, prior written
11*3ac0a46fSAndroid Build Coastguard Worker  * permission of Sam Leffler and Silicon Graphics.
12*3ac0a46fSAndroid Build Coastguard Worker  *
13*3ac0a46fSAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
14*3ac0a46fSAndroid Build Coastguard Worker  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
15*3ac0a46fSAndroid Build Coastguard Worker  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
16*3ac0a46fSAndroid Build Coastguard Worker  *
17*3ac0a46fSAndroid Build Coastguard Worker  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
18*3ac0a46fSAndroid Build Coastguard Worker  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19*3ac0a46fSAndroid Build Coastguard Worker  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20*3ac0a46fSAndroid Build Coastguard Worker  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
21*3ac0a46fSAndroid Build Coastguard Worker  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22*3ac0a46fSAndroid Build Coastguard Worker  * OF THIS SOFTWARE.
23*3ac0a46fSAndroid Build Coastguard Worker  */
24*3ac0a46fSAndroid Build Coastguard Worker 
25*3ac0a46fSAndroid Build Coastguard Worker #ifndef _FAX3_
26*3ac0a46fSAndroid Build Coastguard Worker #define _FAX3_
27*3ac0a46fSAndroid Build Coastguard Worker /*
28*3ac0a46fSAndroid Build Coastguard Worker  * TIFF Library.
29*3ac0a46fSAndroid Build Coastguard Worker  *
30*3ac0a46fSAndroid Build Coastguard Worker  * CCITT Group 3 (T.4) and Group 4 (T.6) Decompression Support.
31*3ac0a46fSAndroid Build Coastguard Worker  *
32*3ac0a46fSAndroid Build Coastguard Worker  * Decoder support is derived, with permission, from the code
33*3ac0a46fSAndroid Build Coastguard Worker  * in Frank Cringle's viewfax program;
34*3ac0a46fSAndroid Build Coastguard Worker  *      Copyright (C) 1990, 1995  Frank D. Cringle.
35*3ac0a46fSAndroid Build Coastguard Worker  */
36*3ac0a46fSAndroid Build Coastguard Worker #include "tiff.h"
37*3ac0a46fSAndroid Build Coastguard Worker 
38*3ac0a46fSAndroid Build Coastguard Worker /*
39*3ac0a46fSAndroid Build Coastguard Worker  * To override the default routine used to image decoded
40*3ac0a46fSAndroid Build Coastguard Worker  * spans one can use the pseudo tag TIFFTAG_FAXFILLFUNC.
41*3ac0a46fSAndroid Build Coastguard Worker  * The routine must have the type signature given below;
42*3ac0a46fSAndroid Build Coastguard Worker  * for example:
43*3ac0a46fSAndroid Build Coastguard Worker  *
44*3ac0a46fSAndroid Build Coastguard Worker  * fillruns(unsigned char* buf, uint32_t* runs, uint32_t* erun, uint32_t lastx)
45*3ac0a46fSAndroid Build Coastguard Worker  *
46*3ac0a46fSAndroid Build Coastguard Worker  * where buf is place to set the bits, runs is the array of b&w run
47*3ac0a46fSAndroid Build Coastguard Worker  * lengths (white then black), erun is the last run in the array, and
48*3ac0a46fSAndroid Build Coastguard Worker  * lastx is the width of the row in pixels.  Fill routines can assume
49*3ac0a46fSAndroid Build Coastguard Worker  * the run array has room for at least lastx runs and can overwrite
50*3ac0a46fSAndroid Build Coastguard Worker  * data in the run array as needed (e.g. to append zero runs to bring
51*3ac0a46fSAndroid Build Coastguard Worker  * the count up to a nice multiple).
52*3ac0a46fSAndroid Build Coastguard Worker  */
53*3ac0a46fSAndroid Build Coastguard Worker typedef void (*TIFFFaxFillFunc)(unsigned char *, uint32_t *, uint32_t *,
54*3ac0a46fSAndroid Build Coastguard Worker                                 uint32_t);
55*3ac0a46fSAndroid Build Coastguard Worker 
56*3ac0a46fSAndroid Build Coastguard Worker /*
57*3ac0a46fSAndroid Build Coastguard Worker  * The default run filler; made external for other decoders.
58*3ac0a46fSAndroid Build Coastguard Worker  */
59*3ac0a46fSAndroid Build Coastguard Worker #if defined(__cplusplus)
60*3ac0a46fSAndroid Build Coastguard Worker extern "C"
61*3ac0a46fSAndroid Build Coastguard Worker {
62*3ac0a46fSAndroid Build Coastguard Worker #endif
63*3ac0a46fSAndroid Build Coastguard Worker     extern void _TIFFFax3fillruns(unsigned char *, uint32_t *, uint32_t *,
64*3ac0a46fSAndroid Build Coastguard Worker                                   uint32_t);
65*3ac0a46fSAndroid Build Coastguard Worker #if defined(__cplusplus)
66*3ac0a46fSAndroid Build Coastguard Worker }
67*3ac0a46fSAndroid Build Coastguard Worker #endif
68*3ac0a46fSAndroid Build Coastguard Worker 
69*3ac0a46fSAndroid Build Coastguard Worker /* finite state machine codes */
70*3ac0a46fSAndroid Build Coastguard Worker #define S_Null 0
71*3ac0a46fSAndroid Build Coastguard Worker #define S_Pass 1
72*3ac0a46fSAndroid Build Coastguard Worker #define S_Horiz 2
73*3ac0a46fSAndroid Build Coastguard Worker #define S_V0 3
74*3ac0a46fSAndroid Build Coastguard Worker #define S_VR 4
75*3ac0a46fSAndroid Build Coastguard Worker #define S_VL 5
76*3ac0a46fSAndroid Build Coastguard Worker #define S_Ext 6
77*3ac0a46fSAndroid Build Coastguard Worker #define S_TermW 7
78*3ac0a46fSAndroid Build Coastguard Worker #define S_TermB 8
79*3ac0a46fSAndroid Build Coastguard Worker #define S_MakeUpW 9
80*3ac0a46fSAndroid Build Coastguard Worker #define S_MakeUpB 10
81*3ac0a46fSAndroid Build Coastguard Worker #define S_MakeUp 11
82*3ac0a46fSAndroid Build Coastguard Worker #define S_EOL 12
83*3ac0a46fSAndroid Build Coastguard Worker 
84*3ac0a46fSAndroid Build Coastguard Worker /* WARNING: do not change the layout of this structure as the HylaFAX software
85*3ac0a46fSAndroid Build Coastguard Worker  */
86*3ac0a46fSAndroid Build Coastguard Worker /* really depends on it. See http://bugzilla.maptools.org/show_bug.cgi?id=2636
87*3ac0a46fSAndroid Build Coastguard Worker  */
88*3ac0a46fSAndroid Build Coastguard Worker typedef struct
89*3ac0a46fSAndroid Build Coastguard Worker {                        /* state table entry */
90*3ac0a46fSAndroid Build Coastguard Worker     unsigned char State; /* see above */
91*3ac0a46fSAndroid Build Coastguard Worker     unsigned char Width; /* width of code in bits */
92*3ac0a46fSAndroid Build Coastguard Worker     uint32_t Param;      /* unsigned 32-bit run length in bits (holds on 16 bit
93*3ac0a46fSAndroid Build Coastguard Worker                             actually, but cannot be changed. See above warning) */
94*3ac0a46fSAndroid Build Coastguard Worker } TIFFFaxTabEnt;
95*3ac0a46fSAndroid Build Coastguard Worker 
96*3ac0a46fSAndroid Build Coastguard Worker extern const TIFFFaxTabEnt TIFFFaxMainTable[];
97*3ac0a46fSAndroid Build Coastguard Worker extern const TIFFFaxTabEnt TIFFFaxWhiteTable[];
98*3ac0a46fSAndroid Build Coastguard Worker extern const TIFFFaxTabEnt TIFFFaxBlackTable[];
99*3ac0a46fSAndroid Build Coastguard Worker 
100*3ac0a46fSAndroid Build Coastguard Worker /*
101*3ac0a46fSAndroid Build Coastguard Worker  * The following macros define the majority of the G3/G4 decoder
102*3ac0a46fSAndroid Build Coastguard Worker  * algorithm using the state tables defined elsewhere.  To build
103*3ac0a46fSAndroid Build Coastguard Worker  * a decoder you need some setup code and some glue code. Note
104*3ac0a46fSAndroid Build Coastguard Worker  * that you may also need/want to change the way the NeedBits*
105*3ac0a46fSAndroid Build Coastguard Worker  * macros get input data if, for example, you know the data to be
106*3ac0a46fSAndroid Build Coastguard Worker  * decoded is properly aligned and oriented (doing so before running
107*3ac0a46fSAndroid Build Coastguard Worker  * the decoder can be a big performance win).
108*3ac0a46fSAndroid Build Coastguard Worker  *
109*3ac0a46fSAndroid Build Coastguard Worker  * Consult the decoder in the TIFF library for an idea of what you
110*3ac0a46fSAndroid Build Coastguard Worker  * need to define and setup to make use of these definitions.
111*3ac0a46fSAndroid Build Coastguard Worker  *
112*3ac0a46fSAndroid Build Coastguard Worker  * NB: to enable a debugging version of these macros define FAX3_DEBUG
113*3ac0a46fSAndroid Build Coastguard Worker  *     before including this file.  Trace output goes to stdout.
114*3ac0a46fSAndroid Build Coastguard Worker  */
115*3ac0a46fSAndroid Build Coastguard Worker 
116*3ac0a46fSAndroid Build Coastguard Worker #ifndef EndOfData
117*3ac0a46fSAndroid Build Coastguard Worker #define EndOfData() (cp >= ep)
118*3ac0a46fSAndroid Build Coastguard Worker #endif
119*3ac0a46fSAndroid Build Coastguard Worker /*
120*3ac0a46fSAndroid Build Coastguard Worker  * Need <=8 or <=16 bits of input data.  Unlike viewfax we
121*3ac0a46fSAndroid Build Coastguard Worker  * cannot use/assume a word-aligned, properly bit swizzled
122*3ac0a46fSAndroid Build Coastguard Worker  * input data set because data may come from an arbitrarily
123*3ac0a46fSAndroid Build Coastguard Worker  * aligned, read-only source such as a memory-mapped file.
124*3ac0a46fSAndroid Build Coastguard Worker  * Note also that the viewfax decoder does not check for
125*3ac0a46fSAndroid Build Coastguard Worker  * running off the end of the input data buffer.  This is
126*3ac0a46fSAndroid Build Coastguard Worker  * possible for G3-encoded data because it prescans the input
127*3ac0a46fSAndroid Build Coastguard Worker  * data to count EOL markers, but can cause problems for G4
128*3ac0a46fSAndroid Build Coastguard Worker  * data.  In any event, we don't prescan and must watch for
129*3ac0a46fSAndroid Build Coastguard Worker  * running out of data since we can't permit the library to
130*3ac0a46fSAndroid Build Coastguard Worker  * scan past the end of the input data buffer.
131*3ac0a46fSAndroid Build Coastguard Worker  *
132*3ac0a46fSAndroid Build Coastguard Worker  * Finally, note that we must handle remaindered data at the end
133*3ac0a46fSAndroid Build Coastguard Worker  * of a strip specially.  The coder asks for a fixed number of
134*3ac0a46fSAndroid Build Coastguard Worker  * bits when scanning for the next code.  This may be more bits
135*3ac0a46fSAndroid Build Coastguard Worker  * than are actually present in the data stream.  If we appear
136*3ac0a46fSAndroid Build Coastguard Worker  * to run out of data but still have some number of valid bits
137*3ac0a46fSAndroid Build Coastguard Worker  * remaining then we makeup the requested amount with zeros and
138*3ac0a46fSAndroid Build Coastguard Worker  * return successfully.  If the returned data is incorrect then
139*3ac0a46fSAndroid Build Coastguard Worker  * we should be called again and get a premature EOF error;
140*3ac0a46fSAndroid Build Coastguard Worker  * otherwise we should get the right answer.
141*3ac0a46fSAndroid Build Coastguard Worker  */
142*3ac0a46fSAndroid Build Coastguard Worker #ifndef NeedBits8
143*3ac0a46fSAndroid Build Coastguard Worker #define NeedBits8(n, eoflab)                                                   \
144*3ac0a46fSAndroid Build Coastguard Worker     do                                                                         \
145*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
146*3ac0a46fSAndroid Build Coastguard Worker         if (BitsAvail < (n))                                                   \
147*3ac0a46fSAndroid Build Coastguard Worker         {                                                                      \
148*3ac0a46fSAndroid Build Coastguard Worker             if (EndOfData())                                                   \
149*3ac0a46fSAndroid Build Coastguard Worker             {                                                                  \
150*3ac0a46fSAndroid Build Coastguard Worker                 if (BitsAvail == 0) /* no valid bits */                        \
151*3ac0a46fSAndroid Build Coastguard Worker                     goto eoflab;                                               \
152*3ac0a46fSAndroid Build Coastguard Worker                 BitsAvail = (n); /* pad with zeros */                          \
153*3ac0a46fSAndroid Build Coastguard Worker             }                                                                  \
154*3ac0a46fSAndroid Build Coastguard Worker             else                                                               \
155*3ac0a46fSAndroid Build Coastguard Worker             {                                                                  \
156*3ac0a46fSAndroid Build Coastguard Worker                 BitAcc |= ((uint32_t)bitmap[*cp++]) << BitsAvail;              \
157*3ac0a46fSAndroid Build Coastguard Worker                 BitsAvail += 8;                                                \
158*3ac0a46fSAndroid Build Coastguard Worker             }                                                                  \
159*3ac0a46fSAndroid Build Coastguard Worker         }                                                                      \
160*3ac0a46fSAndroid Build Coastguard Worker     } while (0)
161*3ac0a46fSAndroid Build Coastguard Worker #endif
162*3ac0a46fSAndroid Build Coastguard Worker #ifndef NeedBits16
163*3ac0a46fSAndroid Build Coastguard Worker #define NeedBits16(n, eoflab)                                                  \
164*3ac0a46fSAndroid Build Coastguard Worker     do                                                                         \
165*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
166*3ac0a46fSAndroid Build Coastguard Worker         if (BitsAvail < (n))                                                   \
167*3ac0a46fSAndroid Build Coastguard Worker         {                                                                      \
168*3ac0a46fSAndroid Build Coastguard Worker             if (EndOfData())                                                   \
169*3ac0a46fSAndroid Build Coastguard Worker             {                                                                  \
170*3ac0a46fSAndroid Build Coastguard Worker                 if (BitsAvail == 0) /* no valid bits */                        \
171*3ac0a46fSAndroid Build Coastguard Worker                     goto eoflab;                                               \
172*3ac0a46fSAndroid Build Coastguard Worker                 BitsAvail = (n); /* pad with zeros */                          \
173*3ac0a46fSAndroid Build Coastguard Worker             }                                                                  \
174*3ac0a46fSAndroid Build Coastguard Worker             else                                                               \
175*3ac0a46fSAndroid Build Coastguard Worker             {                                                                  \
176*3ac0a46fSAndroid Build Coastguard Worker                 BitAcc |= ((uint32_t)bitmap[*cp++]) << BitsAvail;              \
177*3ac0a46fSAndroid Build Coastguard Worker                 if ((BitsAvail += 8) < (n))                                    \
178*3ac0a46fSAndroid Build Coastguard Worker                 {                                                              \
179*3ac0a46fSAndroid Build Coastguard Worker                     if (EndOfData())                                           \
180*3ac0a46fSAndroid Build Coastguard Worker                     {                                                          \
181*3ac0a46fSAndroid Build Coastguard Worker                         /* NB: we know BitsAvail is non-zero here */           \
182*3ac0a46fSAndroid Build Coastguard Worker                         BitsAvail = (n); /* pad with zeros */                  \
183*3ac0a46fSAndroid Build Coastguard Worker                     }                                                          \
184*3ac0a46fSAndroid Build Coastguard Worker                     else                                                       \
185*3ac0a46fSAndroid Build Coastguard Worker                     {                                                          \
186*3ac0a46fSAndroid Build Coastguard Worker                         BitAcc |= ((uint32_t)bitmap[*cp++]) << BitsAvail;      \
187*3ac0a46fSAndroid Build Coastguard Worker                         BitsAvail += 8;                                        \
188*3ac0a46fSAndroid Build Coastguard Worker                     }                                                          \
189*3ac0a46fSAndroid Build Coastguard Worker                 }                                                              \
190*3ac0a46fSAndroid Build Coastguard Worker             }                                                                  \
191*3ac0a46fSAndroid Build Coastguard Worker         }                                                                      \
192*3ac0a46fSAndroid Build Coastguard Worker     } while (0)
193*3ac0a46fSAndroid Build Coastguard Worker #endif
194*3ac0a46fSAndroid Build Coastguard Worker #define GetBits(n) (BitAcc & ((1 << (n)) - 1))
195*3ac0a46fSAndroid Build Coastguard Worker #define ClrBits(n)                                                             \
196*3ac0a46fSAndroid Build Coastguard Worker     do                                                                         \
197*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
198*3ac0a46fSAndroid Build Coastguard Worker         BitsAvail -= (n);                                                      \
199*3ac0a46fSAndroid Build Coastguard Worker         BitAcc >>= (n);                                                        \
200*3ac0a46fSAndroid Build Coastguard Worker     } while (0)
201*3ac0a46fSAndroid Build Coastguard Worker 
202*3ac0a46fSAndroid Build Coastguard Worker #ifdef FAX3_DEBUG
203*3ac0a46fSAndroid Build Coastguard Worker static const char *StateNames[] = {
204*3ac0a46fSAndroid Build Coastguard Worker     "Null   ", "Pass   ", "Horiz  ", "V0     ", "VR     ", "VL     ", "Ext    ",
205*3ac0a46fSAndroid Build Coastguard Worker     "TermW  ", "TermB  ", "MakeUpW", "MakeUpB", "MakeUp ", "EOL    ",
206*3ac0a46fSAndroid Build Coastguard Worker };
207*3ac0a46fSAndroid Build Coastguard Worker #define DEBUG_SHOW putchar(BitAcc & (1 << t) ? '1' : '0')
208*3ac0a46fSAndroid Build Coastguard Worker #define LOOKUP8(wid, tab, eoflab)                                              \
209*3ac0a46fSAndroid Build Coastguard Worker     do                                                                         \
210*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
211*3ac0a46fSAndroid Build Coastguard Worker         int t;                                                                 \
212*3ac0a46fSAndroid Build Coastguard Worker         NeedBits8(wid, eoflab);                                                \
213*3ac0a46fSAndroid Build Coastguard Worker         TabEnt = tab + GetBits(wid);                                           \
214*3ac0a46fSAndroid Build Coastguard Worker         printf("%08lX/%d: %s%5d\t", (long)BitAcc, BitsAvail,                   \
215*3ac0a46fSAndroid Build Coastguard Worker                StateNames[TabEnt->State], TabEnt->Param);                      \
216*3ac0a46fSAndroid Build Coastguard Worker         for (t = 0; t < TabEnt->Width; t++)                                    \
217*3ac0a46fSAndroid Build Coastguard Worker             DEBUG_SHOW;                                                        \
218*3ac0a46fSAndroid Build Coastguard Worker         putchar('\n');                                                         \
219*3ac0a46fSAndroid Build Coastguard Worker         fflush(stdout);                                                        \
220*3ac0a46fSAndroid Build Coastguard Worker         ClrBits(TabEnt->Width);                                                \
221*3ac0a46fSAndroid Build Coastguard Worker     } while (0)
222*3ac0a46fSAndroid Build Coastguard Worker #define LOOKUP16(wid, tab, eoflab)                                             \
223*3ac0a46fSAndroid Build Coastguard Worker     do                                                                         \
224*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
225*3ac0a46fSAndroid Build Coastguard Worker         int t;                                                                 \
226*3ac0a46fSAndroid Build Coastguard Worker         NeedBits16(wid, eoflab);                                               \
227*3ac0a46fSAndroid Build Coastguard Worker         TabEnt = tab + GetBits(wid);                                           \
228*3ac0a46fSAndroid Build Coastguard Worker         printf("%08lX/%d: %s%5d\t", (long)BitAcc, BitsAvail,                   \
229*3ac0a46fSAndroid Build Coastguard Worker                StateNames[TabEnt->State], TabEnt->Param);                      \
230*3ac0a46fSAndroid Build Coastguard Worker         for (t = 0; t < TabEnt->Width; t++)                                    \
231*3ac0a46fSAndroid Build Coastguard Worker             DEBUG_SHOW;                                                        \
232*3ac0a46fSAndroid Build Coastguard Worker         putchar('\n');                                                         \
233*3ac0a46fSAndroid Build Coastguard Worker         fflush(stdout);                                                        \
234*3ac0a46fSAndroid Build Coastguard Worker         ClrBits(TabEnt->Width);                                                \
235*3ac0a46fSAndroid Build Coastguard Worker     } while (0)
236*3ac0a46fSAndroid Build Coastguard Worker 
237*3ac0a46fSAndroid Build Coastguard Worker #define SETVALUE(x)                                                            \
238*3ac0a46fSAndroid Build Coastguard Worker     do                                                                         \
239*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
240*3ac0a46fSAndroid Build Coastguard Worker         *pa++ = RunLength + (x);                                               \
241*3ac0a46fSAndroid Build Coastguard Worker         printf("SETVALUE: %d\t%d\n", RunLength + (x), a0);                     \
242*3ac0a46fSAndroid Build Coastguard Worker         a0 += x;                                                               \
243*3ac0a46fSAndroid Build Coastguard Worker         RunLength = 0;                                                         \
244*3ac0a46fSAndroid Build Coastguard Worker     } while (0)
245*3ac0a46fSAndroid Build Coastguard Worker #else
246*3ac0a46fSAndroid Build Coastguard Worker #define LOOKUP8(wid, tab, eoflab)                                              \
247*3ac0a46fSAndroid Build Coastguard Worker     do                                                                         \
248*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
249*3ac0a46fSAndroid Build Coastguard Worker         NeedBits8(wid, eoflab);                                                \
250*3ac0a46fSAndroid Build Coastguard Worker         TabEnt = tab + GetBits(wid);                                           \
251*3ac0a46fSAndroid Build Coastguard Worker         ClrBits(TabEnt->Width);                                                \
252*3ac0a46fSAndroid Build Coastguard Worker     } while (0)
253*3ac0a46fSAndroid Build Coastguard Worker #define LOOKUP16(wid, tab, eoflab)                                             \
254*3ac0a46fSAndroid Build Coastguard Worker     do                                                                         \
255*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
256*3ac0a46fSAndroid Build Coastguard Worker         NeedBits16(wid, eoflab);                                               \
257*3ac0a46fSAndroid Build Coastguard Worker         TabEnt = tab + GetBits(wid);                                           \
258*3ac0a46fSAndroid Build Coastguard Worker         ClrBits(TabEnt->Width);                                                \
259*3ac0a46fSAndroid Build Coastguard Worker     } while (0)
260*3ac0a46fSAndroid Build Coastguard Worker 
261*3ac0a46fSAndroid Build Coastguard Worker /*
262*3ac0a46fSAndroid Build Coastguard Worker  * Append a run to the run length array for the
263*3ac0a46fSAndroid Build Coastguard Worker  * current row and reset decoding state.
264*3ac0a46fSAndroid Build Coastguard Worker  */
265*3ac0a46fSAndroid Build Coastguard Worker #define SETVALUE(x)                                                            \
266*3ac0a46fSAndroid Build Coastguard Worker     do                                                                         \
267*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
268*3ac0a46fSAndroid Build Coastguard Worker         if (pa >= thisrun + sp->nruns)                                         \
269*3ac0a46fSAndroid Build Coastguard Worker         {                                                                      \
270*3ac0a46fSAndroid Build Coastguard Worker             TIFFErrorExtR(tif, module, "Buffer overflow at line %u of %s %u",  \
271*3ac0a46fSAndroid Build Coastguard Worker                           sp->line, isTiled(tif) ? "tile" : "strip",           \
272*3ac0a46fSAndroid Build Coastguard Worker                           isTiled(tif) ? tif->tif_curtile                      \
273*3ac0a46fSAndroid Build Coastguard Worker                                        : tif->tif_curstrip);                   \
274*3ac0a46fSAndroid Build Coastguard Worker             return (-1);                                                       \
275*3ac0a46fSAndroid Build Coastguard Worker         }                                                                      \
276*3ac0a46fSAndroid Build Coastguard Worker         *pa++ = RunLength + (x);                                               \
277*3ac0a46fSAndroid Build Coastguard Worker         a0 += (x);                                                             \
278*3ac0a46fSAndroid Build Coastguard Worker         RunLength = 0;                                                         \
279*3ac0a46fSAndroid Build Coastguard Worker     } while (0)
280*3ac0a46fSAndroid Build Coastguard Worker #endif
281*3ac0a46fSAndroid Build Coastguard Worker 
282*3ac0a46fSAndroid Build Coastguard Worker /*
283*3ac0a46fSAndroid Build Coastguard Worker  * Synchronize input decoding at the start of each
284*3ac0a46fSAndroid Build Coastguard Worker  * row by scanning for an EOL (if appropriate) and
285*3ac0a46fSAndroid Build Coastguard Worker  * skipping any trash data that might be present
286*3ac0a46fSAndroid Build Coastguard Worker  * after a decoding error.  Note that the decoding
287*3ac0a46fSAndroid Build Coastguard Worker  * done elsewhere that recognizes an EOL only consumes
288*3ac0a46fSAndroid Build Coastguard Worker  * 11 consecutive zero bits.  This means that if EOLcnt
289*3ac0a46fSAndroid Build Coastguard Worker  * is non-zero then we still need to scan for the final flag
290*3ac0a46fSAndroid Build Coastguard Worker  * bit that is part of the EOL code.
291*3ac0a46fSAndroid Build Coastguard Worker  */
292*3ac0a46fSAndroid Build Coastguard Worker #define SYNC_EOL(eoflab)                                                       \
293*3ac0a46fSAndroid Build Coastguard Worker     do                                                                         \
294*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
295*3ac0a46fSAndroid Build Coastguard Worker         if (EOLcnt == 0)                                                       \
296*3ac0a46fSAndroid Build Coastguard Worker         {                                                                      \
297*3ac0a46fSAndroid Build Coastguard Worker             for (;;)                                                           \
298*3ac0a46fSAndroid Build Coastguard Worker             {                                                                  \
299*3ac0a46fSAndroid Build Coastguard Worker                 NeedBits16(11, eoflab);                                        \
300*3ac0a46fSAndroid Build Coastguard Worker                 if (GetBits(11) == 0)                                          \
301*3ac0a46fSAndroid Build Coastguard Worker                     break;                                                     \
302*3ac0a46fSAndroid Build Coastguard Worker                 ClrBits(1);                                                    \
303*3ac0a46fSAndroid Build Coastguard Worker             }                                                                  \
304*3ac0a46fSAndroid Build Coastguard Worker         }                                                                      \
305*3ac0a46fSAndroid Build Coastguard Worker         for (;;)                                                               \
306*3ac0a46fSAndroid Build Coastguard Worker         {                                                                      \
307*3ac0a46fSAndroid Build Coastguard Worker             NeedBits8(8, eoflab);                                              \
308*3ac0a46fSAndroid Build Coastguard Worker             if (GetBits(8))                                                    \
309*3ac0a46fSAndroid Build Coastguard Worker                 break;                                                         \
310*3ac0a46fSAndroid Build Coastguard Worker             ClrBits(8);                                                        \
311*3ac0a46fSAndroid Build Coastguard Worker         }                                                                      \
312*3ac0a46fSAndroid Build Coastguard Worker         while (GetBits(1) == 0)                                                \
313*3ac0a46fSAndroid Build Coastguard Worker             ClrBits(1);                                                        \
314*3ac0a46fSAndroid Build Coastguard Worker         ClrBits(1); /* EOL bit */                                              \
315*3ac0a46fSAndroid Build Coastguard Worker         EOLcnt = 0; /* reset EOL counter/flag */                               \
316*3ac0a46fSAndroid Build Coastguard Worker     } while (0)
317*3ac0a46fSAndroid Build Coastguard Worker 
318*3ac0a46fSAndroid Build Coastguard Worker /*
319*3ac0a46fSAndroid Build Coastguard Worker  * Cleanup the array of runs after decoding a row.
320*3ac0a46fSAndroid Build Coastguard Worker  * We adjust final runs to insure the user buffer is not
321*3ac0a46fSAndroid Build Coastguard Worker  * overwritten and/or undecoded area is white filled.
322*3ac0a46fSAndroid Build Coastguard Worker  */
323*3ac0a46fSAndroid Build Coastguard Worker #define CLEANUP_RUNS()                                                         \
324*3ac0a46fSAndroid Build Coastguard Worker     do                                                                         \
325*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
326*3ac0a46fSAndroid Build Coastguard Worker         if (RunLength)                                                         \
327*3ac0a46fSAndroid Build Coastguard Worker             SETVALUE(0);                                                       \
328*3ac0a46fSAndroid Build Coastguard Worker         if (a0 != lastx)                                                       \
329*3ac0a46fSAndroid Build Coastguard Worker         {                                                                      \
330*3ac0a46fSAndroid Build Coastguard Worker             badlength(a0, lastx);                                              \
331*3ac0a46fSAndroid Build Coastguard Worker             while (a0 > lastx && pa > thisrun)                                 \
332*3ac0a46fSAndroid Build Coastguard Worker                 a0 -= *--pa;                                                   \
333*3ac0a46fSAndroid Build Coastguard Worker             if (a0 < lastx)                                                    \
334*3ac0a46fSAndroid Build Coastguard Worker             {                                                                  \
335*3ac0a46fSAndroid Build Coastguard Worker                 if (a0 < 0)                                                    \
336*3ac0a46fSAndroid Build Coastguard Worker                     a0 = 0;                                                    \
337*3ac0a46fSAndroid Build Coastguard Worker                 if ((pa - thisrun) & 1)                                        \
338*3ac0a46fSAndroid Build Coastguard Worker                     SETVALUE(0);                                               \
339*3ac0a46fSAndroid Build Coastguard Worker                 SETVALUE(lastx - a0);                                          \
340*3ac0a46fSAndroid Build Coastguard Worker             }                                                                  \
341*3ac0a46fSAndroid Build Coastguard Worker             else if (a0 > lastx)                                               \
342*3ac0a46fSAndroid Build Coastguard Worker             {                                                                  \
343*3ac0a46fSAndroid Build Coastguard Worker                 SETVALUE(lastx);                                               \
344*3ac0a46fSAndroid Build Coastguard Worker                 SETVALUE(0);                                                   \
345*3ac0a46fSAndroid Build Coastguard Worker             }                                                                  \
346*3ac0a46fSAndroid Build Coastguard Worker         }                                                                      \
347*3ac0a46fSAndroid Build Coastguard Worker     } while (0)
348*3ac0a46fSAndroid Build Coastguard Worker 
349*3ac0a46fSAndroid Build Coastguard Worker /*
350*3ac0a46fSAndroid Build Coastguard Worker  * Decode a line of 1D-encoded data.
351*3ac0a46fSAndroid Build Coastguard Worker  *
352*3ac0a46fSAndroid Build Coastguard Worker  * The line expanders are written as macros so that they can be reused
353*3ac0a46fSAndroid Build Coastguard Worker  * but still have direct access to the local variables of the "calling"
354*3ac0a46fSAndroid Build Coastguard Worker  * function.
355*3ac0a46fSAndroid Build Coastguard Worker  *
356*3ac0a46fSAndroid Build Coastguard Worker  * Note that unlike the original version we have to explicitly test for
357*3ac0a46fSAndroid Build Coastguard Worker  * a0 >= lastx after each black/white run is decoded.  This is because
358*3ac0a46fSAndroid Build Coastguard Worker  * the original code depended on the input data being zero-padded to
359*3ac0a46fSAndroid Build Coastguard Worker  * insure the decoder recognized an EOL before running out of data.
360*3ac0a46fSAndroid Build Coastguard Worker  */
361*3ac0a46fSAndroid Build Coastguard Worker #define EXPAND1D(eoflab)                                                       \
362*3ac0a46fSAndroid Build Coastguard Worker     do                                                                         \
363*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
364*3ac0a46fSAndroid Build Coastguard Worker         for (;;)                                                               \
365*3ac0a46fSAndroid Build Coastguard Worker         {                                                                      \
366*3ac0a46fSAndroid Build Coastguard Worker             for (;;)                                                           \
367*3ac0a46fSAndroid Build Coastguard Worker             {                                                                  \
368*3ac0a46fSAndroid Build Coastguard Worker                 LOOKUP16(12, TIFFFaxWhiteTable, eof1d);                        \
369*3ac0a46fSAndroid Build Coastguard Worker                 switch (TabEnt->State)                                         \
370*3ac0a46fSAndroid Build Coastguard Worker                 {                                                              \
371*3ac0a46fSAndroid Build Coastguard Worker                     case S_EOL:                                                \
372*3ac0a46fSAndroid Build Coastguard Worker                         EOLcnt = 1;                                            \
373*3ac0a46fSAndroid Build Coastguard Worker                         goto done1d;                                           \
374*3ac0a46fSAndroid Build Coastguard Worker                     case S_TermW:                                              \
375*3ac0a46fSAndroid Build Coastguard Worker                         SETVALUE(TabEnt->Param);                               \
376*3ac0a46fSAndroid Build Coastguard Worker                         goto doneWhite1d;                                      \
377*3ac0a46fSAndroid Build Coastguard Worker                     case S_MakeUpW:                                            \
378*3ac0a46fSAndroid Build Coastguard Worker                     case S_MakeUp:                                             \
379*3ac0a46fSAndroid Build Coastguard Worker                         a0 += TabEnt->Param;                                   \
380*3ac0a46fSAndroid Build Coastguard Worker                         RunLength += TabEnt->Param;                            \
381*3ac0a46fSAndroid Build Coastguard Worker                         break;                                                 \
382*3ac0a46fSAndroid Build Coastguard Worker                     default:                                                   \
383*3ac0a46fSAndroid Build Coastguard Worker                         unexpected("WhiteTable", a0);                          \
384*3ac0a46fSAndroid Build Coastguard Worker                         goto done1d;                                           \
385*3ac0a46fSAndroid Build Coastguard Worker                 }                                                              \
386*3ac0a46fSAndroid Build Coastguard Worker             }                                                                  \
387*3ac0a46fSAndroid Build Coastguard Worker         doneWhite1d:                                                           \
388*3ac0a46fSAndroid Build Coastguard Worker             if (a0 >= lastx)                                                   \
389*3ac0a46fSAndroid Build Coastguard Worker                 goto done1d;                                                   \
390*3ac0a46fSAndroid Build Coastguard Worker             for (;;)                                                           \
391*3ac0a46fSAndroid Build Coastguard Worker             {                                                                  \
392*3ac0a46fSAndroid Build Coastguard Worker                 LOOKUP16(13, TIFFFaxBlackTable, eof1d);                        \
393*3ac0a46fSAndroid Build Coastguard Worker                 switch (TabEnt->State)                                         \
394*3ac0a46fSAndroid Build Coastguard Worker                 {                                                              \
395*3ac0a46fSAndroid Build Coastguard Worker                     case S_EOL:                                                \
396*3ac0a46fSAndroid Build Coastguard Worker                         EOLcnt = 1;                                            \
397*3ac0a46fSAndroid Build Coastguard Worker                         goto done1d;                                           \
398*3ac0a46fSAndroid Build Coastguard Worker                     case S_TermB:                                              \
399*3ac0a46fSAndroid Build Coastguard Worker                         SETVALUE(TabEnt->Param);                               \
400*3ac0a46fSAndroid Build Coastguard Worker                         goto doneBlack1d;                                      \
401*3ac0a46fSAndroid Build Coastguard Worker                     case S_MakeUpB:                                            \
402*3ac0a46fSAndroid Build Coastguard Worker                     case S_MakeUp:                                             \
403*3ac0a46fSAndroid Build Coastguard Worker                         a0 += TabEnt->Param;                                   \
404*3ac0a46fSAndroid Build Coastguard Worker                         RunLength += TabEnt->Param;                            \
405*3ac0a46fSAndroid Build Coastguard Worker                         break;                                                 \
406*3ac0a46fSAndroid Build Coastguard Worker                     default:                                                   \
407*3ac0a46fSAndroid Build Coastguard Worker                         unexpected("BlackTable", a0);                          \
408*3ac0a46fSAndroid Build Coastguard Worker                         goto done1d;                                           \
409*3ac0a46fSAndroid Build Coastguard Worker                 }                                                              \
410*3ac0a46fSAndroid Build Coastguard Worker             }                                                                  \
411*3ac0a46fSAndroid Build Coastguard Worker         doneBlack1d:                                                           \
412*3ac0a46fSAndroid Build Coastguard Worker             if (a0 >= lastx)                                                   \
413*3ac0a46fSAndroid Build Coastguard Worker                 goto done1d;                                                   \
414*3ac0a46fSAndroid Build Coastguard Worker             if (*(pa - 1) == 0 && *(pa - 2) == 0)                              \
415*3ac0a46fSAndroid Build Coastguard Worker                 pa -= 2;                                                       \
416*3ac0a46fSAndroid Build Coastguard Worker         }                                                                      \
417*3ac0a46fSAndroid Build Coastguard Worker     eof1d:                                                                     \
418*3ac0a46fSAndroid Build Coastguard Worker         prematureEOF(a0);                                                      \
419*3ac0a46fSAndroid Build Coastguard Worker         CLEANUP_RUNS();                                                        \
420*3ac0a46fSAndroid Build Coastguard Worker         goto eoflab;                                                           \
421*3ac0a46fSAndroid Build Coastguard Worker     done1d:                                                                    \
422*3ac0a46fSAndroid Build Coastguard Worker         CLEANUP_RUNS();                                                        \
423*3ac0a46fSAndroid Build Coastguard Worker     } while (0)
424*3ac0a46fSAndroid Build Coastguard Worker 
425*3ac0a46fSAndroid Build Coastguard Worker /*
426*3ac0a46fSAndroid Build Coastguard Worker  * Update the value of b1 using the array
427*3ac0a46fSAndroid Build Coastguard Worker  * of runs for the reference line.
428*3ac0a46fSAndroid Build Coastguard Worker  */
429*3ac0a46fSAndroid Build Coastguard Worker #define CHECK_b1                                                               \
430*3ac0a46fSAndroid Build Coastguard Worker     do                                                                         \
431*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
432*3ac0a46fSAndroid Build Coastguard Worker         if (pa != thisrun)                                                     \
433*3ac0a46fSAndroid Build Coastguard Worker             while (b1 <= a0 && b1 < lastx)                                     \
434*3ac0a46fSAndroid Build Coastguard Worker             {                                                                  \
435*3ac0a46fSAndroid Build Coastguard Worker                 if (pb + 1 >= sp->refruns + sp->nruns)                         \
436*3ac0a46fSAndroid Build Coastguard Worker                 {                                                              \
437*3ac0a46fSAndroid Build Coastguard Worker                     TIFFErrorExtR(                                             \
438*3ac0a46fSAndroid Build Coastguard Worker                         tif, module, "Buffer overflow at line %u of %s %u",    \
439*3ac0a46fSAndroid Build Coastguard Worker                         sp->line, isTiled(tif) ? "tile" : "strip",             \
440*3ac0a46fSAndroid Build Coastguard Worker                         isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip);  \
441*3ac0a46fSAndroid Build Coastguard Worker                     return (-1);                                               \
442*3ac0a46fSAndroid Build Coastguard Worker                 }                                                              \
443*3ac0a46fSAndroid Build Coastguard Worker                 b1 += pb[0] + pb[1];                                           \
444*3ac0a46fSAndroid Build Coastguard Worker                 pb += 2;                                                       \
445*3ac0a46fSAndroid Build Coastguard Worker             }                                                                  \
446*3ac0a46fSAndroid Build Coastguard Worker     } while (0)
447*3ac0a46fSAndroid Build Coastguard Worker 
448*3ac0a46fSAndroid Build Coastguard Worker /*
449*3ac0a46fSAndroid Build Coastguard Worker  * Expand a row of 2D-encoded data.
450*3ac0a46fSAndroid Build Coastguard Worker  */
451*3ac0a46fSAndroid Build Coastguard Worker #define EXPAND2D(eoflab)                                                       \
452*3ac0a46fSAndroid Build Coastguard Worker     do                                                                         \
453*3ac0a46fSAndroid Build Coastguard Worker     {                                                                          \
454*3ac0a46fSAndroid Build Coastguard Worker         while (a0 < lastx)                                                     \
455*3ac0a46fSAndroid Build Coastguard Worker         {                                                                      \
456*3ac0a46fSAndroid Build Coastguard Worker             if (pa >= thisrun + sp->nruns)                                     \
457*3ac0a46fSAndroid Build Coastguard Worker             {                                                                  \
458*3ac0a46fSAndroid Build Coastguard Worker                 TIFFErrorExtR(                                                 \
459*3ac0a46fSAndroid Build Coastguard Worker                     tif, module, "Buffer overflow at line %u of %s %u",        \
460*3ac0a46fSAndroid Build Coastguard Worker                     sp->line, isTiled(tif) ? "tile" : "strip",                 \
461*3ac0a46fSAndroid Build Coastguard Worker                     isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip);      \
462*3ac0a46fSAndroid Build Coastguard Worker                 return (-1);                                                   \
463*3ac0a46fSAndroid Build Coastguard Worker             }                                                                  \
464*3ac0a46fSAndroid Build Coastguard Worker             LOOKUP8(7, TIFFFaxMainTable, eof2d);                               \
465*3ac0a46fSAndroid Build Coastguard Worker             switch (TabEnt->State)                                             \
466*3ac0a46fSAndroid Build Coastguard Worker             {                                                                  \
467*3ac0a46fSAndroid Build Coastguard Worker                 case S_Pass:                                                   \
468*3ac0a46fSAndroid Build Coastguard Worker                     CHECK_b1;                                                  \
469*3ac0a46fSAndroid Build Coastguard Worker                     if (pb + 1 >= sp->refruns + sp->nruns)                     \
470*3ac0a46fSAndroid Build Coastguard Worker                     {                                                          \
471*3ac0a46fSAndroid Build Coastguard Worker                         TIFFErrorExtR(tif, module,                             \
472*3ac0a46fSAndroid Build Coastguard Worker                                       "Buffer overflow at line %u of %s %u",   \
473*3ac0a46fSAndroid Build Coastguard Worker                                       sp->line,                                \
474*3ac0a46fSAndroid Build Coastguard Worker                                       isTiled(tif) ? "tile" : "strip",         \
475*3ac0a46fSAndroid Build Coastguard Worker                                       isTiled(tif) ? tif->tif_curtile          \
476*3ac0a46fSAndroid Build Coastguard Worker                                                    : tif->tif_curstrip);       \
477*3ac0a46fSAndroid Build Coastguard Worker                         return (-1);                                           \
478*3ac0a46fSAndroid Build Coastguard Worker                     }                                                          \
479*3ac0a46fSAndroid Build Coastguard Worker                     b1 += *pb++;                                               \
480*3ac0a46fSAndroid Build Coastguard Worker                     RunLength += b1 - a0;                                      \
481*3ac0a46fSAndroid Build Coastguard Worker                     a0 = b1;                                                   \
482*3ac0a46fSAndroid Build Coastguard Worker                     b1 += *pb++;                                               \
483*3ac0a46fSAndroid Build Coastguard Worker                     break;                                                     \
484*3ac0a46fSAndroid Build Coastguard Worker                 case S_Horiz:                                                  \
485*3ac0a46fSAndroid Build Coastguard Worker                     if ((pa - thisrun) & 1)                                    \
486*3ac0a46fSAndroid Build Coastguard Worker                     {                                                          \
487*3ac0a46fSAndroid Build Coastguard Worker                         for (;;)                                               \
488*3ac0a46fSAndroid Build Coastguard Worker                         { /* black first */                                    \
489*3ac0a46fSAndroid Build Coastguard Worker                             LOOKUP16(13, TIFFFaxBlackTable, eof2d);            \
490*3ac0a46fSAndroid Build Coastguard Worker                             switch (TabEnt->State)                             \
491*3ac0a46fSAndroid Build Coastguard Worker                             {                                                  \
492*3ac0a46fSAndroid Build Coastguard Worker                                 case S_TermB:                                  \
493*3ac0a46fSAndroid Build Coastguard Worker                                     SETVALUE(TabEnt->Param);                   \
494*3ac0a46fSAndroid Build Coastguard Worker                                     goto doneWhite2da;                         \
495*3ac0a46fSAndroid Build Coastguard Worker                                 case S_MakeUpB:                                \
496*3ac0a46fSAndroid Build Coastguard Worker                                 case S_MakeUp:                                 \
497*3ac0a46fSAndroid Build Coastguard Worker                                     a0 += TabEnt->Param;                       \
498*3ac0a46fSAndroid Build Coastguard Worker                                     RunLength += TabEnt->Param;                \
499*3ac0a46fSAndroid Build Coastguard Worker                                     break;                                     \
500*3ac0a46fSAndroid Build Coastguard Worker                                 default:                                       \
501*3ac0a46fSAndroid Build Coastguard Worker                                     goto badBlack2d;                           \
502*3ac0a46fSAndroid Build Coastguard Worker                             }                                                  \
503*3ac0a46fSAndroid Build Coastguard Worker                         }                                                      \
504*3ac0a46fSAndroid Build Coastguard Worker                     doneWhite2da:;                                             \
505*3ac0a46fSAndroid Build Coastguard Worker                         for (;;)                                               \
506*3ac0a46fSAndroid Build Coastguard Worker                         { /* then white */                                     \
507*3ac0a46fSAndroid Build Coastguard Worker                             LOOKUP16(12, TIFFFaxWhiteTable, eof2d);            \
508*3ac0a46fSAndroid Build Coastguard Worker                             switch (TabEnt->State)                             \
509*3ac0a46fSAndroid Build Coastguard Worker                             {                                                  \
510*3ac0a46fSAndroid Build Coastguard Worker                                 case S_TermW:                                  \
511*3ac0a46fSAndroid Build Coastguard Worker                                     SETVALUE(TabEnt->Param);                   \
512*3ac0a46fSAndroid Build Coastguard Worker                                     goto doneBlack2da;                         \
513*3ac0a46fSAndroid Build Coastguard Worker                                 case S_MakeUpW:                                \
514*3ac0a46fSAndroid Build Coastguard Worker                                 case S_MakeUp:                                 \
515*3ac0a46fSAndroid Build Coastguard Worker                                     a0 += TabEnt->Param;                       \
516*3ac0a46fSAndroid Build Coastguard Worker                                     RunLength += TabEnt->Param;                \
517*3ac0a46fSAndroid Build Coastguard Worker                                     break;                                     \
518*3ac0a46fSAndroid Build Coastguard Worker                                 default:                                       \
519*3ac0a46fSAndroid Build Coastguard Worker                                     goto badWhite2d;                           \
520*3ac0a46fSAndroid Build Coastguard Worker                             }                                                  \
521*3ac0a46fSAndroid Build Coastguard Worker                         }                                                      \
522*3ac0a46fSAndroid Build Coastguard Worker                     doneBlack2da:;                                             \
523*3ac0a46fSAndroid Build Coastguard Worker                     }                                                          \
524*3ac0a46fSAndroid Build Coastguard Worker                     else                                                       \
525*3ac0a46fSAndroid Build Coastguard Worker                     {                                                          \
526*3ac0a46fSAndroid Build Coastguard Worker                         for (;;)                                               \
527*3ac0a46fSAndroid Build Coastguard Worker                         { /* white first */                                    \
528*3ac0a46fSAndroid Build Coastguard Worker                             LOOKUP16(12, TIFFFaxWhiteTable, eof2d);            \
529*3ac0a46fSAndroid Build Coastguard Worker                             switch (TabEnt->State)                             \
530*3ac0a46fSAndroid Build Coastguard Worker                             {                                                  \
531*3ac0a46fSAndroid Build Coastguard Worker                                 case S_TermW:                                  \
532*3ac0a46fSAndroid Build Coastguard Worker                                     SETVALUE(TabEnt->Param);                   \
533*3ac0a46fSAndroid Build Coastguard Worker                                     goto doneWhite2db;                         \
534*3ac0a46fSAndroid Build Coastguard Worker                                 case S_MakeUpW:                                \
535*3ac0a46fSAndroid Build Coastguard Worker                                 case S_MakeUp:                                 \
536*3ac0a46fSAndroid Build Coastguard Worker                                     a0 += TabEnt->Param;                       \
537*3ac0a46fSAndroid Build Coastguard Worker                                     RunLength += TabEnt->Param;                \
538*3ac0a46fSAndroid Build Coastguard Worker                                     break;                                     \
539*3ac0a46fSAndroid Build Coastguard Worker                                 default:                                       \
540*3ac0a46fSAndroid Build Coastguard Worker                                     goto badWhite2d;                           \
541*3ac0a46fSAndroid Build Coastguard Worker                             }                                                  \
542*3ac0a46fSAndroid Build Coastguard Worker                         }                                                      \
543*3ac0a46fSAndroid Build Coastguard Worker                     doneWhite2db:;                                             \
544*3ac0a46fSAndroid Build Coastguard Worker                         for (;;)                                               \
545*3ac0a46fSAndroid Build Coastguard Worker                         { /* then black */                                     \
546*3ac0a46fSAndroid Build Coastguard Worker                             LOOKUP16(13, TIFFFaxBlackTable, eof2d);            \
547*3ac0a46fSAndroid Build Coastguard Worker                             switch (TabEnt->State)                             \
548*3ac0a46fSAndroid Build Coastguard Worker                             {                                                  \
549*3ac0a46fSAndroid Build Coastguard Worker                                 case S_TermB:                                  \
550*3ac0a46fSAndroid Build Coastguard Worker                                     SETVALUE(TabEnt->Param);                   \
551*3ac0a46fSAndroid Build Coastguard Worker                                     goto doneBlack2db;                         \
552*3ac0a46fSAndroid Build Coastguard Worker                                 case S_MakeUpB:                                \
553*3ac0a46fSAndroid Build Coastguard Worker                                 case S_MakeUp:                                 \
554*3ac0a46fSAndroid Build Coastguard Worker                                     a0 += TabEnt->Param;                       \
555*3ac0a46fSAndroid Build Coastguard Worker                                     RunLength += TabEnt->Param;                \
556*3ac0a46fSAndroid Build Coastguard Worker                                     break;                                     \
557*3ac0a46fSAndroid Build Coastguard Worker                                 default:                                       \
558*3ac0a46fSAndroid Build Coastguard Worker                                     goto badBlack2d;                           \
559*3ac0a46fSAndroid Build Coastguard Worker                             }                                                  \
560*3ac0a46fSAndroid Build Coastguard Worker                         }                                                      \
561*3ac0a46fSAndroid Build Coastguard Worker                     doneBlack2db:;                                             \
562*3ac0a46fSAndroid Build Coastguard Worker                     }                                                          \
563*3ac0a46fSAndroid Build Coastguard Worker                     CHECK_b1;                                                  \
564*3ac0a46fSAndroid Build Coastguard Worker                     break;                                                     \
565*3ac0a46fSAndroid Build Coastguard Worker                 case S_V0:                                                     \
566*3ac0a46fSAndroid Build Coastguard Worker                     CHECK_b1;                                                  \
567*3ac0a46fSAndroid Build Coastguard Worker                     SETVALUE(b1 - a0);                                         \
568*3ac0a46fSAndroid Build Coastguard Worker                     if (pb >= sp->refruns + sp->nruns)                         \
569*3ac0a46fSAndroid Build Coastguard Worker                     {                                                          \
570*3ac0a46fSAndroid Build Coastguard Worker                         TIFFErrorExtR(tif, module,                             \
571*3ac0a46fSAndroid Build Coastguard Worker                                       "Buffer overflow at line %u of %s %u",   \
572*3ac0a46fSAndroid Build Coastguard Worker                                       sp->line,                                \
573*3ac0a46fSAndroid Build Coastguard Worker                                       isTiled(tif) ? "tile" : "strip",         \
574*3ac0a46fSAndroid Build Coastguard Worker                                       isTiled(tif) ? tif->tif_curtile          \
575*3ac0a46fSAndroid Build Coastguard Worker                                                    : tif->tif_curstrip);       \
576*3ac0a46fSAndroid Build Coastguard Worker                         return (-1);                                           \
577*3ac0a46fSAndroid Build Coastguard Worker                     }                                                          \
578*3ac0a46fSAndroid Build Coastguard Worker                     b1 += *pb++;                                               \
579*3ac0a46fSAndroid Build Coastguard Worker                     break;                                                     \
580*3ac0a46fSAndroid Build Coastguard Worker                 case S_VR:                                                     \
581*3ac0a46fSAndroid Build Coastguard Worker                     CHECK_b1;                                                  \
582*3ac0a46fSAndroid Build Coastguard Worker                     SETVALUE(b1 - a0 + TabEnt->Param);                         \
583*3ac0a46fSAndroid Build Coastguard Worker                     if (pb >= sp->refruns + sp->nruns)                         \
584*3ac0a46fSAndroid Build Coastguard Worker                     {                                                          \
585*3ac0a46fSAndroid Build Coastguard Worker                         TIFFErrorExtR(tif, module,                             \
586*3ac0a46fSAndroid Build Coastguard Worker                                       "Buffer overflow at line %u of %s %u",   \
587*3ac0a46fSAndroid Build Coastguard Worker                                       sp->line,                                \
588*3ac0a46fSAndroid Build Coastguard Worker                                       isTiled(tif) ? "tile" : "strip",         \
589*3ac0a46fSAndroid Build Coastguard Worker                                       isTiled(tif) ? tif->tif_curtile          \
590*3ac0a46fSAndroid Build Coastguard Worker                                                    : tif->tif_curstrip);       \
591*3ac0a46fSAndroid Build Coastguard Worker                         return (-1);                                           \
592*3ac0a46fSAndroid Build Coastguard Worker                     }                                                          \
593*3ac0a46fSAndroid Build Coastguard Worker                     b1 += *pb++;                                               \
594*3ac0a46fSAndroid Build Coastguard Worker                     break;                                                     \
595*3ac0a46fSAndroid Build Coastguard Worker                 case S_VL:                                                     \
596*3ac0a46fSAndroid Build Coastguard Worker                     CHECK_b1;                                                  \
597*3ac0a46fSAndroid Build Coastguard Worker                     if (b1 < (int)(a0 + TabEnt->Param))                        \
598*3ac0a46fSAndroid Build Coastguard Worker                     {                                                          \
599*3ac0a46fSAndroid Build Coastguard Worker                         unexpected("VL", a0);                                  \
600*3ac0a46fSAndroid Build Coastguard Worker                         goto eol2d;                                            \
601*3ac0a46fSAndroid Build Coastguard Worker                     }                                                          \
602*3ac0a46fSAndroid Build Coastguard Worker                     SETVALUE(b1 - a0 - TabEnt->Param);                         \
603*3ac0a46fSAndroid Build Coastguard Worker                     b1 -= *--pb;                                               \
604*3ac0a46fSAndroid Build Coastguard Worker                     break;                                                     \
605*3ac0a46fSAndroid Build Coastguard Worker                 case S_Ext:                                                    \
606*3ac0a46fSAndroid Build Coastguard Worker                     *pa++ = lastx - a0;                                        \
607*3ac0a46fSAndroid Build Coastguard Worker                     extension(a0);                                             \
608*3ac0a46fSAndroid Build Coastguard Worker                     goto eol2d;                                                \
609*3ac0a46fSAndroid Build Coastguard Worker                 case S_EOL:                                                    \
610*3ac0a46fSAndroid Build Coastguard Worker                     *pa++ = lastx - a0;                                        \
611*3ac0a46fSAndroid Build Coastguard Worker                     NeedBits8(4, eof2d);                                       \
612*3ac0a46fSAndroid Build Coastguard Worker                     if (GetBits(4))                                            \
613*3ac0a46fSAndroid Build Coastguard Worker                         unexpected("EOL", a0);                                 \
614*3ac0a46fSAndroid Build Coastguard Worker                     ClrBits(4);                                                \
615*3ac0a46fSAndroid Build Coastguard Worker                     EOLcnt = 1;                                                \
616*3ac0a46fSAndroid Build Coastguard Worker                     goto eol2d;                                                \
617*3ac0a46fSAndroid Build Coastguard Worker                 default:                                                       \
618*3ac0a46fSAndroid Build Coastguard Worker                 badMain2d:                                                     \
619*3ac0a46fSAndroid Build Coastguard Worker                     unexpected("MainTable", a0);                               \
620*3ac0a46fSAndroid Build Coastguard Worker                     goto eol2d;                                                \
621*3ac0a46fSAndroid Build Coastguard Worker                 badBlack2d:                                                    \
622*3ac0a46fSAndroid Build Coastguard Worker                     unexpected("BlackTable", a0);                              \
623*3ac0a46fSAndroid Build Coastguard Worker                     goto eol2d;                                                \
624*3ac0a46fSAndroid Build Coastguard Worker                 badWhite2d:                                                    \
625*3ac0a46fSAndroid Build Coastguard Worker                     unexpected("WhiteTable", a0);                              \
626*3ac0a46fSAndroid Build Coastguard Worker                     goto eol2d;                                                \
627*3ac0a46fSAndroid Build Coastguard Worker                 eof2d:                                                         \
628*3ac0a46fSAndroid Build Coastguard Worker                     prematureEOF(a0);                                          \
629*3ac0a46fSAndroid Build Coastguard Worker                     CLEANUP_RUNS();                                            \
630*3ac0a46fSAndroid Build Coastguard Worker                     goto eoflab;                                               \
631*3ac0a46fSAndroid Build Coastguard Worker             }                                                                  \
632*3ac0a46fSAndroid Build Coastguard Worker         }                                                                      \
633*3ac0a46fSAndroid Build Coastguard Worker         if (RunLength)                                                         \
634*3ac0a46fSAndroid Build Coastguard Worker         {                                                                      \
635*3ac0a46fSAndroid Build Coastguard Worker             if (RunLength + a0 < lastx)                                        \
636*3ac0a46fSAndroid Build Coastguard Worker             {                                                                  \
637*3ac0a46fSAndroid Build Coastguard Worker                 /* expect a final V0 */                                        \
638*3ac0a46fSAndroid Build Coastguard Worker                 NeedBits8(1, eof2d);                                           \
639*3ac0a46fSAndroid Build Coastguard Worker                 if (!GetBits(1))                                               \
640*3ac0a46fSAndroid Build Coastguard Worker                     goto badMain2d;                                            \
641*3ac0a46fSAndroid Build Coastguard Worker                 ClrBits(1);                                                    \
642*3ac0a46fSAndroid Build Coastguard Worker             }                                                                  \
643*3ac0a46fSAndroid Build Coastguard Worker             SETVALUE(0);                                                       \
644*3ac0a46fSAndroid Build Coastguard Worker         }                                                                      \
645*3ac0a46fSAndroid Build Coastguard Worker     eol2d:                                                                     \
646*3ac0a46fSAndroid Build Coastguard Worker         CLEANUP_RUNS();                                                        \
647*3ac0a46fSAndroid Build Coastguard Worker     } while (0)
648*3ac0a46fSAndroid Build Coastguard Worker #endif /* _FAX3_ */
649