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