Blame libtiff/tif_fax3.h

Packit 994f1a
/* $Id: tif_fax3.h,v 1.5.2.1 2010-06-08 18:50:42 bfriesen Exp $ */
Packit 994f1a
Packit 994f1a
/*
Packit 994f1a
 * Copyright (c) 1990-1997 Sam Leffler
Packit 994f1a
 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
Packit 994f1a
 *
Packit 994f1a
 * Permission to use, copy, modify, distribute, and sell this software and 
Packit 994f1a
 * its documentation for any purpose is hereby granted without fee, provided
Packit 994f1a
 * that (i) the above copyright notices and this permission notice appear in
Packit 994f1a
 * all copies of the software and related documentation, and (ii) the names of
Packit 994f1a
 * Sam Leffler and Silicon Graphics may not be used in any advertising or
Packit 994f1a
 * publicity relating to the software without the specific, prior written
Packit 994f1a
 * permission of Sam Leffler and Silicon Graphics.
Packit 994f1a
 * 
Packit 994f1a
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
Packit 994f1a
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
Packit 994f1a
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
Packit 994f1a
 * 
Packit 994f1a
 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
Packit 994f1a
 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
Packit 994f1a
 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
Packit 994f1a
 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
Packit 994f1a
 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
Packit 994f1a
 * OF THIS SOFTWARE.
Packit 994f1a
 */
Packit 994f1a
Packit 994f1a
#ifndef _FAX3_
Packit 994f1a
#define	_FAX3_
Packit 994f1a
/*
Packit 994f1a
 * TIFF Library.
Packit 994f1a
 *
Packit 994f1a
 * CCITT Group 3 (T.4) and Group 4 (T.6) Decompression Support.
Packit 994f1a
 *
Packit 994f1a
 * Decoder support is derived, with permission, from the code
Packit 994f1a
 * in Frank Cringle's viewfax program;
Packit 994f1a
 *      Copyright (C) 1990, 1995  Frank D. Cringle.
Packit 994f1a
 */
Packit 994f1a
#include "tiff.h"
Packit 994f1a
Packit 994f1a
/*
Packit 994f1a
 * To override the default routine used to image decoded
Packit 994f1a
 * spans one can use the pseduo tag TIFFTAG_FAXFILLFUNC.
Packit 994f1a
 * The routine must have the type signature given below;
Packit 994f1a
 * for example:
Packit 994f1a
 *
Packit 994f1a
 * fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx)
Packit 994f1a
 *
Packit 994f1a
 * where buf is place to set the bits, runs is the array of b&w run
Packit 994f1a
 * lengths (white then black), erun is the last run in the array, and
Packit 994f1a
 * lastx is the width of the row in pixels.  Fill routines can assume
Packit 994f1a
 * the run array has room for at least lastx runs and can overwrite
Packit 994f1a
 * data in the run array as needed (e.g. to append zero runs to bring
Packit 994f1a
 * the count up to a nice multiple).
Packit 994f1a
 */
Packit 994f1a
typedef	void (*TIFFFaxFillFunc)(unsigned char*, uint32*, uint32*, uint32);
Packit 994f1a
Packit 994f1a
/*
Packit 994f1a
 * The default run filler; made external for other decoders.
Packit 994f1a
 */
