xref: /aosp_15_r20/external/pdfium/third_party/libtiff/tif_codec.c (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker /*
2*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 1988-1997 Sam Leffler
3*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
4*3ac0a46fSAndroid Build Coastguard Worker  *
5*3ac0a46fSAndroid Build Coastguard Worker  * Permission to use, copy, modify, distribute, and sell this software and
6*3ac0a46fSAndroid Build Coastguard Worker  * its documentation for any purpose is hereby granted without fee, provided
7*3ac0a46fSAndroid Build Coastguard Worker  * that (i) the above copyright notices and this permission notice appear in
8*3ac0a46fSAndroid Build Coastguard Worker  * all copies of the software and related documentation, and (ii) the names of
9*3ac0a46fSAndroid Build Coastguard Worker  * Sam Leffler and Silicon Graphics may not be used in any advertising or
10*3ac0a46fSAndroid Build Coastguard Worker  * publicity relating to the software without the specific, prior written
11*3ac0a46fSAndroid Build Coastguard Worker  * permission of Sam Leffler and Silicon Graphics.
12*3ac0a46fSAndroid Build Coastguard Worker  *
13*3ac0a46fSAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
14*3ac0a46fSAndroid Build Coastguard Worker  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
15*3ac0a46fSAndroid Build Coastguard Worker  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
16*3ac0a46fSAndroid Build Coastguard Worker  *
17*3ac0a46fSAndroid Build Coastguard Worker  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
18*3ac0a46fSAndroid Build Coastguard Worker  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19*3ac0a46fSAndroid Build Coastguard Worker  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20*3ac0a46fSAndroid Build Coastguard Worker  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
21*3ac0a46fSAndroid Build Coastguard Worker  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22*3ac0a46fSAndroid Build Coastguard Worker  * OF THIS SOFTWARE.
23*3ac0a46fSAndroid Build Coastguard Worker  */
24*3ac0a46fSAndroid Build Coastguard Worker 
25*3ac0a46fSAndroid Build Coastguard Worker /*
26*3ac0a46fSAndroid Build Coastguard Worker  * TIFF Library
27*3ac0a46fSAndroid Build Coastguard Worker  *
28*3ac0a46fSAndroid Build Coastguard Worker  * Builtin Compression Scheme Configuration Support.
29*3ac0a46fSAndroid Build Coastguard Worker  */
30*3ac0a46fSAndroid Build Coastguard Worker #include "tiffiop.h"
31*3ac0a46fSAndroid Build Coastguard Worker 
32*3ac0a46fSAndroid Build Coastguard Worker static int NotConfigured(TIFF *, int);
33*3ac0a46fSAndroid Build Coastguard Worker 
34*3ac0a46fSAndroid Build Coastguard Worker #ifndef LZW_SUPPORT
35*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitLZW NotConfigured
36*3ac0a46fSAndroid Build Coastguard Worker #endif
37*3ac0a46fSAndroid Build Coastguard Worker #ifndef PACKBITS_SUPPORT
38*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitPackBits NotConfigured
39*3ac0a46fSAndroid Build Coastguard Worker #endif
40*3ac0a46fSAndroid Build Coastguard Worker #ifndef THUNDER_SUPPORT
41*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitThunderScan NotConfigured
42*3ac0a46fSAndroid Build Coastguard Worker #endif
43*3ac0a46fSAndroid Build Coastguard Worker #ifndef NEXT_SUPPORT
44*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitNeXT NotConfigured
45*3ac0a46fSAndroid Build Coastguard Worker #endif
46*3ac0a46fSAndroid Build Coastguard Worker #ifndef JPEG_SUPPORT
47*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitJPEG NotConfigured
48*3ac0a46fSAndroid Build Coastguard Worker #endif
49*3ac0a46fSAndroid Build Coastguard Worker #ifndef OJPEG_SUPPORT
50*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitOJPEG NotConfigured
51*3ac0a46fSAndroid Build Coastguard Worker #endif
52*3ac0a46fSAndroid Build Coastguard Worker #ifndef CCITT_SUPPORT
53*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitCCITTRLE NotConfigured
54*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitCCITTRLEW NotConfigured
55*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitCCITTFax3 NotConfigured
56*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitCCITTFax4 NotConfigured
57*3ac0a46fSAndroid Build Coastguard Worker #endif
58*3ac0a46fSAndroid Build Coastguard Worker #ifndef JBIG_SUPPORT
59*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitJBIG NotConfigured
60*3ac0a46fSAndroid Build Coastguard Worker #endif
61*3ac0a46fSAndroid Build Coastguard Worker #ifndef ZIP_SUPPORT
62*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitZIP NotConfigured
63*3ac0a46fSAndroid Build Coastguard Worker #endif
64*3ac0a46fSAndroid Build Coastguard Worker #ifndef PIXARLOG_SUPPORT
65*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitPixarLog NotConfigured
66*3ac0a46fSAndroid Build Coastguard Worker #endif
67*3ac0a46fSAndroid Build Coastguard Worker #ifndef LOGLUV_SUPPORT
68*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitSGILog NotConfigured
69*3ac0a46fSAndroid Build Coastguard Worker #endif
70*3ac0a46fSAndroid Build Coastguard Worker #ifndef LERC_SUPPORT
71*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitLERC NotConfigured
72*3ac0a46fSAndroid Build Coastguard Worker #endif
73*3ac0a46fSAndroid Build Coastguard Worker #ifndef LZMA_SUPPORT
74*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitLZMA NotConfigured
75*3ac0a46fSAndroid Build Coastguard Worker #endif
76*3ac0a46fSAndroid Build Coastguard Worker #ifndef ZSTD_SUPPORT
77*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitZSTD NotConfigured
78*3ac0a46fSAndroid Build Coastguard Worker #endif
79*3ac0a46fSAndroid Build Coastguard Worker #ifndef WEBP_SUPPORT
80*3ac0a46fSAndroid Build Coastguard Worker #define TIFFInitWebP NotConfigured
81*3ac0a46fSAndroid Build Coastguard Worker #endif
82*3ac0a46fSAndroid Build Coastguard Worker 
83*3ac0a46fSAndroid Build Coastguard Worker /*
84*3ac0a46fSAndroid Build Coastguard Worker  * Compression schemes statically built into the library.
85*3ac0a46fSAndroid Build Coastguard Worker  */
86*3ac0a46fSAndroid Build Coastguard Worker const TIFFCodec _TIFFBuiltinCODECS[] = {
87*3ac0a46fSAndroid Build Coastguard Worker     {"None", COMPRESSION_NONE, TIFFInitDumpMode},
88*3ac0a46fSAndroid Build Coastguard Worker     {"LZW", COMPRESSION_LZW, TIFFInitLZW},
89*3ac0a46fSAndroid Build Coastguard Worker     {"PackBits", COMPRESSION_PACKBITS, TIFFInitPackBits},
90*3ac0a46fSAndroid Build Coastguard Worker     {"ThunderScan", COMPRESSION_THUNDERSCAN, TIFFInitThunderScan},
91*3ac0a46fSAndroid Build Coastguard Worker     {"NeXT", COMPRESSION_NEXT, TIFFInitNeXT},
92*3ac0a46fSAndroid Build Coastguard Worker     {"JPEG", COMPRESSION_JPEG, TIFFInitJPEG},
93*3ac0a46fSAndroid Build Coastguard Worker     {"Old-style JPEG", COMPRESSION_OJPEG, TIFFInitOJPEG},
94*3ac0a46fSAndroid Build Coastguard Worker     {"CCITT RLE", COMPRESSION_CCITTRLE, TIFFInitCCITTRLE},
95*3ac0a46fSAndroid Build Coastguard Worker     {"CCITT RLE/W", COMPRESSION_CCITTRLEW, TIFFInitCCITTRLEW},
96*3ac0a46fSAndroid Build Coastguard Worker     {"CCITT Group 3", COMPRESSION_CCITTFAX3, TIFFInitCCITTFax3},
97*3ac0a46fSAndroid Build Coastguard Worker     {"CCITT Group 4", COMPRESSION_CCITTFAX4, TIFFInitCCITTFax4},
98*3ac0a46fSAndroid Build Coastguard Worker     {"ISO JBIG", COMPRESSION_JBIG, TIFFInitJBIG},
99*3ac0a46fSAndroid Build Coastguard Worker     {"Deflate", COMPRESSION_DEFLATE, TIFFInitZIP},
100*3ac0a46fSAndroid Build Coastguard Worker     {"AdobeDeflate", COMPRESSION_ADOBE_DEFLATE, TIFFInitZIP},
101*3ac0a46fSAndroid Build Coastguard Worker     {"PixarLog", COMPRESSION_PIXARLOG, TIFFInitPixarLog},
102*3ac0a46fSAndroid Build Coastguard Worker     {"SGILog", COMPRESSION_SGILOG, TIFFInitSGILog},
103*3ac0a46fSAndroid Build Coastguard Worker     {"SGILog24", COMPRESSION_SGILOG24, TIFFInitSGILog},
104*3ac0a46fSAndroid Build Coastguard Worker     {"LZMA", COMPRESSION_LZMA, TIFFInitLZMA},
105*3ac0a46fSAndroid Build Coastguard Worker     {"ZSTD", COMPRESSION_ZSTD, TIFFInitZSTD},
106*3ac0a46fSAndroid Build Coastguard Worker     {"WEBP", COMPRESSION_WEBP, TIFFInitWebP},
107*3ac0a46fSAndroid Build Coastguard Worker     {"LERC", COMPRESSION_LERC, TIFFInitLERC},
108*3ac0a46fSAndroid Build Coastguard Worker     {NULL, 0, NULL}};
109*3ac0a46fSAndroid Build Coastguard Worker 
_notConfigured(TIFF * tif)110*3ac0a46fSAndroid Build Coastguard Worker static int _notConfigured(TIFF *tif)
111*3ac0a46fSAndroid Build Coastguard Worker {
112*3ac0a46fSAndroid Build Coastguard Worker     const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
113*3ac0a46fSAndroid Build Coastguard Worker     char compression_code[20];
114*3ac0a46fSAndroid Build Coastguard Worker 
115*3ac0a46fSAndroid Build Coastguard Worker     snprintf(compression_code, sizeof(compression_code), "%" PRIu16,
116*3ac0a46fSAndroid Build Coastguard Worker              tif->tif_dir.td_compression);
117*3ac0a46fSAndroid Build Coastguard Worker     TIFFErrorExtR(tif, tif->tif_name,
118*3ac0a46fSAndroid Build Coastguard Worker                   "%s compression support is not configured",
119*3ac0a46fSAndroid Build Coastguard Worker                   c ? c->name : compression_code);
120*3ac0a46fSAndroid Build Coastguard Worker     return (0);
121*3ac0a46fSAndroid Build Coastguard Worker }
122*3ac0a46fSAndroid Build Coastguard Worker 
NotConfigured(TIFF * tif,int scheme)123*3ac0a46fSAndroid Build Coastguard Worker static int NotConfigured(TIFF *tif, int scheme)
124*3ac0a46fSAndroid Build Coastguard Worker {
125*3ac0a46fSAndroid Build Coastguard Worker     (void)scheme;
126*3ac0a46fSAndroid Build Coastguard Worker 
127*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_fixuptags = _notConfigured;
128*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_decodestatus = FALSE;
129*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_setupdecode = _notConfigured;
130*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_encodestatus = FALSE;
131*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_setupencode = _notConfigured;
132*3ac0a46fSAndroid Build Coastguard Worker     return (1);
133*3ac0a46fSAndroid Build Coastguard Worker }
134*3ac0a46fSAndroid Build Coastguard Worker 
135*3ac0a46fSAndroid Build Coastguard Worker /************************************************************************/
136*3ac0a46fSAndroid Build Coastguard Worker /*                       TIFFIsCODECConfigured()                        */
137*3ac0a46fSAndroid Build Coastguard Worker /************************************************************************/
138*3ac0a46fSAndroid Build Coastguard Worker 
139*3ac0a46fSAndroid Build Coastguard Worker /**
140*3ac0a46fSAndroid Build Coastguard Worker  * Check whether we have working codec for the specific coding scheme.
141*3ac0a46fSAndroid Build Coastguard Worker  *
142*3ac0a46fSAndroid Build Coastguard Worker  * @return returns 1 if the codec is configured and working. Otherwise
143*3ac0a46fSAndroid Build Coastguard Worker  * 0 will be returned.
144*3ac0a46fSAndroid Build Coastguard Worker  */
145*3ac0a46fSAndroid Build Coastguard Worker 
TIFFIsCODECConfigured(uint16_t scheme)146*3ac0a46fSAndroid Build Coastguard Worker int TIFFIsCODECConfigured(uint16_t scheme)
147*3ac0a46fSAndroid Build Coastguard Worker {
148*3ac0a46fSAndroid Build Coastguard Worker     const TIFFCodec *codec = TIFFFindCODEC(scheme);
149*3ac0a46fSAndroid Build Coastguard Worker 
150*3ac0a46fSAndroid Build Coastguard Worker     if (codec == NULL)
151*3ac0a46fSAndroid Build Coastguard Worker     {
152*3ac0a46fSAndroid Build Coastguard Worker         return 0;
153*3ac0a46fSAndroid Build Coastguard Worker     }
154*3ac0a46fSAndroid Build Coastguard Worker     if (codec->init == NULL)
155*3ac0a46fSAndroid Build Coastguard Worker     {
156*3ac0a46fSAndroid Build Coastguard Worker         return 0;
157*3ac0a46fSAndroid Build Coastguard Worker     }
158*3ac0a46fSAndroid Build Coastguard Worker     if (codec->init != NotConfigured)
159*3ac0a46fSAndroid Build Coastguard Worker     {
160*3ac0a46fSAndroid Build Coastguard Worker         return 1;
161*3ac0a46fSAndroid Build Coastguard Worker     }
162*3ac0a46fSAndroid Build Coastguard Worker     return 0;
163*3ac0a46fSAndroid Build Coastguard Worker }
164