xref: /aosp_15_r20/external/pdfium/third_party/libtiff/tif_compress.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  * Compression Scheme Configuration Support.
29*3ac0a46fSAndroid Build Coastguard Worker  */
30*3ac0a46fSAndroid Build Coastguard Worker #include "tiffiop.h"
31*3ac0a46fSAndroid Build Coastguard Worker 
TIFFNoEncode(TIFF * tif,const char * method)32*3ac0a46fSAndroid Build Coastguard Worker static int TIFFNoEncode(TIFF *tif, const char *method)
33*3ac0a46fSAndroid Build Coastguard Worker {
34*3ac0a46fSAndroid Build Coastguard Worker     const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
35*3ac0a46fSAndroid Build Coastguard Worker 
36*3ac0a46fSAndroid Build Coastguard Worker     if (c)
37*3ac0a46fSAndroid Build Coastguard Worker     {
38*3ac0a46fSAndroid Build Coastguard Worker         TIFFErrorExtR(tif, tif->tif_name, "%s %s encoding is not implemented",
39*3ac0a46fSAndroid Build Coastguard Worker                       c->name, method);
40*3ac0a46fSAndroid Build Coastguard Worker     }
41*3ac0a46fSAndroid Build Coastguard Worker     else
42*3ac0a46fSAndroid Build Coastguard Worker     {
43*3ac0a46fSAndroid Build Coastguard Worker         TIFFErrorExtR(tif, tif->tif_name,
44*3ac0a46fSAndroid Build Coastguard Worker                       "Compression scheme %" PRIu16
45*3ac0a46fSAndroid Build Coastguard Worker                       " %s encoding is not implemented",
46*3ac0a46fSAndroid Build Coastguard Worker                       tif->tif_dir.td_compression, method);
47*3ac0a46fSAndroid Build Coastguard Worker     }
48*3ac0a46fSAndroid Build Coastguard Worker     return (-1);
49*3ac0a46fSAndroid Build Coastguard Worker }
50*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFNoRowEncode(TIFF * tif,uint8_t * pp,tmsize_t cc,uint16_t s)51*3ac0a46fSAndroid Build Coastguard Worker int _TIFFNoRowEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
52*3ac0a46fSAndroid Build Coastguard Worker {
53*3ac0a46fSAndroid Build Coastguard Worker     (void)pp;
54*3ac0a46fSAndroid Build Coastguard Worker     (void)cc;
55*3ac0a46fSAndroid Build Coastguard Worker     (void)s;
56*3ac0a46fSAndroid Build Coastguard Worker     return (TIFFNoEncode(tif, "scanline"));
57*3ac0a46fSAndroid Build Coastguard Worker }
58*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFNoStripEncode(TIFF * tif,uint8_t * pp,tmsize_t cc,uint16_t s)59*3ac0a46fSAndroid Build Coastguard Worker int _TIFFNoStripEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
60*3ac0a46fSAndroid Build Coastguard Worker {
61*3ac0a46fSAndroid Build Coastguard Worker     (void)pp;
62*3ac0a46fSAndroid Build Coastguard Worker     (void)cc;
63*3ac0a46fSAndroid Build Coastguard Worker     (void)s;
64*3ac0a46fSAndroid Build Coastguard Worker     return (TIFFNoEncode(tif, "strip"));
65*3ac0a46fSAndroid Build Coastguard Worker }
66*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFNoTileEncode(TIFF * tif,uint8_t * pp,tmsize_t cc,uint16_t s)67*3ac0a46fSAndroid Build Coastguard Worker int _TIFFNoTileEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
68*3ac0a46fSAndroid Build Coastguard Worker {
69*3ac0a46fSAndroid Build Coastguard Worker     (void)pp;
70*3ac0a46fSAndroid Build Coastguard Worker     (void)cc;
71*3ac0a46fSAndroid Build Coastguard Worker     (void)s;
72*3ac0a46fSAndroid Build Coastguard Worker     return (TIFFNoEncode(tif, "tile"));
73*3ac0a46fSAndroid Build Coastguard Worker }
74*3ac0a46fSAndroid Build Coastguard Worker 
TIFFNoDecode(TIFF * tif,const char * method)75*3ac0a46fSAndroid Build Coastguard Worker static int TIFFNoDecode(TIFF *tif, const char *method)
76*3ac0a46fSAndroid Build Coastguard Worker {
77*3ac0a46fSAndroid Build Coastguard Worker     const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
78*3ac0a46fSAndroid Build Coastguard Worker 
79*3ac0a46fSAndroid Build Coastguard Worker     if (c)
80*3ac0a46fSAndroid Build Coastguard Worker         TIFFErrorExtR(tif, tif->tif_name, "%s %s decoding is not implemented",
81*3ac0a46fSAndroid Build Coastguard Worker                       c->name, method);
82*3ac0a46fSAndroid Build Coastguard Worker     else
83*3ac0a46fSAndroid Build Coastguard Worker         TIFFErrorExtR(tif, tif->tif_name,
84*3ac0a46fSAndroid Build Coastguard Worker                       "Compression scheme %" PRIu16
85*3ac0a46fSAndroid Build Coastguard Worker                       " %s decoding is not implemented",
86*3ac0a46fSAndroid Build Coastguard Worker                       tif->tif_dir.td_compression, method);
87*3ac0a46fSAndroid Build Coastguard Worker     return (0);
88*3ac0a46fSAndroid Build Coastguard Worker }
89*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFNoFixupTags(TIFF * tif)90*3ac0a46fSAndroid Build Coastguard Worker static int _TIFFNoFixupTags(TIFF *tif)
91*3ac0a46fSAndroid Build Coastguard Worker {
92*3ac0a46fSAndroid Build Coastguard Worker     (void)tif;
93*3ac0a46fSAndroid Build Coastguard Worker     return (1);
94*3ac0a46fSAndroid Build Coastguard Worker }
95*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFNoRowDecode(TIFF * tif,uint8_t * pp,tmsize_t cc,uint16_t s)96*3ac0a46fSAndroid Build Coastguard Worker int _TIFFNoRowDecode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
97*3ac0a46fSAndroid Build Coastguard Worker {
98*3ac0a46fSAndroid Build Coastguard Worker     (void)pp;
99*3ac0a46fSAndroid Build Coastguard Worker     (void)cc;
100*3ac0a46fSAndroid Build Coastguard Worker     (void)s;
101*3ac0a46fSAndroid Build Coastguard Worker     return (TIFFNoDecode(tif, "scanline"));
102*3ac0a46fSAndroid Build Coastguard Worker }
103*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFNoStripDecode(TIFF * tif,uint8_t * pp,tmsize_t cc,uint16_t s)104*3ac0a46fSAndroid Build Coastguard Worker int _TIFFNoStripDecode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
105*3ac0a46fSAndroid Build Coastguard Worker {
106*3ac0a46fSAndroid Build Coastguard Worker     (void)pp;
107*3ac0a46fSAndroid Build Coastguard Worker     (void)cc;
108*3ac0a46fSAndroid Build Coastguard Worker     (void)s;
109*3ac0a46fSAndroid Build Coastguard Worker     return (TIFFNoDecode(tif, "strip"));
110*3ac0a46fSAndroid Build Coastguard Worker }
111*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFNoTileDecode(TIFF * tif,uint8_t * pp,tmsize_t cc,uint16_t s)112*3ac0a46fSAndroid Build Coastguard Worker int _TIFFNoTileDecode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
113*3ac0a46fSAndroid Build Coastguard Worker {
114*3ac0a46fSAndroid Build Coastguard Worker     (void)pp;
115*3ac0a46fSAndroid Build Coastguard Worker     (void)cc;
116*3ac0a46fSAndroid Build Coastguard Worker     (void)s;
117*3ac0a46fSAndroid Build Coastguard Worker     return (TIFFNoDecode(tif, "tile"));
118*3ac0a46fSAndroid Build Coastguard Worker }
119*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFNoSeek(TIFF * tif,uint32_t off)120*3ac0a46fSAndroid Build Coastguard Worker int _TIFFNoSeek(TIFF *tif, uint32_t off)
121*3ac0a46fSAndroid Build Coastguard Worker {
122*3ac0a46fSAndroid Build Coastguard Worker     (void)off;
123*3ac0a46fSAndroid Build Coastguard Worker     TIFFErrorExtR(tif, tif->tif_name,
124*3ac0a46fSAndroid Build Coastguard Worker                   "Compression algorithm does not support random access");
125*3ac0a46fSAndroid Build Coastguard Worker     return (0);
126*3ac0a46fSAndroid Build Coastguard Worker }
127*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFNoPreCode(TIFF * tif,uint16_t s)128*3ac0a46fSAndroid Build Coastguard Worker int _TIFFNoPreCode(TIFF *tif, uint16_t s)
129*3ac0a46fSAndroid Build Coastguard Worker {
130*3ac0a46fSAndroid Build Coastguard Worker     (void)tif;
131*3ac0a46fSAndroid Build Coastguard Worker     (void)s;
132*3ac0a46fSAndroid Build Coastguard Worker     return (1);
133*3ac0a46fSAndroid Build Coastguard Worker }
134*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFtrue(TIFF * tif)135*3ac0a46fSAndroid Build Coastguard Worker static int _TIFFtrue(TIFF *tif)
136*3ac0a46fSAndroid Build Coastguard Worker {
137*3ac0a46fSAndroid Build Coastguard Worker     (void)tif;
138*3ac0a46fSAndroid Build Coastguard Worker     return (1);
139*3ac0a46fSAndroid Build Coastguard Worker }
_TIFFvoid(TIFF * tif)140*3ac0a46fSAndroid Build Coastguard Worker static void _TIFFvoid(TIFF *tif) { (void)tif; }
141*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFSetDefaultCompressionState(TIFF * tif)142*3ac0a46fSAndroid Build Coastguard Worker void _TIFFSetDefaultCompressionState(TIFF *tif)
143*3ac0a46fSAndroid Build Coastguard Worker {
144*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_fixuptags = _TIFFNoFixupTags;
145*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_decodestatus = TRUE;
146*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_setupdecode = _TIFFtrue;
147*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_predecode = _TIFFNoPreCode;
148*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_decoderow = _TIFFNoRowDecode;
149*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_decodestrip = _TIFFNoStripDecode;
150*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_decodetile = _TIFFNoTileDecode;
151*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_encodestatus = TRUE;
152*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_setupencode = _TIFFtrue;
153*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_preencode = _TIFFNoPreCode;
154*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_postencode = _TIFFtrue;
155*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_encoderow = _TIFFNoRowEncode;
156*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_encodestrip = _TIFFNoStripEncode;
157*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_encodetile = _TIFFNoTileEncode;
158*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_close = _TIFFvoid;
159*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_seek = _TIFFNoSeek;
160*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_cleanup = _TIFFvoid;
161*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_defstripsize = _TIFFDefaultStripSize;
162*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_deftilesize = _TIFFDefaultTileSize;
163*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_flags &= ~(TIFF_NOBITREV | TIFF_NOREADRAW);
164*3ac0a46fSAndroid Build Coastguard Worker }
165*3ac0a46fSAndroid Build Coastguard Worker 
TIFFSetCompressionScheme(TIFF * tif,int scheme)166*3ac0a46fSAndroid Build Coastguard Worker int TIFFSetCompressionScheme(TIFF *tif, int scheme)
167*3ac0a46fSAndroid Build Coastguard Worker {
168*3ac0a46fSAndroid Build Coastguard Worker     const TIFFCodec *c = TIFFFindCODEC((uint16_t)scheme);
169*3ac0a46fSAndroid Build Coastguard Worker 
170*3ac0a46fSAndroid Build Coastguard Worker     _TIFFSetDefaultCompressionState(tif);
171*3ac0a46fSAndroid Build Coastguard Worker     /*
172*3ac0a46fSAndroid Build Coastguard Worker      * Don't treat an unknown compression scheme as an error.
173*3ac0a46fSAndroid Build Coastguard Worker      * This permits applications to open files with data that
174*3ac0a46fSAndroid Build Coastguard Worker      * the library does not have builtin support for, but which
175*3ac0a46fSAndroid Build Coastguard Worker      * may still be meaningful.
176*3ac0a46fSAndroid Build Coastguard Worker      */
177*3ac0a46fSAndroid Build Coastguard Worker     return (c ? (*c->init)(tif, scheme) : 1);
178*3ac0a46fSAndroid Build Coastguard Worker }
179*3ac0a46fSAndroid Build Coastguard Worker 
180*3ac0a46fSAndroid Build Coastguard Worker /*
181*3ac0a46fSAndroid Build Coastguard Worker  * Other compression schemes may be registered.  Registered
182*3ac0a46fSAndroid Build Coastguard Worker  * schemes can also override the builtin versions provided
183*3ac0a46fSAndroid Build Coastguard Worker  * by this library.
184*3ac0a46fSAndroid Build Coastguard Worker  */
185*3ac0a46fSAndroid Build Coastguard Worker typedef struct _codec
186*3ac0a46fSAndroid Build Coastguard Worker {
187*3ac0a46fSAndroid Build Coastguard Worker     struct _codec *next;
188*3ac0a46fSAndroid Build Coastguard Worker     TIFFCodec *info;
189*3ac0a46fSAndroid Build Coastguard Worker } codec_t;
190*3ac0a46fSAndroid Build Coastguard Worker static codec_t *registeredCODECS = NULL;
191*3ac0a46fSAndroid Build Coastguard Worker 
TIFFFindCODEC(uint16_t scheme)192*3ac0a46fSAndroid Build Coastguard Worker const TIFFCodec *TIFFFindCODEC(uint16_t scheme)
193*3ac0a46fSAndroid Build Coastguard Worker {
194*3ac0a46fSAndroid Build Coastguard Worker     const TIFFCodec *c;
195*3ac0a46fSAndroid Build Coastguard Worker     codec_t *cd;
196*3ac0a46fSAndroid Build Coastguard Worker 
197*3ac0a46fSAndroid Build Coastguard Worker     for (cd = registeredCODECS; cd; cd = cd->next)
198*3ac0a46fSAndroid Build Coastguard Worker         if (cd->info->scheme == scheme)
199*3ac0a46fSAndroid Build Coastguard Worker             return ((const TIFFCodec *)cd->info);
200*3ac0a46fSAndroid Build Coastguard Worker     for (c = _TIFFBuiltinCODECS; c->name; c++)
201*3ac0a46fSAndroid Build Coastguard Worker         if (c->scheme == scheme)
202*3ac0a46fSAndroid Build Coastguard Worker             return (c);
203*3ac0a46fSAndroid Build Coastguard Worker     return ((const TIFFCodec *)0);
204*3ac0a46fSAndroid Build Coastguard Worker }
205*3ac0a46fSAndroid Build Coastguard Worker 
TIFFRegisterCODEC(uint16_t scheme,const char * name,TIFFInitMethod init)206*3ac0a46fSAndroid Build Coastguard Worker TIFFCodec *TIFFRegisterCODEC(uint16_t scheme, const char *name,
207*3ac0a46fSAndroid Build Coastguard Worker                              TIFFInitMethod init)
208*3ac0a46fSAndroid Build Coastguard Worker {
209*3ac0a46fSAndroid Build Coastguard Worker     codec_t *cd = (codec_t *)_TIFFmallocExt(
210*3ac0a46fSAndroid Build Coastguard Worker         NULL,
211*3ac0a46fSAndroid Build Coastguard Worker         (tmsize_t)(sizeof(codec_t) + sizeof(TIFFCodec) + strlen(name) + 1));
212*3ac0a46fSAndroid Build Coastguard Worker 
213*3ac0a46fSAndroid Build Coastguard Worker     if (cd != NULL)
214*3ac0a46fSAndroid Build Coastguard Worker     {
215*3ac0a46fSAndroid Build Coastguard Worker         cd->info = (TIFFCodec *)((uint8_t *)cd + sizeof(codec_t));
216*3ac0a46fSAndroid Build Coastguard Worker         cd->info->name = (char *)((uint8_t *)cd->info + sizeof(TIFFCodec));
217*3ac0a46fSAndroid Build Coastguard Worker         strcpy(cd->info->name, name);
218*3ac0a46fSAndroid Build Coastguard Worker         cd->info->scheme = scheme;
219*3ac0a46fSAndroid Build Coastguard Worker         cd->info->init = init;
220*3ac0a46fSAndroid Build Coastguard Worker         cd->next = registeredCODECS;
221*3ac0a46fSAndroid Build Coastguard Worker         registeredCODECS = cd;
222*3ac0a46fSAndroid Build Coastguard Worker     }
223*3ac0a46fSAndroid Build Coastguard Worker     else
224*3ac0a46fSAndroid Build Coastguard Worker     {
225*3ac0a46fSAndroid Build Coastguard Worker         TIFFErrorExt(0, "TIFFRegisterCODEC",
226*3ac0a46fSAndroid Build Coastguard Worker                      "No space to register compression scheme %s", name);
227*3ac0a46fSAndroid Build Coastguard Worker         return NULL;
228*3ac0a46fSAndroid Build Coastguard Worker     }
229*3ac0a46fSAndroid Build Coastguard Worker     return (cd->info);
230*3ac0a46fSAndroid Build Coastguard Worker }
231*3ac0a46fSAndroid Build Coastguard Worker 
TIFFUnRegisterCODEC(TIFFCodec * c)232*3ac0a46fSAndroid Build Coastguard Worker void TIFFUnRegisterCODEC(TIFFCodec *c)
233*3ac0a46fSAndroid Build Coastguard Worker {
234*3ac0a46fSAndroid Build Coastguard Worker     codec_t *cd;
235*3ac0a46fSAndroid Build Coastguard Worker     codec_t **pcd;
236*3ac0a46fSAndroid Build Coastguard Worker 
237*3ac0a46fSAndroid Build Coastguard Worker     for (pcd = &registeredCODECS; (cd = *pcd) != NULL; pcd = &cd->next)
238*3ac0a46fSAndroid Build Coastguard Worker         if (cd->info == c)
239*3ac0a46fSAndroid Build Coastguard Worker         {
240*3ac0a46fSAndroid Build Coastguard Worker             *pcd = cd->next;
241*3ac0a46fSAndroid Build Coastguard Worker             _TIFFfreeExt(NULL, cd);
242*3ac0a46fSAndroid Build Coastguard Worker             return;
243*3ac0a46fSAndroid Build Coastguard Worker         }
244*3ac0a46fSAndroid Build Coastguard Worker     TIFFErrorExt(0, "TIFFUnRegisterCODEC",
245*3ac0a46fSAndroid Build Coastguard Worker                  "Cannot remove compression scheme %s; not registered",
246*3ac0a46fSAndroid Build Coastguard Worker                  c->name);
247*3ac0a46fSAndroid Build Coastguard Worker }
248*3ac0a46fSAndroid Build Coastguard Worker 
249*3ac0a46fSAndroid Build Coastguard Worker /************************************************************************/
250*3ac0a46fSAndroid Build Coastguard Worker /*                       TIFFGetConfisuredCODECs()                      */
251*3ac0a46fSAndroid Build Coastguard Worker /************************************************************************/
252*3ac0a46fSAndroid Build Coastguard Worker 
253*3ac0a46fSAndroid Build Coastguard Worker /**
254*3ac0a46fSAndroid Build Coastguard Worker  * Get list of configured codecs, both built-in and registered by user.
255*3ac0a46fSAndroid Build Coastguard Worker  * Caller is responsible to free this structure.
256*3ac0a46fSAndroid Build Coastguard Worker  *
257*3ac0a46fSAndroid Build Coastguard Worker  * @return returns array of TIFFCodec records (the last record should be NULL)
258*3ac0a46fSAndroid Build Coastguard Worker  * or NULL if function failed.
259*3ac0a46fSAndroid Build Coastguard Worker  */
260*3ac0a46fSAndroid Build Coastguard Worker 
TIFFGetConfiguredCODECs()261*3ac0a46fSAndroid Build Coastguard Worker TIFFCodec *TIFFGetConfiguredCODECs()
262*3ac0a46fSAndroid Build Coastguard Worker {
263*3ac0a46fSAndroid Build Coastguard Worker     int i = 1;
264*3ac0a46fSAndroid Build Coastguard Worker     codec_t *cd;
265*3ac0a46fSAndroid Build Coastguard Worker     const TIFFCodec *c;
266*3ac0a46fSAndroid Build Coastguard Worker     TIFFCodec *codecs = NULL;
267*3ac0a46fSAndroid Build Coastguard Worker     TIFFCodec *new_codecs;
268*3ac0a46fSAndroid Build Coastguard Worker 
269*3ac0a46fSAndroid Build Coastguard Worker     for (cd = registeredCODECS; cd; cd = cd->next)
270*3ac0a46fSAndroid Build Coastguard Worker     {
271*3ac0a46fSAndroid Build Coastguard Worker         new_codecs =
272*3ac0a46fSAndroid Build Coastguard Worker             (TIFFCodec *)_TIFFreallocExt(NULL, codecs, i * sizeof(TIFFCodec));
273*3ac0a46fSAndroid Build Coastguard Worker         if (!new_codecs)
274*3ac0a46fSAndroid Build Coastguard Worker         {
275*3ac0a46fSAndroid Build Coastguard Worker             _TIFFfreeExt(NULL, codecs);
276*3ac0a46fSAndroid Build Coastguard Worker             return NULL;
277*3ac0a46fSAndroid Build Coastguard Worker         }
278*3ac0a46fSAndroid Build Coastguard Worker         codecs = new_codecs;
279*3ac0a46fSAndroid Build Coastguard Worker         _TIFFmemcpy(codecs + i - 1, cd->info, sizeof(TIFFCodec));
280*3ac0a46fSAndroid Build Coastguard Worker         i++;
281*3ac0a46fSAndroid Build Coastguard Worker     }
282*3ac0a46fSAndroid Build Coastguard Worker     for (c = _TIFFBuiltinCODECS; c->name; c++)
283*3ac0a46fSAndroid Build Coastguard Worker     {
284*3ac0a46fSAndroid Build Coastguard Worker         if (TIFFIsCODECConfigured(c->scheme))
285*3ac0a46fSAndroid Build Coastguard Worker         {
286*3ac0a46fSAndroid Build Coastguard Worker             new_codecs = (TIFFCodec *)_TIFFreallocExt(NULL, codecs,
287*3ac0a46fSAndroid Build Coastguard Worker                                                       i * sizeof(TIFFCodec));
288*3ac0a46fSAndroid Build Coastguard Worker             if (!new_codecs)
289*3ac0a46fSAndroid Build Coastguard Worker             {
290*3ac0a46fSAndroid Build Coastguard Worker                 _TIFFfreeExt(NULL, codecs);
291*3ac0a46fSAndroid Build Coastguard Worker                 return NULL;
292*3ac0a46fSAndroid Build Coastguard Worker             }
293*3ac0a46fSAndroid Build Coastguard Worker             codecs = new_codecs;
294*3ac0a46fSAndroid Build Coastguard Worker             _TIFFmemcpy(codecs + i - 1, (const void *)c, sizeof(TIFFCodec));
295*3ac0a46fSAndroid Build Coastguard Worker             i++;
296*3ac0a46fSAndroid Build Coastguard Worker         }
297*3ac0a46fSAndroid Build Coastguard Worker     }
298*3ac0a46fSAndroid Build Coastguard Worker 
299*3ac0a46fSAndroid Build Coastguard Worker     new_codecs =
300*3ac0a46fSAndroid Build Coastguard Worker         (TIFFCodec *)_TIFFreallocExt(NULL, codecs, i * sizeof(TIFFCodec));
301*3ac0a46fSAndroid Build Coastguard Worker     if (!new_codecs)
302*3ac0a46fSAndroid Build Coastguard Worker     {
303*3ac0a46fSAndroid Build Coastguard Worker         _TIFFfreeExt(NULL, codecs);
304*3ac0a46fSAndroid Build Coastguard Worker         return NULL;
305*3ac0a46fSAndroid Build Coastguard Worker     }
306*3ac0a46fSAndroid Build Coastguard Worker     codecs = new_codecs;
307*3ac0a46fSAndroid Build Coastguard Worker     _TIFFmemset(codecs + i - 1, 0, sizeof(TIFFCodec));
308*3ac0a46fSAndroid Build Coastguard Worker 
309*3ac0a46fSAndroid Build Coastguard Worker     return codecs;
310*3ac0a46fSAndroid Build Coastguard Worker }
311