Packit 994f1a
#if defined(__cplusplus)
Packit 994f1a
extern "C" {
Packit 994f1a
#endif
Packit 994f1a
extern	void _TIFFFax3fillruns(unsigned char*, uint32*, uint32*, uint32);
Packit 994f1a
#if defined(__cplusplus)
Packit 994f1a
}
Packit 994f1a
#endif
Packit 994f1a
Packit 994f1a
Packit 994f1a
/* finite state machine codes */
Packit 994f1a
#define S_Null		0
Packit 994f1a
#define S_Pass		1
Packit 994f1a
#define S_Horiz		2
Packit 994f1a
#define S_V0		3
Packit 994f1a
#define S_VR		4
Packit 994f1a
#define S_VL		5
Packit 994f1a
#define S_Ext		6
Packit 994f1a
#define S_TermW		7
Packit 994f1a
#define S_TermB		8
Packit 994f1a
#define S_MakeUpW	9
Packit 994f1a
#define S_MakeUpB	10
Packit 994f1a
#define S_MakeUp	11
Packit 994f1a
#define S_EOL		12
Packit 994f1a
Packit 994f1a
typedef struct {		/* state table entry */
Packit 994f1a
	unsigned char State;	/* see above */
Packit 994f1a
	unsigned char Width;	/* width of code in bits */
Packit 994f1a
	uint32	Param;		/* unsigned 32-bit run length in bits */
Packit 994f1a
} TIFFFaxTabEnt;
Packit 994f1a
Packit 994f1a
extern	const TIFFFaxTabEnt TIFFFaxMainTable[];
Packit 994f1a
extern	const TIFFFaxTabEnt TIFFFaxWhiteTable[];
Packit 994f1a
extern	const TIFFFaxTabEnt TIFFFaxBlackTable[];
Packit 994f1a
Packit 994f1a
/*
Packit 994f1a
 * The following macros define the majority of the G3/G4 decoder
Packit 994f1a
 * algorithm using the state tables defined elsewhere.  To build
Packit 994f1a
 * a decoder you need some setup code and some glue code. Note
Packit 994f1a
 * that you may also need/want to change the way the NeedBits*
Packit 994f1a
 * macros get input data if, for example, you know the data to be
Packit 994f1a
 * decoded is properly aligned and oriented (doing so before running
Packit 994f1a
 * the decoder can be a big performance win).
Packit 994f1a
 *
Packit 994f1a
 * Consult the decoder in the TIFF library for an idea of what you
Packit 994f1a
 * need to define and setup to make use of these definitions.
Packit 994f1a
 *
Packit 994f1a
 * NB: to enable a debugging version of these macros define FAX3_DEBUG
Packit 994f1a
 *     before including this file.  Trace output goes to stdout.
Packit 994f1a
 */
Packit 994f1a
Packit 994f1a
#ifndef EndOfData
Packit 994f1a
#define EndOfData()	(cp >= ep)
Packit 994f1a
#endif
Packit 994f1a
/*
Packit 994f1a
 * Need <=8 or <=16 bits of input data.  Unlike viewfax we
Packit 994f1a
 * cannot use/assume a word-aligned, properly bit swizzled
Packit 994f1a
 * input data set because data may come from an arbitrarily
Packit 994f1a
 * aligned, read-only source such as a memory-mapped file.
Packit 994f1a
 * Note also that the viewfax decoder does not check for
Packit 994f1a
 * running off the end of the input data buffer.  This is
Packit 994f1a
 * possible for G3-encoded data because it prescans the input
Packit 994f1a
 * data to count EOL markers, but can cause problems for G4
Packit 994f1a
 * data.  In any event, we don't prescan and must watch for
Packit 994f1a
 * running out of data since we can't permit the library to
Packit 994f1a
 * scan past the end of the input data buffer.
Packit 994f1a
 *
Packit 994f1a
 * Finally, note that we must handle remaindered data at the end
Packit 994f1a
 * of a strip specially.  The coder asks for a fixed number of
Packit 994f1a
 * bits when scanning for the next code.  This may be more bits
Packit 994f1a
 * than are actually present in the data stream.  If we appear
Packit 994f1a
 * to run out of data but still have some number of valid bits
Packit 994f1a
 * remaining then we makeup the requested amount with zeros and
Packit 994f1a
 * return successfully.  If the returned data is incorrect then
Packit 994f1a
 * we should be called again and get a premature EOF error;
Packit 994f1a
 * otherwise we should get the right answer.
Packit 994f1a
 */
Packit 994f1a
#ifndef NeedBits8
Packit 994f1a
#define NeedBits8(n,eoflab) do {					\
Packit 994f1a
    if (BitsAvail < (n)) {						\
Packit 994f1a
	if (EndOfData()) {						\
Packit 994f1a
	    if (BitsAvail == 0)			/* no valid bits */	\
Packit 994f1a
		goto eoflab;						\
Packit 994f1a
	    BitsAvail = (n);			/* pad with zeros */	\
Packit 994f1a
	} else {							\
Packit 994f1a
	    BitAcc |= ((uint32) bitmap[*cp++])<
Packit 994f1a
	    BitsAvail += 8;						\
Packit 994f1a
	}								\
Packit 994f1a
    }									\
