LCOV - code coverage report
Current view: top level - frmts/gtiff/libtiff - tif_lzw.c (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 483 575 84.0 %
Date: 2024-11-21 22:18:42 Functions: 12 12 100.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 1988-1997 Sam Leffler
       3             :  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
       4             :  * Copyright (c) 2022 Even Rouault
       5             :  *
       6             :  * Permission to use, copy, modify, distribute, and sell this software and
       7             :  * its documentation for any purpose is hereby granted without fee, provided
       8             :  * that (i) the above copyright notices and this permission notice appear in
       9             :  * all copies of the software and related documentation, and (ii) the names of
      10             :  * Sam Leffler and Silicon Graphics may not be used in any advertising or
      11             :  * publicity relating to the software without the specific, prior written
      12             :  * permission of Sam Leffler and Silicon Graphics.
      13             :  *
      14             :  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
      15             :  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
      16             :  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
      17             :  *
      18             :  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
      19             :  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
      20             :  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
      21             :  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
      22             :  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
      23             :  * OF THIS SOFTWARE.
      24             :  */
      25             : 
      26             : #include "tiffiop.h"
      27             : #ifdef LZW_SUPPORT
      28             : /*
      29             :  * TIFF Library.
      30             :  * Rev 5.0 Lempel-Ziv & Welch Compression Support
      31             :  *
      32             :  * This code is derived from the compress program whose code is
      33             :  * derived from software contributed to Berkeley by James A. Woods,
      34             :  * derived from original work by Spencer Thomas and Joseph Orost.
      35             :  *
      36             :  * The original Berkeley copyright notice appears below in its entirety.
      37             :  */
      38             : #include "tif_predict.h"
      39             : 
      40             : #include <stdbool.h>
      41             : #include <stdio.h>
      42             : #include <stdlib.h>
      43             : 
      44             : /* Select the plausible largest natural integer type for the architecture */
      45             : #define SIZEOF_WORDTYPE SIZEOF_SIZE_T
      46             : typedef size_t WordType;
      47             : 
      48             : /*
      49             :  * NB: The 5.0 spec describes a different algorithm than Aldus
      50             :  *     implements.  Specifically, Aldus does code length transitions
      51             :  *     one code earlier than should be done (for real LZW).
      52             :  *     Earlier versions of this library implemented the correct
      53             :  *     LZW algorithm, but emitted codes in a bit order opposite
      54             :  *     to the TIFF spec.  Thus, to maintain compatibility w/ Aldus
      55             :  *     we interpret MSB-LSB ordered codes to be images written w/
      56             :  *     old versions of this library, but otherwise adhere to the
      57             :  *     Aldus "off by one" algorithm.
      58             :  *
      59             :  * Future revisions to the TIFF spec are expected to "clarify this issue".
      60             :  */
      61             : #define LZW_COMPAT /* include backwards compatibility code */
      62             : 
      63             : #define MAXCODE(n) ((1L << (n)) - 1)
      64             : /*
      65             :  * The TIFF spec specifies that encoded bit
      66             :  * strings range from 9 to 12 bits.
      67             :  */
      68             : #define BITS_MIN 9  /* start with 9 bits */
      69             : #define BITS_MAX 12 /* max of 12 bit strings */
      70             : /* predefined codes */
      71             : #define CODE_CLEAR 256 /* code to clear string table */
      72             : #define CODE_EOI 257   /* end-of-information code */
      73             : #define CODE_FIRST 258 /* first free code entry */
      74             : #define CODE_MAX MAXCODE(BITS_MAX)
      75             : #define HSIZE 9001L /* 91% occupancy */
      76             : #define HSHIFT (13 - 8)
      77             : #ifdef LZW_COMPAT
      78             : /* NB: +1024 is for compatibility with old files */
      79             : #define CSIZE (MAXCODE(BITS_MAX) + 1024L)
      80             : #else
      81             : #define CSIZE (MAXCODE(BITS_MAX) + 1L)
      82             : #endif
      83             : 
      84             : /*
      85             :  * State block for each open TIFF file using LZW
      86             :  * compression/decompression.  Note that the predictor
      87             :  * state block must be first in this data structure.
      88             :  */
      89             : typedef struct
      90             : {
      91             :     TIFFPredictorState predict; /* predictor super class */
      92             : 
      93             :     unsigned short nbits;    /* # of bits/code */
      94             :     unsigned short maxcode;  /* maximum code for lzw_nbits */
      95             :     unsigned short free_ent; /* next free entry in hash table */
      96             :     WordType nextdata;       /* next bits of i/o */
      97             :     long nextbits;           /* # of valid bits in lzw_nextdata */
      98             : 
      99             :     int rw_mode; /* preserve rw_mode from init */
     100             : } LZWBaseState;
     101             : 
     102             : #define lzw_nbits base.nbits
     103             : #define lzw_maxcode base.maxcode
     104             : #define lzw_free_ent base.free_ent
     105             : #define lzw_nextdata base.nextdata
     106             : #define lzw_nextbits base.nextbits
     107             : 
     108             : /*
     109             :  * Encoding-specific state.
     110             :  */
     111             : typedef uint16_t hcode_t; /* codes fit in 16 bits */
     112             : typedef struct
     113             : {
     114             :     long hash;
     115             :     hcode_t code;
     116             : } hash_t;
     117             : 
     118             : /*
     119             :  * Decoding-specific state.
     120             :  */
     121             : typedef struct code_ent
     122             : {
     123             :     struct code_ent *next;
     124             :     unsigned short length; /* string len, including this token */
     125             :     /* firstchar should be placed immediately before value in this structure */
     126             :     unsigned char firstchar; /* first token of string */
     127             :     unsigned char value;     /* data value */
     128             :     bool repeated;
     129             : } code_t;
     130             : 
     131             : typedef int (*decodeFunc)(TIFF *, uint8_t *, tmsize_t, uint16_t);
     132             : 
     133             : typedef struct
     134             : {
     135             :     LZWBaseState base;
     136             : 
     137             :     /* Decoding specific data */
     138             :     long dec_nbitsmask;     /* lzw_nbits 1 bits, right adjusted */
     139             :     tmsize_t dec_restart;   /* restart count */
     140             :     uint64_t dec_bitsleft;  /* available bits in raw data */
     141             :     tmsize_t old_tif_rawcc; /* value of tif_rawcc at the end of the previous
     142             :                                TIFLZWDecode() call */
     143             :     decodeFunc dec_decode;  /* regular or backwards compatible */
     144             :     code_t *dec_codep;      /* current recognized code */
     145             :     code_t *dec_oldcodep;   /* previously recognized code */
     146             :     code_t *dec_free_entp;  /* next free entry */
     147             :     code_t *dec_maxcodep;   /* max available entry */
     148             :     code_t *dec_codetab;    /* kept separate for small machines */
     149             :     int read_error; /* whether a read error has occurred, and which should cause
     150             :                        further reads in the same strip/tile to be aborted */
     151             : 
     152             :     /* Encoding specific data */
     153             :     int enc_oldcode;         /* last code encountered */
     154             :     tmsize_t enc_checkpoint; /* point at which to clear table */
     155             : #define CHECK_GAP 10000      /* enc_ratio check interval */
     156             :     tmsize_t enc_ratio;      /* current compression ratio */
     157             :     tmsize_t enc_incount;    /* (input) data bytes encoded */
     158             :     tmsize_t enc_outcount;   /* encoded (output) bytes */
     159             :     uint8_t *enc_rawlimit;   /* bound on tif_rawdata buffer */
     160             :     hash_t *enc_hashtab;     /* kept separate for small machines */
     161             : } LZWCodecState;
     162             : 
     163             : #define LZWState(tif) ((LZWBaseState *)(tif)->tif_data)
     164             : #define LZWDecoderState(tif) ((LZWCodecState *)LZWState(tif))
     165             : #define LZWEncoderState(tif) ((LZWCodecState *)LZWState(tif))
     166             : 
     167             : static int LZWDecode(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s);
     168             : #ifdef LZW_COMPAT
     169             : static int LZWDecodeCompat(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s);
     170             : #endif
     171             : static void cl_hash(LZWCodecState *);
     172             : 
     173             : /*
     174             :  * LZW Decoder.
     175             :  */
     176             : 
     177        4150 : static int LZWFixupTags(TIFF *tif)
     178             : {
     179             :     (void)tif;
     180        4150 :     return (1);
     181             : }
     182             : 
     183        2406 : static int LZWSetupDecode(TIFF *tif)
     184             : {
     185             :     static const char module[] = "LZWSetupDecode";
     186        2406 :     LZWCodecState *sp = LZWDecoderState(tif);
     187             :     int code;
     188             : 
     189        2406 :     if (sp == NULL)
     190             :     {
     191             :         /*
     192             :          * Allocate state block so tag methods have storage to record
     193             :          * values.
     194             :          */
     195           0 :         tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(LZWCodecState));
     196           0 :         if (tif->tif_data == NULL)
     197             :         {
     198           0 :             TIFFErrorExtR(tif, module, "No space for LZW state block");
     199           0 :             return (0);
     200             :         }
     201             : 
     202           0 :         sp = LZWDecoderState(tif);
     203           0 :         sp->dec_codetab = NULL;
     204           0 :         sp->dec_decode = NULL;
     205             : 
     206             :         /*
     207             :          * Setup predictor setup.
     208             :          */
     209           0 :         (void)TIFFPredictorInit(tif);
     210             :     }
     211             : 
     212        2409 :     if (sp->dec_codetab == NULL)
     213             :     {
     214        2405 :         sp->dec_codetab = (code_t *)_TIFFmallocExt(tif, CSIZE * sizeof(code_t));
     215        2403 :         if (sp->dec_codetab == NULL)
     216             :         {
     217           0 :             TIFFErrorExtR(tif, module, "No space for LZW code table");
     218           0 :             return (0);
     219             :         }
     220             :         /*
     221             :          * Pre-load the table.
     222             :          */
     223        2403 :         code = 255;
     224             :         do
     225             :         {
     226      613970 :             sp->dec_codetab[code].firstchar = (unsigned char)code;
     227      613970 :             sp->dec_codetab[code].value = (unsigned char)code;
     228      613970 :             sp->dec_codetab[code].repeated = true;
     229      613970 :             sp->dec_codetab[code].length = 1;
     230      613970 :             sp->dec_codetab[code].next = NULL;
     231      613970 :         } while (code--);
     232             :         /*
     233             :          * Zero-out the unused entries  */
     234             :         /* Silence false positive */
     235             :         /* coverity[overrun-buffer-arg] */
     236        2403 :         memset(&sp->dec_codetab[CODE_CLEAR], 0,
     237             :                (CODE_FIRST - CODE_CLEAR) * sizeof(code_t));
     238             :     }
     239        2407 :     return (1);
     240             : }
     241             : 
     242             : /*
     243             :  * Setup state for decoding a strip.
     244             :  */
     245        4855 : static int LZWPreDecode(TIFF *tif, uint16_t s)
     246             : {
     247             :     static const char module[] = "LZWPreDecode";
     248        4855 :     LZWCodecState *sp = LZWDecoderState(tif);
     249             : 
     250             :     (void)s;
     251        4855 :     assert(sp != NULL);
     252        4855 :     if (sp->dec_codetab == NULL)
     253             :     {
     254          33 :         tif->tif_setupdecode(tif);
     255          33 :         if (sp->dec_codetab == NULL)
     256           0 :             return (0);
     257             :     }
     258             : 
     259             :     /*
     260             :      * Check for old bit-reversed codes.
     261             :      */
     262        4855 :     if (tif->tif_rawcc >= 2 && tif->tif_rawdata[0] == 0 &&
     263         103 :         (tif->tif_rawdata[1] & 0x1))
     264             :     {
     265             : #ifdef LZW_COMPAT
     266         103 :         if (!sp->dec_decode)
     267             :         {
     268           2 :             TIFFWarningExtR(tif, module, "Old-style LZW codes, convert file");
     269             :             /*
     270             :              * Override default decoding methods with
     271             :              * ones that deal with the old coding.
     272             :              * Otherwise the predictor versions set
     273             :              * above will call the compatibility routines
     274             :              * through the dec_decode method.
     275             :              */
     276           2 :             tif->tif_decoderow = LZWDecodeCompat;
     277           2 :             tif->tif_decodestrip = LZWDecodeCompat;
     278           2 :             tif->tif_decodetile = LZWDecodeCompat;
     279             :             /*
     280             :              * If doing horizontal differencing, must
     281             :              * re-setup the predictor logic since we
     282             :              * switched the basic decoder methods...
     283             :              */
     284           2 :             (*tif->tif_setupdecode)(tif);
     285           2 :             sp->dec_decode = LZWDecodeCompat;
     286             :         }
     287         103 :         sp->lzw_maxcode = MAXCODE(BITS_MIN);
     288             : #else  /* !LZW_COMPAT */
     289             :         if (!sp->dec_decode)
     290             :         {
     291             :             TIFFErrorExtR(tif, module, "Old-style LZW codes not supported");
     292             :             sp->dec_decode = LZWDecode;
     293             :         }
     294             :         return (0);
     295             : #endif /* !LZW_COMPAT */
     296             :     }
     297             :     else
     298             :     {
     299        4752 :         sp->lzw_maxcode = MAXCODE(BITS_MIN) - 1;
     300        4752 :         sp->dec_decode = LZWDecode;
     301             :     }
     302        4855 :     sp->lzw_nbits = BITS_MIN;
     303        4855 :     sp->lzw_nextbits = 0;
     304        4855 :     sp->lzw_nextdata = 0;
     305             : 
     306        4855 :     sp->dec_restart = 0;
     307        4855 :     sp->dec_nbitsmask = MAXCODE(BITS_MIN);
     308        4855 :     sp->dec_bitsleft = 0;
     309        4855 :     sp->old_tif_rawcc = 0;
     310        4855 :     sp->dec_free_entp = sp->dec_codetab - 1; // + CODE_FIRST;
     311             :     /*
     312             :      * Zero entries that are not yet filled in.  We do
     313             :      * this to guard against bogus input data that causes
     314             :      * us to index into undefined entries.  If you can
     315             :      * come up with a way to safely bounds-check input codes
     316             :      * while decoding then you can remove this operation.
     317             :      */
     318        4855 :     sp->dec_oldcodep = &sp->dec_codetab[0];
     319        4855 :     sp->dec_maxcodep = &sp->dec_codetab[sp->dec_nbitsmask - 1];
     320        4855 :     sp->read_error = 0;
     321        4855 :     return (1);
     322             : }
     323             : 
     324             : /*
     325             :  * Decode a "hunk of data".
     326             :  */
     327             : 
     328             : /* Get the next 32 or 64-bit from the input data */
     329             : #ifdef WORDS_BIGENDIAN
     330             : #define GetNextData(nextdata, bp) memcpy(&nextdata, bp, sizeof(nextdata))
     331             : #elif SIZEOF_WORDTYPE == 8
     332             : #if defined(_M_X64)
     333             : #define GetNextData(nextdata, bp) nextdata = _byteswap_uint64(*(uint64_t *)(bp))
     334             : #elif defined(__GNUC__)
     335             : #define GetNextData(nextdata, bp)                                              \
     336             :     memcpy(&nextdata, bp, sizeof(nextdata));                                   \
     337             :     nextdata = __builtin_bswap64(nextdata)
     338             : #else
     339             : #define GetNextData(nextdata, bp)                                              \
     340             :     nextdata = (((uint64_t)bp[0]) << 56) | (((uint64_t)bp[1]) << 48) |         \
     341             :                (((uint64_t)bp[2]) << 40) | (((uint64_t)bp[3]) << 32) |         \
     342             :                (((uint64_t)bp[4]) << 24) | (((uint64_t)bp[5]) << 16) |         \
     343             :                (((uint64_t)bp[6]) << 8) | (((uint64_t)bp[7]))
     344             : #endif
     345             : #elif SIZEOF_WORDTYPE == 4
     346             : #if defined(_M_X86)
     347             : #define GetNextData(nextdata, bp)                                              \
     348             :     nextdata = _byteswap_ulong(*(unsigned long *)(bp))
     349             : #elif defined(__GNUC__)
     350             : #define GetNextData(nextdata, bp)                                              \
     351             :     memcpy(&nextdata, bp, sizeof(nextdata));                                   \
     352             :     nextdata = __builtin_bswap32(nextdata)
     353             : #else
     354             : #define GetNextData(nextdata, bp)                                              \
     355             :     nextdata = (((uint32_t)bp[0]) << 24) | (((uint32_t)bp[1]) << 16) |         \
     356             :                (((uint32_t)bp[2]) << 8) | (((uint32_t)bp[3]))
     357             : #endif
     358             : #else
     359             : #error "Unhandled SIZEOF_WORDTYPE"
     360             : #endif
     361             : 
     362             : #define GetNextCodeLZW()                                                       \
     363             :     do                                                                         \
     364             :     {                                                                          \
     365             :         nextbits -= nbits;                                                     \
     366             :         if (nextbits < 0)                                                      \
     367             :         {                                                                      \
     368             :             if (dec_bitsleft >= 8 * SIZEOF_WORDTYPE)                           \
     369             :             {                                                                  \
     370             :                 unsigned codetmp = (unsigned)(nextdata << (-nextbits));        \
     371             :                 GetNextData(nextdata, bp);                                     \
     372             :                 bp += SIZEOF_WORDTYPE;                                         \
     373             :                 nextbits += 8 * SIZEOF_WORDTYPE;                               \
     374             :                 dec_bitsleft -= 8 * SIZEOF_WORDTYPE;                           \
     375             :                 code = (WordType)((codetmp | (nextdata >> nextbits)) &         \
     376             :                                   nbitsmask);                                  \
     377             :                 break;                                                         \
     378             :             }                                                                  \
     379             :             else                                                               \
     380             :             {                                                                  \
     381             :                 if (dec_bitsleft < 8)                                          \
     382             :                 {                                                              \
     383             :                     goto no_eoi;                                               \
     384             :                 }                                                              \
     385             :                 nextdata = (nextdata << 8) | *(bp)++;                          \
     386             :                 nextbits += 8;                                                 \
     387             :                 dec_bitsleft -= 8;                                             \
     388             :                 if (nextbits < 0)                                              \
     389             :                 {                                                              \
     390             :                     if (dec_bitsleft < 8)                                      \
     391             :                     {                                                          \
     392             :                         goto no_eoi;                                           \
     393             :                     }                                                          \
     394             :                     nextdata = (nextdata << 8) | *(bp)++;                      \
     395             :                     nextbits += 8;                                             \
     396             :                     dec_bitsleft -= 8;                                         \
     397             :                 }                                                              \
     398             :             }                                                                  \
     399             :         }                                                                      \
     400             :         code = (WordType)((nextdata >> nextbits) & nbitsmask);                 \
     401             :     } while (0)
     402             : 
     403      112966 : static int LZWDecode(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s)
     404             : {
     405             :     static const char module[] = "LZWDecode";
     406      112966 :     LZWCodecState *sp = LZWDecoderState(tif);
     407      112966 :     uint8_t *op = (uint8_t *)op0;
     408      112966 :     tmsize_t occ = occ0;
     409             :     uint8_t *bp;
     410             :     long nbits, nextbits, nbitsmask;
     411             :     WordType nextdata;
     412             :     code_t *free_entp, *maxcodep, *oldcodep;
     413             : 
     414             :     (void)s;
     415      112966 :     assert(sp != NULL);
     416      112966 :     assert(sp->dec_codetab != NULL);
     417             : 
     418      112966 :     if (sp->read_error)
     419             :     {
     420           0 :         memset(op, 0, (size_t)occ);
     421           0 :         TIFFErrorExtR(tif, module,
     422             :                       "LZWDecode: Scanline %" PRIu32 " cannot be read due to "
     423             :                       "previous error",
     424             :                       tif->tif_row);
     425           0 :         return 0;
     426             :     }
     427             : 
     428             :     /*
     429             :      * Restart interrupted output operation.
     430             :      */
     431      112966 :     if (sp->dec_restart)
     432             :     {
     433             :         tmsize_t residue;
     434             : 
     435      104113 :         code_t *codep = sp->dec_codep;
     436      104113 :         residue = codep->length - sp->dec_restart;
     437      104113 :         if (residue > occ)
     438             :         {
     439             :             /*
     440             :              * Residue from previous decode is sufficient
     441             :              * to satisfy decode request.  Skip to the
     442             :              * start of the decoded string, place decoded
     443             :              * values in the output buffer, and return.
     444             :              */
     445       99868 :             sp->dec_restart += occ;
     446             :             do
     447             :             {
     448     3160750 :                 codep = codep->next;
     449     3160750 :             } while (--residue > occ && codep);
     450       99868 :             if (codep)
     451             :             {
     452       99868 :                 uint8_t *tp = op + occ;
     453             :                 do
     454             :                 {
     455      176900 :                     *--tp = codep->value;
     456      176900 :                     codep = codep->next;
     457      176900 :                 } while (--occ && codep);
     458             :             }
     459       99868 :             return (1);
     460             :         }
     461             :         /*
     462             :          * Residue satisfies only part of the decode request.
     463             :          */
     464        4245 :         op += residue;
     465        4245 :         occ -= residue;
     466        4245 :         uint8_t *tp = op;
     467             :         do
     468             :         {
     469        6912 :             *--tp = codep->value;
     470        6912 :             codep = codep->next;
     471        6912 :         } while (--residue && codep);
     472        4245 :         sp->dec_restart = 0;
     473             :     }
     474             : 
     475       13098 :     bp = (uint8_t *)tif->tif_rawcp;
     476       13098 :     sp->dec_bitsleft += (((uint64_t)tif->tif_rawcc - sp->old_tif_rawcc) << 3);
     477       13098 :     uint64_t dec_bitsleft = sp->dec_bitsleft;
     478       13098 :     nbits = sp->lzw_nbits;
     479       13098 :     nextdata = sp->lzw_nextdata;
     480       13098 :     nextbits = sp->lzw_nextbits;
     481       13098 :     nbitsmask = sp->dec_nbitsmask;
     482       13098 :     oldcodep = sp->dec_oldcodep;
     483       13098 :     free_entp = sp->dec_free_entp;
     484       13098 :     maxcodep = sp->dec_maxcodep;
     485       13098 :     code_t *const dec_codetab = sp->dec_codetab;
     486             :     code_t *codep;
     487             : 
     488       13098 :     if (occ == 0)
     489             :     {
     490        2276 :         goto after_loop;
     491             :     }
     492             : 
     493       10822 : begin:
     494             : {
     495             :     WordType code;
     496    24222300 :     GetNextCodeLZW();
     497    24222300 :     codep = dec_codetab + code;
     498    24222300 :     if (code >= CODE_FIRST)
     499    20278000 :         goto code_above_or_equal_to_258;
     500     3944250 :     if (code < 256)
     501     3931110 :         goto code_below_256;
     502       13140 :     if (code == CODE_EOI)
     503           0 :         goto after_loop;
     504       13140 :     goto code_clear;
     505             : 
     506     3931110 : code_below_256:
     507             : {
     508     3931110 :     if (codep > free_entp)
     509           0 :         goto error_code;
     510     3931110 :     free_entp->next = oldcodep;
     511     3931110 :     free_entp->firstchar = oldcodep->firstchar;
     512     3931110 :     free_entp->length = oldcodep->length + 1;
     513     3931110 :     free_entp->value = (uint8_t)code;
     514     3931110 :     free_entp->repeated =
     515     3931110 :         (bool)(oldcodep->repeated & (oldcodep->value == code));
     516     3931110 :     if (++free_entp > maxcodep)
     517             :     {
     518        3884 :         if (++nbits > BITS_MAX) /* should not happen for a conformant encoder */
     519           0 :             nbits = BITS_MAX;
     520        3884 :         nbitsmask = MAXCODE(nbits);
     521        3884 :         maxcodep = dec_codetab + nbitsmask - 1;
     522        3884 :         if (free_entp >= &dec_codetab[CSIZE])
     523             :         {
     524             :             /* At that point, the next valid states are either EOI or a */
     525             :             /* CODE_CLEAR. If a regular code is read, at the next */
     526             :             /* attempt at registering a new entry, we will error out */
     527             :             /* due to setting free_entp before any valid code */
     528           0 :             free_entp = dec_codetab - 1;
     529             :         }
     530             :     }
     531     3931110 :     oldcodep = codep;
     532     3931110 :     *op++ = (uint8_t)code;
     533     3931110 :     occ--;
     534     3931110 :     if (occ == 0)
     535        2591 :         goto after_loop;
     536     3928520 :     goto begin;
     537             : }
     538             : 
     539    20278000 : code_above_or_equal_to_258:
     540             : {
     541             :     /*
     542             :      * Add the new entry to the code table.
     543             :      */
     544             : 
     545    20278000 :     if (codep >= free_entp)
     546             :     {
     547     3264460 :         if (codep != free_entp)
     548           0 :             goto error_code;
     549     3264460 :         free_entp->value = oldcodep->firstchar;
     550             :     }
     551             :     else
     552             :     {
     553    17013600 :         free_entp->value = codep->firstchar;
     554             :     }
     555    20278000 :     free_entp->repeated =
     556    20278000 :         (bool)(oldcodep->repeated & (oldcodep->value == free_entp->value));
     557    20278000 :     free_entp->next = oldcodep;
     558             : 
     559    20278000 :     free_entp->firstchar = oldcodep->firstchar;
     560    20278000 :     free_entp->length = oldcodep->length + 1;
     561    20278000 :     if (++free_entp > maxcodep)
     562             :     {
     563       16451 :         if (++nbits > BITS_MAX) /* should not happen for a conformant encoder */
     564           0 :             nbits = BITS_MAX;
     565       16451 :         nbitsmask = MAXCODE(nbits);
     566       16451 :         maxcodep = dec_codetab + nbitsmask - 1;
     567       16451 :         if (free_entp >= &dec_codetab[CSIZE])
     568             :         {
     569             :             /* At that point, the next valid states are either EOI or a */
     570             :             /* CODE_CLEAR. If a regular code is read, at the next */
     571             :             /* attempt at registering a new entry, we will error out */
     572             :             /* due to setting free_entp before any valid code */
     573           0 :             free_entp = dec_codetab - 1;
     574             :         }
     575             :     }
     576    20278000 :     oldcodep = codep;
     577             : 
     578             :     /*
     579             :      * Code maps to a string, copy string
     580             :      * value to output (written in reverse).
     581             :      */
     582             :     /* tiny bit faster on x86_64 to store in unsigned short than int */
     583    20278000 :     unsigned short len = codep->length;
     584             : 
     585    20278000 :     if (len < 3) /* equivalent to len == 2 given all other conditions */
     586             :     {
     587     3158900 :         if (occ <= 2)
     588             :         {
     589         559 :             if (occ == 2)
     590             :             {
     591         512 :                 memcpy(op, &(codep->firstchar), 2);
     592         512 :                 op += 2;
     593         512 :                 occ -= 2;
     594         512 :                 goto after_loop;
     595             :             }
     596          47 :             goto too_short_buffer;
     597             :         }
     598             : 
     599     3158340 :         memcpy(op, &(codep->firstchar), 2);
     600     3158340 :         op += 2;
     601     3158340 :         occ -= 2;
     602     3158340 :         goto begin; /* we can save the comparison occ > 0 */
     603             :     }
     604             : 
     605    17119100 :     if (len == 3)
     606             :     {
     607     2420260 :         if (occ <= 3)
     608             :         {
     609         291 :             if (occ == 3)
     610             :             {
     611         229 :                 op[0] = codep->firstchar;
     612         229 :                 op[1] = codep->next->value;
     613         229 :                 op[2] = codep->value;
     614         229 :                 op += 3;
     615         229 :                 occ -= 3;
     616         229 :                 goto after_loop;
     617             :             }
     618          62 :             goto too_short_buffer;
     619             :         }
     620             : 
     621     2419970 :         op[0] = codep->firstchar;
     622     2419970 :         op[1] = codep->next->value;
     623     2419970 :         op[2] = codep->value;
     624     2419970 :         op += 3;
     625     2419970 :         occ -= 3;
     626     2419970 :         goto begin; /* we can save the comparison occ > 0 */
     627             :     }
     628             : 
     629    14698900 :     if (len > occ)
     630             :     {
     631        4320 :         goto too_short_buffer;
     632             :     }
     633             : 
     634    14694600 :     if (codep->repeated)
     635             :     {
     636      563495 :         memset(op, codep->value, len);
     637      563495 :         op += len;
     638      563495 :         occ -= len;
     639      563495 :         if (occ == 0)
     640        2711 :             goto after_loop;
     641      560784 :         goto begin;
     642             :     }
     643             : 
     644    14131100 :     uint8_t *tp = op + len;
     645             : 
     646    14131100 :     assert(len >= 4);
     647             : 
     648    14131100 :     *--tp = codep->value;
     649    14131100 :     codep = codep->next;
     650    14131100 :     *--tp = codep->value;
     651    14131100 :     codep = codep->next;
     652    14131100 :     *--tp = codep->value;
     653    14131100 :     codep = codep->next;
     654    14131100 :     *--tp = codep->value;
     655    14131100 :     if (tp > op)
     656             :     {
     657             :         do
     658             :         {
     659   111102000 :             codep = codep->next;
     660   111102000 :             *--tp = codep->value;
     661   111102000 :         } while (tp > op);
     662             :     }
     663             : 
     664    14131100 :     assert(occ >= len);
     665    14131100 :     op += len;
     666    14131100 :     occ -= len;
     667    14131100 :     if (occ == 0)
     668         321 :         goto after_loop;
     669    14130700 :     goto begin;
     670             : }
     671             : 
     672       13140 : code_clear:
     673             : {
     674       13140 :     free_entp = dec_codetab + CODE_FIRST;
     675       13140 :     nbits = BITS_MIN;
     676       13140 :     nbitsmask = MAXCODE(BITS_MIN);
     677       13140 :     maxcodep = dec_codetab + nbitsmask - 1;
     678             :     do
     679             :     {
     680       10329 :         GetNextCodeLZW();
     681       10329 :     } while (code == CODE_CLEAR); /* consecutive CODE_CLEAR codes */
     682       13140 :     if (code == CODE_EOI)
     683           0 :         goto after_loop;
     684       13140 :     if (code > CODE_EOI)
     685             :     {
     686           0 :         goto error_code;
     687             :     }
     688       13140 :     *op++ = (uint8_t)code;
     689       13140 :     occ--;
     690       13140 :     oldcodep = dec_codetab + code;
     691       13140 :     if (occ == 0)
     692          29 :         goto after_loop;
     693       13111 :     goto begin;
     694             : }
     695             : }
     696             : 
     697        4429 : too_short_buffer:
     698             : {
     699             :     /*
     700             :      * String is too long for decode buffer,
     701             :      * locate portion that will fit, copy to
     702             :      * the decode buffer, and setup restart
     703             :      * logic for the next decoding call.
     704             :      */
     705        4429 :     sp->dec_codep = codep;
     706             :     do
     707             :     {
     708      196923 :         codep = codep->next;
     709      196923 :     } while (codep->length > occ);
     710             : 
     711        4429 :     sp->dec_restart = occ;
     712        4429 :     uint8_t *tp = op + occ;
     713             :     do
     714             :     {
     715       19244 :         *--tp = codep->value;
     716       19244 :         codep = codep->next;
     717       19244 :     } while (--occ);
     718             : }
     719             : 
     720        4429 : after_loop:
     721       13098 :     tif->tif_rawcc -= (tmsize_t)((uint8_t *)bp - tif->tif_rawcp);
     722       13098 :     tif->tif_rawcp = (uint8_t *)bp;
     723       13098 :     sp->old_tif_rawcc = tif->tif_rawcc;
     724       13098 :     sp->dec_bitsleft = dec_bitsleft;
     725       13098 :     sp->lzw_nbits = (unsigned short)nbits;
     726       13098 :     sp->lzw_nextdata = nextdata;
     727       13098 :     sp->lzw_nextbits = nextbits;
     728       13098 :     sp->dec_nbitsmask = nbitsmask;
     729       13098 :     sp->dec_oldcodep = oldcodep;
     730       13098 :     sp->dec_free_entp = free_entp;
     731       13098 :     sp->dec_maxcodep = maxcodep;
     732             : 
     733       13098 :     if (occ > 0)
     734             :     {
     735           0 :         memset(op, 0, (size_t)occ);
     736           0 :         TIFFErrorExtR(tif, module,
     737             :                       "Not enough data at scanline %" PRIu32 " (short %" PRIu64
     738             :                       " bytes)",
     739             :                       tif->tif_row, (uint64_t)occ);
     740           0 :         return (0);
     741             :     }
     742       13098 :     return (1);
     743             : 
     744           0 : no_eoi:
     745           0 :     memset(op, 0, (size_t)occ);
     746           0 :     sp->read_error = 1;
     747           0 :     TIFFErrorExtR(tif, module,
     748             :                   "LZWDecode: Strip %" PRIu32 " not terminated with EOI code",
     749             :                   tif->tif_curstrip);
     750           0 :     return 0;
     751           0 : error_code:
     752           0 :     memset(op, 0, (size_t)occ);
     753           0 :     sp->read_error = 1;
     754           0 :     TIFFErrorExtR(tif, tif->tif_name, "Using code not yet in table");
     755           0 :     return 0;
     756             : }
     757             : 
     758             : #ifdef LZW_COMPAT
     759             : 
     760             : /*
     761             :  * This check shouldn't be necessary because each
     762             :  * strip is suppose to be terminated with CODE_EOI.
     763             :  */
     764             : #define NextCode(_tif, _sp, _bp, _code, _get, dec_bitsleft)                    \
     765             :     {                                                                          \
     766             :         if (dec_bitsleft < (uint64_t)nbits)                                    \
     767             :         {                                                                      \
     768             :             TIFFWarningExtR(_tif, module,                                      \
     769             :                             "LZWDecode: Strip %" PRIu32                        \
     770             :                             " not terminated with EOI code",                   \
     771             :                             _tif->tif_curstrip);                               \
     772             :             _code = CODE_EOI;                                                  \
     773             :         }                                                                      \
     774             :         else                                                                   \
     775             :         {                                                                      \
     776             :             _get(_sp, _bp, _code);                                             \
     777             :             dec_bitsleft -= nbits;                                             \
     778             :         }                                                                      \
     779             :     }
     780             : 
     781             : /*
     782             :  * Decode a "hunk of data" for old images.
     783             :  */
     784             : #define GetNextCodeCompat(sp, bp, code)                                        \
     785             :     {                                                                          \
     786             :         nextdata |= (unsigned long)*(bp)++ << nextbits;                        \
     787             :         nextbits += 8;                                                         \
     788             :         if (nextbits < nbits)                                                  \
     789             :         {                                                                      \
     790             :             nextdata |= (unsigned long)*(bp)++ << nextbits;                    \
     791             :             nextbits += 8;                                                     \
     792             :         }                                                                      \
     793             :         code = (hcode_t)(nextdata & nbitsmask);                                \
     794             :         nextdata >>= nbits;                                                    \
     795             :         nextbits -= nbits;                                                     \
     796             :     }
     797             : 
     798         103 : static int LZWDecodeCompat(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s)
     799             : {
     800             :     static const char module[] = "LZWDecodeCompat";
     801         103 :     LZWCodecState *sp = LZWDecoderState(tif);
     802         103 :     uint8_t *op = (uint8_t *)op0;
     803         103 :     tmsize_t occ = occ0;
     804             :     uint8_t *tp;
     805             :     uint8_t *bp;
     806             :     int code, nbits;
     807             :     int len;
     808             :     long nextbits, nbitsmask;
     809             :     WordType nextdata;
     810             :     code_t *codep, *free_entp, *maxcodep, *oldcodep;
     811             : 
     812             :     (void)s;
     813         103 :     assert(sp != NULL);
     814             : 
     815             :     /*
     816             :      * Restart interrupted output operation.
     817             :      */
     818         103 :     if (sp->dec_restart)
     819             :     {
     820             :         tmsize_t residue;
     821             : 
     822           0 :         codep = sp->dec_codep;
     823           0 :         residue = codep->length - sp->dec_restart;
     824           0 :         if (residue > occ)
     825             :         {
     826             :             /*
     827             :              * Residue from previous decode is sufficient
     828             :              * to satisfy decode request.  Skip to the
     829             :              * start of the decoded string, place decoded
     830             :              * values in the output buffer, and return.
     831             :              */
     832           0 :             sp->dec_restart += occ;
     833             :             do
     834             :             {
     835           0 :                 codep = codep->next;
     836           0 :             } while (--residue > occ);
     837           0 :             tp = op + occ;
     838             :             do
     839             :             {
     840           0 :                 *--tp = codep->value;
     841           0 :                 codep = codep->next;
     842           0 :             } while (--occ);
     843           0 :             return (1);
     844             :         }
     845             :         /*
     846             :          * Residue satisfies only part of the decode request.
     847             :          */
     848           0 :         op += residue;
     849           0 :         occ -= residue;
     850           0 :         tp = op;
     851             :         do
     852             :         {
     853           0 :             *--tp = codep->value;
     854           0 :             codep = codep->next;
     855           0 :         } while (--residue);
     856           0 :         sp->dec_restart = 0;
     857             :     }
     858             : 
     859         103 :     bp = (uint8_t *)tif->tif_rawcp;
     860             : 
     861         103 :     sp->dec_bitsleft += (((uint64_t)tif->tif_rawcc - sp->old_tif_rawcc) << 3);
     862         103 :     uint64_t dec_bitsleft = sp->dec_bitsleft;
     863             : 
     864         103 :     nbits = sp->lzw_nbits;
     865         103 :     nextdata = sp->lzw_nextdata;
     866         103 :     nextbits = sp->lzw_nextbits;
     867         103 :     nbitsmask = sp->dec_nbitsmask;
     868         103 :     oldcodep = sp->dec_oldcodep;
     869         103 :     free_entp = sp->dec_free_entp;
     870         103 :     maxcodep = sp->dec_maxcodep;
     871             : 
     872      208210 :     while (occ > 0)
     873             :     {
     874      208107 :         NextCode(tif, sp, bp, code, GetNextCodeCompat, dec_bitsleft);
     875      208107 :         if (code == CODE_EOI)
     876           0 :             break;
     877      208107 :         if (code == CODE_CLEAR)
     878             :         {
     879             :             do
     880             :             {
     881         103 :                 free_entp = sp->dec_codetab + CODE_FIRST;
     882         103 :                 _TIFFmemset(free_entp, 0,
     883             :                             (CSIZE - CODE_FIRST) * sizeof(code_t));
     884         103 :                 nbits = BITS_MIN;
     885         103 :                 nbitsmask = MAXCODE(BITS_MIN);
     886         103 :                 maxcodep = sp->dec_codetab + nbitsmask;
     887         103 :                 NextCode(tif, sp, bp, code, GetNextCodeCompat, dec_bitsleft);
     888         103 :             } while (code == CODE_CLEAR); /* consecutive CODE_CLEAR codes */
     889         103 :             if (code == CODE_EOI)
     890           0 :                 break;
     891         103 :             if (code > CODE_CLEAR)
     892             :             {
     893           0 :                 TIFFErrorExtR(
     894           0 :                     tif, tif->tif_name,
     895             :                     "LZWDecode: Corrupted LZW table at scanline %" PRIu32,
     896             :                     tif->tif_row);
     897           0 :                 return (0);
     898             :             }
     899         103 :             *op++ = (uint8_t)code;
     900         103 :             occ--;
     901         103 :             oldcodep = sp->dec_codetab + code;
     902         103 :             continue;
     903             :         }
     904      208004 :         codep = sp->dec_codetab + code;
     905             : 
     906             :         /*
     907             :          * Add the new entry to the code table.
     908             :          */
     909      208004 :         if (free_entp < &sp->dec_codetab[0] ||
     910      208004 :             free_entp >= &sp->dec_codetab[CSIZE])
     911             :         {
     912           0 :             TIFFErrorExtR(tif, module,
     913             :                           "Corrupted LZW table at scanline %" PRIu32,
     914             :                           tif->tif_row);
     915           0 :             return (0);
     916             :         }
     917             : 
     918      208004 :         free_entp->next = oldcodep;
     919      208004 :         if (free_entp->next < &sp->dec_codetab[0] ||
     920      208004 :             free_entp->next >= &sp->dec_codetab[CSIZE])
     921             :         {
     922           0 :             TIFFErrorExtR(tif, module,
     923             :                           "Corrupted LZW table at scanline %" PRIu32,
     924             :                           tif->tif_row);
     925           0 :             return (0);
     926             :         }
     927      208004 :         free_entp->firstchar = free_entp->next->firstchar;
     928      208004 :         free_entp->length = free_entp->next->length + 1;
     929      208004 :         free_entp->value =
     930             :             (codep < free_entp) ? codep->firstchar : free_entp->firstchar;
     931      208004 :         if (++free_entp > maxcodep)
     932             :         {
     933        8825 :             if (++nbits > BITS_MAX) /* should not happen */
     934        8645 :                 nbits = BITS_MAX;
     935        8825 :             nbitsmask = MAXCODE(nbits);
     936        8825 :             maxcodep = sp->dec_codetab + nbitsmask;
     937             :         }
     938      208004 :         oldcodep = codep;
     939      208004 :         if (code >= 256)
     940             :         {
     941             :             /*
     942             :              * Code maps to a string, copy string
     943             :              * value to output (written in reverse).
     944             :              */
     945       69116 :             if (codep->length == 0)
     946             :             {
     947           0 :                 TIFFErrorExtR(
     948             :                     tif, module,
     949             :                     "Wrong length of decoded "
     950             :                     "string: data probably corrupted at scanline %" PRIu32,
     951             :                     tif->tif_row);
     952           0 :                 return (0);
     953             :             }
     954       69116 :             if (codep->length > occ)
     955             :             {
     956             :                 /*
     957             :                  * String is too long for decode buffer,
     958             :                  * locate portion that will fit, copy to
     959             :                  * the decode buffer, and setup restart
     960             :                  * logic for the next decoding call.
     961             :                  */
     962           0 :                 sp->dec_codep = codep;
     963             :                 do
     964             :                 {
     965           0 :                     codep = codep->next;
     966           0 :                 } while (codep->length > occ);
     967           0 :                 sp->dec_restart = occ;
     968           0 :                 tp = op + occ;
     969             :                 do
     970             :                 {
     971           0 :                     *--tp = codep->value;
     972           0 :                     codep = codep->next;
     973           0 :                 } while (--occ);
     974           0 :                 break;
     975             :             }
     976       69116 :             len = codep->length;
     977       69116 :             tp = op + len;
     978             :             do
     979             :             {
     980      650513 :                 *--tp = codep->value;
     981      650513 :                 codep = codep->next;
     982      650513 :             } while (codep && tp > op);
     983       69116 :             assert(occ >= len);
     984       69116 :             op += len;
     985       69116 :             occ -= len;
     986             :         }
     987             :         else
     988             :         {
     989      138888 :             *op++ = (uint8_t)code;
     990      138888 :             occ--;
     991             :         }
     992             :     }
     993             : 
     994         103 :     tif->tif_rawcc -= (tmsize_t)((uint8_t *)bp - tif->tif_rawcp);
     995         103 :     tif->tif_rawcp = (uint8_t *)bp;
     996             : 
     997         103 :     sp->old_tif_rawcc = tif->tif_rawcc;
     998         103 :     sp->dec_bitsleft = dec_bitsleft;
     999             : 
    1000         103 :     sp->lzw_nbits = (unsigned short)nbits;
    1001         103 :     sp->lzw_nextdata = nextdata;
    1002         103 :     sp->lzw_nextbits = nextbits;
    1003         103 :     sp->dec_nbitsmask = nbitsmask;
    1004         103 :     sp->dec_oldcodep = oldcodep;
    1005         103 :     sp->dec_free_entp = free_entp;
    1006         103 :     sp->dec_maxcodep = maxcodep;
    1007             : 
    1008         103 :     if (occ > 0)
    1009             :     {
    1010           0 :         TIFFErrorExtR(tif, module,
    1011             :                       "Not enough data at scanline %" PRIu32 " (short %" PRIu64
    1012             :                       " bytes)",
    1013             :                       tif->tif_row, (uint64_t)occ);
    1014           0 :         return (0);
    1015             :     }
    1016         103 :     return (1);
    1017             : }
    1018             : #endif /* LZW_COMPAT */
    1019             : 
    1020             : /*
    1021             :  * LZW Encoding.
    1022             :  */
    1023             : 
    1024       11273 : static int LZWSetupEncode(TIFF *tif)
    1025             : {
    1026             :     static const char module[] = "LZWSetupEncode";
    1027       11273 :     LZWCodecState *sp = LZWEncoderState(tif);
    1028             : 
    1029       11273 :     assert(sp != NULL);
    1030       11273 :     sp->enc_hashtab = (hash_t *)_TIFFmallocExt(tif, HSIZE * sizeof(hash_t));
    1031       11273 :     if (sp->enc_hashtab == NULL)
    1032             :     {
    1033           0 :         TIFFErrorExtR(tif, module, "No space for LZW hash table");
    1034           0 :         return (0);
    1035             :     }
    1036       11273 :     return (1);
    1037             : }
    1038             : 
    1039             : /*
    1040             :  * Reset encoding state at the start of a strip.
    1041             :  */
    1042       12936 : static int LZWPreEncode(TIFF *tif, uint16_t s)
    1043             : {
    1044       12936 :     LZWCodecState *sp = LZWEncoderState(tif);
    1045             : 
    1046             :     (void)s;
    1047       12936 :     assert(sp != NULL);
    1048             : 
    1049       12936 :     if (sp->enc_hashtab == NULL)
    1050             :     {
    1051           0 :         tif->tif_setupencode(tif);
    1052             :     }
    1053             : 
    1054       12936 :     sp->lzw_nbits = BITS_MIN;
    1055       12936 :     sp->lzw_maxcode = MAXCODE(BITS_MIN);
    1056       12936 :     sp->lzw_free_ent = CODE_FIRST;
    1057       12936 :     sp->lzw_nextbits = 0;
    1058       12936 :     sp->lzw_nextdata = 0;
    1059       12936 :     sp->enc_checkpoint = CHECK_GAP;
    1060       12936 :     sp->enc_ratio = 0;
    1061       12936 :     sp->enc_incount = 0;
    1062       12936 :     sp->enc_outcount = 0;
    1063             :     /*
    1064             :      * The 4 here insures there is space for 2 max-sized
    1065             :      * codes in LZWEncode and LZWPostDecode.
    1066             :      */
    1067       12936 :     sp->enc_rawlimit = tif->tif_rawdata + tif->tif_rawdatasize - 1 - 4;
    1068       12936 :     cl_hash(sp);                   /* clear hash table */
    1069       12936 :     sp->enc_oldcode = (hcode_t)-1; /* generates CODE_CLEAR in LZWEncode */
    1070       12936 :     return (1);
    1071             : }
    1072             : 
    1073             : #define CALCRATIO(sp, rat)                                                     \
    1074             :     {                                                                          \
    1075             :         if (incount > 0x007fffff)                                              \
    1076             :         { /* NB: shift will overflow */                                        \
    1077             :             rat = outcount >> 8;                                               \
    1078             :             rat = (rat == 0 ? 0x7fffffff : incount / rat);                     \
    1079             :         }                                                                      \
    1080             :         else                                                                   \
    1081             :             rat = (incount << 8) / outcount;                                   \
    1082             :     }
    1083             : 
    1084             : /* Explicit 0xff masking to make icc -check=conversions happy */
    1085             : #define PutNextCode(op, c)                                                     \
    1086             :     {                                                                          \
    1087             :         nextdata = (nextdata << nbits) | c;                                    \
    1088             :         nextbits += nbits;                                                     \
    1089             :         *op++ = (unsigned char)((nextdata >> (nextbits - 8)) & 0xff);          \
    1090             :         nextbits -= 8;                                                         \
    1091             :         if (nextbits >= 8)                                                     \
    1092             :         {                                                                      \
    1093             :             *op++ = (unsigned char)((nextdata >> (nextbits - 8)) & 0xff);      \
    1094             :             nextbits -= 8;                                                     \
    1095             :         }                                                                      \
    1096             :         outcount += nbits;                                                     \
    1097             :     }
    1098             : 
    1099             : /*
    1100             :  * Encode a chunk of pixels.
    1101             :  *
    1102             :  * Uses an open addressing double hashing (no chaining) on the
    1103             :  * prefix code/next character combination.  We do a variant of
    1104             :  * Knuth's algorithm D (vol. 3, sec. 6.4) along with G. Knott's
    1105             :  * relatively-prime secondary probe.  Here, the modular division
    1106             :  * first probe is gives way to a faster exclusive-or manipulation.
    1107             :  * Also do block compression with an adaptive reset, whereby the
    1108             :  * code table is cleared when the compression ratio decreases,
    1109             :  * but after the table fills.  The variable-length output codes
    1110             :  * are re-sized at this point, and a CODE_CLEAR is generated
    1111             :  * for the decoder.
    1112             :  */
    1113       34932 : static int LZWEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
    1114             : {
    1115       34932 :     register LZWCodecState *sp = LZWEncoderState(tif);
    1116             :     register long fcode;
    1117             :     register hash_t *hp;
    1118             :     register int h, c;
    1119             :     hcode_t ent;
    1120             :     long disp;
    1121             :     tmsize_t incount, outcount, checkpoint;
    1122             :     WordType nextdata;
    1123             :     long nextbits;
    1124             :     int free_ent, maxcode, nbits;
    1125             :     uint8_t *op;
    1126             :     uint8_t *limit;
    1127             : 
    1128             :     (void)s;
    1129       34932 :     if (sp == NULL)
    1130           0 :         return (0);
    1131             : 
    1132       34932 :     assert(sp->enc_hashtab != NULL);
    1133             : 
    1134             :     /*
    1135             :      * Load local state.
    1136             :      */
    1137       34932 :     incount = sp->enc_incount;
    1138       34932 :     outcount = sp->enc_outcount;
    1139       34932 :     checkpoint = sp->enc_checkpoint;
    1140       34932 :     nextdata = sp->lzw_nextdata;
    1141       34932 :     nextbits = sp->lzw_nextbits;
    1142       34932 :     free_ent = sp->lzw_free_ent;
    1143       34932 :     maxcode = sp->lzw_maxcode;
    1144       34932 :     nbits = sp->lzw_nbits;
    1145       34932 :     op = tif->tif_rawcp;
    1146       34932 :     limit = sp->enc_rawlimit;
    1147       34932 :     ent = (hcode_t)sp->enc_oldcode;
    1148             : 
    1149       34932 :     if (ent == (hcode_t)-1 && cc > 0)
    1150             :     {
    1151             :         /*
    1152             :          * NB: This is safe because it can only happen
    1153             :          *     at the start of a strip where we know there
    1154             :          *     is space in the data buffer.
    1155             :          */
    1156       12936 :         PutNextCode(op, CODE_CLEAR);
    1157       12936 :         ent = *bp++;
    1158       12936 :         cc--;
    1159       12936 :         incount++;
    1160             :     }
    1161       34932 :     while (cc > 0)
    1162             :     {
    1163   559288000 :         c = *bp++;
    1164   559288000 :         cc--;
    1165   559288000 :         incount++;
    1166   559288000 :         fcode = ((long)c << BITS_MAX) + ent;
    1167   559288000 :         h = (c << HSHIFT) ^ ent; /* xor hashing */
    1168             : #ifdef _WINDOWS
    1169             :         /*
    1170             :          * Check hash index for an overflow.
    1171             :          */
    1172             :         if (h >= HSIZE)
    1173             :             h -= HSIZE;
    1174             : #endif
    1175   559288000 :         hp = &sp->enc_hashtab[h];
    1176   559288000 :         if (hp->hash == fcode)
    1177             :         {
    1178   442180000 :             ent = hp->code;
    1179   442180000 :             continue;
    1180             :         }
    1181   117108000 :         if (hp->hash >= 0)
    1182             :         {
    1183             :             /*
    1184             :              * Primary hash failed, check secondary hash.
    1185             :              */
    1186    99805200 :             disp = HSIZE - h;
    1187    99805200 :             if (h == 0)
    1188       15260 :                 disp = 1;
    1189             :             do
    1190             :             {
    1191             :                 /*
    1192             :                  * Avoid pointer arithmetic because of
    1193             :                  * wraparound problems with segments.
    1194             :                  */
    1195   128841000 :                 if ((h -= disp) < 0)
    1196   119987000 :                     h += HSIZE;
    1197   128841000 :                 hp = &sp->enc_hashtab[h];
    1198   128841000 :                 if (hp->hash == fcode)
    1199             :                 {
    1200    95607200 :                     ent = hp->code;
    1201    95607200 :                     goto hit;
    1202             :                 }
    1203    33233600 :             } while (hp->hash >= 0);
    1204             :         }
    1205             :         /*
    1206             :          * New entry, emit code and add to table.
    1207             :          */
    1208             :         /*
    1209             :          * Verify there is space in the buffer for the code
    1210             :          * and any potential Clear code that might be emitted
    1211             :          * below.  The value of limit is setup so that there
    1212             :          * are at least 4 bytes free--room for 2 codes.
    1213             :          */
    1214    21501000 :         if (op > limit)
    1215             :         {
    1216           1 :             tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
    1217           1 :             if (!TIFFFlushData1(tif))
    1218           0 :                 return 0;
    1219           1 :             op = tif->tif_rawdata;
    1220             :         }
    1221    21501000 :         PutNextCode(op, ent);
    1222    21501000 :         ent = (hcode_t)c;
    1223    21501000 :         hp->code = (hcode_t)(free_ent++);
    1224    21501000 :         hp->hash = fcode;
    1225    21501000 :         if (free_ent == CODE_MAX - 1)
    1226             :         {
    1227             :             /* table is full, emit clear code and reset */
    1228        5694 :             cl_hash(sp);
    1229        5694 :             sp->enc_ratio = 0;
    1230        5694 :             incount = 0;
    1231        5694 :             outcount = 0;
    1232        5694 :             free_ent = CODE_FIRST;
    1233        5694 :             PutNextCode(op, CODE_CLEAR);
    1234        5694 :             nbits = BITS_MIN;
    1235        5694 :             maxcode = MAXCODE(BITS_MIN);
    1236             :         }
    1237             :         else
    1238             :         {
    1239             :             /*
    1240             :              * If the next entry is going to be too big for
    1241             :              * the code size, then increase it, if possible.
    1242             :              */
    1243    21495300 :             if (free_ent > maxcode)
    1244             :             {
    1245       23363 :                 nbits++;
    1246       23363 :                 assert(nbits <= BITS_MAX);
    1247       23363 :                 maxcode = (int)MAXCODE(nbits);
    1248             :             }
    1249    21471900 :             else if (incount >= checkpoint)
    1250             :             {
    1251             :                 tmsize_t rat;
    1252             :                 /*
    1253             :                  * Check compression ratio and, if things seem
    1254             :                  * to be slipping, clear the hash table and
    1255             :                  * reset state.  The compression ratio is a
    1256             :                  * 24+8-bit fractional number.
    1257             :                  */
    1258       37396 :                 checkpoint = incount + CHECK_GAP;
    1259       37396 :                 CALCRATIO(sp, rat);
    1260       37396 :                 if (rat <= sp->enc_ratio)
    1261             :                 {
    1262         119 :                     cl_hash(sp);
    1263         119 :                     sp->enc_ratio = 0;
    1264         119 :                     incount = 0;
    1265         119 :                     outcount = 0;
    1266         119 :                     free_ent = CODE_FIRST;
    1267         119 :                     PutNextCode(op, CODE_CLEAR);
    1268         119 :                     nbits = BITS_MIN;
    1269         119 :                     maxcode = MAXCODE(BITS_MIN);
    1270             :                 }
    1271             :                 else
    1272       37277 :                     sp->enc_ratio = rat;
    1273             :             }
    1274             :         }
    1275   559323000 :     hit:;
    1276             :     }
    1277             : 
    1278             :     /*
    1279             :      * Restore global state.
    1280             :      */
    1281       34932 :     sp->enc_incount = incount;
    1282       34932 :     sp->enc_outcount = outcount;
    1283       34932 :     sp->enc_checkpoint = checkpoint;
    1284       34932 :     sp->enc_oldcode = ent;
    1285       34932 :     sp->lzw_nextdata = nextdata;
    1286       34932 :     sp->lzw_nextbits = nextbits;
    1287       34932 :     sp->lzw_free_ent = (unsigned short)free_ent;
    1288       34932 :     sp->lzw_maxcode = (unsigned short)maxcode;
    1289       34932 :     sp->lzw_nbits = (unsigned short)nbits;
    1290       34932 :     tif->tif_rawcp = op;
    1291       34932 :     return (1);
    1292             : }
    1293             : 
    1294             : /*
    1295             :  * Finish off an encoded strip by flushing the last
    1296             :  * string and tacking on an End Of Information code.
    1297             :  */
    1298       12936 : static int LZWPostEncode(TIFF *tif)
    1299             : {
    1300       12936 :     register LZWCodecState *sp = LZWEncoderState(tif);
    1301       12936 :     uint8_t *op = tif->tif_rawcp;
    1302       12936 :     long nextbits = sp->lzw_nextbits;
    1303       12936 :     WordType nextdata = sp->lzw_nextdata;
    1304       12936 :     tmsize_t outcount = sp->enc_outcount;
    1305       12936 :     int nbits = sp->lzw_nbits;
    1306             : 
    1307       12936 :     if (op > sp->enc_rawlimit)
    1308             :     {
    1309           0 :         tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
    1310           0 :         if (!TIFFFlushData1(tif))
    1311           0 :             return 0;
    1312           0 :         op = tif->tif_rawdata;
    1313             :     }
    1314       12936 :     if (sp->enc_oldcode != (hcode_t)-1)
    1315             :     {
    1316       12936 :         int free_ent = sp->lzw_free_ent;
    1317             : 
    1318       12936 :         PutNextCode(op, sp->enc_oldcode);
    1319       12936 :         sp->enc_oldcode = (hcode_t)-1;
    1320       12936 :         free_ent++;
    1321             : 
    1322       12936 :         if (free_ent == CODE_MAX - 1)
    1323             :         {
    1324             :             /* table is full, emit clear code and reset */
    1325           0 :             outcount = 0;
    1326           0 :             PutNextCode(op, CODE_CLEAR);
    1327           0 :             nbits = BITS_MIN;
    1328             :         }
    1329             :         else
    1330             :         {
    1331             :             /*
    1332             :              * If the next entry is going to be too big for
    1333             :              * the code size, then increase it, if possible.
    1334             :              */
    1335       12936 :             if (free_ent > sp->lzw_maxcode)
    1336             :             {
    1337           1 :                 nbits++;
    1338           1 :                 assert(nbits <= BITS_MAX);
    1339             :             }
    1340             :         }
    1341             :     }
    1342       12936 :     PutNextCode(op, CODE_EOI);
    1343             :     /* Explicit 0xff masking to make icc -check=conversions happy */
    1344       12936 :     if (nextbits > 0)
    1345       12839 :         *op++ = (unsigned char)((nextdata << (8 - nextbits)) & 0xff);
    1346       12936 :     tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
    1347             :     (void)outcount;
    1348       12936 :     return (1);
    1349             : }
    1350             : 
    1351             : /*
    1352             :  * Reset encoding hash table.
    1353             :  */
    1354       18749 : static void cl_hash(LZWCodecState *sp)
    1355             : {
    1356       18749 :     register hash_t *hp = &sp->enc_hashtab[HSIZE - 1];
    1357       18749 :     register long i = HSIZE - 8;
    1358             : 
    1359             :     do
    1360             :     {
    1361    21084900 :         i -= 8;
    1362    21084900 :         hp[-7].hash = -1;
    1363    21084900 :         hp[-6].hash = -1;
    1364    21084900 :         hp[-5].hash = -1;
    1365    21084900 :         hp[-4].hash = -1;
    1366    21084900 :         hp[-3].hash = -1;
    1367    21084900 :         hp[-2].hash = -1;
    1368    21084900 :         hp[-1].hash = -1;
    1369    21084900 :         hp[0].hash = -1;
    1370    21084900 :         hp -= 8;
    1371    21084900 :     } while (i >= 0);
    1372       37498 :     for (i += 8; i > 0; i--, hp--)
    1373       18749 :         hp->hash = -1;
    1374       18749 : }
    1375             : 
    1376       17724 : static void LZWCleanup(TIFF *tif)
    1377             : {
    1378       17724 :     (void)TIFFPredictorCleanup(tif);
    1379             : 
    1380       17726 :     assert(tif->tif_data != 0);
    1381             : 
    1382       17726 :     if (LZWDecoderState(tif)->dec_codetab)
    1383        2403 :         _TIFFfreeExt(tif, LZWDecoderState(tif)->dec_codetab);
    1384             : 
    1385       17727 :     if (LZWEncoderState(tif)->enc_hashtab)
    1386       11273 :         _TIFFfreeExt(tif, LZWEncoderState(tif)->enc_hashtab);
    1387             : 
    1388       17727 :     _TIFFfreeExt(tif, tif->tif_data);
    1389       17727 :     tif->tif_data = NULL;
    1390             : 
    1391       17727 :     _TIFFSetDefaultCompressionState(tif);
    1392       17726 : }
    1393             : 
    1394       17728 : int TIFFInitLZW(TIFF *tif, int scheme)
    1395             : {
    1396             :     static const char module[] = "TIFFInitLZW";
    1397             :     (void)scheme;
    1398       17728 :     assert(scheme == COMPRESSION_LZW);
    1399             :     /*
    1400             :      * Allocate state block so tag methods have storage to record values.
    1401             :      */
    1402       17728 :     tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(LZWCodecState));
    1403       17727 :     if (tif->tif_data == NULL)
    1404           0 :         goto bad;
    1405       17727 :     LZWDecoderState(tif)->dec_codetab = NULL;
    1406       17727 :     LZWDecoderState(tif)->dec_decode = NULL;
    1407       17727 :     LZWEncoderState(tif)->enc_hashtab = NULL;
    1408       17727 :     LZWState(tif)->rw_mode = tif->tif_mode;
    1409             : 
    1410             :     /*
    1411             :      * Install codec methods.
    1412             :      */
    1413       17727 :     tif->tif_fixuptags = LZWFixupTags;
    1414       17727 :     tif->tif_setupdecode = LZWSetupDecode;
    1415       17727 :     tif->tif_predecode = LZWPreDecode;
    1416       17727 :     tif->tif_decoderow = LZWDecode;
    1417       17727 :     tif->tif_decodestrip = LZWDecode;
    1418       17727 :     tif->tif_decodetile = LZWDecode;
    1419       17727 :     tif->tif_setupencode = LZWSetupEncode;
    1420       17727 :     tif->tif_preencode = LZWPreEncode;
    1421       17727 :     tif->tif_postencode = LZWPostEncode;
    1422       17727 :     tif->tif_encoderow = LZWEncode;
    1423       17727 :     tif->tif_encodestrip = LZWEncode;
    1424       17727 :     tif->tif_encodetile = LZWEncode;
    1425       17727 :     tif->tif_cleanup = LZWCleanup;
    1426             :     /*
    1427             :      * Setup predictor setup.
    1428             :      */
    1429       17727 :     (void)TIFFPredictorInit(tif);
    1430       17728 :     return (1);
    1431           0 : bad:
    1432           0 :     TIFFErrorExtR(tif, module, "No space for LZW state block");
    1433           0 :     return (0);
    1434             : }
    1435             : 
    1436             : /*
    1437             :  * Copyright (c) 1985, 1986 The Regents of the University of California.
    1438             :  * All rights reserved.
    1439             :  *
    1440             :  * This code is derived from software contributed to Berkeley by
    1441             :  * James A. Woods, derived from original work by Spencer Thomas
    1442             :  * and Joseph Orost.
    1443             :  *
    1444             :  * Redistribution and use in source and binary forms are permitted
    1445             :  * provided that the above copyright notice and this paragraph are
    1446             :  * duplicated in all such forms and that any documentation,
    1447             :  * advertising materials, and other materials related to such
    1448             :  * distribution and use acknowledge that the software was developed
    1449             :  * by the University of California, Berkeley.  The name of the
    1450             :  * University may not be used to endorse or promote products derived
    1451             :  * from this software without specific prior written permission.
    1452             :  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
    1453             :  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
    1454             :  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
    1455             :  */
    1456             : #endif /* LZW_SUPPORT */

Generated by: LCOV version 1.14