home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / src / tiff / tif_fax3.c < prev    next >
C/C++ Source or Header  |  2003-01-03  |  45KB  |  1,572 lines

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