Packit 994f1a
} while (0)
Packit 994f1a
#endif
Packit 994f1a
#ifndef NeedBits16
Packit 994f1a
#define NeedBits16(n,eoflab) do {					\
Packit 994f1a
    if (BitsAvail < (n)) {						\
Packit 994f1a
	if (EndOfData()) {						\
Packit 994f1a
	    if (BitsAvail == 0)			/* no valid bits */	\
Packit 994f1a
		goto eoflab;						\
Packit 994f1a
	    BitsAvail = (n);			/* pad with zeros */	\
Packit 994f1a
	} else {							\
Packit 994f1a
	    BitAcc |= ((uint32) bitmap[*cp++])<
Packit 994f1a
	    if ((BitsAvail += 8) < (n)) {				\
Packit 994f1a
		if (EndOfData()) {					\
Packit 994f1a
		    /* NB: we know BitsAvail is non-zero here */	\
Packit 994f1a
		    BitsAvail = (n);		/* pad with zeros */	\
Packit 994f1a
		} else {						\
Packit 994f1a
		    BitAcc |= ((uint32) bitmap[*cp++])<
Packit 994f1a
		    BitsAvail += 8;					\
Packit 994f1a
		}							\
Packit 994f1a
	    }								\
Packit 994f1a
	}								\
Packit 994f1a
    }									\
Packit 994f1a
} while (0)
Packit 994f1a
#endif
Packit 994f1a
#define GetBits(n)	(BitAcc & ((1<<(n))-1))
Packit 994f1a
#define ClrBits(n) do {							\
Packit 994f1a
    BitsAvail -= (n);							\
Packit 994f1a
    BitAcc >>= (n);							\
Packit 994f1a
} while (0)
Packit 994f1a
Packit 994f1a
#ifdef FAX3_DEBUG
Packit 994f1a
static const char* StateNames[] = {
Packit 994f1a
    "Null   ",
Packit 994f1a
    "Pass   ",
Packit 994f1a
    "Horiz  ",
Packit 994f1a
    "V0     ",
Packit 994f1a
    "VR     ",
Packit 994f1a
    "VL     ",
Packit 994f1a
    "Ext    ",
Packit 994f1a
    "TermW  ",
Packit 994f1a
    "TermB  ",
Packit 994f1a
    "MakeUpW",
Packit 994f1a
    "MakeUpB",
Packit 994f1a
    "MakeUp ",
Packit 994f1a
    "EOL    ",
Packit 994f1a
};
Packit 994f1a
#define DEBUG_SHOW putchar(BitAcc & (1 << t) ? '1' : '0')
Packit 994f1a
#define LOOKUP8(wid,tab,eoflab) do {					\
Packit 994f1a
    int t;								\
Packit 994f1a
    NeedBits8(wid,eoflab);						\
Packit 994f1a
    TabEnt = tab + GetBits(wid);					\
Packit 994f1a
    printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail,		\
Packit 994f1a
	   StateNames[TabEnt->State], TabEnt->Param);			\
Packit 994f1a
    for (t = 0; t < TabEnt->Width; t++)					\
Packit 994f1a
	DEBUG_SHOW;							\
Packit 994f1a
    putchar('\n');							\
Packit 994f1a
    fflush(stdout);							\
Packit 994f1a
    ClrBits(TabEnt->Width);						\
Packit 994f1a
} while (0)
Packit 994f1a
#define LOOKUP16(wid,tab,eoflab) do {					\
Packit 994f1a
    int t;								\
Packit 994f1a
    NeedBits16(wid,eoflab);						\
Packit 994f1a
    TabEnt = tab + GetBits(wid);					\
Packit 994f1a
    printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail,		\
Packit 994f1a
	   StateNames[TabEnt->State], TabEnt->Param);			\
Packit 994f1a
    for (t = 0; t < TabEnt->Width; t++)					\
Packit 994f1a
	DEBUG_SHOW;							\
Packit 994f1a
    putchar('\n');							\
Packit 994f1a
    fflush(stdout);							\
Packit 994f1a
    ClrBits(TabEnt->Width);						\
Packit 994f1a
} while (0)
Packit 994f1a
Packit 994f1a
#define SETVALUE(x) do {							\
Packit 994f1a
    *pa++ = RunLength + (x);						\
Packit 994f1a
    printf("SETVALUE: %d\t%d\n", RunLength + (x), a0);			\
Packit 994f1a
    a0 += x;								\
