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 = ®isteredCODECS; (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