tif_fax3.c
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:43k
源码类别:

打印编程

开发平台:

Visual C++

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