Packit 994f1a
    RunLength = 0;							\
Packit 994f1a
} while (0)
Packit 994f1a
#else
Packit 994f1a
#define LOOKUP8(wid,tab,eoflab) do {					\
Packit 994f1a
    NeedBits8(wid,eoflab);						\
Packit 994f1a
    TabEnt = tab + GetBits(wid);					\
Packit 994f1a
    ClrBits(TabEnt->Width);						\
Packit 994f1a
} while (0)
Packit 994f1a
#define LOOKUP16(wid,tab,eoflab) do {					\
Packit 994f1a
    NeedBits16(wid,eoflab);						\
Packit 994f1a
    TabEnt = tab + GetBits(wid);					\
Packit 994f1a
    ClrBits(TabEnt->Width);						\
Packit 994f1a
} while (0)
Packit 994f1a
Packit 994f1a
/*
Packit 994f1a
 * Append a run to the run length array for the
Packit 994f1a
 * current row and reset decoding state.
Packit 994f1a
 */
Packit 994f1a
#define SETVALUE(x) do {							\
Packit 994f1a
    *pa++ = RunLength + (x);						\
Packit 994f1a
    a0 += (x);								\
Packit 994f1a
    RunLength = 0;							\
Packit 994f1a
} while (0)
Packit 994f1a
#endif
Packit 994f1a
Packit 994f1a
/*
Packit 994f1a
 * Synchronize input decoding at the start of each
Packit 994f1a
 * row by scanning for an EOL (if appropriate) and
Packit 994f1a
 * skipping any trash data that might be present
Packit 994f1a
 * after a decoding error.  Note that the decoding
Packit 994f1a
 * done elsewhere that recognizes an EOL only consumes
Packit 994f1a
 * 11 consecutive zero bits.  This means that if EOLcnt
Packit 994f1a
 * is non-zero then we still need to scan for the final flag
Packit 994f1a
 * bit that is part of the EOL code.
Packit 994f1a
 */
Packit 994f1a
#define	SYNC_EOL(eoflab) do {						\
Packit 994f1a
    if (EOLcnt == 0) {							\
Packit 994f1a
	for (;;) {							\
Packit 994f1a
	    NeedBits16(11,eoflab);					\
Packit 994f1a
	    if (GetBits(11) == 0)					\
Packit 994f1a
		break;							\
Packit 994f1a
	    ClrBits(1);							\
Packit 994f1a
	}								\
Packit 994f1a
    }									\
Packit 994f1a
    for (;;) {								\
Packit 994f1a
	NeedBits8(8,eoflab);						\
Packit 994f1a
	if (GetBits(8))							\
Packit 994f1a
	    break;							\
Packit 994f1a
	ClrBits(8);							\
Packit 994f1a
    }									\
Packit 994f1a
    while (GetBits(1) == 0)						\
Packit 994f1a
	ClrBits(1);							\
Packit 994f1a
    ClrBits(1);				/* EOL bit */			\
Packit 994f1a
    EOLcnt = 0;				/* reset EOL counter/flag */	\
Packit 994f1a
} while (0)
Packit 994f1a
Packit 994f1a
/*
Packit 994f1a
 * Cleanup the array of runs after decoding a row.
Packit 994f1a
 * We adjust final runs to insure the user buffer is not
Packit 994f1a
 * overwritten and/or undecoded area is white filled.
Packit 994f1a
 */
Packit 994f1a
#define	CLEANUP_RUNS() do {						\
Packit 994f1a
    if (RunLength)							\
Packit 994f1a
	SETVALUE(0);							\
Packit 994f1a
    if (a0 != lastx) {							\
Packit 994f1a
	badlength(a0, lastx);						\
Packit 994f1a
	while (a0 > lastx && pa > thisrun)				\
Packit 994f1a
	    a0 -= *--pa;						\
Packit 994f1a
	if (a0 < lastx) {						\
Packit 994f1a
	    if (a0 < 0)							\
Packit 994f1a
		a0 = 0;							\
Packit 994f1a
	    if ((pa-thisrun)&1)						\
Packit 994f1a
		SETVALUE(0);						\
Packit 994f1a
	    SETVALUE(lastx - a0);						\
Packit 994f1a
	} else if (a0 > lastx) {					\
Packit 994f1a
	    SETVALUE(lastx);						\
Packit 994f1a
	    SETVALUE(0);							\
Packit 994f1a
	}								\
Packit 994f1a
    }									\
