1 : /* $Id: tif_fax3.c,v 1.72 2010-06-09 17:17:13 bfriesen 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 : */
50 : typedef 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 :
67 : typedef enum { G3_1D, G3_2D } Ttag;
68 : typedef 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 : */
146 : static int
147 : Fax3PreDecode(TIFF* tif, uint16 s)
148 6 : {
149 6 : Fax3CodecState* sp = DecoderState(tif);
150 :
151 : (void) s;
152 6 : assert(sp != NULL);
153 6 : sp->bit = 0; /* force initial read */
154 6 : sp->data = 0;
155 6 : 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 6 : sp->bitmap =
164 : TIFFGetBitRevTable(tif->tif_dir.td_fillorder != FILLORDER_LSB2MSB);
165 6 : if (sp->refruns) { /* init reference line to white */
166 6 : sp->refruns[0] = (uint32) sp->b.rowpixels;
167 6 : sp->refruns[1] = 0;
168 : }
169 6 : sp->line = 0;
170 6 : 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 :
179 : static void
180 : Fax3Unexpected(const char* module, TIFF* tif, uint32 line, uint32 a0)
181 0 : {
182 0 : 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 0 : }
187 : #define unexpected(table, a0) Fax3Unexpected(module, tif, sp->line, a0)
188 :
189 : static void
190 : Fax3Extension(const char* module, TIFF* tif, uint32 line, uint32 a0)
191 0 : {
192 0 : 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 0 : }
198 : #define extension(a0) Fax3Extension(module, tif, sp->line, a0)
199 :
200 : static void
201 : Fax3BadLength(const char* module, TIFF* tif, uint32 line, uint32 a0, uint32 lastx)
202 0 : {
203 0 : 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 0 : }
209 : #define badlength(a0,lastx) Fax3BadLength(module, tif, sp->line, a0, lastx)
210 :
211 : static void
212 : Fax3PrematureEOF(const char* module, TIFF* tif, uint32 line, uint32 a0)
213 0 : {
214 0 : 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 0 : }
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 : */
226 : static int
227 : Fax3Decode1D(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
228 0 : {
229 0 : DECLARE_STATE(tif, sp, "Fax3Decode1D");
230 : (void) s;
231 0 : if (occ % sp->b.rowbytes)
232 : {
233 0 : TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
234 0 : return (-1);
235 : }
236 0 : CACHE_STATE(tif, sp);
237 0 : thisrun = sp->curruns;
238 0 : while (occ > 0) {
239 0 : a0 = 0;
240 0 : RunLength = 0;
241 0 : 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 0 : SYNC_EOL(EOF1D);
248 0 : EXPAND1D(EOF1Da);
249 0 : (*sp->fill)(buf, thisrun, pa, lastx);
250 0 : buf += sp->b.rowbytes;
251 0 : occ -= sp->b.rowbytes;
252 0 : sp->line++;
253 0 : continue;
254 0 : EOF1D: /* premature EOF */
255 0 : CLEANUP_RUNS();
256 0 : EOF1Da: /* premature EOF */
257 0 : (*sp->fill)(buf, thisrun, pa, lastx);
258 0 : UNCACHE_STATE(tif, sp);
259 0 : return (-1);
260 : }
261 0 : UNCACHE_STATE(tif, sp);
262 0 : 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 : */
269 : static int
270 : Fax3Decode2D(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
271 1 : {
272 1 : DECLARE_STATE_2D(tif, sp, "Fax3Decode2D");
273 : int is1D; /* current line is 1d/2d-encoded */
274 : (void) s;
275 1 : if (occ % sp->b.rowbytes)
276 : {
277 0 : TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
278 0 : return (-1);
279 : }
280 1 : CACHE_STATE(tif, sp);
281 1026 : while (occ > 0) {
282 1024 : a0 = 0;
283 1024 : RunLength = 0;
284 1024 : pa = thisrun = sp->curruns;
285 : #ifdef FAX3_DEBUG
286 : printf("\nBitAcc=%08X, BitsAvail = %d EOLcnt = %d",
287 : BitAcc, BitsAvail, EOLcnt);
288 : #endif
289 1024 : SYNC_EOL(EOF2D);
290 1024 : NeedBits8(1, EOF2D);
291 1024 : is1D = GetBits(1); /* 1D/2D-encoding tag bit */
292 1024 : 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 1024 : pb = sp->refruns;
299 1024 : b1 = *pb++;
300 1024 : if (is1D)
301 497 : EXPAND1D(EOF2Da);
302 : else
303 768 : EXPAND2D(EOF2Da);
304 1024 : (*sp->fill)(buf, thisrun, pa, lastx);
305 1024 : SETVALUE(0); /* imaginary change for reference */
306 1024 : SWAP(uint32*, sp->curruns, sp->refruns);
307 1024 : buf += sp->b.rowbytes;
308 1024 : occ -= sp->b.rowbytes;
309 1024 : sp->line++;
310 1024 : continue;
311 0 : EOF2D: /* premature EOF */
312 0 : CLEANUP_RUNS();
313 0 : EOF2Da: /* premature EOF */
314 0 : (*sp->fill)(buf, thisrun, pa, lastx);
315 0 : UNCACHE_STATE(tif, sp);
316 0 : return (-1);
317 : }
318 1 : UNCACHE_STATE(tif, sp);
319 1 : 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 : */
367 : void
368 : _TIFFFax3fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx)
369 22858 : {
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 22858 : if ((erun-runs)&1)
378 83 : *erun++ = 0;
379 22858 : x = 0;
380 73492 : for (; runs < erun; runs += 2) {
381 50634 : run = runs[0];
382 50634 : if (x+run > lastx || run > lastx )
383 0 : run = runs[0] = (uint32) (lastx - x);
384 50634 : if (run) {
385 28871 : cp = buf + (x>>3);
386 28871 : bx = x&7;
387 28871 : if (run > 8-bx) {
388 20739 : if (bx) { /* align to byte boundary */
389 17664 : *cp++ &= 0xff << (8-bx);
390 17664 : run -= 8-bx;
391 : }
392 20739 : if( (n = run >> 3) != 0 ) { /* multiple bytes to fill */
393 12499 : if ((n/sizeof (long)) > 1) {
394 : /*
395 : * Align to longword boundary and fill.
396 : */
397 897 : for (; n && !isAligned(cp, long); n--)
398 0 : *cp++ = 0x00;
399 897 : lp = (long*) cp;
400 897 : nw = (int32)(n / sizeof (long));
401 897 : n -= nw * sizeof (long);
402 : do {
403 7632 : *lp++ = 0L;
404 7632 : } while (--nw);
405 897 : cp = (unsigned char*) lp;
406 : }
407 12499 : ZERO(n, cp);
408 12499 : run &= 7;
409 : }
410 20739 : if (run)
411 19027 : cp[0] &= 0xff >> run;
412 : } else
413 8132 : cp[0] &= ~(_fillmasks[run]>>bx);
414 28871 : x += runs[0];
415 : }
416 50634 : run = runs[1];
417 50634 : if (x+run > lastx || run > lastx )
418 0 : run = runs[1] = lastx - x;
419 50634 : if (run) {
420 50551 : cp = buf + (x>>3);
421 50551 : bx = x&7;
422 50551 : if (run > 8-bx) {
423 45592 : if (bx) { /* align to byte boundary */
424 21623 : *cp++ |= 0xff >> bx;
425 21623 : run -= 8-bx;
426 : }
427 45592 : if( (n = run>>3) != 0 ) { /* multiple bytes to fill */
428 42107 : if ((n/sizeof (long)) > 1) {
429 : /*
430 : * Align to longword boundary and fill.
431 : */
432 54477 : for (; n && !isAligned(cp, long); n--)
433 26419 : *cp++ = 0xff;
434 28058 : lp = (long*) cp;
435 28058 : nw = (int32)(n / sizeof (long));
436 28058 : n -= nw * sizeof (long);
437 : do {
438 311393 : *lp++ = -1L;
439 311393 : } while (--nw);
440 28058 : cp = (unsigned char*) lp;
441 : }
442 42107 : FILL(n, cp);
443 42107 : run &= 7;
444 : }
445 45592 : if (run)
446 20366 : cp[0] |= 0xff00 >> run;
447 : } else
448 4959 : cp[0] |= _fillmasks[run]>>bx;
449 50551 : x += runs[1];
450 : }
451 : }
452 22858 : assert(x == lastx);
453 22858 : }
454 : #undef ZERO
455 : #undef FILL
456 :
457 : static int
458 : Fax3FixupTags(TIFF* tif)
459 10 : {
460 : (void) tif;
461 10 : return (1);
462 : }
463 :
464 : /*
465 : * Setup G3/G4-related compression/decompression state
466 : * before data is processed. This routine is called once
467 : * per image -- it sets up different state based on whether
468 : * or not decoding or encoding is being done and whether
469 : * 1D- or 2D-encoded data is involved.
470 : */
471 : static int
472 : Fax3SetupState(TIFF* tif)
473 8 : {
474 : static const char module[] = "Fax3SetupState";
475 8 : TIFFDirectory* td = &tif->tif_dir;
476 8 : Fax3BaseState* sp = Fax3State(tif);
477 : int needsRefLine;
478 8 : Fax3CodecState* dsp = (Fax3CodecState*) Fax3State(tif);
479 : tmsize_t rowbytes;
480 : uint32 rowpixels, nruns;
481 :
482 8 : if (td->td_bitspersample != 1) {
483 0 : TIFFErrorExt(tif->tif_clientdata, module,
484 : "Bits/sample must be 1 for Group 3/4 encoding/decoding");
485 0 : return (0);
486 : }
487 : /*
488 : * Calculate the scanline/tile widths.
489 : */
490 8 : if (isTiled(tif)) {
491 0 : rowbytes = TIFFTileRowSize(tif);
492 0 : rowpixels = td->td_tilewidth;
493 : } else {
494 8 : rowbytes = TIFFScanlineSize(tif);
495 8 : rowpixels = td->td_imagewidth;
496 : }
497 8 : sp->rowbytes = rowbytes;
498 8 : sp->rowpixels = rowpixels;
499 : /*
500 : * Allocate any additional space required for decoding/encoding.
501 : */
502 8 : needsRefLine = (
503 : (sp->groupoptions & GROUP3OPT_2DENCODING) ||
504 : td->td_compression == COMPRESSION_CCITTFAX4
505 : );
506 :
507 : /*
508 : Assure that allocation computations do not overflow.
509 :
510 : TIFFroundup and TIFFSafeMultiply return zero on integer overflow
511 : */
512 8 : dsp->runs=(uint32*) NULL;
513 8 : nruns = TIFFroundup_32(rowpixels,32);
514 8 : if (needsRefLine) {
515 8 : nruns = TIFFSafeMultiply(uint32,nruns,2);
516 : }
517 8 : if ((nruns == 0) || (TIFFSafeMultiply(uint32,nruns,2) == 0)) {
518 0 : TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
519 : "Row pixels integer overflow (rowpixels %u)",
520 : rowpixels);
521 0 : return (0);
522 : }
523 8 : dsp->runs = (uint32*) _TIFFCheckMalloc(tif,
524 : TIFFSafeMultiply(uint32,nruns,2),
525 : sizeof (uint32),
526 : "for Group 3/4 run arrays");
527 8 : if (dsp->runs == NULL)
528 0 : return (0);
529 8 : dsp->curruns = dsp->runs;
530 8 : if (needsRefLine)
531 8 : dsp->refruns = dsp->runs + nruns;
532 : else
533 0 : dsp->refruns = NULL;
534 8 : if (td->td_compression == COMPRESSION_CCITTFAX3
535 : && is2DEncoding(dsp)) { /* NB: default is 1D routine */
536 1 : tif->tif_decoderow = Fax3Decode2D;
537 1 : tif->tif_decodestrip = Fax3Decode2D;
538 1 : tif->tif_decodetile = Fax3Decode2D;
539 : }
540 :
541 8 : if (needsRefLine) { /* 2d encoding */
542 8 : Fax3CodecState* esp = EncoderState(tif);
543 : /*
544 : * 2d encoding requires a scanline
545 : * buffer for the ``reference line''; the
546 : * scanline against which delta encoding
547 : * is referenced. The reference line must
548 : * be initialized to be ``white'' (done elsewhere).
549 : */
550 8 : esp->refline = (unsigned char*) _TIFFmalloc(rowbytes);
551 8 : if (esp->refline == NULL) {
552 0 : TIFFErrorExt(tif->tif_clientdata, module,
553 : "No space for Group 3/4 reference line");
554 0 : return (0);
555 : }
556 : } else /* 1d encoding */
557 0 : EncoderState(tif)->refline = NULL;
558 :
559 8 : return (1);
560 : }
561 :
562 : /*
563 : * CCITT Group 3 FAX Encoding.
564 : */
565 :
566 : #define Fax3FlushBits(tif, sp) { \
567 : if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \
568 : (void) TIFFFlushData1(tif); \
569 : *(tif)->tif_rawcp++ = (uint8) (sp)->data; \
570 : (tif)->tif_rawcc++; \
571 : (sp)->data = 0, (sp)->bit = 8; \
572 : }
573 : #define _FlushBits(tif) { \
574 : if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \
575 : (void) TIFFFlushData1(tif); \
576 : *(tif)->tif_rawcp++ = (uint8) data; \
577 : (tif)->tif_rawcc++; \
578 : data = 0, bit = 8; \
579 : }
580 : static const int _msbmask[9] =
581 : { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
582 : #define _PutBits(tif, bits, length) { \
583 : while (length > bit) { \
584 : data |= bits >> (length - bit); \
585 : length -= bit; \
586 : _FlushBits(tif); \
587 : } \
588 : assert( length < 9 ); \
589 : data |= (bits & _msbmask[length]) << (bit - length); \
590 : bit -= length; \
591 : if (bit == 0) \
592 : _FlushBits(tif); \
593 : }
594 :
595 : /*
596 : * Write a variable-length bit-value to
597 : * the output stream. Values are
598 : * assumed to be at most 16 bits.
599 : */
600 : static void
601 : Fax3PutBits(TIFF* tif, unsigned int bits, unsigned int length)
602 32719 : {
603 32719 : Fax3CodecState* sp = EncoderState(tif);
604 32719 : unsigned int bit = sp->bit;
605 32719 : int data = sp->data;
606 :
607 32719 : _PutBits(tif, bits, length);
608 :
609 32719 : sp->data = data;
610 32719 : sp->bit = bit;
611 32719 : }
612 :
613 : /*
614 : * Write a code to the output stream.
615 : */
616 : #define putcode(tif, te) Fax3PutBits(tif, (te)->code, (te)->length)
617 :
618 : #ifdef FAX3_DEBUG
619 : #define DEBUG_COLOR(w) (tab == TIFFFaxWhiteCodes ? w "W" : w "B")
620 : #define DEBUG_PRINT(what,len) { \
621 : int t; \
622 : printf("%08X/%-2d: %s%5d\t", data, bit, DEBUG_COLOR(what), len); \
623 : for (t = length-1; t >= 0; t--) \
624 : putchar(code & (1<<t) ? '1' : '0'); \
625 : putchar('\n'); \
626 : }
627 : #endif
628 :
629 : /*
630 : * Write the sequence of codes that describes
631 : * the specified span of zero's or one's. The
632 : * appropriate table that holds the make-up and
633 : * terminating codes is supplied.
634 : */
635 : static void
636 : putspan(TIFF* tif, int32 span, const tableentry* tab)
637 4768 : {
638 4768 : Fax3CodecState* sp = EncoderState(tif);
639 4768 : unsigned int bit = sp->bit;
640 4768 : int data = sp->data;
641 : unsigned int code, length;
642 :
643 9536 : while (span >= 2624) {
644 0 : const tableentry* te = &tab[63 + (2560>>6)];
645 0 : code = te->code, length = te->length;
646 : #ifdef FAX3_DEBUG
647 : DEBUG_PRINT("MakeUp", te->runlen);
648 : #endif
649 0 : _PutBits(tif, code, length);
650 0 : span -= te->runlen;
651 : }
652 4768 : if (span >= 64) {
653 397 : const tableentry* te = &tab[63 + (span>>6)];
654 397 : assert(te->runlen == 64*(span>>6));
655 397 : code = te->code, length = te->length;
656 : #ifdef FAX3_DEBUG
657 : DEBUG_PRINT("MakeUp", te->runlen);
658 : #endif
659 397 : _PutBits(tif, code, length);
660 397 : span -= te->runlen;
661 : }
662 4768 : code = tab[span].code, length = tab[span].length;
663 : #ifdef FAX3_DEBUG
664 : DEBUG_PRINT(" Term", tab[span].runlen);
665 : #endif
666 4768 : _PutBits(tif, code, length);
667 :
668 4768 : sp->data = data;
669 4768 : sp->bit = bit;
670 4768 : }
671 :
672 : /*
673 : * Write an EOL code to the output stream. The zero-fill
674 : * logic for byte-aligning encoded scanlines is handled
675 : * here. We also handle writing the tag bit for the next
676 : * scanline when doing 2d encoding.
677 : */
678 : static void
679 : Fax3PutEOL(TIFF* tif)
680 0 : {
681 0 : Fax3CodecState* sp = EncoderState(tif);
682 0 : unsigned int bit = sp->bit;
683 0 : int data = sp->data;
684 : unsigned int code, length, tparm;
685 :
686 0 : if (sp->b.groupoptions & GROUP3OPT_FILLBITS) {
687 : /*
688 : * Force bit alignment so EOL will terminate on
689 : * a byte boundary. That is, force the bit alignment
690 : * to 16-12 = 4 before putting out the EOL code.
691 : */
692 0 : int align = 8 - 4;
693 0 : if (align != sp->bit) {
694 0 : if (align > sp->bit)
695 0 : align = sp->bit + (8 - align);
696 : else
697 0 : align = sp->bit - align;
698 0 : code = 0;
699 0 : tparm=align;
700 0 : _PutBits(tif, 0, tparm);
701 : }
702 : }
703 0 : code = EOL, length = 12;
704 0 : if (is2DEncoding(sp))
705 0 : code = (code<<1) | (sp->tag == G3_1D), length++;
706 0 : _PutBits(tif, code, length);
707 :
708 0 : sp->data = data;
709 0 : sp->bit = bit;
710 0 : }
711 :
712 : /*
713 : * Reset encoding state at the start of a strip.
714 : */
715 : static int
716 : Fax3PreEncode(TIFF* tif, uint16 s)
717 2 : {
718 2 : Fax3CodecState* sp = EncoderState(tif);
719 :
720 : (void) s;
721 2 : assert(sp != NULL);
722 2 : sp->bit = 8;
723 2 : sp->data = 0;
724 2 : sp->tag = G3_1D;
725 : /*
726 : * This is necessary for Group 4; otherwise it isn't
727 : * needed because the first scanline of each strip ends
728 : * up being copied into the refline.
729 : */
730 2 : if (sp->refline)
731 2 : _TIFFmemset(sp->refline, 0x00, sp->b.rowbytes);
732 2 : if (is2DEncoding(sp)) {
733 0 : float res = tif->tif_dir.td_yresolution;
734 : /*
735 : * The CCITT spec says that when doing 2d encoding, you
736 : * should only do it on K consecutive scanlines, where K
737 : * depends on the resolution of the image being encoded
738 : * (2 for <= 200 lpi, 4 for > 200 lpi). Since the directory
739 : * code initializes td_yresolution to 0, this code will
740 : * select a K of 2 unless the YResolution tag is set
741 : * appropriately. (Note also that we fudge a little here
742 : * and use 150 lpi to avoid problems with units conversion.)
743 : */
744 0 : if (tif->tif_dir.td_resolutionunit == RESUNIT_CENTIMETER)
745 0 : res *= 2.54f; /* convert to inches */
746 0 : sp->maxk = (res > 150 ? 4 : 2);
747 0 : sp->k = sp->maxk-1;
748 : } else
749 2 : sp->k = sp->maxk = 0;
750 2 : sp->line = 0;
751 2 : return (1);
752 : }
753 :
754 : static const unsigned char zeroruns[256] = {
755 : 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, /* 0x00 - 0x0f */
756 : 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0x10 - 0x1f */
757 : 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x20 - 0x2f */
758 : 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x30 - 0x3f */
759 : 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 - 0x4f */
760 : 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 - 0x5f */
761 : 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60 - 0x6f */
762 : 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x70 - 0x7f */
763 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8f */
764 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9f */
765 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 - 0xaf */
766 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 - 0xbf */
767 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 - 0xcf */
768 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 - 0xdf */
769 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 - 0xef */
770 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 - 0xff */
771 : };
772 : static const unsigned char oneruns[256] = {
773 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 - 0x0f */
774 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 - 0x1f */
775 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 - 0x2f */
776 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 - 0x3f */
777 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 - 0x4f */
778 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 - 0x5f */
779 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6f */
780 : 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7f */
781 : 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x80 - 0x8f */
782 : 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x90 - 0x9f */
783 : 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xa0 - 0xaf */
784 : 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xb0 - 0xbf */
785 : 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xc0 - 0xcf */
786 : 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xd0 - 0xdf */
787 : 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0xe0 - 0xef */
788 : 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, /* 0xf0 - 0xff */
789 : };
790 :
791 : /*
792 : * On certain systems it pays to inline
793 : * the routines that find pixel spans.
794 : */
795 : #ifdef VAXC
796 : static int32 find0span(unsigned char*, int32, int32);
797 : static int32 find1span(unsigned char*, int32, int32);
798 : #pragma inline(find0span,find1span)
799 : #endif
800 :
801 : /*
802 : * Find a span of ones or zeros using the supplied
803 : * table. The ``base'' of the bit string is supplied
804 : * along with the start+end bit indices.
805 : */
806 : inline static int32
807 : find0span(unsigned char* bp, int32 bs, int32 be)
808 44923 : {
809 44923 : int32 bits = be - bs;
810 : int32 n, span;
811 :
812 44923 : bp += bs>>3;
813 : /*
814 : * Check partial byte on lhs.
815 : */
816 64872 : if (bits > 0 && (n = (bs & 7))) {
817 32943 : span = zeroruns[(*bp << n) & 0xff];
818 32943 : if (span > 8-n) /* table value too generous */
819 19998 : span = 8-n;
820 32943 : if (span > bits) /* constrain span to bit range */
821 49 : span = bits;
822 32943 : if (n+span < 8) /* doesn't extend to edge of byte */
823 12994 : return (span);
824 19949 : bits -= span;
825 19949 : bp++;
826 : } else
827 11980 : span = 0;
828 31929 : if (bits >= (int32)(2 * 8 * sizeof(long))) {
829 : long* lp;
830 : /*
831 : * Align to longword boundary and check longwords.
832 : */
833 73698 : while (!isAligned(bp, long)) {
834 31618 : if (*bp != 0x00)
835 14452 : return (span + zeroruns[*bp]);
836 17166 : span += 8, bits -= 8;
837 17166 : bp++;
838 : }
839 13814 : lp = (long*) bp;
840 27788 : while ((bits >= (int32)(8 * sizeof(long))) && (0 == *lp)) {
841 160 : span += 8*sizeof (long), bits -= 8*sizeof (long);
842 160 : lp++;
843 : }
844 13814 : bp = (unsigned char*) lp;
845 : }
846 : /*
847 : * Scan full bytes for all 0's.
848 : */
849 42957 : while (bits >= 8) {
850 25236 : if (*bp != 0x00) /* end of run */
851 17233 : return (span + zeroruns[*bp]);
852 8003 : span += 8, bits -= 8;
853 8003 : bp++;
854 : }
855 : /*
856 : * Check partial byte on rhs.
857 : */
858 244 : if (bits > 0) {
859 147 : n = zeroruns[*bp];
860 147 : span += (n > bits ? bits : n);
861 : }
862 244 : return (span);
863 : }
864 :
865 : inline static int32
866 : find1span(unsigned char* bp, int32 bs, int32 be)
867 59093 : {
868 59093 : int32 bits = be - bs;
869 : int32 n, span;
870 :
871 59093 : bp += bs>>3;
872 : /*
873 : * Check partial byte on lhs.
874 : */
875 81282 : if (bits > 0 && (n = (bs & 7))) {
876 33236 : span = oneruns[(*bp << n) & 0xff];
877 33236 : if (span > 8-n) /* table value too generous */
878 0 : span = 8-n;
879 33236 : if (span > bits) /* constrain span to bit range */
880 0 : span = bits;
881 33236 : if (n+span < 8) /* doesn't extend to edge of byte */
882 11047 : return (span);
883 22189 : bits -= span;
884 22189 : bp++;
885 : } else
886 25857 : span = 0;
887 48046 : if (bits >= (int32)(2 * 8 * sizeof(long))) {
888 : long* lp;
889 : /*
890 : * Align to longword boundary and check longwords.
891 : */
892 158918 : while (!isAligned(bp, long)) {
893 82008 : if (*bp != 0xff)
894 10078 : return (span + oneruns[*bp]);
895 71930 : span += 8, bits -= 8;
896 71930 : bp++;
897 : }
898 33416 : lp = (long*) bp;
899 370082 : while ((bits >= (int32)(8 * sizeof(long))) && (~0 == *lp)) {
900 303250 : span += 8*sizeof (long), bits -= 8*sizeof (long);
901 303250 : lp++;
902 : }
903 33416 : bp = (unsigned char*) lp;
904 : }
905 : /*
906 : * Scan full bytes for all 1's.
907 : */
908 221861 : while (bits >= 8) {
909 161904 : if (*bp != 0xff) /* end of run */
910 15979 : return (span + oneruns[*bp]);
911 145925 : span += 8, bits -= 8;
912 145925 : bp++;
913 : }
914 : /*
915 : * Check partial byte on rhs.
916 : */
917 21989 : if (bits > 0) {
918 288 : n = oneruns[*bp];
919 288 : span += (n > bits ? bits : n);
920 : }
921 21989 : return (span);
922 : }
923 :
924 : /*
925 : * Return the offset of the next bit in the range
926 : * [bs..be] that is different from the specified
927 : * color. The end, be, is returned if no such bit
928 : * exists.
929 : */
930 : #define finddiff(_cp, _bs, _be, _color) \
931 : (_bs + (_color ? find1span(_cp,_bs,_be) : find0span(_cp,_bs,_be)))
932 : /*
933 : * Like finddiff, but also check the starting bit
934 : * against the end in case start > end.
935 : */
936 : #define finddiff2(_cp, _bs, _be, _color) \
937 : (_bs < _be ? finddiff(_cp,_bs,_be,_color) : _be)
938 :
939 : /*
940 : * 1d-encode a row of pixels. The encoding is
941 : * a sequence of all-white or all-black spans
942 : * of pixels encoded with Huffman codes.
943 : */
944 : static int
945 : Fax3Encode1DRow(TIFF* tif, unsigned char* bp, uint32 bits)
946 0 : {
947 0 : Fax3CodecState* sp = EncoderState(tif);
948 : int32 span;
949 0 : uint32 bs = 0;
950 :
951 : for (;;) {
952 0 : span = find0span(bp, bs, bits); /* white span */
953 0 : putspan(tif, span, TIFFFaxWhiteCodes);
954 0 : bs += span;
955 0 : if (bs >= bits)
956 0 : break;
957 0 : span = find1span(bp, bs, bits); /* black span */
958 0 : putspan(tif, span, TIFFFaxBlackCodes);
959 0 : bs += span;
960 0 : if (bs >= bits)
961 0 : break;
962 0 : }
963 0 : if (sp->b.mode & (FAXMODE_BYTEALIGN|FAXMODE_WORDALIGN)) {
964 0 : if (sp->bit != 8) /* byte-align */
965 0 : Fax3FlushBits(tif, sp);
966 0 : if ((sp->b.mode&FAXMODE_WORDALIGN) &&
967 : !isAligned(tif->tif_rawcp, uint16))
968 0 : Fax3FlushBits(tif, sp);
969 : }
970 0 : return (1);
971 : }
972 :
973 : static const tableentry horizcode =
974 : { 3, 0x1, 0 }; /* 001 */
975 : static const tableentry passcode =
976 : { 4, 0x1, 0 }; /* 0001 */
977 : static const tableentry vcodes[7] = {
978 : { 7, 0x03, 0 }, /* 0000 011 */
979 : { 6, 0x03, 0 }, /* 0000 11 */
980 : { 3, 0x03, 0 }, /* 011 */
981 : { 1, 0x1, 0 }, /* 1 */
982 : { 3, 0x2, 0 }, /* 010 */
983 : { 6, 0x02, 0 }, /* 0000 10 */
984 : { 7, 0x02, 0 } /* 0000 010 */
985 : };
986 :
987 : /*
988 : * 2d-encode a row of pixels. Consult the CCITT
989 : * documentation for the algorithm.
990 : */
991 : static int
992 : Fax3Encode2DRow(TIFF* tif, unsigned char* bp, unsigned char* rp, uint32 bits)
993 7299 : {
994 : #define PIXEL(buf,ix) ((((buf)[(ix)>>3]) >> (7-((ix)&7))) & 1)
995 7299 : uint32 a0 = 0;
996 7299 : uint32 a1 = (PIXEL(bp, 0) != 0 ? 0 : finddiff(bp, 0, bits, 0));
997 7299 : uint32 b1 = (PIXEL(rp, 0) != 0 ? 0 : finddiff(rp, 0, bits, 0));
998 : uint32 a2, b2;
999 :
1000 : for (;;) {
1001 32715 : b2 = finddiff2(rp, b1, bits, PIXEL(rp,b1));
1002 32715 : if (b2 >= a1) {
1003 31212 : int32 d = b1 - a1;
1004 33596 : if (!(-3 <= d && d <= 3)) { /* horizontal mode */
1005 2384 : a2 = finddiff2(bp, a1, bits, PIXEL(bp,a1));
1006 2384 : putcode(tif, &horizcode);
1007 3437 : if (a0+a1 == 0 || PIXEL(bp, a0) == 0) {
1008 1053 : putspan(tif, a1-a0, TIFFFaxWhiteCodes);
1009 1053 : putspan(tif, a2-a1, TIFFFaxBlackCodes);
1010 : } else {
1011 1331 : putspan(tif, a1-a0, TIFFFaxBlackCodes);
1012 1331 : putspan(tif, a2-a1, TIFFFaxWhiteCodes);
1013 : }
1014 2384 : a0 = a2;
1015 : } else { /* vertical mode */
1016 28828 : putcode(tif, &vcodes[d+3]);
1017 28828 : a0 = a1;
1018 : }
1019 : } else { /* pass mode */
1020 1503 : putcode(tif, &passcode);
1021 1503 : a0 = b2;
1022 : }
1023 32715 : if (a0 >= bits)
1024 7299 : break;
1025 25416 : a1 = finddiff(bp, a0, bits, PIXEL(bp,a0));
1026 25416 : b1 = finddiff(rp, a0, bits, !PIXEL(bp,a0));
1027 25416 : b1 = finddiff(rp, b1, bits, PIXEL(bp,a0));
1028 25416 : }
1029 7299 : return (1);
1030 : #undef PIXEL
1031 : }
1032 :
1033 : /*
1034 : * Encode a buffer of pixels.
1035 : */
1036 : static int
1037 : Fax3Encode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
1038 0 : {
1039 : static const char module[] = "Fax3Encode";
1040 0 : Fax3CodecState* sp = EncoderState(tif);
1041 : (void) s;
1042 0 : if (cc % sp->b.rowbytes)
1043 : {
1044 0 : TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be written");
1045 0 : return (0);
1046 : }
1047 0 : while (cc > 0) {
1048 0 : if ((sp->b.mode & FAXMODE_NOEOL) == 0)
1049 0 : Fax3PutEOL(tif);
1050 0 : if (is2DEncoding(sp)) {
1051 0 : if (sp->tag == G3_1D) {
1052 0 : if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels))
1053 0 : return (0);
1054 0 : sp->tag = G3_2D;
1055 : } else {
1056 0 : if (!Fax3Encode2DRow(tif, bp, sp->refline,
1057 : sp->b.rowpixels))
1058 0 : return (0);
1059 0 : sp->k--;
1060 : }
1061 0 : if (sp->k == 0) {
1062 0 : sp->tag = G3_1D;
1063 0 : sp->k = sp->maxk-1;
1064 : } else
1065 0 : _TIFFmemcpy(sp->refline, bp, sp->b.rowbytes);
1066 : } else {
1067 0 : if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels))
1068 0 : return (0);
1069 : }
1070 0 : bp += sp->b.rowbytes;
1071 0 : cc -= sp->b.rowbytes;
1072 : }
1073 0 : return (1);
1074 : }
1075 :
1076 : static int
1077 : Fax3PostEncode(TIFF* tif)
1078 0 : {
1079 0 : Fax3CodecState* sp = EncoderState(tif);
1080 :
1081 0 : if (sp->bit != 8)
1082 0 : Fax3FlushBits(tif, sp);
1083 0 : return (1);
1084 : }
1085 :
1086 : static void
1087 : Fax3Close(TIFF* tif)
1088 4 : {
1089 4 : if ((Fax3State(tif)->mode & FAXMODE_NORTC) == 0) {
1090 0 : Fax3CodecState* sp = EncoderState(tif);
1091 0 : unsigned int code = EOL;
1092 0 : unsigned int length = 12;
1093 : int i;
1094 :
1095 0 : if (is2DEncoding(sp))
1096 0 : code = (code<<1) | (sp->tag == G3_1D), length++;
1097 0 : for (i = 0; i < 6; i++)
1098 0 : Fax3PutBits(tif, code, length);
1099 0 : Fax3FlushBits(tif, sp);
1100 : }
1101 4 : }
1102 :
1103 : static void
1104 : Fax3Cleanup(TIFF* tif)
1105 14 : {
1106 14 : Fax3CodecState* sp = DecoderState(tif);
1107 :
1108 14 : assert(sp != 0);
1109 :
1110 14 : tif->tif_tagmethods.vgetfield = sp->b.vgetparent;
1111 14 : tif->tif_tagmethods.vsetfield = sp->b.vsetparent;
1112 14 : tif->tif_tagmethods.printdir = sp->b.printdir;
1113 :
1114 14 : if (sp->runs)
1115 8 : _TIFFfree(sp->runs);
1116 14 : if (sp->refline)
1117 8 : _TIFFfree(sp->refline);
1118 :
1119 14 : _TIFFfree(tif->tif_data);
1120 14 : tif->tif_data = NULL;
1121 :
1122 14 : _TIFFSetDefaultCompressionState(tif);
1123 14 : }
1124 :
1125 : #define FIELD_BADFAXLINES (FIELD_CODEC+0)
1126 : #define FIELD_CLEANFAXDATA (FIELD_CODEC+1)
1127 : #define FIELD_BADFAXRUN (FIELD_CODEC+2)
1128 :
1129 : #define FIELD_OPTIONS (FIELD_CODEC+7)
1130 :
1131 : static const TIFFField faxFields[] = {
1132 : { TIFFTAG_FAXMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "FaxMode", NULL },
1133 : { TIFFTAG_FAXFILLFUNC, 0, 0, TIFF_ANY, 0, TIFF_SETGET_OTHER, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "FaxFillFunc", NULL },
1134 : { TIFFTAG_BADFAXLINES, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_BADFAXLINES, TRUE, FALSE, "BadFaxLines", NULL },
1135 : { TIFFTAG_CLEANFAXDATA, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UINT16, FIELD_CLEANFAXDATA, TRUE, FALSE, "CleanFaxData", NULL },
1136 : { TIFFTAG_CONSECUTIVEBADFAXLINES, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_BADFAXRUN, TRUE, FALSE, "ConsecutiveBadFaxLines", NULL }};
1137 : static const TIFFField fax3Fields[] = {
1138 : { TIFFTAG_GROUP3OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_OPTIONS, FALSE, FALSE, "Group3Options", NULL },
1139 : };
1140 : static const TIFFField fax4Fields[] = {
1141 : { TIFFTAG_GROUP4OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_OPTIONS, FALSE, FALSE, "Group4Options", NULL },
1142 : };
1143 :
1144 : static int
1145 : Fax3VSetField(TIFF* tif, uint32 tag, va_list ap)
1146 140 : {
1147 140 : Fax3BaseState* sp = Fax3State(tif);
1148 : const TIFFField* fip;
1149 :
1150 140 : assert(sp != 0);
1151 140 : assert(sp->vsetparent != 0);
1152 :
1153 140 : switch (tag) {
1154 : case TIFFTAG_FAXMODE:
1155 14 : sp->mode = (int) va_arg(ap, int);
1156 14 : return 1; /* NB: pseudo tag */
1157 : case TIFFTAG_FAXFILLFUNC:
1158 14 : DecoderState(tif)->fill = va_arg(ap, TIFFFaxFillFunc);
1159 14 : return 1; /* NB: pseudo tag */
1160 : case TIFFTAG_GROUP3OPTIONS:
1161 : /* XXX: avoid reading options if compression mismatches. */
1162 2 : if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX3)
1163 2 : sp->groupoptions = (uint32) va_arg(ap, uint32);
1164 2 : break;
1165 : case TIFFTAG_GROUP4OPTIONS:
1166 : /* XXX: avoid reading options if compression mismatches. */
1167 0 : if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4)
1168 0 : sp->groupoptions = (uint32) va_arg(ap, uint32);
1169 0 : break;
1170 : case TIFFTAG_BADFAXLINES:
1171 0 : sp->badfaxlines = (uint32) va_arg(ap, uint32);
1172 0 : break;
1173 : case TIFFTAG_CLEANFAXDATA:
1174 0 : sp->cleanfaxdata = (uint16) va_arg(ap, uint16_vap);
1175 0 : break;
1176 : case TIFFTAG_CONSECUTIVEBADFAXLINES:
1177 0 : sp->badfaxrun = (uint32) va_arg(ap, uint32);
1178 0 : break;
1179 : default:
1180 110 : return (*sp->vsetparent)(tif, tag, ap);
1181 : }
1182 :
1183 2 : if ((fip = TIFFFieldWithTag(tif, tag)))
1184 2 : TIFFSetFieldBit(tif, fip->field_bit);
1185 : else
1186 0 : return 0;
1187 :
1188 2 : tif->tif_flags |= TIFF_DIRTYDIRECT;
1189 2 : return 1;
1190 : }
1191 :
1192 : static int
1193 : Fax3VGetField(TIFF* tif, uint32 tag, va_list ap)
1194 189 : {
1195 189 : Fax3BaseState* sp = Fax3State(tif);
1196 :
1197 189 : assert(sp != 0);
1198 :
1199 189 : switch (tag) {
1200 : case TIFFTAG_FAXMODE:
1201 0 : *va_arg(ap, int*) = sp->mode;
1202 0 : break;
1203 : case TIFFTAG_FAXFILLFUNC:
1204 0 : *va_arg(ap, TIFFFaxFillFunc*) = DecoderState(tif)->fill;
1205 0 : break;
1206 : case TIFFTAG_GROUP3OPTIONS:
1207 : case TIFFTAG_GROUP4OPTIONS:
1208 2 : *va_arg(ap, uint32*) = sp->groupoptions;
1209 2 : break;
1210 : case TIFFTAG_BADFAXLINES:
1211 0 : *va_arg(ap, uint32*) = sp->badfaxlines;
1212 0 : break;
1213 : case TIFFTAG_CLEANFAXDATA:
1214 0 : *va_arg(ap, uint16*) = sp->cleanfaxdata;
1215 0 : break;
1216 : case TIFFTAG_CONSECUTIVEBADFAXLINES:
1217 0 : *va_arg(ap, uint32*) = sp->badfaxrun;
1218 0 : break;
1219 : default:
1220 187 : return (*sp->vgetparent)(tif, tag, ap);
1221 : }
1222 2 : return (1);
1223 : }
1224 :
1225 : static void
1226 : Fax3PrintDir(TIFF* tif, FILE* fd, long flags)
1227 0 : {
1228 0 : Fax3BaseState* sp = Fax3State(tif);
1229 :
1230 0 : assert(sp != 0);
1231 :
1232 : (void) flags;
1233 0 : if (TIFFFieldSet(tif,FIELD_OPTIONS)) {
1234 0 : const char* sep = " ";
1235 0 : if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4) {
1236 0 : fprintf(fd, " Group 4 Options:");
1237 0 : if (sp->groupoptions & GROUP4OPT_UNCOMPRESSED)
1238 0 : fprintf(fd, "%suncompressed data", sep);
1239 : } else {
1240 :
1241 0 : fprintf(fd, " Group 3 Options:");
1242 0 : if (sp->groupoptions & GROUP3OPT_2DENCODING)
1243 0 : fprintf(fd, "%s2-d encoding", sep), sep = "+";
1244 0 : if (sp->groupoptions & GROUP3OPT_FILLBITS)
1245 0 : fprintf(fd, "%sEOL padding", sep), sep = "+";
1246 0 : if (sp->groupoptions & GROUP3OPT_UNCOMPRESSED)
1247 0 : fprintf(fd, "%suncompressed data", sep);
1248 : }
1249 0 : fprintf(fd, " (%lu = 0x%lx)\n",
1250 : (unsigned long) sp->groupoptions,
1251 : (unsigned long) sp->groupoptions);
1252 : }
1253 0 : if (TIFFFieldSet(tif,FIELD_CLEANFAXDATA)) {
1254 0 : fprintf(fd, " Fax Data:");
1255 0 : switch (sp->cleanfaxdata) {
1256 : case CLEANFAXDATA_CLEAN:
1257 0 : fprintf(fd, " clean");
1258 0 : break;
1259 : case CLEANFAXDATA_REGENERATED:
1260 0 : fprintf(fd, " receiver regenerated");
1261 0 : break;
1262 : case CLEANFAXDATA_UNCLEAN:
1263 0 : fprintf(fd, " uncorrected errors");
1264 : break;
1265 : }
1266 0 : fprintf(fd, " (%u = 0x%x)\n",
1267 : sp->cleanfaxdata, sp->cleanfaxdata);
1268 : }
1269 0 : if (TIFFFieldSet(tif,FIELD_BADFAXLINES))
1270 0 : fprintf(fd, " Bad Fax Lines: %lu\n",
1271 : (unsigned long) sp->badfaxlines);
1272 0 : if (TIFFFieldSet(tif,FIELD_BADFAXRUN))
1273 0 : fprintf(fd, " Consecutive Bad Fax Lines: %lu\n",
1274 : (unsigned long) sp->badfaxrun);
1275 0 : if (sp->printdir)
1276 0 : (*sp->printdir)(tif, fd, flags);
1277 0 : }
1278 :
1279 : static int
1280 : InitCCITTFax3(TIFF* tif)
1281 14 : {
1282 : static const char module[] = "InitCCITTFax3";
1283 : Fax3BaseState* sp;
1284 :
1285 : /*
1286 : * Merge codec-specific tag information.
1287 : */
1288 14 : if (!_TIFFMergeFields(tif, faxFields, TIFFArrayCount(faxFields))) {
1289 0 : TIFFErrorExt(tif->tif_clientdata, "InitCCITTFax3",
1290 : "Merging common CCITT Fax codec-specific tags failed");
1291 0 : return 0;
1292 : }
1293 :
1294 : /*
1295 : * Allocate state block so tag methods have storage to record values.
1296 : */
1297 14 : tif->tif_data = (uint8*)
1298 : _TIFFmalloc(sizeof (Fax3CodecState));
1299 :
1300 14 : if (tif->tif_data == NULL) {
1301 0 : TIFFErrorExt(tif->tif_clientdata, module,
1302 : "No space for state block");
1303 0 : return (0);
1304 : }
1305 :
1306 14 : sp = Fax3State(tif);
1307 14 : sp->rw_mode = tif->tif_mode;
1308 :
1309 : /*
1310 : * Override parent get/set field methods.
1311 : */
1312 14 : sp->vgetparent = tif->tif_tagmethods.vgetfield;
1313 14 : tif->tif_tagmethods.vgetfield = Fax3VGetField; /* hook for codec tags */
1314 14 : sp->vsetparent = tif->tif_tagmethods.vsetfield;
1315 14 : tif->tif_tagmethods.vsetfield = Fax3VSetField; /* hook for codec tags */
1316 14 : sp->printdir = tif->tif_tagmethods.printdir;
1317 14 : tif->tif_tagmethods.printdir = Fax3PrintDir; /* hook for codec tags */
1318 14 : sp->groupoptions = 0;
1319 :
1320 14 : if (sp->rw_mode == O_RDONLY) /* FIXME: improve for in place update */
1321 8 : tif->tif_flags |= TIFF_NOBITREV; /* decoder does bit reversal */
1322 14 : DecoderState(tif)->runs = NULL;
1323 14 : TIFFSetField(tif, TIFFTAG_FAXFILLFUNC, _TIFFFax3fillruns);
1324 14 : EncoderState(tif)->refline = NULL;
1325 :
1326 : /*
1327 : * Install codec methods.
1328 : */
1329 14 : tif->tif_fixuptags = Fax3FixupTags;
1330 14 : tif->tif_setupdecode = Fax3SetupState;
1331 14 : tif->tif_predecode = Fax3PreDecode;
1332 14 : tif->tif_decoderow = Fax3Decode1D;
1333 14 : tif->tif_decodestrip = Fax3Decode1D;
1334 14 : tif->tif_decodetile = Fax3Decode1D;
1335 14 : tif->tif_setupencode = Fax3SetupState;
1336 14 : tif->tif_preencode = Fax3PreEncode;
1337 14 : tif->tif_postencode = Fax3PostEncode;
1338 14 : tif->tif_encoderow = Fax3Encode;
1339 14 : tif->tif_encodestrip = Fax3Encode;
1340 14 : tif->tif_encodetile = Fax3Encode;
1341 14 : tif->tif_close = Fax3Close;
1342 14 : tif->tif_cleanup = Fax3Cleanup;
1343 :
1344 14 : return (1);
1345 : }
1346 :
1347 : int
1348 : TIFFInitCCITTFax3(TIFF* tif, int scheme)
1349 2 : {
1350 : (void) scheme;
1351 2 : if (InitCCITTFax3(tif)) {
1352 : /*
1353 : * Merge codec-specific tag information.
1354 : */
1355 2 : if (!_TIFFMergeFields(tif, fax3Fields,
1356 : TIFFArrayCount(fax3Fields))) {
1357 0 : TIFFErrorExt(tif->tif_clientdata, "TIFFInitCCITTFax3",
1358 : "Merging CCITT Fax 3 codec-specific tags failed");
1359 0 : return 0;
1360 : }
1361 :
1362 : /*
1363 : * The default format is Class/F-style w/o RTC.
1364 : */
1365 2 : return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
1366 : } else
1367 0 : return 01;
1368 : }
1369 :
1370 : /*
1371 : * CCITT Group 4 (T.6) Facsimile-compatible
1372 : * Compression Scheme Support.
1373 : */
1374 :
1375 : #define SWAP(t,a,b) { t x; x = (a); (a) = (b); (b) = x; }
1376 : /*
1377 : * Decode the requested amount of G4-encoded data.
1378 : */
1379 : static int
1380 : Fax4Decode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
1381 21602 : {
1382 21602 : DECLARE_STATE_2D(tif, sp, "Fax4Decode");
1383 : (void) s;
1384 21602 : if (occ % sp->b.rowbytes)
1385 : {
1386 0 : TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
1387 0 : return (-1);
1388 : }
1389 21602 : CACHE_STATE(tif, sp);
1390 65038 : while (occ > 0) {
1391 21834 : a0 = 0;
1392 21834 : RunLength = 0;
1393 21834 : pa = thisrun = sp->curruns;
1394 21834 : pb = sp->refruns;
1395 21834 : b1 = *pb++;
1396 : #ifdef FAX3_DEBUG
1397 : printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail);
1398 : printf("-------------------- %d\n", tif->tif_row);
1399 : fflush(stdout);
1400 : #endif
1401 21834 : EXPAND2D(EOFG4);
1402 21834 : if (EOLcnt)
1403 0 : goto EOFG4;
1404 21834 : (*sp->fill)(buf, thisrun, pa, lastx);
1405 21834 : SETVALUE(0); /* imaginary change for reference */
1406 21834 : SWAP(uint32*, sp->curruns, sp->refruns);
1407 21834 : buf += sp->b.rowbytes;
1408 21834 : occ -= sp->b.rowbytes;
1409 21834 : sp->line++;
1410 21834 : continue;
1411 0 : EOFG4:
1412 0 : NeedBits16( 13, BADG4 );
1413 0 : BADG4:
1414 : #ifdef FAX3_DEBUG
1415 : if( GetBits(13) != 0x1001 )
1416 : fputs( "Bad EOFB\n", stderr );
1417 : #endif
1418 0 : ClrBits( 13 );
1419 0 : (*sp->fill)(buf, thisrun, pa, lastx);
1420 0 : UNCACHE_STATE(tif, sp);
1421 0 : return ( sp->line ? 1 : -1); /* don't error on badly-terminated strips */
1422 : }
1423 21602 : UNCACHE_STATE(tif, sp);
1424 21602 : return (1);
1425 : }
1426 : #undef SWAP
1427 :
1428 : /*
1429 : * Encode the requested amount of data.
1430 : */
1431 : static int
1432 : Fax4Encode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
1433 2 : {
1434 : static const char module[] = "Fax4Encode";
1435 2 : Fax3CodecState *sp = EncoderState(tif);
1436 : (void) s;
1437 2 : if (cc % sp->b.rowbytes)
1438 : {
1439 0 : TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be written");
1440 0 : return (0);
1441 : }
1442 7303 : while (cc > 0) {
1443 7299 : if (!Fax3Encode2DRow(tif, bp, sp->refline, sp->b.rowpixels))
1444 0 : return (0);
1445 7299 : _TIFFmemcpy(sp->refline, bp, sp->b.rowbytes);
1446 7299 : bp += sp->b.rowbytes;
1447 7299 : cc -= sp->b.rowbytes;
1448 : }
1449 2 : return (1);
1450 : }
1451 :
1452 : static int
1453 : Fax4PostEncode(TIFF* tif)
1454 2 : {
1455 2 : Fax3CodecState *sp = EncoderState(tif);
1456 :
1457 : /* terminate strip w/ EOFB */
1458 2 : Fax3PutBits(tif, EOL, 12);
1459 2 : Fax3PutBits(tif, EOL, 12);
1460 2 : if (sp->bit != 8)
1461 2 : Fax3FlushBits(tif, sp);
1462 2 : return (1);
1463 : }
1464 :
1465 : int
1466 : TIFFInitCCITTFax4(TIFF* tif, int scheme)
1467 12 : {
1468 : (void) scheme;
1469 12 : if (InitCCITTFax3(tif)) { /* reuse G3 support */
1470 : /*
1471 : * Merge codec-specific tag information.
1472 : */
1473 12 : if (!_TIFFMergeFields(tif, fax4Fields,
1474 : TIFFArrayCount(fax4Fields))) {
1475 0 : TIFFErrorExt(tif->tif_clientdata, "TIFFInitCCITTFax4",
1476 : "Merging CCITT Fax 4 codec-specific tags failed");
1477 0 : return 0;
1478 : }
1479 :
1480 12 : tif->tif_decoderow = Fax4Decode;
1481 12 : tif->tif_decodestrip = Fax4Decode;
1482 12 : tif->tif_decodetile = Fax4Decode;
1483 12 : tif->tif_encoderow = Fax4Encode;
1484 12 : tif->tif_encodestrip = Fax4Encode;
1485 12 : tif->tif_encodetile = Fax4Encode;
1486 12 : tif->tif_postencode = Fax4PostEncode;
1487 : /*
1488 : * Suppress RTC at the end of each strip.
1489 : */
1490 12 : return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_NORTC);
1491 : } else
1492 0 : return (0);
1493 : }
1494 :
1495 : /*
1496 : * CCITT Group 3 1-D Modified Huffman RLE Compression Support.
1497 : * (Compression algorithms 2 and 32771)
1498 : */
1499 :
1500 : /*
1501 : * Decode the requested amount of RLE-encoded data.
1502 : */
1503 : static int
1504 : Fax3DecodeRLE(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
1505 0 : {
1506 0 : DECLARE_STATE(tif, sp, "Fax3DecodeRLE");
1507 0 : int mode = sp->b.mode;
1508 : (void) s;
1509 0 : if (occ % sp->b.rowbytes)
1510 : {
1511 0 : TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
1512 0 : return (-1);
1513 : }
1514 0 : CACHE_STATE(tif, sp);
1515 0 : thisrun = sp->curruns;
1516 0 : while (occ > 0) {
1517 0 : a0 = 0;
1518 0 : RunLength = 0;
1519 0 : pa = thisrun;
1520 : #ifdef FAX3_DEBUG
1521 : printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail);
1522 : printf("-------------------- %d\n", tif->tif_row);
1523 : fflush(stdout);
1524 : #endif
1525 0 : EXPAND1D(EOFRLE);
1526 0 : (*sp->fill)(buf, thisrun, pa, lastx);
1527 : /*
1528 : * Cleanup at the end of the row.
1529 : */
1530 0 : if (mode & FAXMODE_BYTEALIGN) {
1531 0 : int n = BitsAvail - (BitsAvail &~ 7);
1532 0 : ClrBits(n);
1533 0 : } else if (mode & FAXMODE_WORDALIGN) {
1534 0 : int n = BitsAvail - (BitsAvail &~ 15);
1535 0 : ClrBits(n);
1536 0 : if (BitsAvail == 0 && !isAligned(cp, uint16))
1537 0 : cp++;
1538 : }
1539 0 : buf += sp->b.rowbytes;
1540 0 : occ -= sp->b.rowbytes;
1541 0 : sp->line++;
1542 0 : continue;
1543 0 : EOFRLE: /* premature EOF */
1544 0 : (*sp->fill)(buf, thisrun, pa, lastx);
1545 0 : UNCACHE_STATE(tif, sp);
1546 0 : return (-1);
1547 : }
1548 0 : UNCACHE_STATE(tif, sp);
1549 0 : return (1);
1550 : }
1551 :
1552 : int
1553 : TIFFInitCCITTRLE(TIFF* tif, int scheme)
1554 0 : {
1555 : (void) scheme;
1556 0 : if (InitCCITTFax3(tif)) { /* reuse G3 support */
1557 0 : tif->tif_decoderow = Fax3DecodeRLE;
1558 0 : tif->tif_decodestrip = Fax3DecodeRLE;
1559 0 : tif->tif_decodetile = Fax3DecodeRLE;
1560 : /*
1561 : * Suppress RTC+EOLs when encoding and byte-align data.
1562 : */
1563 0 : return TIFFSetField(tif, TIFFTAG_FAXMODE,
1564 : FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_BYTEALIGN);
1565 : } else
1566 0 : return (0);
1567 : }
1568 :
1569 : int
1570 : TIFFInitCCITTRLEW(TIFF* tif, int scheme)
1571 0 : {
1572 : (void) scheme;
1573 0 : if (InitCCITTFax3(tif)) { /* reuse G3 support */
1574 0 : tif->tif_decoderow = Fax3DecodeRLE;
1575 0 : tif->tif_decodestrip = Fax3DecodeRLE;
1576 0 : tif->tif_decodetile = Fax3DecodeRLE;
1577 : /*
1578 : * Suppress RTC+EOLs when encoding and word-align data.
1579 : */
1580 0 : return TIFFSetField(tif, TIFFTAG_FAXMODE,
1581 : FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_WORDALIGN);
1582 : } else
1583 0 : return (0);
1584 : }
1585 : #endif /* CCITT_SUPPORT */
1586 :
1587 : /* vim: set ts=8 sts=8 sw=8 noet: */
1588 : /*
1589 : * Local Variables:
1590 : * mode: c
1591 : * c-basic-offset: 8
1592 : * fill-column: 78
1593 : * End:
1594 : */
|