Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(113)

Side by Side Diff: third_party/libtiff/tif_lzw.c

Issue 1563103002: XFA: Upgrade to libtiff 4.0.6. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: rename to libtiff Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/libtiff/tif_luv.c ('k') | third_party/libtiff/tif_next.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* $Id: tif_lzw.c,v 1.45 2011-04-02 20:54:09 bfriesen Exp $ */ 1 /* $Id: tif_lzw.c,v 1.49 2015-08-30 21:07:44 erouault Exp $ */
2 2
3 /* 3 /*
4 * Copyright (c) 1988-1997 Sam Leffler 4 * Copyright (c) 1988-1997 Sam Leffler
5 * Copyright (c) 1991-1997 Silicon Graphics, Inc. 5 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
6 * 6 *
7 * Permission to use, copy, modify, distribute, and sell this software and 7 * Permission to use, copy, modify, distribute, and sell this software and
8 * its documentation for any purpose is hereby granted without fee, provided 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 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 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 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 12 * publicity relating to the software without the specific, prior written
13 * permission of Sam Leffler and Silicon Graphics. 13 * permission of Sam Leffler and Silicon Graphics.
14 * 14 *
15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. 17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
18 * 18 *
19 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR 19 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, 20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 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 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 23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24 * OF THIS SOFTWARE. 24 * OF THIS SOFTWARE.
25 */ 25 */
26
26 #include "tiffiop.h" 27 #include "tiffiop.h"
27 #ifdef LZW_SUPPORT 28 #ifdef LZW_SUPPORT
28 /* 29 /*
29 * TIFF Library. 30 * TIFF Library.
30 * Rev 5.0 Lempel-Ziv & Welch Compression Support 31 * Rev 5.0 Lempel-Ziv & Welch Compression Support
31 * 32 *
32 * This code is derived from the compress program whose code is 33 * 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 software contributed to Berkeley by James A. Woods,
34 * derived from original work by Spencer Thomas and Joseph Orost. 35 * derived from original work by Spencer Thomas and Joseph Orost.
35 * 36 *
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 * State block for each open TIFF file using LZW 87 * State block for each open TIFF file using LZW
87 * compression/decompression. Note that the predictor 88 * compression/decompression. Note that the predictor
88 * state block must be first in this data structure. 89 * state block must be first in this data structure.
89 */ 90 */
90 typedef struct { 91 typedef struct {
91 TIFFPredictorState predict; /* predictor super class */ 92 TIFFPredictorState predict; /* predictor super class */
92 93
93 unsigned short nbits; /* # of bits/code */ 94 unsigned short nbits; /* # of bits/code */
94 unsigned short maxcode; /* maximum code for lzw_nbits */ 95 unsigned short maxcode; /* maximum code for lzw_nbits */
95 unsigned short free_ent; /* next free entry in hash table */ 96 unsigned short free_ent; /* next free entry in hash table */
96 » long nextdata; /* next bits of i/o */ 97 » unsigned long nextdata; /* next bits of i/o */
97 long nextbits; /* # of valid bits in lzw_nextdata */ 98 long nextbits; /* # of valid bits in lzw_nextdata */
98 99
99 int rw_mode; /* preserve rw_mode from init */ 100 int rw_mode; /* preserve rw_mode from init */
100 } LZWBaseState; 101 } LZWBaseState;
101 102
102 #define lzw_nbits base.nbits 103 #define lzw_nbits base.nbits
103 #define lzw_maxcode base.maxcode 104 #define lzw_maxcode base.maxcode
104 #define lzw_free_ent base.free_ent 105 #define lzw_free_ent base.free_ent
105 #define lzw_nextdata base.nextdata 106 #define lzw_nextdata base.nextdata
106 #define lzw_nextbits base.nextbits 107 #define lzw_nextbits base.nextbits
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 LZWPreDecode(TIFF* tif, uint16 s) 261 LZWPreDecode(TIFF* tif, uint16 s)
261 { 262 {
262 static const char module[] = "LZWPreDecode"; 263 static const char module[] = "LZWPreDecode";
263 LZWCodecState *sp = DecoderState(tif); 264 LZWCodecState *sp = DecoderState(tif);
264 265
265 (void) s; 266 (void) s;
266 assert(sp != NULL); 267 assert(sp != NULL);
267 if( sp->dec_codetab == NULL ) 268 if( sp->dec_codetab == NULL )
268 { 269 {
269 tif->tif_setupdecode( tif ); 270 tif->tif_setupdecode( tif );
271 if( sp->dec_codetab == NULL )
272 return (0);
270 } 273 }
271 274
272 /* 275 /*
273 * Check for old bit-reversed codes. 276 * Check for old bit-reversed codes.
274 */ 277 */
275 if (tif->tif_rawdata[0] == 0 && (tif->tif_rawdata[1] & 0x1)) { 278 if (tif->tif_rawdata[0] == 0 && (tif->tif_rawdata[1] & 0x1)) {
276 #ifdef LZW_COMPAT 279 #ifdef LZW_COMPAT
277 if (!sp->dec_decode) { 280 if (!sp->dec_decode) {
278 TIFFWarningExt(tif->tif_clientdata, module, 281 TIFFWarningExt(tif->tif_clientdata, module,
279 "Old-style LZW codes, convert file"); 282 "Old-style LZW codes, convert file");
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 LZWDecode(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s) 360 LZWDecode(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s)
358 { 361 {
359 static const char module[] = "LZWDecode"; 362 static const char module[] = "LZWDecode";
360 LZWCodecState *sp = DecoderState(tif); 363 LZWCodecState *sp = DecoderState(tif);
361 char *op = (char*) op0; 364 char *op = (char*) op0;
362 long occ = (long) occ0; 365 long occ = (long) occ0;
363 char *tp; 366 char *tp;
364 unsigned char *bp; 367 unsigned char *bp;
365 hcode_t code; 368 hcode_t code;
366 int len; 369 int len;
367 » long nbits, nextbits, nextdata, nbitsmask; 370 » long nbits, nextbits, nbitsmask;
371 unsigned long nextdata;
368 code_t *codep, *free_entp, *maxcodep, *oldcodep; 372 code_t *codep, *free_entp, *maxcodep, *oldcodep;
369 373
370 (void) s; 374 (void) s;
371 assert(sp != NULL); 375 assert(sp != NULL);
372 assert(sp->dec_codetab != NULL); 376 assert(sp->dec_codetab != NULL);
373 377
374 /* 378 /*
375 Fail if value does not fit in long. 379 Fail if value does not fit in long.
376 */ 380 */
377 if ((tmsize_t) occ != occ0) 381 if ((tmsize_t) occ != occ0)
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 nbitsmask = sp->dec_nbitsmask; 430 nbitsmask = sp->dec_nbitsmask;
427 oldcodep = sp->dec_oldcodep; 431 oldcodep = sp->dec_oldcodep;
428 free_entp = sp->dec_free_entp; 432 free_entp = sp->dec_free_entp;
429 maxcodep = sp->dec_maxcodep; 433 maxcodep = sp->dec_maxcodep;
430 434
431 while (occ > 0) { 435 while (occ > 0) {
432 NextCode(tif, sp, bp, code, GetNextCode); 436 NextCode(tif, sp, bp, code, GetNextCode);
433 if (code == CODE_EOI) 437 if (code == CODE_EOI)
434 break; 438 break;
435 if (code == CODE_CLEAR) { 439 if (code == CODE_CLEAR) {
436 » » » free_entp = sp->dec_codetab + CODE_FIRST; 440 » » » do {
437 » » » _TIFFmemset(free_entp, 0, 441 » » » » free_entp = sp->dec_codetab + CODE_FIRST;
438 » » » » (CSIZE - CODE_FIRST) * sizeof (code_t)); 442 » » » » _TIFFmemset(free_entp, 0,
439 » » » nbits = BITS_MIN; 443 » » » » » (CSIZE - CODE_FIRST) * sizeof (code_ t));
440 » » » nbitsmask = MAXCODE(BITS_MIN); 444 » » » » nbits = BITS_MIN;
441 » » » maxcodep = sp->dec_codetab + nbitsmask-1; 445 » » » » nbitsmask = MAXCODE(BITS_MIN);
442 » » » NextCode(tif, sp, bp, code, GetNextCode); 446 » » » » maxcodep = sp->dec_codetab + nbitsmask-1;
447 » » » » NextCode(tif, sp, bp, code, GetNextCode);
448 » » » } while (code == CODE_CLEAR);» /* consecutive CODE_CLEA R codes */
443 if (code == CODE_EOI) 449 if (code == CODE_EOI)
444 break; 450 break;
445 » » » if (code >= CODE_CLEAR) { 451 » » » if (code > CODE_CLEAR) {
446 TIFFErrorExt(tif->tif_clientdata, tif->tif_name, 452 TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
447 "LZWDecode: Corrupted LZW table at scanline %d", 453 "LZWDecode: Corrupted LZW table at scanline %d",
448 tif->tif_row); 454 tif->tif_row);
449 return (0); 455 return (0);
450 } 456 }
451 *op++ = (char)code, occ--; 457 *op++ = (char)code, occ--;
452 oldcodep = sp->dec_codetab + code; 458 oldcodep = sp->dec_codetab + code;
453 continue; 459 continue;
454 } 460 }
455 codep = sp->dec_codetab + code; 461 codep = sp->dec_codetab + code;
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 nbitsmask = sp->dec_nbitsmask; 651 nbitsmask = sp->dec_nbitsmask;
646 oldcodep = sp->dec_oldcodep; 652 oldcodep = sp->dec_oldcodep;
647 free_entp = sp->dec_free_entp; 653 free_entp = sp->dec_free_entp;
648 maxcodep = sp->dec_maxcodep; 654 maxcodep = sp->dec_maxcodep;
649 655
650 while (occ > 0) { 656 while (occ > 0) {
651 NextCode(tif, sp, bp, code, GetNextCodeCompat); 657 NextCode(tif, sp, bp, code, GetNextCodeCompat);
652 if (code == CODE_EOI) 658 if (code == CODE_EOI)
653 break; 659 break;
654 if (code == CODE_CLEAR) { 660 if (code == CODE_CLEAR) {
655 » » » free_entp = sp->dec_codetab + CODE_FIRST; 661 » » » do {
656 » » » _TIFFmemset(free_entp, 0, 662 » » » » free_entp = sp->dec_codetab + CODE_FIRST;
657 » » » » (CSIZE - CODE_FIRST) * sizeof (code_t)); 663 » » » » _TIFFmemset(free_entp, 0,
658 » » » nbits = BITS_MIN; 664 » » » » » (CSIZE - CODE_FIRST) * sizeof (code_ t));
659 » » » nbitsmask = MAXCODE(BITS_MIN); 665 » » » » nbits = BITS_MIN;
660 » » » maxcodep = sp->dec_codetab + nbitsmask; 666 » » » » nbitsmask = MAXCODE(BITS_MIN);
661 » » » NextCode(tif, sp, bp, code, GetNextCodeCompat); 667 » » » » maxcodep = sp->dec_codetab + nbitsmask;
668 » » » » NextCode(tif, sp, bp, code, GetNextCodeCompat);
669 » » » } while (code == CODE_CLEAR);» /* consecutive CODE_CLEA R codes */
662 if (code == CODE_EOI) 670 if (code == CODE_EOI)
663 break; 671 break;
664 » » » if (code >= CODE_CLEAR) { 672 » » » if (code > CODE_CLEAR) {
665 TIFFErrorExt(tif->tif_clientdata, tif->tif_name, 673 TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
666 "LZWDecode: Corrupted LZW table at scanline %d", 674 "LZWDecode: Corrupted LZW table at scanline %d",
667 tif->tif_row); 675 tif->tif_row);
668 return (0); 676 return (0);
669 } 677 }
670 *op++ = code, occ--; 678 *op++ = code, occ--;
671 oldcodep = sp->dec_codetab + code; 679 oldcodep = sp->dec_codetab + code;
672 continue; 680 continue;
673 } 681 }
674 codep = sp->dec_codetab + code; 682 codep = sp->dec_codetab + code;
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 return (1); 830 return (1);
823 } 831 }
824 832
825 #define CALCRATIO(sp, rat) { \ 833 #define CALCRATIO(sp, rat) { \
826 if (incount > 0x007fffff) { /* NB: shift will overflow */\ 834 if (incount > 0x007fffff) { /* NB: shift will overflow */\
827 rat = outcount >> 8; \ 835 rat = outcount >> 8; \
828 rat = (rat == 0 ? 0x7fffffff : incount/rat); \ 836 rat = (rat == 0 ? 0x7fffffff : incount/rat); \
829 } else \ 837 } else \
830 rat = (incount<<8) / outcount; \ 838 rat = (incount<<8) / outcount; \
831 } 839 }
840
841 /* Explicit 0xff masking to make icc -check=conversions happy */
832 #define PutNextCode(op, c) { \ 842 #define PutNextCode(op, c) { \
833 nextdata = (nextdata << nbits) | c; \ 843 nextdata = (nextdata << nbits) | c; \
834 nextbits += nbits; \ 844 nextbits += nbits; \
835 » *op++ = (unsigned char)(nextdata >> (nextbits-8));» » \ 845 » *op++ = (unsigned char)((nextdata >> (nextbits-8))&0xff);» » \
836 nextbits -= 8; \ 846 nextbits -= 8; \
837 if (nextbits >= 8) { \ 847 if (nextbits >= 8) { \
838 » » *op++ = (unsigned char)(nextdata >> (nextbits-8));» \ 848 » » *op++ = (unsigned char)((nextdata >> (nextbits-8))&0xff);» \
839 nextbits -= 8; \ 849 nextbits -= 8; \
840 } \ 850 } \
841 outcount += nbits; \ 851 outcount += nbits; \
842 } 852 }
843 853
844 /* 854 /*
845 * Encode a chunk of pixels. 855 * Encode a chunk of pixels.
846 * 856 *
847 * Uses an open addressing double hashing (no chaining) on the 857 * Uses an open addressing double hashing (no chaining) on the
848 * prefix code/next character combination. We do a variant of 858 * prefix code/next character combination. We do a variant of
849 * Knuth's algorithm D (vol. 3, sec. 6.4) along with G. Knott's 859 * Knuth's algorithm D (vol. 3, sec. 6.4) along with G. Knott's
850 * relatively-prime secondary probe. Here, the modular division 860 * relatively-prime secondary probe. Here, the modular division
851 * first probe is gives way to a faster exclusive-or manipulation. 861 * first probe is gives way to a faster exclusive-or manipulation.
852 * Also do block compression with an adaptive reset, whereby the 862 * Also do block compression with an adaptive reset, whereby the
853 * code table is cleared when the compression ratio decreases, 863 * code table is cleared when the compression ratio decreases,
854 * but after the table fills. The variable-length output codes 864 * but after the table fills. The variable-length output codes
855 * are re-sized at this point, and a CODE_CLEAR is generated 865 * are re-sized at this point, and a CODE_CLEAR is generated
856 * for the decoder. 866 * for the decoder.
857 */ 867 */
858 static int 868 static int
859 LZWEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) 869 LZWEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
860 { 870 {
861 register LZWCodecState *sp = EncoderState(tif); 871 register LZWCodecState *sp = EncoderState(tif);
862 register long fcode; 872 register long fcode;
863 register hash_t *hp; 873 register hash_t *hp;
864 register int h, c; 874 register int h, c;
865 hcode_t ent; 875 hcode_t ent;
866 long disp; 876 long disp;
867 long incount, outcount, checkpoint; 877 long incount, outcount, checkpoint;
868 » long nextdata, nextbits; 878 » unsigned long nextdata;
879 long nextbits;
869 int free_ent, maxcode, nbits; 880 int free_ent, maxcode, nbits;
870 uint8* op; 881 uint8* op;
871 uint8* limit; 882 uint8* limit;
872 883
873 (void) s; 884 (void) s;
874 if (sp == NULL) 885 if (sp == NULL)
875 return (0); 886 return (0);
876 887
877 assert(sp->enc_hashtab != NULL); 888 assert(sp->enc_hashtab != NULL);
878 889
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1020 /* 1031 /*
1021 * Finish off an encoded strip by flushing the last 1032 * Finish off an encoded strip by flushing the last
1022 * string and tacking on an End Of Information code. 1033 * string and tacking on an End Of Information code.
1023 */ 1034 */
1024 static int 1035 static int
1025 LZWPostEncode(TIFF* tif) 1036 LZWPostEncode(TIFF* tif)
1026 { 1037 {
1027 register LZWCodecState *sp = EncoderState(tif); 1038 register LZWCodecState *sp = EncoderState(tif);
1028 uint8* op = tif->tif_rawcp; 1039 uint8* op = tif->tif_rawcp;
1029 long nextbits = sp->lzw_nextbits; 1040 long nextbits = sp->lzw_nextbits;
1030 » long nextdata = sp->lzw_nextdata; 1041 » unsigned long nextdata = sp->lzw_nextdata;
1031 long outcount = sp->enc_outcount; 1042 long outcount = sp->enc_outcount;
1032 int nbits = sp->lzw_nbits; 1043 int nbits = sp->lzw_nbits;
1033 1044
1034 if (op > sp->enc_rawlimit) { 1045 if (op > sp->enc_rawlimit) {
1035 tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata); 1046 tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
1036 TIFFFlushData1(tif); 1047 TIFFFlushData1(tif);
1037 op = tif->tif_rawdata; 1048 op = tif->tif_rawdata;
1038 } 1049 }
1039 if (sp->enc_oldcode != (hcode_t) -1) { 1050 if (sp->enc_oldcode != (hcode_t) -1) {
1040 PutNextCode(op, sp->enc_oldcode); 1051 PutNextCode(op, sp->enc_oldcode);
1041 sp->enc_oldcode = (hcode_t) -1; 1052 sp->enc_oldcode = (hcode_t) -1;
1042 } 1053 }
1043 PutNextCode(op, CODE_EOI); 1054 PutNextCode(op, CODE_EOI);
1055 /* Explicit 0xff masking to make icc -check=conversions happy */
1044 if (nextbits > 0) 1056 if (nextbits > 0)
1045 » » *op++ = (unsigned char)(nextdata << (8-nextbits)); 1057 » » *op++ = (unsigned char)((nextdata << (8-nextbits))&0xff);
1046 tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata); 1058 tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
1047 return (1); 1059 return (1);
1048 } 1060 }
1049 1061
1050 /* 1062 /*
1051 * Reset encoding hash table. 1063 * Reset encoding hash table.
1052 */ 1064 */
1053 static void 1065 static void
1054 cl_hash(LZWCodecState* sp) 1066 cl_hash(LZWCodecState* sp)
1055 { 1067 {
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1157 #endif /* LZW_SUPPORT */ 1169 #endif /* LZW_SUPPORT */
1158 1170
1159 /* vim: set ts=8 sts=8 sw=8 noet: */ 1171 /* vim: set ts=8 sts=8 sw=8 noet: */
1160 /* 1172 /*
1161 * Local Variables: 1173 * Local Variables:
1162 * mode: c 1174 * mode: c
1163 * c-basic-offset: 8 1175 * c-basic-offset: 8
1164 * fill-column: 78 1176 * fill-column: 78
1165 * End: 1177 * End:
1166 */ 1178 */
1167
OLDNEW
« no previous file with comments | « third_party/libtiff/tif_luv.c ('k') | third_party/libtiff/tif_next.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698