LCOV - code coverage report
Current view: directory - frmts/gtiff/libtiff - tif_fax3.c (source / functions) Found Hit Coverage
Test: gdal_filtered.info Lines: 654 383 58.6 %
Date: 2010-01-09 Functions: 34 21 61.8 %

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

Generated by: LCOV version 1.7