Packit 994f1a
} while (0)
Packit 994f1a
Packit 994f1a
/*
Packit 994f1a
 * Decode a line of 1D-encoded data.
Packit 994f1a
 *
Packit 994f1a
 * The line expanders are written as macros so that they can be reused
Packit 994f1a
 * but still have direct access to the local variables of the "calling"
Packit 994f1a
 * function.
Packit 994f1a
 *
Packit 994f1a
 * Note that unlike the original version we have to explicitly test for
Packit 994f1a
 * a0 >= lastx after each black/white run is decoded.  This is because
Packit 994f1a
 * the original code depended on the input data being zero-padded to
Packit 994f1a
 * insure the decoder recognized an EOL before running out of data.
Packit 994f1a
 */
Packit 994f1a
#define EXPAND1D(eoflab) do {						\
Packit 994f1a
    for (;;) {								\
Packit 994f1a
	for (;;) {							\
Packit 994f1a
	    LOOKUP16(12, TIFFFaxWhiteTable, eof1d);			\
Packit 994f1a
	    switch (TabEnt->State) {					\
Packit 994f1a
	    case S_EOL:							\
Packit 994f1a
		EOLcnt = 1;						\
Packit 994f1a
		goto done1d;						\
Packit 994f1a
	    case S_TermW:						\
Packit 994f1a
		SETVALUE(TabEnt->Param);					\
Packit 994f1a
		goto doneWhite1d;					\
Packit 994f1a
	    case S_MakeUpW:						\
Packit 994f1a
	    case S_MakeUp:						\
Packit 994f1a
		a0 += TabEnt->Param;					\
Packit 994f1a
		RunLength += TabEnt->Param;				\
Packit 994f1a
		break;							\
Packit 994f1a
	    default:							\
Packit 994f1a
		unexpected("WhiteTable", a0);				\
Packit 994f1a
		goto done1d;						\
Packit 994f1a
	    }								\
Packit 994f1a
	}								\
Packit 994f1a
    doneWhite1d:							\
Packit 994f1a
	if (a0 >= lastx)						\
Packit 994f1a
	    goto done1d;						\
Packit 994f1a
	for (;;) {							\
Packit 994f1a
	    LOOKUP16(13, TIFFFaxBlackTable, eof1d);			\
Packit 994f1a
	    switch (TabEnt->State) {					\
Packit 994f1a
	    case S_EOL:							\
Packit 994f1a
		EOLcnt = 1;						\
Packit 994f1a
		goto done1d;						\
Packit 994f1a
	    case S_TermB:						\
Packit 994f1a
		SETVALUE(TabEnt->Param);					\
Packit 994f1a
		goto doneBlack1d;					\
Packit 994f1a
	    case S_MakeUpB:						\
Packit 994f1a
	    case S_MakeUp:						\
Packit 994f1a
		a0 += TabEnt->Param;					\
Packit 994f1a
		RunLength += TabEnt->Param;				\
Packit 994f1a
		break;							\
Packit 994f1a
	    default:							\
Packit 994f1a
		unexpected("BlackTable", a0);				\
Packit 994f1a
		goto done1d;						\
Packit 994f1a
	    }								\
Packit 994f1a
	}								\
Packit 994f1a
    doneBlack1d:							\
Packit 994f1a
	if (a0 >= lastx)						\
Packit 994f1a
	    goto done1d;						\
Packit 994f1a
        if( *(pa-1) == 0 && *(pa-2) == 0 )				\
Packit 994f1a
            pa -= 2;                                                    \
Packit 994f1a
    }									\
Packit 994f1a
eof1d:									\
Packit 994f1a
    prematureEOF(a0);							\
Packit 994f1a
    CLEANUP_RUNS();							\
Packit 994f1a
    goto eoflab;							\
Packit 994f1a
done1d:									\
Packit 994f1a
    CLEANUP_RUNS();							\
Packit 994f1a
} while (0)
Packit 994f1a
Packit 994f1a
/*
Packit 994f1a
 * Update the value of b1 using the array
Packit 994f1a
 * of runs for the reference line.
Packit 994f1a
 */
