1/* $Id: tif_fax3.c,v 1.75 2015-08-30 20:49:55 erouault Exp $ */
2
3/*
4 * Copyright (c) 1990-1997 Sam Leffler
5 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
6 *
7 * Permission to use, copy, modify, distribute, and sell this software and
8 * its documentation for any purpose is hereby granted without fee, provided
9 * that (i) the above copyright notices and this permission notice appear in
10 * all copies of the software and related documentation, and (ii) the names of
11 * Sam Leffler and Silicon Graphics may not be used in any advertising or
12 * publicity relating to the software without the specific, prior written
13 * permission of Sam Leffler and Silicon Graphics.
14 *
15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
18 *
19 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24 * OF THIS SOFTWARE.
25 */
26
27#include "tiffiop.h"
28#ifdef CCITT_SUPPORT
29/*
30 * TIFF Library.
31 *
32 * CCITT Group 3 (T.4) and Group 4 (T.6) Compression Support.
33 *
34 * This file contains support for decoding and encoding TIFF
35 * compression algorithms 2, 3, 4, and 32771.
36 *
37 * Decoder support is derived, with permission, from the code
38 * in Frank Cringle's viewfax program;
39 *      Copyright (C) 1990, 1995  Frank D. Cringle.
40 */
41#include "tif_fax3.h"
42#define	G3CODES
43#include "t4.h"
44#include <stdio.h>
45
46/*
47 * Compression+decompression state blocks are
48 * derived from this ``base state'' block.
49 */
50typedef struct {
51	int      rw_mode;                /* O_RDONLY for decode, else encode */
52	int      mode;                   /* operating mode */
53	tmsize_t rowbytes;               /* bytes in a decoded scanline */
54	uint32   rowpixels;              /* pixels in a scanline */
55
56	uint16   cleanfaxdata;           /* CleanFaxData tag */
57	uint32   badfaxrun;              /* BadFaxRun tag */
58	uint32   badfaxlines;            /* BadFaxLines tag */
59	uint32   groupoptions;           /* Group 3/4 options tag */
60
61	TIFFVGetMethod  vgetparent;      /* super-class method */
62	TIFFVSetMethod  vsetparent;      /* super-class method */
63	TIFFPrintMethod printdir;        /* super-class method */
64} Fax3BaseState;
65#define	Fax3State(tif)		((Fax3BaseState*) (tif)->tif_data)
66
67typedef enum { G3_1D, G3_2D } Ttag;
68typedef struct {
69	Fax3BaseState b;
70
71	/* Decoder state info */
72	const unsigned char* bitmap;	/* bit reversal table */
73	uint32	data;			/* current i/o byte/word */
74	int	bit;			/* current i/o bit in byte */
75	int	EOLcnt;			/* count of EOL codes recognized */
76	TIFFFaxFillFunc fill;		/* fill routine */
77	uint32*	runs;			/* b&w runs for current/previous row */
78	uint32*	refruns;		/* runs for reference line */
79	uint32*	curruns;		/* runs for current line */
80
81	/* Encoder state info */
82	Ttag    tag;			/* encoding state */
83	unsigned char*	refline;	/* reference line for 2d decoding */
84	int	k;			/* #rows left that can be 2d encoded */
85	int	maxk;			/* max #rows that can be 2d encoded */
86
87	int line;
88} Fax3CodecState;
89#define DecoderState(tif) ((Fax3CodecState*) Fax3State(tif))
90#define EncoderState(tif) ((Fax3CodecState*) Fax3State(tif))
91
92#define is2DEncoding(sp) (sp->b.groupoptions & GROUP3OPT_2DENCODING)
93#define isAligned(p,t) ((((size_t)(p)) & (sizeof (t)-1)) == 0)
94
95/*
96 * Group 3 and Group 4 Decoding.
97 */
98
99/*
100 * These macros glue the TIFF library state to
101 * the state expected by Frank's decoder.
102 */
103#define	DECLARE_STATE(tif, sp, mod)					\
104    static const char module[] = mod;					\
105    Fax3CodecState* sp = DecoderState(tif);				\
106    int a0;				/* reference element */		\
107    int lastx = sp->b.rowpixels;	/* last element in row */	\
108    uint32 BitAcc;			/* bit accumulator */		\
109    int BitsAvail;			/* # valid bits in BitAcc */	\
110    int RunLength;			/* length of current run */	\
111    unsigned char* cp;			/* next byte of input data */	\
112    unsigned char* ep;			/* end of input data */		\
113    uint32* pa;				/* place to stuff next run */	\
114    uint32* thisrun;			/* current row's run array */	\
115    int EOLcnt;				/* # EOL codes recognized */	\
116    const unsigned char* bitmap = sp->bitmap;	/* input data bit reverser */	\
117    const TIFFFaxTabEnt* TabEnt
118#define	DECLARE_STATE_2D(tif, sp, mod)					\
119    DECLARE_STATE(tif, sp, mod);					\
120    int b1;				/* next change on prev line */	\
121    uint32* pb				/* next run in reference line */\
122/*
123 * Load any state that may be changed during decoding.
124 */
125#define	CACHE_STATE(tif, sp) do {					\
126    BitAcc = sp->data;							\
127    BitsAvail = sp->bit;						\
128    EOLcnt = sp->EOLcnt;						\
129    cp = (unsigned char*) tif->tif_rawcp;				\
130    ep = cp + tif->tif_rawcc;						\
131} while (0)
132/*
133 * Save state possibly changed during decoding.
134 */
135#define	UNCACHE_STATE(tif, sp) do {					\
136    sp->bit = BitsAvail;						\
137    sp->data = BitAcc;							\
138    sp->EOLcnt = EOLcnt;						\
139    tif->tif_rawcc -= (tmsize_t)((uint8*) cp - tif->tif_rawcp);		\
140    tif->tif_rawcp = (uint8*) cp;					\
141} while (0)
142
143/*
144 * Setup state for decoding a strip.
145 */
146static int
147Fax3PreDecode(TIFF* tif, uint16 s)
148{
149	Fax3CodecState* sp = DecoderState(tif);
150
151	(void) s;
152	assert(sp != NULL);
153	sp->bit = 0;			/* force initial read */
154	sp->data = 0;
155	sp->EOLcnt = 0;			/* force initial scan for EOL */
156	/*
157	 * Decoder assumes lsb-to-msb bit order.  Note that we select
158	 * this here rather than in Fax3SetupState so that viewers can
159	 * hold the image open, fiddle with the FillOrder tag value,
160	 * and then re-decode the image.  Otherwise they'd need to close
161	 * and open the image to get the state reset.
162	 */
163	sp->bitmap =
164	    TIFFGetBitRevTable(tif->tif_dir.td_fillorder != FILLORDER_LSB2MSB);
165	if (sp->refruns) {		/* init reference line to white */
166		sp->refruns[0] = (uint32) sp->b.rowpixels;
167		sp->refruns[1] = 0;
168	}
169	sp->line = 0;
170	return (1);
171}
172
173/*
174 * Routine for handling various errors/conditions.
175 * Note how they are "glued into the decoder" by
176 * overriding the definitions used by the decoder.
177 */
178
179static void
180Fax3Unexpected(const char* module, TIFF* tif, uint32 line, uint32 a0)
181{
182	TIFFErrorExt(tif->tif_clientdata, module, "Bad code word at line %u of %s %u (x %u)",
183	    line, isTiled(tif) ? "tile" : "strip",
184	    (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip),
185	    a0);
186}
187#define	unexpected(table, a0)	Fax3Unexpected(module, tif, sp->line, a0)
188
189static void
190Fax3Extension(const char* module, TIFF* tif, uint32 line, uint32 a0)
191{
192	TIFFErrorExt(tif->tif_clientdata, module,
193	    "Uncompressed data (not supported) at line %u of %s %u (x %u)",
194	    line, isTiled(tif) ? "tile" : "strip",
195	    (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip),
196	    a0);
197}
198#define	extension(a0)	Fax3Extension(module, tif, sp->line, a0)
199
200static void
201Fax3BadLength(const char* module, TIFF* tif, uint32 line, uint32 a0, uint32 lastx)
202{
203	TIFFWarningExt(tif->tif_clientdata, module, "%s at line %u of %s %u (got %u, expected %u)",
204	    a0 < lastx ? "Premature EOL" : "Line length mismatch",
205	    line, isTiled(tif) ? "tile" : "strip",
206	    (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip),
207	    a0, lastx);
208}
209#define	badlength(a0,lastx)	Fax3BadLength(module, tif, sp->line, a0, lastx)
210
211static void
212Fax3PrematureEOF(const char* module, TIFF* tif, uint32 line, uint32 a0)
213{
214	TIFFWarningExt(tif->tif_clientdata, module, "Premature EOF at line %u of %s %u (x %u)",
215	    line, isTiled(tif) ? "tile" : "strip",
216	    (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip),
217	    a0);
218}
219#define	prematureEOF(a0)	Fax3PrematureEOF(module, tif, sp->line, a0)
220
221#define	Nop
222
223/*
224 * Decode the requested amount of G3 1D-encoded data.
225 */
226static int
227Fax3Decode1D(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
228{
229	DECLARE_STATE(tif, sp, "Fax3Decode1D");
230	(void) s;
231	if (occ % sp->b.rowbytes)
232	{
233		TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
234		return (-1);
235	}
236	CACHE_STATE(tif, sp);
237	thisrun = sp->curruns;
238	while (occ > 0) {
239		a0 = 0;
240		RunLength = 0;
241		pa = thisrun;
242#ifdef FAX3_DEBUG
243		printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail);
244		printf("-------------------- %d\n", tif->tif_row);
245		fflush(stdout);
246#endif
247		SYNC_EOL(EOF1D);
248		EXPAND1D(EOF1Da);
249		(*sp->fill)(buf, thisrun, pa, lastx);
250		buf += sp->b.rowbytes;
251		occ -= sp->b.rowbytes;
252		sp->line++;
253		continue;
254	EOF1D:				/* premature EOF */
255		CLEANUP_RUNS();
256	EOF1Da:				/* premature EOF */
257		(*sp->fill)(buf, thisrun, pa, lastx);
258		UNCACHE_STATE(tif, sp);
259		return (-1);
260	}
261	UNCACHE_STATE(tif, sp);
262	return (1);
263}
264
265#define	SWAP(t,a,b)	{ t x; x = (a); (a) = (b); (b) = x; }
266/*
267 * Decode the requested amount of G3 2D-encoded data.
268 */
269static int
270Fax3Decode2D(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
271{
272	DECLARE_STATE_2D(tif, sp, "Fax3Decode2D");
273	int is1D;			/* current line is 1d/2d-encoded */
274	(void) s;
275	if (occ % sp->b.rowbytes)
276	{
277		TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
278		return (-1);
279	}
280	CACHE_STATE(tif, sp);
281	while (occ > 0) {
282		a0 = 0;
283		RunLength = 0;
284		pa = thisrun = sp->curruns;
285#ifdef FAX3_DEBUG
286		printf("\nBitAcc=%08X, BitsAvail = %d EOLcnt = %d",
287		    BitAcc, BitsAvail, EOLcnt);
288#endif
289		SYNC_EOL(EOF2D);
290		NeedBits8(1, EOF2D);
291		is1D = GetBits(1);	/* 1D/2D-encoding tag bit */
292		ClrBits(1);
293#ifdef FAX3_DEBUG
294		printf(" %s\n-------------------- %d\n",
295		    is1D ? "1D" : "2D", tif->tif_row);
296		fflush(stdout);
297#endif
298		pb = sp->refruns;
299		b1 = *pb++;
300		if (is1D)
301			EXPAND1D(EOF2Da);
302		else
303			EXPAND2D(EOF2Da);
304		(*sp->fill)(buf, thisrun, pa, lastx);
305		SETVALUE(0);		/* imaginary change for reference */
306		SWAP(uint32*, sp->curruns, sp->refruns);
307		buf += sp->b.rowbytes;
308		occ -= sp->b.rowbytes;
309		sp->line++;
310		continue;
311	EOF2D:				/* premature EOF */
312		CLEANUP_RUNS();
313	EOF2Da:				/* premature EOF */
314		(*sp->fill)(buf, thisrun, pa, lastx);
315		UNCACHE_STATE(tif, sp);
316		return (-1);
317	}
318	UNCACHE_STATE(tif, sp);
319	return (1);
320}
321#undef SWAP
322
323/*
324 * The ZERO & FILL macros must handle spans < 2*sizeof(long) bytes.
325 * For machines with 64-bit longs this is <16 bytes; otherwise
326 * this is <8 bytes.  We optimize the code here to reflect the
327 * machine characteristics.
328 */
329#if SIZEOF_UNSIGNED_LONG == 8
330# define FILL(n, cp)							    \
331    switch (n) {							    \
332    case 15:(cp)[14] = 0xff; case 14:(cp)[13] = 0xff; case 13: (cp)[12] = 0xff;\
333    case 12:(cp)[11] = 0xff; case 11:(cp)[10] = 0xff; case 10: (cp)[9] = 0xff;\
334    case  9: (cp)[8] = 0xff; case  8: (cp)[7] = 0xff; case  7: (cp)[6] = 0xff;\
335    case  6: (cp)[5] = 0xff; case  5: (cp)[4] = 0xff; case  4: (cp)[3] = 0xff;\
336    case  3: (cp)[2] = 0xff; case  2: (cp)[1] = 0xff;			      \
337    case  1: (cp)[0] = 0xff; (cp) += (n); case 0:  ;			      \
338    }
339# define ZERO(n, cp)							\
340    switch (n) {							\
341    case 15:(cp)[14] = 0; case 14:(cp)[13] = 0; case 13: (cp)[12] = 0;	\
342    case 12:(cp)[11] = 0; case 11:(cp)[10] = 0; case 10: (cp)[9] = 0;	\
343    case  9: (cp)[8] = 0; case  8: (cp)[7] = 0; case  7: (cp)[6] = 0;	\
344    case  6: (cp)[5] = 0; case  5: (cp)[4] = 0; case  4: (cp)[3] = 0;	\
345    case  3: (cp)[2] = 0; case  2: (cp)[1] = 0;				\
346    case  1: (cp)[0] = 0; (cp) += (n); case 0:  ;			\
347    }
348#else
349# define FILL(n, cp)							    \
350    switch (n) {							    \
351    case 7: (cp)[6] = 0xff; case 6: (cp)[5] = 0xff; case 5: (cp)[4] = 0xff; \
352    case 4: (cp)[3] = 0xff; case 3: (cp)[2] = 0xff; case 2: (cp)[1] = 0xff; \
353    case 1: (cp)[0] = 0xff; (cp) += (n); case 0:  ;			    \
354    }
355# define ZERO(n, cp)							\
356    switch (n) {							\
357    case 7: (cp)[6] = 0; case 6: (cp)[5] = 0; case 5: (cp)[4] = 0;	\
358    case 4: (cp)[3] = 0; case 3: (cp)[2] = 0; case 2: (cp)[1] = 0;	\
359    case 1: (cp)[0] = 0; (cp) += (n); case 0:  ;			\
360    }
361#endif
362
363/*
364 * Bit-fill a row according to the white/black
365 * runs generated during G3/G4 decoding.
366 */
367void
368_TIFFFax3fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx)
369{
370	static const unsigned char _fillmasks[] =
371	    { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff };
372	unsigned char* cp;
373	uint32 x, bx, run;
374	int32 n, nw;
375	long* lp;
376
377	if ((erun-runs)&1)
378	    *erun++ = 0;
379	x = 0;
380	for (; runs < erun; runs += 2) {
381	    run = runs[0];
382	    if (x+run > lastx || run > lastx )
383		run = runs[0] = (uint32) (lastx - x);
384	    if (run) {
385		cp = buf + (x>>3);
386		bx = x&7;
387		if (run > 8-bx) {
388		    if (bx) {			/* align to byte boundary */
389			*cp++ &= 0xff << (8-bx);
390			run -= 8-bx;
391		    }
392		    if( (n = run >> 3) != 0 ) {	/* multiple bytes to fill */
393			if ((n/sizeof (long)) > 1) {
394			    /*
395			     * Align to longword boundary and fill.
396			     */
397			    for (; n && !isAligned(cp, long); n--)
398				    *cp++ = 0x00;
399			    lp = (long*) cp;
400			    nw = (int32)(n / sizeof (long));
401			    n -= nw * sizeof (long);
402			    do {
403				    *lp++ = 0L;
404			    } while (--nw);
405			    cp = (unsigned char*) lp;
406			}
407			ZERO(n, cp);
408			run &= 7;
409		    }
410		    if (run)
411			cp[0] &= 0xff >> run;
412		} else
413		    cp[0] &= ~(_fillmasks[run]>>bx);
414		x += runs[0];
415	    }
416	    run = runs[1];
417	    if (x+run > lastx || run > lastx )
418		run = runs[1] = lastx - x;
419	    if (run) {
420		cp = buf + (x>>3);
421		bx = x&7;
422		if (run > 8-bx) {
423		    if (bx) {			/* align to byte boundary */
424			*cp++ |= 0xff >> bx;
425			run -= 8-bx;
426		    }
427		    if( (n = run>>3) != 0 ) {	/* multiple bytes to fill */
428			if ((n/sizeof (long)) > 1) {
429			    /*
430			     * Align to longword boundary and fill.
431			     */
432			    for (; n && !isAligned(cp, long); n--)
433				*cp++ = 0xff;
434			    lp = (long*) cp;
435			    nw = (int32)(n / sizeof (long));
436			    n -= nw * sizeof (long);
437			    do {
438				*lp++ = -1L;
439			    } while (--nw);
440			    cp = (unsigned char*) lp;
441			}
442			FILL(n, cp);
443			run &= 7;
444		    }
445                    /* Explicit 0xff masking to make icc -check=conversions happy */
446		    if (run)
447			cp[0] = (unsigned char)((cp[0] | (0xff00 >> run))&0xff);
448		} else
449		    cp[0] |= _fillmasks[run]>>bx;
450		x += runs[1];
451	    }
452	}
453	assert(x == lastx);
454}
455#undef	ZERO
456#undef	FILL
457
458static int
459Fax3FixupTags(TIFF* tif)
460{
461	(void) tif;
462	return (1);
463}
464
465/*
466 * Setup G3/G4-related compression/decompression state
467 * before data is processed.  This routine is called once
468 * per image -- it sets up different state based on whether
469 * or not decoding or encoding is being done and whether
470 * 1D- or 2D-encoded data is involved.
471 */
472static int
473Fax3SetupState(TIFF* tif)
474{
475	static const char module[] = "Fax3SetupState";
476	TIFFDirectory* td = &tif->tif_dir;
477	Fax3BaseState* sp = Fax3State(tif);
478	int needsRefLine;
479	Fax3CodecState* dsp = (Fax3CodecState*) Fax3State(tif);
480	tmsize_t rowbytes;
481	uint32 rowpixels, nruns;
482
483	if (td->td_bitspersample != 1) {
484		TIFFErrorExt(tif->tif_clientdata, module,
485		    "Bits/sample must be 1 for Group 3/4 encoding/decoding");
486		return (0);
487	}
488	/*
489	 * Calculate the scanline/tile widths.
490	 */
491	if (isTiled(tif)) {
492		rowbytes = TIFFTileRowSize(tif);
493		rowpixels = td->td_tilewidth;
494	} else {
495		rowbytes = TIFFScanlineSize(tif);
496		rowpixels = td->td_imagewidth;
497	}
498	sp->rowbytes = rowbytes;
499	sp->rowpixels = rowpixels;
500	/*
501	 * Allocate any additional space required for decoding/encoding.
502	 */
503	needsRefLine = (
504	    (sp->groupoptions & GROUP3OPT_2DENCODING) ||
505	    td->td_compression == COMPRESSION_CCITTFAX4
506	);
507
508	/*
509	  Assure that allocation computations do not overflow.
510
511	  TIFFroundup and TIFFSafeMultiply return zero on integer overflow
512	*/
513	dsp->runs=(uint32*) NULL;
514	nruns = TIFFroundup_32(rowpixels,32);
515	if (needsRefLine) {
516		nruns = TIFFSafeMultiply(uint32,nruns,2);
517	}
518	if ((nruns == 0) || (TIFFSafeMultiply(uint32,nruns,2) == 0)) {
519		TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
520			     "Row pixels integer overflow (rowpixels %u)",
521			     rowpixels);
522		return (0);
523	}
524	dsp->runs = (uint32*) _TIFFCheckMalloc(tif,
525					       TIFFSafeMultiply(uint32,nruns,2),
526					       sizeof (uint32),
527					       "for Group 3/4 run arrays");
528	if (dsp->runs == NULL)
529		return (0);
530	memset( dsp->runs, 0, TIFFSafeMultiply(uint32,nruns,2)*sizeof(uint32));
531	dsp->curruns = dsp->runs;
532	if (needsRefLine)
533		dsp->refruns = dsp->runs + nruns;
534	else
535		dsp->refruns = NULL;
536	if (td->td_compression == COMPRESSION_CCITTFAX3
537	    && is2DEncoding(dsp)) {	/* NB: default is 1D routine */
538		tif->tif_decoderow = Fax3Decode2D;
539		tif->tif_decodestrip = Fax3Decode2D;
540		tif->tif_decodetile = Fax3Decode2D;
541	}
542
543	if (needsRefLine) {		/* 2d encoding */
544		Fax3CodecState* esp = EncoderState(tif);
545		/*
546		 * 2d encoding requires a scanline
547		 * buffer for the ``reference line''; the
548		 * scanline against which delta encoding
549		 * is referenced.  The reference line must
550		 * be initialized to be ``white'' (done elsewhere).
551		 */
552		esp->refline = (unsigned char*) _TIFFmalloc(rowbytes);
553		if (esp->refline == NULL) {
554			TIFFErrorExt(tif->tif_clientdata, module,
555			    "No space for Group 3/4 reference line");
556			return (0);
557		}
558	} else					/* 1d encoding */
559		EncoderState(tif)->refline = NULL;
560
561	return (1);
562}
563
564/*
565 * CCITT Group 3 FAX Encoding.
566 */
567
568#define	Fax3FlushBits(tif, sp) {				\
569	if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize)		\
570		(void) TIFFFlushData1(tif);			\
571	*(tif)->tif_rawcp++ = (uint8) (sp)->data;		\
572	(tif)->tif_rawcc++;					\
573	(sp)->data = 0, (sp)->bit = 8;				\
574}
575#define	_FlushBits(tif) {					\
576	if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize)		\
577		(void) TIFFFlushData1(tif);			\
578	*(tif)->tif_rawcp++ = (uint8) data;		\
579	(tif)->tif_rawcc++;					\
580	data = 0, bit = 8;					\
581}
582static const int _msbmask[9] =
583    { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
584#define	_PutBits(tif, bits, length) {				\
585	while (length > bit) {					\
586		data |= bits >> (length - bit);			\
587		length -= bit;					\
588		_FlushBits(tif);				\
589	}							\
590        assert( length < 9 );                                   \
591	data |= (bits & _msbmask[length]) << (bit - length);	\
592	bit -= length;						\
593	if (bit == 0)						\
594		_FlushBits(tif);				\
595}
596
597/*
598 * Write a variable-length bit-value to
599 * the output stream.  Values are
600 * assumed to be at most 16 bits.
601 */
602static void
603Fax3PutBits(TIFF* tif, unsigned int bits, unsigned int length)
604{
605	Fax3CodecState* sp = EncoderState(tif);
606	unsigned int bit = sp->bit;
607	int data = sp->data;
608
609	_PutBits(tif, bits, length);
610
611	sp->data = data;
612	sp->bit = bit;
613}
614
615/*
616 * Write a code to the output stream.
617 */
618#define putcode(tif, te)	Fax3PutBits(tif, (te)->code, (te)->length)
619
620#ifdef FAX3_DEBUG
621#define	DEBUG_COLOR(w) (tab == TIFFFaxWhiteCodes ? w "W" : w "B")
622#define	DEBUG_PRINT(what,len) {						\
623    int t;								\
624    printf("%08X/%-2d: %s%5d\t", data, bit, DEBUG_COLOR(what), len);	\
625    for (t = length-1; t >= 0; t--)					\
626	putchar(code & (1<<t) ? '1' : '0');				\
627    putchar('\n');							\
628}
629#endif
630
631/*
632 * Write the sequence of codes that describes
633 * the specified span of zero's or one's.  The
634 * appropriate table that holds the make-up and
635 * terminating codes is supplied.
636 */
637static void
638putspan(TIFF* tif, int32 span, const tableentry* tab)
639{
640	Fax3CodecState* sp = EncoderState(tif);
641	unsigned int bit = sp->bit;
642	int data = sp->data;
643	unsigned int code, length;
644
645	while (span >= 2624) {
646		const tableentry* te = &tab[63 + (2560>>6)];
647		code = te->code, length = te->length;
648#ifdef FAX3_DEBUG
649		DEBUG_PRINT("MakeUp", te->runlen);
650#endif
651		_PutBits(tif, code, length);
652		span -= te->runlen;
653	}
654	if (span >= 64) {
655		const tableentry* te = &tab[63 + (span>>6)];
656		assert(te->runlen == 64*(span>>6));
657		code = te->code, length = te->length;
658#ifdef FAX3_DEBUG
659		DEBUG_PRINT("MakeUp", te->runlen);
660#endif
661		_PutBits(tif, code, length);
662		span -= te->runlen;
663	}
664	code = tab[span].code, length = tab[span].length;
665#ifdef FAX3_DEBUG
666	DEBUG_PRINT("  Term", tab[span].runlen);
667#endif
668	_PutBits(tif, code, length);
669
670	sp->data = data;
671	sp->bit = bit;
672}
673
674/*
675 * Write an EOL code to the output stream.  The zero-fill
676 * logic for byte-aligning encoded scanlines is handled
677 * here.  We also handle writing the tag bit for the next
678 * scanline when doing 2d encoding.
679 */
680static void
681Fax3PutEOL(TIFF* tif)
682{
683	Fax3CodecState* sp = EncoderState(tif);
684	unsigned int bit = sp->bit;
685	int data = sp->data;
686	unsigned int code, length, tparm;
687
688	if (sp->b.groupoptions & GROUP3OPT_FILLBITS) {
689		/*
690		 * Force bit alignment so EOL will terminate on
691		 * a byte boundary.  That is, force the bit alignment
692		 * to 16-12 = 4 before putting out the EOL code.
693		 */
694		int align = 8 - 4;
695		if (align != sp->bit) {
696			if (align > sp->bit)
697				align = sp->bit + (8 - align);
698			else
699				align = sp->bit - align;
700			code = 0;
701			tparm=align;
702			_PutBits(tif, 0, tparm);
703		}
704	}
705	code = EOL, length = 12;
706	if (is2DEncoding(sp))
707		code = (code<<1) | (sp->tag == G3_1D), length++;
708	_PutBits(tif, code, length);
709
710	sp->data = data;
711	sp->bit = bit;
712}
713
714/*
715 * Reset encoding state at the start of a strip.
716 */
717static int
718Fax3PreEncode(TIFF* tif, uint16 s)
719{
720	Fax3CodecState* sp = EncoderState(tif);
721
722	(void) s;
723	assert(sp != NULL);
724	sp->bit = 8;
725	sp->data = 0;
726	sp->tag = G3_1D;
727	/*
728	 * This is necessary for Group 4; otherwise it isn't
729	 * needed because the first scanline of each strip ends
730	 * up being copied into the refline.
731	 */
732	if (sp->refline)
733		_TIFFmemset(sp->refline, 0x00, sp->b.rowbytes);
734	if (is2DEncoding(sp)) {
735		float res = tif->tif_dir.td_yresolution;
736		/*
737		 * The CCITT spec says that when doing 2d encoding, you
738		 * should only do it on K consecutive scanlines, where K
739		 * depends on the resolution of the image being encoded
740		 * (2 for <= 200 lpi, 4 for > 200 lpi).  Since the directory
741		 * code initializes td_yresolution to 0, this code will
742		 * select a K of 2 unless the YResolution tag is set
743		 * appropriately.  (Note also that we fudge a little here
744		 * and use 150 lpi to avoid problems with units conversion.)
745		 */
746		if (tif->tif_dir.td_resolutionunit == RESUNIT_CENTIMETER)
747			res *= 2.54f;		/* convert to inches */
748		sp->maxk = (res > 150 ? 4 : 2);
749		sp->k = sp->maxk-1;
750	} else
751		sp->k = sp->maxk = 0;
752	sp->line = 0;
753	return (1);
754}
755
756static const unsigned char zeroruns[256] = {
757    8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,	/* 0x00 - 0x0f */
758    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,	/* 0x10 - 0x1f */
759    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,	/* 0x20 - 0x2f */
760    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,	/* 0x30 - 0x3f */
761    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0x40 - 0x4f */
762    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0x50 - 0x5f */
763    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0x60 - 0x6f */
764    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0x70 - 0x7f */
765    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x80 - 0x8f */
766    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x90 - 0x9f */
767    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0xa0 - 0xaf */
768    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0xb0 - 0xbf */
769    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0xc0 - 0xcf */
770    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0xd0 - 0xdf */
771    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0xe0 - 0xef */
772    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0xf0 - 0xff */
773};
774static const unsigned char oneruns[256] = {
775    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x00 - 0x0f */
776    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x10 - 0x1f */
777    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x20 - 0x2f */
778    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x30 - 0x3f */
779    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x40 - 0x4f */
780    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x50 - 0x5f */
781    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x60 - 0x6f */
782    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x70 - 0x7f */
783    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0x80 - 0x8f */
784    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0x90 - 0x9f */
785    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0xa0 - 0xaf */
786    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0xb0 - 0xbf */
787    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,	/* 0xc0 - 0xcf */
788    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,	/* 0xd0 - 0xdf */
789    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,	/* 0xe0 - 0xef */
790    4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8,	/* 0xf0 - 0xff */
791};
792
793/*
794 * On certain systems it pays to inline
795 * the routines that find pixel spans.
796 */
797#ifdef VAXC
798static	int32 find0span(unsigned char*, int32, int32);
799static	int32 find1span(unsigned char*, int32, int32);
800#pragma inline(find0span,find1span)
801#endif
802
803/*
804 * Find a span of ones or zeros using the supplied
805 * table.  The ``base'' of the bit string is supplied
806 * along with the start+end bit indices.
807 */
808inline static int32
809find0span(unsigned char* bp, int32 bs, int32 be)
810{
811	int32 bits = be - bs;
812	int32 n, span;
813
814	bp += bs>>3;
815	/*
816	 * Check partial byte on lhs.
817	 */
818	if (bits > 0 && (n = (bs & 7))) {
819		span = zeroruns[(*bp << n) & 0xff];
820		if (span > 8-n)		/* table value too generous */
821			span = 8-n;
822		if (span > bits)	/* constrain span to bit range */
823			span = bits;
824		if (n+span < 8)		/* doesn't extend to edge of byte */
825			return (span);
826		bits -= span;
827		bp++;
828	} else
829		span = 0;
830	if (bits >= (int32)(2 * 8 * sizeof(long))) {
831		long* lp;
832		/*
833		 * Align to longword boundary and check longwords.
834		 */
835		while (!isAligned(bp, long)) {
836			if (*bp != 0x00)
837				return (span + zeroruns[*bp]);
838			span += 8, bits -= 8;
839			bp++;
840		}
841		lp = (long*) bp;
842		while ((bits >= (int32)(8 * sizeof(long))) && (0 == *lp)) {
843			span += 8*sizeof (long), bits -= 8*sizeof (long);
844			lp++;
845		}
846		bp = (unsigned char*) lp;
847	}
848	/*
849	 * Scan full bytes for all 0's.
850	 */
851	while (bits >= 8) {
852		if (*bp != 0x00)	/* end of run */
853			return (span + zeroruns[*bp]);
854		span += 8, bits -= 8;
855		bp++;
856	}
857	/*
858	 * Check partial byte on rhs.
859	 */
860	if (bits > 0) {
861		n = zeroruns[*bp];
862		span += (n > bits ? bits : n);
863	}
864	return (span);
865}
866
867inline static int32
868find1span(unsigned char* bp, int32 bs, int32 be)
869{
870	int32 bits = be - bs;
871	int32 n, span;
872
873	bp += bs>>3;
874	/*
875	 * Check partial byte on lhs.
876	 */
877	if (bits > 0 && (n = (bs & 7))) {
878		span = oneruns[(*bp << n) & 0xff];
879		if (span > 8-n)		/* table value too generous */
880			span = 8-n;
881		if (span > bits)	/* constrain span to bit range */
882			span = bits;
883		if (n+span < 8)		/* doesn't extend to edge of byte */
884			return (span);
885		bits -= span;
886		bp++;
887	} else
888		span = 0;
889	if (bits >= (int32)(2 * 8 * sizeof(long))) {
890		long* lp;
891		/*
892		 * Align to longword boundary and check longwords.
893		 */
894		while (!isAligned(bp, long)) {
895			if (*bp != 0xff)
896				return (span + oneruns[*bp]);
897			span += 8, bits -= 8;
898			bp++;
899		}
900		lp = (long*) bp;
901		while ((bits >= (int32)(8 * sizeof(long))) && (~0 == *lp)) {
902			span += 8*sizeof (long), bits -= 8*sizeof (long);
903			lp++;
904		}
905		bp = (unsigned char*) lp;
906	}
907	/*
908	 * Scan full bytes for all 1's.
909	 */
910	while (bits >= 8) {
911		if (*bp != 0xff)	/* end of run */
912			return (span + oneruns[*bp]);
913		span += 8, bits -= 8;
914		bp++;
915	}
916	/*
917	 * Check partial byte on rhs.
918	 */
919	if (bits > 0) {
920		n = oneruns[*bp];
921		span += (n > bits ? bits : n);
922	}
923	return (span);
924}
925
926/*
927 * Return the offset of the next bit in the range
928 * [bs..be] that is different from the specified
929 * color.  The end, be, is returned if no such bit
930 * exists.
931 */
932#define	finddiff(_cp, _bs, _be, _color)	\
933	(_bs + (_color ? find1span(_cp,_bs,_be) : find0span(_cp,_bs,_be)))
934/*
935 * Like finddiff, but also check the starting bit
936 * against the end in case start > end.
937 */
938#define	finddiff2(_cp, _bs, _be, _color) \
939	(_bs < _be ? finddiff(_cp,_bs,_be,_color) : _be)
940
941/*
942 * 1d-encode a row of pixels.  The encoding is
943 * a sequence of all-white or all-black spans
944 * of pixels encoded with Huffman codes.
945 */
946static int
947Fax3Encode1DRow(TIFF* tif, unsigned char* bp, uint32 bits)
948{
949	Fax3CodecState* sp = EncoderState(tif);
950	int32 span;
951        uint32 bs = 0;
952
953	for (;;) {
954		span = find0span(bp, bs, bits);		/* white span */
955		putspan(tif, span, TIFFFaxWhiteCodes);
956		bs += span;
957		if (bs >= bits)
958			break;
959		span = find1span(bp, bs, bits);		/* black span */
960		putspan(tif, span, TIFFFaxBlackCodes);
961		bs += span;
962		if (bs >= bits)
963			break;
964	}
965	if (sp->b.mode & (FAXMODE_BYTEALIGN|FAXMODE_WORDALIGN)) {
966		if (sp->bit != 8)			/* byte-align */
967			Fax3FlushBits(tif, sp);
968		if ((sp->b.mode&FAXMODE_WORDALIGN) &&
969		    !isAligned(tif->tif_rawcp, uint16))
970			Fax3FlushBits(tif, sp);
971	}
972	return (1);
973}
974
975static const tableentry horizcode =
976    { 3, 0x1, 0 };	/* 001 */
977static const tableentry passcode =
978    { 4, 0x1, 0 };	/* 0001 */
979static const tableentry vcodes[7] = {
980    { 7, 0x03, 0 },	/* 0000 011 */
981    { 6, 0x03, 0 },	/* 0000 11 */
982    { 3, 0x03, 0 },	/* 011 */
983    { 1, 0x1, 0 },	/* 1 */
984    { 3, 0x2, 0 },	/* 010 */
985    { 6, 0x02, 0 },	/* 0000 10 */
986    { 7, 0x02, 0 }	/* 0000 010 */
987};
988
989/*
990 * 2d-encode a row of pixels.  Consult the CCITT
991 * documentation for the algorithm.
992 */
993static int
994Fax3Encode2DRow(TIFF* tif, unsigned char* bp, unsigned char* rp, uint32 bits)
995{
996#define	PIXEL(buf,ix)	((((buf)[(ix)>>3]) >> (7-((ix)&7))) & 1)
997        uint32 a0 = 0;
998	uint32 a1 = (PIXEL(bp, 0) != 0 ? 0 : finddiff(bp, 0, bits, 0));
999	uint32 b1 = (PIXEL(rp, 0) != 0 ? 0 : finddiff(rp, 0, bits, 0));
1000	uint32 a2, b2;
1001
1002	for (;;) {
1003		b2 = finddiff2(rp, b1, bits, PIXEL(rp,b1));
1004		if (b2 >= a1) {
1005			int32 d = b1 - a1;
1006			if (!(-3 <= d && d <= 3)) {	/* horizontal mode */
1007				a2 = finddiff2(bp, a1, bits, PIXEL(bp,a1));
1008				putcode(tif, &horizcode);
1009				if (a0+a1 == 0 || PIXEL(bp, a0) == 0) {
1010					putspan(tif, a1-a0, TIFFFaxWhiteCodes);
1011					putspan(tif, a2-a1, TIFFFaxBlackCodes);
1012				} else {
1013					putspan(tif, a1-a0, TIFFFaxBlackCodes);
1014					putspan(tif, a2-a1, TIFFFaxWhiteCodes);
1015				}
1016				a0 = a2;
1017			} else {			/* vertical mode */
1018				putcode(tif, &vcodes[d+3]);
1019				a0 = a1;
1020			}
1021		} else {				/* pass mode */
1022			putcode(tif, &passcode);
1023			a0 = b2;
1024		}
1025		if (a0 >= bits)
1026			break;
1027		a1 = finddiff(bp, a0, bits, PIXEL(bp,a0));
1028		b1 = finddiff(rp, a0, bits, !PIXEL(bp,a0));
1029		b1 = finddiff(rp, b1, bits, PIXEL(bp,a0));
1030	}
1031	return (1);
1032#undef PIXEL
1033}
1034
1035/*
1036 * Encode a buffer of pixels.
1037 */
1038static int
1039Fax3Encode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
1040{
1041	static const char module[] = "Fax3Encode";
1042	Fax3CodecState* sp = EncoderState(tif);
1043	(void) s;
1044	if (cc % sp->b.rowbytes)
1045	{
1046		TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be written");
1047		return (0);
1048	}
1049	while (cc > 0) {
1050		if ((sp->b.mode & FAXMODE_NOEOL) == 0)
1051			Fax3PutEOL(tif);
1052		if (is2DEncoding(sp)) {
1053			if (sp->tag == G3_1D) {
1054				if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels))
1055					return (0);
1056				sp->tag = G3_2D;
1057			} else {
1058				if (!Fax3Encode2DRow(tif, bp, sp->refline,
1059				    sp->b.rowpixels))
1060					return (0);
1061				sp->k--;
1062			}
1063			if (sp->k == 0) {
1064				sp->tag = G3_1D;
1065				sp->k = sp->maxk-1;
1066			} else
1067				_TIFFmemcpy(sp->refline, bp, sp->b.rowbytes);
1068		} else {
1069			if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels))
1070				return (0);
1071		}
1072		bp += sp->b.rowbytes;
1073		cc -= sp->b.rowbytes;
1074	}
1075	return (1);
1076}
1077
1078static int
1079Fax3PostEncode(TIFF* tif)
1080{
1081	Fax3CodecState* sp = EncoderState(tif);
1082
1083	if (sp->bit != 8)
1084		Fax3FlushBits(tif, sp);
1085	return (1);
1086}
1087
1088static void
1089Fax3Close(TIFF* tif)
1090{
1091	if ((Fax3State(tif)->mode & FAXMODE_NORTC) == 0) {
1092		Fax3CodecState* sp = EncoderState(tif);
1093		unsigned int code = EOL;
1094		unsigned int length = 12;
1095		int i;
1096
1097		if (is2DEncoding(sp))
1098			code = (code<<1) | (sp->tag == G3_1D), length++;
1099		for (i = 0; i < 6; i++)
1100			Fax3PutBits(tif, code, length);
1101		Fax3FlushBits(tif, sp);
1102	}
1103}
1104
1105static void
1106Fax3Cleanup(TIFF* tif)
1107{
1108	Fax3CodecState* sp = DecoderState(tif);
1109
1110	assert(sp != 0);
1111
1112	tif->tif_tagmethods.vgetfield = sp->b.vgetparent;
1113	tif->tif_tagmethods.vsetfield = sp->b.vsetparent;
1114	tif->tif_tagmethods.printdir = sp->b.printdir;
1115
1116	if (sp->runs)
1117		_TIFFfree(sp->runs);
1118	if (sp->refline)
1119		_TIFFfree(sp->refline);
1120
1121	_TIFFfree(tif->tif_data);
1122	tif->tif_data = NULL;
1123
1124	_TIFFSetDefaultCompressionState(tif);
1125}
1126
1127#define	FIELD_BADFAXLINES	(FIELD_CODEC+0)
1128#define	FIELD_CLEANFAXDATA	(FIELD_CODEC+1)
1129#define	FIELD_BADFAXRUN		(FIELD_CODEC+2)
1130
1131#define	FIELD_OPTIONS		(FIELD_CODEC+7)
1132
1133static const TIFFField faxFields[] = {
1134    { TIFFTAG_FAXMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "FaxMode", NULL },
1135    { TIFFTAG_FAXFILLFUNC, 0, 0, TIFF_ANY, 0, TIFF_SETGET_OTHER, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "FaxFillFunc", NULL },
1136    { TIFFTAG_BADFAXLINES, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_BADFAXLINES, TRUE, FALSE, "BadFaxLines", NULL },
1137    { TIFFTAG_CLEANFAXDATA, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UINT16, FIELD_CLEANFAXDATA, TRUE, FALSE, "CleanFaxData", NULL },
1138    { TIFFTAG_CONSECUTIVEBADFAXLINES, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_BADFAXRUN, TRUE, FALSE, "ConsecutiveBadFaxLines", NULL }};
1139static const TIFFField fax3Fields[] = {
1140    { TIFFTAG_GROUP3OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_OPTIONS, FALSE, FALSE, "Group3Options", NULL },
1141};
1142static const TIFFField fax4Fields[] = {
1143    { TIFFTAG_GROUP4OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_OPTIONS, FALSE, FALSE, "Group4Options", NULL },
1144};
1145
1146static int
1147Fax3VSetField(TIFF* tif, uint32 tag, va_list ap)
1148{
1149	Fax3BaseState* sp = Fax3State(tif);
1150	const TIFFField* fip;
1151
1152	assert(sp != 0);
1153	assert(sp->vsetparent != 0);
1154
1155	switch (tag) {
1156	case TIFFTAG_FAXMODE:
1157		sp->mode = (int) va_arg(ap, int);
1158		return 1;			/* NB: pseudo tag */
1159	case TIFFTAG_FAXFILLFUNC:
1160		DecoderState(tif)->fill = va_arg(ap, TIFFFaxFillFunc);
1161		return 1;			/* NB: pseudo tag */
1162	case TIFFTAG_GROUP3OPTIONS:
1163		/* XXX: avoid reading options if compression mismatches. */
1164		if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX3)
1165			sp->groupoptions = (uint32) va_arg(ap, uint32);
1166		break;
1167	case TIFFTAG_GROUP4OPTIONS:
1168		/* XXX: avoid reading options if compression mismatches. */
1169		if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4)
1170			sp->groupoptions = (uint32) va_arg(ap, uint32);
1171		break;
1172	case TIFFTAG_BADFAXLINES:
1173		sp->badfaxlines = (uint32) va_arg(ap, uint32);
1174		break;
1175	case TIFFTAG_CLEANFAXDATA:
1176		sp->cleanfaxdata = (uint16) va_arg(ap, uint16_vap);
1177		break;
1178	case TIFFTAG_CONSECUTIVEBADFAXLINES:
1179		sp->badfaxrun = (uint32) va_arg(ap, uint32);
1180		break;
1181	default:
1182		return (*sp->vsetparent)(tif, tag, ap);
1183	}
1184
1185	if ((fip = TIFFFieldWithTag(tif, tag)))
1186		TIFFSetFieldBit(tif, fip->field_bit);
1187	else
1188		return 0;
1189
1190	tif->tif_flags |= TIFF_DIRTYDIRECT;
1191	return 1;
1192}
1193
1194static int
1195Fax3VGetField(TIFF* tif, uint32 tag, va_list ap)
1196{
1197	Fax3BaseState* sp = Fax3State(tif);
1198
1199	assert(sp != 0);
1200
1201	switch (tag) {
1202	case TIFFTAG_FAXMODE:
1203		*va_arg(ap, int*) = sp->mode;
1204		break;
1205	case TIFFTAG_FAXFILLFUNC:
1206		*va_arg(ap, TIFFFaxFillFunc*) = DecoderState(tif)->fill;
1207		break;
1208	case TIFFTAG_GROUP3OPTIONS:
1209	case TIFFTAG_GROUP4OPTIONS:
1210		*va_arg(ap, uint32*) = sp->groupoptions;
1211		break;
1212	case TIFFTAG_BADFAXLINES:
1213		*va_arg(ap, uint32*) = sp->badfaxlines;
1214		break;
1215	case TIFFTAG_CLEANFAXDATA:
1216		*va_arg(ap, uint16*) = sp->cleanfaxdata;
1217		break;
1218	case TIFFTAG_CONSECUTIVEBADFAXLINES:
1219		*va_arg(ap, uint32*) = sp->badfaxrun;
1220		break;
1221	default:
1222		return (*sp->vgetparent)(tif, tag, ap);
1223	}
1224	return (1);
1225}
1226
1227static void
1228Fax3PrintDir(TIFF* tif, FILE* fd, long flags)
1229{
1230	Fax3BaseState* sp = Fax3State(tif);
1231
1232	assert(sp != 0);
1233
1234	(void) flags;
1235	if (TIFFFieldSet(tif,FIELD_OPTIONS)) {
1236		const char* sep = " ";
1237		if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4) {
1238			fprintf(fd, "  Group 4 Options:");
1239			if (sp->groupoptions & GROUP4OPT_UNCOMPRESSED)
1240				fprintf(fd, "%suncompressed data", sep);
1241		} else {
1242
1243			fprintf(fd, "  Group 3 Options:");
1244			if (sp->groupoptions & GROUP3OPT_2DENCODING)
1245				fprintf(fd, "%s2-d encoding", sep), sep = "+";
1246			if (sp->groupoptions & GROUP3OPT_FILLBITS)
1247				fprintf(fd, "%sEOL padding", sep), sep = "+";
1248			if (sp->groupoptions & GROUP3OPT_UNCOMPRESSED)
1249				fprintf(fd, "%suncompressed data", sep);
1250		}
1251		fprintf(fd, " (%lu = 0x%lx)\n",
1252                        (unsigned long) sp->groupoptions,
1253                        (unsigned long) sp->groupoptions);
1254	}
1255	if (TIFFFieldSet(tif,FIELD_CLEANFAXDATA)) {
1256		fprintf(fd, "  Fax Data:");
1257		switch (sp->cleanfaxdata) {
1258		case CLEANFAXDATA_CLEAN:
1259			fprintf(fd, " clean");
1260			break;
1261		case CLEANFAXDATA_REGENERATED:
1262			fprintf(fd, " receiver regenerated");
1263			break;
1264		case CLEANFAXDATA_UNCLEAN:
1265			fprintf(fd, " uncorrected errors");
1266			break;
1267		}
1268		fprintf(fd, " (%u = 0x%x)\n",
1269		    sp->cleanfaxdata, sp->cleanfaxdata);
1270	}
1271	if (TIFFFieldSet(tif,FIELD_BADFAXLINES))
1272		fprintf(fd, "  Bad Fax Lines: %lu\n",
1273                        (unsigned long) sp->badfaxlines);
1274	if (TIFFFieldSet(tif,FIELD_BADFAXRUN))
1275		fprintf(fd, "  Consecutive Bad Fax Lines: %lu\n",
1276		    (unsigned long) sp->badfaxrun);
1277	if (sp->printdir)
1278		(*sp->printdir)(tif, fd, flags);
1279}
1280
1281static int
1282InitCCITTFax3(TIFF* tif)
1283{
1284	static const char module[] = "InitCCITTFax3";
1285	Fax3BaseState* sp;
1286
1287	/*
1288	 * Merge codec-specific tag information.
1289	 */
1290	if (!_TIFFMergeFields(tif, faxFields, TIFFArrayCount(faxFields))) {
1291		TIFFErrorExt(tif->tif_clientdata, "InitCCITTFax3",
1292			"Merging common CCITT Fax codec-specific tags failed");
1293		return 0;
1294	}
1295
1296	/*
1297	 * Allocate state block so tag methods have storage to record values.
1298	 */
1299	tif->tif_data = (uint8*)
1300		_TIFFmalloc(sizeof (Fax3CodecState));
1301
1302	if (tif->tif_data == NULL) {
1303		TIFFErrorExt(tif->tif_clientdata, module,
1304		    "No space for state block");
1305		return (0);
1306	}
1307
1308	sp = Fax3State(tif);
1309        sp->rw_mode = tif->tif_mode;
1310
1311	/*
1312	 * Override parent get/set field methods.
1313	 */
1314	sp->vgetparent = tif->tif_tagmethods.vgetfield;
1315	tif->tif_tagmethods.vgetfield = Fax3VGetField; /* hook for codec tags */
1316	sp->vsetparent = tif->tif_tagmethods.vsetfield;
1317	tif->tif_tagmethods.vsetfield = Fax3VSetField; /* hook for codec tags */
1318	sp->printdir = tif->tif_tagmethods.printdir;
1319	tif->tif_tagmethods.printdir = Fax3PrintDir;   /* hook for codec tags */
1320	sp->groupoptions = 0;
1321
1322	if (sp->rw_mode == O_RDONLY) /* FIXME: improve for in place update */
1323		tif->tif_flags |= TIFF_NOBITREV; /* decoder does bit reversal */
1324	DecoderState(tif)->runs = NULL;
1325	TIFFSetField(tif, TIFFTAG_FAXFILLFUNC, _TIFFFax3fillruns);
1326	EncoderState(tif)->refline = NULL;
1327
1328	/*
1329	 * Install codec methods.
1330	 */
1331	tif->tif_fixuptags = Fax3FixupTags;
1332	tif->tif_setupdecode = Fax3SetupState;
1333	tif->tif_predecode = Fax3PreDecode;
1334	tif->tif_decoderow = Fax3Decode1D;
1335	tif->tif_decodestrip = Fax3Decode1D;
1336	tif->tif_decodetile = Fax3Decode1D;
1337	tif->tif_setupencode = Fax3SetupState;
1338	tif->tif_preencode = Fax3PreEncode;
1339	tif->tif_postencode = Fax3PostEncode;
1340	tif->tif_encoderow = Fax3Encode;
1341	tif->tif_encodestrip = Fax3Encode;
1342	tif->tif_encodetile = Fax3Encode;
1343	tif->tif_close = Fax3Close;
1344	tif->tif_cleanup = Fax3Cleanup;
1345
1346	return (1);
1347}
1348
1349int
1350TIFFInitCCITTFax3(TIFF* tif, int scheme)
1351{
1352	(void) scheme;
1353	if (InitCCITTFax3(tif)) {
1354		/*
1355		 * Merge codec-specific tag information.
1356		 */
1357		if (!_TIFFMergeFields(tif, fax3Fields,
1358				      TIFFArrayCount(fax3Fields))) {
1359			TIFFErrorExt(tif->tif_clientdata, "TIFFInitCCITTFax3",
1360			"Merging CCITT Fax 3 codec-specific tags failed");
1361			return 0;
1362		}
1363
1364		/*
1365		 * The default format is Class/F-style w/o RTC.
1366		 */
1367		return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
1368	} else
1369		return 01;
1370}
1371
1372/*
1373 * CCITT Group 4 (T.6) Facsimile-compatible
1374 * Compression Scheme Support.
1375 */
1376
1377#define SWAP(t,a,b) { t x; x = (a); (a) = (b); (b) = x; }
1378/*
1379 * Decode the requested amount of G4-encoded data.
1380 */
1381static int
1382Fax4Decode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
1383{
1384	DECLARE_STATE_2D(tif, sp, "Fax4Decode");
1385	(void) s;
1386	if (occ % sp->b.rowbytes)
1387	{
1388		TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
1389		return (-1);
1390	}
1391	CACHE_STATE(tif, sp);
1392	while (occ > 0) {
1393		a0 = 0;
1394		RunLength = 0;
1395		pa = thisrun = sp->curruns;
1396		pb = sp->refruns;
1397		b1 = *pb++;
1398#ifdef FAX3_DEBUG
1399		printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail);
1400		printf("-------------------- %d\n", tif->tif_row);
1401		fflush(stdout);
1402#endif
1403		EXPAND2D(EOFG4);
1404                if (EOLcnt)
1405                    goto EOFG4;
1406		(*sp->fill)(buf, thisrun, pa, lastx);
1407		SETVALUE(0);		/* imaginary change for reference */
1408		SWAP(uint32*, sp->curruns, sp->refruns);
1409		buf += sp->b.rowbytes;
1410		occ -= sp->b.rowbytes;
1411		sp->line++;
1412		continue;
1413	EOFG4:
1414                NeedBits16( 13, BADG4 );
1415        BADG4:
1416#ifdef FAX3_DEBUG
1417                if( GetBits(13) != 0x1001 )
1418                    fputs( "Bad EOFB\n", stderr );
1419#endif
1420                ClrBits( 13 );
1421		(*sp->fill)(buf, thisrun, pa, lastx);
1422		UNCACHE_STATE(tif, sp);
1423		return ( sp->line ? 1 : -1);	/* don't error on badly-terminated strips */
1424	}
1425	UNCACHE_STATE(tif, sp);
1426	return (1);
1427}
1428#undef	SWAP
1429
1430/*
1431 * Encode the requested amount of data.
1432 */
1433static int
1434Fax4Encode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
1435{
1436	static const char module[] = "Fax4Encode";
1437	Fax3CodecState *sp = EncoderState(tif);
1438	(void) s;
1439	if (cc % sp->b.rowbytes)
1440	{
1441		TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be written");
1442		return (0);
1443	}
1444	while (cc > 0) {
1445		if (!Fax3Encode2DRow(tif, bp, sp->refline, sp->b.rowpixels))
1446			return (0);
1447		_TIFFmemcpy(sp->refline, bp, sp->b.rowbytes);
1448		bp += sp->b.rowbytes;
1449		cc -= sp->b.rowbytes;
1450	}
1451	return (1);
1452}
1453
1454static int
1455Fax4PostEncode(TIFF* tif)
1456{
1457	Fax3CodecState *sp = EncoderState(tif);
1458
1459	/* terminate strip w/ EOFB */
1460	Fax3PutBits(tif, EOL, 12);
1461	Fax3PutBits(tif, EOL, 12);
1462	if (sp->bit != 8)
1463		Fax3FlushBits(tif, sp);
1464	return (1);
1465}
1466
1467int
1468TIFFInitCCITTFax4(TIFF* tif, int scheme)
1469{
1470	(void) scheme;
1471	if (InitCCITTFax3(tif)) {		/* reuse G3 support */
1472		/*
1473		 * Merge codec-specific tag information.
1474		 */
1475		if (!_TIFFMergeFields(tif, fax4Fields,
1476				      TIFFArrayCount(fax4Fields))) {
1477			TIFFErrorExt(tif->tif_clientdata, "TIFFInitCCITTFax4",
1478			"Merging CCITT Fax 4 codec-specific tags failed");
1479			return 0;
1480		}
1481
1482		tif->tif_decoderow = Fax4Decode;
1483		tif->tif_decodestrip = Fax4Decode;
1484		tif->tif_decodetile = Fax4Decode;
1485		tif->tif_encoderow = Fax4Encode;
1486		tif->tif_encodestrip = Fax4Encode;
1487		tif->tif_encodetile = Fax4Encode;
1488		tif->tif_postencode = Fax4PostEncode;
1489		/*
1490		 * Suppress RTC at the end of each strip.
1491		 */
1492		return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_NORTC);
1493	} else
1494		return (0);
1495}
1496
1497/*
1498 * CCITT Group 3 1-D Modified Huffman RLE Compression Support.
1499 * (Compression algorithms 2 and 32771)
1500 */
1501
1502/*
1503 * Decode the requested amount of RLE-encoded data.
1504 */
1505static int
1506Fax3DecodeRLE(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
1507{
1508	DECLARE_STATE(tif, sp, "Fax3DecodeRLE");
1509	int mode = sp->b.mode;
1510	(void) s;
1511	if (occ % sp->b.rowbytes)
1512	{
1513		TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
1514		return (-1);
1515	}
1516	CACHE_STATE(tif, sp);
1517	thisrun = sp->curruns;
1518	while (occ > 0) {
1519		a0 = 0;
1520		RunLength = 0;
1521		pa = thisrun;
1522#ifdef FAX3_DEBUG
1523		printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail);
1524		printf("-------------------- %d\n", tif->tif_row);
1525		fflush(stdout);
1526#endif
1527		EXPAND1D(EOFRLE);
1528		(*sp->fill)(buf, thisrun, pa, lastx);
1529		/*
1530		 * Cleanup at the end of the row.
1531		 */
1532		if (mode & FAXMODE_BYTEALIGN) {
1533			int n = BitsAvail - (BitsAvail &~ 7);
1534			ClrBits(n);
1535		} else if (mode & FAXMODE_WORDALIGN) {
1536			int n = BitsAvail - (BitsAvail &~ 15);
1537			ClrBits(n);
1538			if (BitsAvail == 0 && !isAligned(cp, uint16))
1539			    cp++;
1540		}
1541		buf += sp->b.rowbytes;
1542		occ -= sp->b.rowbytes;
1543		sp->line++;
1544		continue;
1545	EOFRLE:				/* premature EOF */
1546		(*sp->fill)(buf, thisrun, pa, lastx);
1547		UNCACHE_STATE(tif, sp);
1548		return (-1);
1549	}
1550	UNCACHE_STATE(tif, sp);
1551	return (1);
1552}
1553
1554int
1555TIFFInitCCITTRLE(TIFF* tif, int scheme)
1556{
1557	(void) scheme;
1558	if (InitCCITTFax3(tif)) {		/* reuse G3 support */
1559		tif->tif_decoderow = Fax3DecodeRLE;
1560		tif->tif_decodestrip = Fax3DecodeRLE;
1561		tif->tif_decodetile = Fax3DecodeRLE;
1562		/*
1563		 * Suppress RTC+EOLs when encoding and byte-align data.
1564		 */
1565		return TIFFSetField(tif, TIFFTAG_FAXMODE,
1566		    FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_BYTEALIGN);
1567	} else
1568		return (0);
1569}
1570
1571int
1572TIFFInitCCITTRLEW(TIFF* tif, int scheme)
1573{
1574	(void) scheme;
1575	if (InitCCITTFax3(tif)) {		/* reuse G3 support */
1576		tif->tif_decoderow = Fax3DecodeRLE;
1577		tif->tif_decodestrip = Fax3DecodeRLE;
1578		tif->tif_decodetile = Fax3DecodeRLE;
1579		/*
1580		 * Suppress RTC+EOLs when encoding and word-align data.
1581		 */
1582		return TIFFSetField(tif, TIFFTAG_FAXMODE,
1583		    FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_WORDALIGN);
1584	} else
1585		return (0);
1586}
1587#endif /* CCITT_SUPPORT */
1588
1589/* vim: set ts=8 sts=8 sw=8 noet: */
1590/*
1591 * Local Variables:
1592 * mode: c
1593 * c-basic-offset: 8
1594 * fill-column: 78
1595 * End:
1596 */
1597