LCOV - code coverage report
Current view: directory - frmts/gtiff/libtiff - tif_fax3.c (source / functions) Found Hit Coverage
Test: gdal_filtered.info Lines: 661 387 58.5 %
Date: 2012-12-26 Functions: 34 21 61.8 %

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

Generated by: LCOV version 1.7