Packit 994f1a
#define CHECK_b1 do {							\
Packit 994f1a
    if (pa != thisrun) while (b1 <= a0 && b1 < lastx) {			\
Packit 994f1a
	b1 += pb[0] + pb[1];						\
Packit 994f1a
	pb += 2;							\
Packit 994f1a
    }									\
Packit 994f1a
} while (0)
Packit 994f1a
Packit 994f1a
/*
Packit 994f1a
 * Expand a row of 2D-encoded data.
Packit 994f1a
 */
Packit 994f1a
#define EXPAND2D(eoflab) do {						\
Packit 994f1a
    while (a0 < lastx) {						\
Packit 994f1a
	LOOKUP8(7, TIFFFaxMainTable, eof2d);				\
Packit 994f1a
	switch (TabEnt->State) {					\
Packit 994f1a
	case S_Pass:							\
Packit 994f1a
	    CHECK_b1;							\
Packit 994f1a
	    b1 += *pb++;						\
Packit 994f1a
	    RunLength += b1 - a0;					\
Packit 994f1a
	    a0 = b1;							\
Packit 994f1a
	    b1 += *pb++;						\
Packit 994f1a
	    break;							\
Packit 994f1a
	case S_Horiz:							\
Packit 994f1a
	    if ((pa-thisrun)&1) {					\
Packit 994f1a
		for (;;) {	/* black first */			\
Packit 994f1a
		    LOOKUP16(13, TIFFFaxBlackTable, eof2d);		\
Packit 994f1a
		    switch (TabEnt->State) {				\
Packit 994f1a
		    case S_TermB:					\
Packit 994f1a
			SETVALUE(TabEnt->Param);				\
Packit 994f1a
			goto doneWhite2da;				\
Packit 994f1a
		    case S_MakeUpB:					\
Packit 994f1a
		    case S_MakeUp:					\
Packit 994f1a
			a0 += TabEnt->Param;				\
Packit 994f1a
			RunLength += TabEnt->Param;			\
Packit 994f1a
			break;						\
Packit 994f1a
		    default:						\
Packit 994f1a
			goto badBlack2d;				\
Packit 994f1a
		    }							\
Packit 994f1a
		}							\
Packit 994f1a
	    doneWhite2da:;						\
Packit 994f1a
		for (;;) {	/* then white */			\
Packit 994f1a
		    LOOKUP16(12, TIFFFaxWhiteTable, eof2d);		\
Packit 994f1a
		    switch (TabEnt->State) {				\
Packit 994f1a
		    case S_TermW:					\
Packit 994f1a
			SETVALUE(TabEnt->Param);				\
Packit 994f1a
			goto doneBlack2da;				\
Packit 994f1a
		    case S_MakeUpW:					\
Packit 994f1a
		    case S_MakeUp:					\
Packit 994f1a
			a0 += TabEnt->Param;				\
Packit 994f1a
			RunLength += TabEnt->Param;			\
Packit 994f1a
			break;						\
Packit 994f1a
		    default:						\
Packit 994f1a
			goto badWhite2d;				\
Packit 994f1a
		    }							\
Packit 994f1a
		}							\
Packit 994f1a
	    doneBlack2da:;						\
Packit 994f1a
	    } else {							\
Packit 994f1a
		for (;;) {	/* white first */			\
Packit 994f1a
		    LOOKUP16(12, TIFFFaxWhiteTable, eof2d);		\
Packit 994f1a
		    switch (TabEnt->State) {				\
Packit 994f1a
		    case S_TermW:					\
Packit 994f1a
			SETVALUE(TabEnt->Param);				\
Packit 994f1a
			goto doneWhite2db;				\
Packit 994f1a
		    case S_MakeUpW:					\
Packit 994f1a
		    case S_MakeUp:					\
Packit 994f1a
			a0 += TabEnt->Param;				\
Packit 994f1a
			RunLength += TabEnt->Param;			\
Packit 994f1a
			break;						\
Packit 994f1a
		    default:						\
Packit 994f1a
			goto badWhite2d;				\
Packit 994f1a
		    }							\
Packit 994f1a
		}							\
Packit 994f1a
	    doneWhite2db:;						\
Packit 994f1a
		for (;;) {	/* then black */			\
Packit 994f1a
		    LOOKUP16(13, TIFFFaxBlackTable, eof2d);		\
Packit 994f1a
		    switch (TabEnt->State) {				\
Packit 994f1a
		    case S_TermB:					\
Packit 994f1a
			SETVALUE(TabEnt->Param);				\
Packit 994f1a
			goto doneBlack2db;				\
Packit 994f1a
		    case S_MakeUpB:					\
Packit 994f1a
		    case S_MakeUp:					\
Packit 994f1a
			a0 += TabEnt->Param;				\
Packit 994f1a
			RunLength += TabEnt->Param;			\
Packit 994f1a
			break;						\
Packit 994f1a
		    default:						\
Packit 994f1a
			goto badBlack2d;				\
Packit 994f1a
		    }							\
Packit 994f1a
		}							\
Packit 994f1a
	    doneBlack2db:;						\
Packit 994f1a
	    }								\
Packit 994f1a
	    CHECK_b1;							\
Packit 994f1a
	    break;							\
Packit 994f1a
	case S_V0:							\
Packit 994f1a
	    CHECK_b1;							\
Packit 994f1a
	    SETVALUE(b1 - a0);						\
Packit 994f1a
	    b1 += *pb++;						\
Packit 994f1a
	    break;							\
Packit 994f1a
	case S_VR:							\
Packit 994f1a
	    CHECK_b1;							\
Packit 994f1a
	    SETVALUE(b1 - a0 + TabEnt->Param);				\
Packit 994f1a
	    b1 += *pb++;						\
Packit 994f1a
	    break;							\
Packit 994f1a
	case S_VL:							\
Packit 994f1a
	    CHECK_b1;							\
Packit 994f1a
	    SETVALUE(b1 - a0 - TabEnt->Param);				\
Packit 994f1a
	    b1 -= *--pb;						\
Packit 994f1a
	    break;							\
Packit 994f1a
	case S_Ext:							\
Packit 994f1a
	    *pa++ = lastx - a0;						\
Packit 994f1a
	    extension(a0);						\
Packit 994f1a
	    goto eol2d;							\
Packit 994f1a
	case S_EOL:							\
Packit 994f1a
	    *pa++ = lastx - a0;						\
Packit 994f1a
	    NeedBits8(4,eof2d);						\
Packit 994f1a
	    if (GetBits(4))						\
Packit 994f1a
		unexpected("EOL", a0);					\
Packit 994f1a
            ClrBits(4);                                                 \
Packit 994f1a
	    EOLcnt = 1;							\
Packit 994f1a
	    goto eol2d;							\
Packit 994f1a
	default:							\
Packit 994f1a
	badMain2d:							\
Packit 994f1a
	    unexpected("MainTable", a0);				\
Packit 994f1a
	    goto eol2d;							\
Packit 994f1a
	badBlack2d:							\
Packit 994f1a
	    unexpected("BlackTable", a0);				\
Packit 994f1a
	    goto eol2d;							\
Packit 994f1a
	badWhite2d:							\
Packit 994f1a
	    unexpected("WhiteTable", a0);				\
Packit 994f1a
	    goto eol2d;							\
Packit 994f1a
	eof2d:								\
Packit 994f1a
	    prematureEOF(a0);						\
Packit 994f1a
	    CLEANUP_RUNS();						\
Packit 994f1a
	    goto eoflab;						\
Packit 994f1a
	}								\
Packit 994f1a
    }									\
Packit 994f1a
    if (RunLength) {							\
Packit 994f1a
	if (RunLength + a0 < lastx) {					\
Packit 994f1a
	    /* expect a final V0 */					\
Packit 994f1a
	    NeedBits8(1,eof2d);						\
Packit 994f1a
	    if (!GetBits(1))						\
Packit 994f1a
		goto badMain2d;						\
Packit 994f1a
	    ClrBits(1);							\
Packit 994f1a
	}								\
Packit 994f1a
	SETVALUE(0);							\
Packit 994f1a
    }									\
Packit 994f1a
eol2d:									\
Packit 994f1a
    CLEANUP_RUNS();							\
Packit 994f1a
} while (0)
Packit 994f1a
#endif /* _FAX3_ */
Packit 994f1a
/*
Packit 994f1a
 * Local Variables:
Packit 994f1a
 * mode: c
Packit 994f1a
 * c-basic-offset: 8
Packit 994f1a
 * fill-column: 78
Packit 994f1a
 * End:
Packit 994f1a
 */