New comit of SDL2
[supertux.git] / src / SDL2 / external / tiff-4.0.3 / libtiff / tif_dir.c
1 /* $Id: tif_dir.c,v 1.113 2012-06-14 20:32:53 fwarmerdam Exp $ */
2
3 /*
4  * Copyright (c) 1988-1997 Sam Leffler
5  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
6  *
7  * Permission to use, copy, modify, distribute, and sell this software and 
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
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
12  * publicity relating to the software without the specific, prior written
13  * permission of Sam Leffler and Silicon Graphics.
14  * 
15  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
16  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
17  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
18  * 
19  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
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 
23  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
24  * OF THIS SOFTWARE.
25  */
26
27 /*
28  * TIFF Library.
29  *
30  * Directory Tag Get & Set Routines.
31  * (and also some miscellaneous stuff)
32  */
33 #include "tiffiop.h"
34
35 /*
36  * These are used in the backwards compatibility code...
37  */
38 #define DATATYPE_VOID           0       /* !untyped data */
39 #define DATATYPE_INT            1       /* !signed integer data */
40 #define DATATYPE_UINT           2       /* !unsigned integer data */
41 #define DATATYPE_IEEEFP         3       /* !IEEE floating point data */
42
43 static void
44 setByteArray(void** vpp, void* vp, size_t nmemb, size_t elem_size)
45 {
46         if (*vpp)
47                 _TIFFfree(*vpp), *vpp = 0;
48         if (vp) {
49                 tmsize_t bytes = (tmsize_t)(nmemb * elem_size);
50                 if (elem_size && bytes / elem_size == nmemb)
51                         *vpp = (void*) _TIFFmalloc(bytes);
52                 if (*vpp)
53                         _TIFFmemcpy(*vpp, vp, bytes);
54         }
55 }
56 void _TIFFsetByteArray(void** vpp, void* vp, uint32 n)
57     { setByteArray(vpp, vp, n, 1); }
58 void _TIFFsetString(char** cpp, char* cp)
59     { setByteArray((void**) cpp, (void*) cp, strlen(cp)+1, 1); }
60 void _TIFFsetNString(char** cpp, char* cp, uint32 n)
61     { setByteArray((void**) cpp, (void*) cp, n, 1); }
62 void _TIFFsetShortArray(uint16** wpp, uint16* wp, uint32 n)
63     { setByteArray((void**) wpp, (void*) wp, n, sizeof (uint16)); }
64 void _TIFFsetLongArray(uint32** lpp, uint32* lp, uint32 n)
65     { setByteArray((void**) lpp, (void*) lp, n, sizeof (uint32)); }
66 void _TIFFsetLong8Array(uint64** lpp, uint64* lp, uint32 n)
67     { setByteArray((void**) lpp, (void*) lp, n, sizeof (uint64)); }
68 void _TIFFsetFloatArray(float** fpp, float* fp, uint32 n)
69     { setByteArray((void**) fpp, (void*) fp, n, sizeof (float)); }
70 void _TIFFsetDoubleArray(double** dpp, double* dp, uint32 n)
71     { setByteArray((void**) dpp, (void*) dp, n, sizeof (double)); }
72
73 static void
74 setDoubleArrayOneValue(double** vpp, double value, size_t nmemb)
75 {
76         if (*vpp)
77                 _TIFFfree(*vpp);
78         *vpp = _TIFFmalloc(nmemb*sizeof(double));
79         if (*vpp)
80         {
81                 while (nmemb--)
82                         ((double*)*vpp)[nmemb] = value;
83         }
84 }
85
86 /*
87  * Install extra samples information.
88  */
89 static int
90 setExtraSamples(TIFFDirectory* td, va_list ap, uint32* v)
91 {
92 /* XXX: Unassociated alpha data == 999 is a known Corel Draw bug, see below */
93 #define EXTRASAMPLE_COREL_UNASSALPHA 999 
94
95         uint16* va;
96         uint32 i;
97
98         *v = (uint16) va_arg(ap, uint16_vap);
99         if ((uint16) *v > td->td_samplesperpixel)
100                 return 0;
101         va = va_arg(ap, uint16*);
102         if (*v > 0 && va == NULL)               /* typically missing param */
103                 return 0;
104         for (i = 0; i < *v; i++) {
105                 if (va[i] > EXTRASAMPLE_UNASSALPHA) {
106                         /*
107                          * XXX: Corel Draw is known to produce incorrect
108                          * ExtraSamples tags which must be patched here if we
109                          * want to be able to open some of the damaged TIFF
110                          * files: 
111                          */
112                         if (va[i] == EXTRASAMPLE_COREL_UNASSALPHA)
113                                 va[i] = EXTRASAMPLE_UNASSALPHA;
114                         else
115                                 return 0;
116                 }
117         }
118         td->td_extrasamples = (uint16) *v;
119         _TIFFsetShortArray(&td->td_sampleinfo, va, td->td_extrasamples);
120         return 1;
121
122 #undef EXTRASAMPLE_COREL_UNASSALPHA
123 }
124
125 /*
126  * Confirm we have "samplesperpixel" ink names separated by \0.  Returns 
127  * zero if the ink names are not as expected.
128  */
129 static uint32
130 checkInkNamesString(TIFF* tif, uint32 slen, const char* s)
131 {
132         TIFFDirectory* td = &tif->tif_dir;
133         uint16 i = td->td_samplesperpixel;
134
135         if (slen > 0) {
136                 const char* ep = s+slen;
137                 const char* cp = s;
138                 for (; i > 0; i--) {
139                         for (; cp < ep && *cp != '\0'; cp++) {}
140                         if (cp >= ep)
141                                 goto bad;
142                         cp++;                           /* skip \0 */
143                 }
144                 return ((uint32)(cp-s));
145         }
146 bad:
147         TIFFErrorExt(tif->tif_clientdata, "TIFFSetField",
148             "%s: Invalid InkNames value; expecting %d names, found %d",
149             tif->tif_name,
150             td->td_samplesperpixel,
151             td->td_samplesperpixel-i);
152         return (0);
153 }
154
155 static int
156 _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
157 {
158         static const char module[] = "_TIFFVSetField";
159
160         TIFFDirectory* td = &tif->tif_dir;
161         int status = 1;
162         uint32 v32, i, v;
163         char* s;
164         const TIFFField *fip = TIFFFindField(tif, tag, TIFF_ANY);
165         uint32 standard_tag = tag;
166
167         /*
168          * We want to force the custom code to be used for custom
169          * fields even if the tag happens to match a well known 
170          * one - important for reinterpreted handling of standard
171          * tag values in custom directories (ie. EXIF) 
172          */
173         if (fip->field_bit == FIELD_CUSTOM) {
174                 standard_tag = 0;
175         }
176
177         switch (standard_tag) {
178         case TIFFTAG_SUBFILETYPE:
179                 td->td_subfiletype = (uint32) va_arg(ap, uint32);
180                 break;
181         case TIFFTAG_IMAGEWIDTH:
182                 td->td_imagewidth = (uint32) va_arg(ap, uint32);
183                 break;
184         case TIFFTAG_IMAGELENGTH:
185                 td->td_imagelength = (uint32) va_arg(ap, uint32);
186                 break;
187         case TIFFTAG_BITSPERSAMPLE:
188                 td->td_bitspersample = (uint16) va_arg(ap, uint16_vap);
189                 /*
190                  * If the data require post-decoding processing to byte-swap
191                  * samples, set it up here.  Note that since tags are required
192                  * to be ordered, compression code can override this behaviour
193                  * in the setup method if it wants to roll the post decoding
194                  * work in with its normal work.
195                  */
196                 if (tif->tif_flags & TIFF_SWAB) {
197                         if (td->td_bitspersample == 8)
198                                 tif->tif_postdecode = _TIFFNoPostDecode;
199                         else if (td->td_bitspersample == 16)
200                                 tif->tif_postdecode = _TIFFSwab16BitData;
201                         else if (td->td_bitspersample == 24)
202                                 tif->tif_postdecode = _TIFFSwab24BitData;
203                         else if (td->td_bitspersample == 32)
204                                 tif->tif_postdecode = _TIFFSwab32BitData;
205                         else if (td->td_bitspersample == 64)
206                                 tif->tif_postdecode = _TIFFSwab64BitData;
207                         else if (td->td_bitspersample == 128) /* two 64's */
208                                 tif->tif_postdecode = _TIFFSwab64BitData;
209                 }
210                 break;
211         case TIFFTAG_COMPRESSION:
212                 v = (uint16) va_arg(ap, uint16_vap);
213                 /*
214                  * If we're changing the compression scheme, the notify the
215                  * previous module so that it can cleanup any state it's
216                  * setup.
217                  */
218                 if (TIFFFieldSet(tif, FIELD_COMPRESSION)) {
219                         if ((uint32)td->td_compression == v)
220                                 break;
221                         (*tif->tif_cleanup)(tif);
222                         tif->tif_flags &= ~TIFF_CODERSETUP;
223                 }
224                 /*
225                  * Setup new compression routine state.
226                  */
227                 if( (status = TIFFSetCompressionScheme(tif, v)) != 0 )
228                     td->td_compression = (uint16) v;
229                 else
230                     status = 0;
231                 break;
232         case TIFFTAG_PHOTOMETRIC:
233                 td->td_photometric = (uint16) va_arg(ap, uint16_vap);
234                 break;
235         case TIFFTAG_THRESHHOLDING:
236                 td->td_threshholding = (uint16) va_arg(ap, uint16_vap);
237                 break;
238         case TIFFTAG_FILLORDER:
239                 v = (uint16) va_arg(ap, uint16_vap);
240                 if (v != FILLORDER_LSB2MSB && v != FILLORDER_MSB2LSB)
241                         goto badvalue;
242                 td->td_fillorder = (uint16) v;
243                 break;
244         case TIFFTAG_ORIENTATION:
245                 v = (uint16) va_arg(ap, uint16_vap);
246                 if (v < ORIENTATION_TOPLEFT || ORIENTATION_LEFTBOT < v)
247                         goto badvalue;
248                 else
249                         td->td_orientation = (uint16) v;
250                 break;
251         case TIFFTAG_SAMPLESPERPIXEL:
252                 v = (uint16) va_arg(ap, uint16_vap);
253                 if (v == 0)
254                         goto badvalue;
255                 td->td_samplesperpixel = (uint16) v;
256                 break;
257         case TIFFTAG_ROWSPERSTRIP:
258                 v32 = (uint32) va_arg(ap, uint32);
259                 if (v32 == 0)
260                         goto badvalue32;
261                 td->td_rowsperstrip = v32;
262                 if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) {
263                         td->td_tilelength = v32;
264                         td->td_tilewidth = td->td_imagewidth;
265                 }
266                 break;
267         case TIFFTAG_MINSAMPLEVALUE:
268                 td->td_minsamplevalue = (uint16) va_arg(ap, uint16_vap);
269                 break;
270         case TIFFTAG_MAXSAMPLEVALUE:
271                 td->td_maxsamplevalue = (uint16) va_arg(ap, uint16_vap);
272                 break;
273         case TIFFTAG_SMINSAMPLEVALUE:
274                 if (tif->tif_flags & TIFF_PERSAMPLE)
275                         _TIFFsetDoubleArray(&td->td_sminsamplevalue, va_arg(ap, double*), td->td_samplesperpixel);
276                 else
277                         setDoubleArrayOneValue(&td->td_sminsamplevalue, va_arg(ap, double), td->td_samplesperpixel);
278                 break;
279         case TIFFTAG_SMAXSAMPLEVALUE:
280                 if (tif->tif_flags & TIFF_PERSAMPLE)
281                         _TIFFsetDoubleArray(&td->td_smaxsamplevalue, va_arg(ap, double*), td->td_samplesperpixel);
282                 else
283                         setDoubleArrayOneValue(&td->td_smaxsamplevalue, va_arg(ap, double), td->td_samplesperpixel);
284                 break;
285         case TIFFTAG_XRESOLUTION:
286                 td->td_xresolution = (float) va_arg(ap, double);
287                 break;
288         case TIFFTAG_YRESOLUTION:
289                 td->td_yresolution = (float) va_arg(ap, double);
290                 break;
291         case TIFFTAG_PLANARCONFIG:
292                 v = (uint16) va_arg(ap, uint16_vap);
293                 if (v != PLANARCONFIG_CONTIG && v != PLANARCONFIG_SEPARATE)
294                         goto badvalue;
295                 td->td_planarconfig = (uint16) v;
296                 break;
297         case TIFFTAG_XPOSITION:
298                 td->td_xposition = (float) va_arg(ap, double);
299                 break;
300         case TIFFTAG_YPOSITION:
301                 td->td_yposition = (float) va_arg(ap, double);
302                 break;
303         case TIFFTAG_RESOLUTIONUNIT:
304                 v = (uint16) va_arg(ap, uint16_vap);
305                 if (v < RESUNIT_NONE || RESUNIT_CENTIMETER < v)
306                         goto badvalue;
307                 td->td_resolutionunit = (uint16) v;
308                 break;
309         case TIFFTAG_PAGENUMBER:
310                 td->td_pagenumber[0] = (uint16) va_arg(ap, uint16_vap);
311                 td->td_pagenumber[1] = (uint16) va_arg(ap, uint16_vap);
312                 break;
313         case TIFFTAG_HALFTONEHINTS:
314                 td->td_halftonehints[0] = (uint16) va_arg(ap, uint16_vap);
315                 td->td_halftonehints[1] = (uint16) va_arg(ap, uint16_vap);
316                 break;
317         case TIFFTAG_COLORMAP:
318                 v32 = (uint32)(1L<<td->td_bitspersample);
319                 _TIFFsetShortArray(&td->td_colormap[0], va_arg(ap, uint16*), v32);
320                 _TIFFsetShortArray(&td->td_colormap[1], va_arg(ap, uint16*), v32);
321                 _TIFFsetShortArray(&td->td_colormap[2], va_arg(ap, uint16*), v32);
322                 break;
323         case TIFFTAG_EXTRASAMPLES:
324                 if (!setExtraSamples(td, ap, &v))
325                         goto badvalue;
326                 break;
327         case TIFFTAG_MATTEING:
328                 td->td_extrasamples =  (((uint16) va_arg(ap, uint16_vap)) != 0);
329                 if (td->td_extrasamples) {
330                         uint16 sv = EXTRASAMPLE_ASSOCALPHA;
331                         _TIFFsetShortArray(&td->td_sampleinfo, &sv, 1);
332                 }
333                 break;
334         case TIFFTAG_TILEWIDTH:
335                 v32 = (uint32) va_arg(ap, uint32);
336                 if (v32 % 16) {
337                         if (tif->tif_mode != O_RDONLY)
338                                 goto badvalue32;
339                         TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
340                                 "Nonstandard tile width %d, convert file", v32);
341                 }
342                 td->td_tilewidth = v32;
343                 tif->tif_flags |= TIFF_ISTILED;
344                 break;
345         case TIFFTAG_TILELENGTH:
346                 v32 = (uint32) va_arg(ap, uint32);
347                 if (v32 % 16) {
348                         if (tif->tif_mode != O_RDONLY)
349                                 goto badvalue32;
350                         TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
351                             "Nonstandard tile length %d, convert file", v32);
352                 }
353                 td->td_tilelength = v32;
354                 tif->tif_flags |= TIFF_ISTILED;
355                 break;
356         case TIFFTAG_TILEDEPTH:
357                 v32 = (uint32) va_arg(ap, uint32);
358                 if (v32 == 0)
359                         goto badvalue32;
360                 td->td_tiledepth = v32;
361                 break;
362         case TIFFTAG_DATATYPE:
363                 v = (uint16) va_arg(ap, uint16_vap);
364                 switch (v) {
365                 case DATATYPE_VOID:     v = SAMPLEFORMAT_VOID;  break;
366                 case DATATYPE_INT:      v = SAMPLEFORMAT_INT;   break;
367                 case DATATYPE_UINT:     v = SAMPLEFORMAT_UINT;  break;
368                 case DATATYPE_IEEEFP:   v = SAMPLEFORMAT_IEEEFP;break;
369                 default:                goto badvalue;
370                 }
371                 td->td_sampleformat = (uint16) v;
372                 break;
373         case TIFFTAG_SAMPLEFORMAT:
374                 v = (uint16) va_arg(ap, uint16_vap);
375                 if (v < SAMPLEFORMAT_UINT || SAMPLEFORMAT_COMPLEXIEEEFP < v)
376                         goto badvalue;
377                 td->td_sampleformat = (uint16) v;
378
379                 /*  Try to fix up the SWAB function for complex data. */
380                 if( td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT
381                     && td->td_bitspersample == 32
382                     && tif->tif_postdecode == _TIFFSwab32BitData )
383                     tif->tif_postdecode = _TIFFSwab16BitData;
384                 else if( (td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT
385                           || td->td_sampleformat == SAMPLEFORMAT_COMPLEXIEEEFP)
386                          && td->td_bitspersample == 64
387                          && tif->tif_postdecode == _TIFFSwab64BitData )
388                     tif->tif_postdecode = _TIFFSwab32BitData;
389                 break;
390         case TIFFTAG_IMAGEDEPTH:
391                 td->td_imagedepth = (uint32) va_arg(ap, uint32);
392                 break;
393         case TIFFTAG_SUBIFD:
394                 if ((tif->tif_flags & TIFF_INSUBIFD) == 0) {
395                         td->td_nsubifd = (uint16) va_arg(ap, uint16_vap);
396                         _TIFFsetLong8Array(&td->td_subifd, (uint64*) va_arg(ap, uint64*),
397                             (long) td->td_nsubifd);
398                 } else {
399                         TIFFErrorExt(tif->tif_clientdata, module,
400                                      "%s: Sorry, cannot nest SubIFDs",
401                                      tif->tif_name);
402                         status = 0;
403                 }
404                 break;
405         case TIFFTAG_YCBCRPOSITIONING:
406                 td->td_ycbcrpositioning = (uint16) va_arg(ap, uint16_vap);
407                 break;
408         case TIFFTAG_YCBCRSUBSAMPLING:
409                 td->td_ycbcrsubsampling[0] = (uint16) va_arg(ap, uint16_vap);
410                 td->td_ycbcrsubsampling[1] = (uint16) va_arg(ap, uint16_vap);
411                 break;
412         case TIFFTAG_TRANSFERFUNCTION:
413                 v = (td->td_samplesperpixel - td->td_extrasamples) > 1 ? 3 : 1;
414                 for (i = 0; i < v; i++)
415                         _TIFFsetShortArray(&td->td_transferfunction[i],
416                             va_arg(ap, uint16*), 1L<<td->td_bitspersample);
417                 break;
418         case TIFFTAG_REFERENCEBLACKWHITE:
419                 /* XXX should check for null range */
420                 _TIFFsetFloatArray(&td->td_refblackwhite, va_arg(ap, float*), 6);
421                 break;
422         case TIFFTAG_INKNAMES:
423                 v = (uint16) va_arg(ap, uint16_vap);
424                 s = va_arg(ap, char*);
425                 v = checkInkNamesString(tif, v, s);
426                 status = v > 0;
427                 if( v > 0 ) {
428                         _TIFFsetNString(&td->td_inknames, s, v);
429                         td->td_inknameslen = v;
430                 }
431                 break;
432         case TIFFTAG_PERSAMPLE:
433                 v = (uint16) va_arg(ap, uint16_vap);
434                 if( v == PERSAMPLE_MULTI )
435                         tif->tif_flags |= TIFF_PERSAMPLE;
436                 else
437                         tif->tif_flags &= ~TIFF_PERSAMPLE;
438                 break;
439         default: {
440                 TIFFTagValue *tv;
441                 int tv_size, iCustom;
442
443                 /*
444                  * This can happen if multiple images are open with different
445                  * codecs which have private tags.  The global tag information
446                  * table may then have tags that are valid for one file but not
447                  * the other. If the client tries to set a tag that is not valid
448                  * for the image's codec then we'll arrive here.  This
449                  * happens, for example, when tiffcp is used to convert between
450                  * compression schemes and codec-specific tags are blindly copied.
451                  */
452                 if(fip == NULL || fip->field_bit != FIELD_CUSTOM) {
453                         TIFFErrorExt(tif->tif_clientdata, module,
454                             "%s: Invalid %stag \"%s\" (not supported by codec)",
455                             tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "",
456                             fip ? fip->field_name : "Unknown");
457                         status = 0;
458                         break;
459                 }
460
461                 /*
462                  * Find the existing entry for this custom value.
463                  */
464                 tv = NULL;
465                 for (iCustom = 0; iCustom < td->td_customValueCount; iCustom++) {
466                         if (td->td_customValues[iCustom].info->field_tag == tag) {
467                                 tv = td->td_customValues + iCustom;
468                                 if (tv->value != NULL) {
469                                         _TIFFfree(tv->value);
470                                         tv->value = NULL;
471                                 }
472                                 break;
473                         }
474                 }
475
476                 /*
477                  * Grow the custom list if the entry was not found.
478                  */
479                 if(tv == NULL) {
480                         TIFFTagValue *new_customValues;
481
482                         td->td_customValueCount++;
483                         new_customValues = (TIFFTagValue *)
484                             _TIFFrealloc(td->td_customValues,
485                             sizeof(TIFFTagValue) * td->td_customValueCount);
486                         if (!new_customValues) {
487                                 TIFFErrorExt(tif->tif_clientdata, module,
488                                     "%s: Failed to allocate space for list of custom values",
489                                     tif->tif_name);
490                                 status = 0;
491                                 goto end;
492                         }
493
494                         td->td_customValues = new_customValues;
495
496                         tv = td->td_customValues + (td->td_customValueCount - 1);
497                         tv->info = fip;
498                         tv->value = NULL;
499                         tv->count = 0;
500                 }
501
502                 /*
503                  * Set custom value ... save a copy of the custom tag value.
504                  */
505                 tv_size = _TIFFDataSize(fip->field_type);
506                 if (tv_size == 0) {
507                         status = 0;
508                         TIFFErrorExt(tif->tif_clientdata, module,
509                             "%s: Bad field type %d for \"%s\"",
510                             tif->tif_name, fip->field_type,
511                             fip->field_name);
512                         goto end;
513                 }
514
515                 if (fip->field_type == TIFF_ASCII)
516                 {
517                         uint32 ma;
518                         char* mb;
519                         if (fip->field_passcount)
520                         {
521                                 assert(fip->field_writecount==TIFF_VARIABLE2);
522                                 ma=(uint32)va_arg(ap,uint32);
523                                 mb=(char*)va_arg(ap,char*);
524                         }
525                         else
526                         {
527                                 mb=(char*)va_arg(ap,char*);
528                                 ma=(uint32)(strlen(mb)+1);
529                         }
530                         tv->count=ma;
531                         setByteArray(&tv->value,mb,ma,1);
532                 }
533                 else
534                 {
535                         if (fip->field_passcount) {
536                                 if (fip->field_writecount == TIFF_VARIABLE2)
537                                         tv->count = (uint32) va_arg(ap, uint32);
538                                 else
539                                         tv->count = (int) va_arg(ap, int);
540                         } else if (fip->field_writecount == TIFF_VARIABLE
541                            || fip->field_writecount == TIFF_VARIABLE2)
542                                 tv->count = 1;
543                         else if (fip->field_writecount == TIFF_SPP)
544                                 tv->count = td->td_samplesperpixel;
545                         else
546                                 tv->count = fip->field_writecount;
547
548                         if (tv->count == 0) {
549                                 status = 0;
550                                 TIFFErrorExt(tif->tif_clientdata, module,
551                                              "%s: Null count for \"%s\" (type "
552                                              "%d, writecount %d, passcount %d)",
553                                              tif->tif_name,
554                                              fip->field_name,
555                                              fip->field_type,
556                                              fip->field_writecount,
557                                              fip->field_passcount);
558                                 goto end;
559                         }
560
561                         tv->value = _TIFFCheckMalloc(tif, tv->count, tv_size,
562                             "custom tag binary object");
563                         if (!tv->value) {
564                                 status = 0;
565                                 goto end;
566                         }
567
568                         if (fip->field_tag == TIFFTAG_DOTRANGE 
569                             && strcmp(fip->field_name,"DotRange") == 0) {
570                                 /* TODO: This is an evil exception and should not have been
571                                    handled this way ... likely best if we move it into
572                                    the directory structure with an explicit field in 
573                                    libtiff 4.1 and assign it a FIELD_ value */
574                                 uint16 v[2];
575                                 v[0] = (uint16)va_arg(ap, int);
576                                 v[1] = (uint16)va_arg(ap, int);
577                                 _TIFFmemcpy(tv->value, &v, 4);
578                         }
579
580                         else if (fip->field_passcount
581                                   || fip->field_writecount == TIFF_VARIABLE
582                                   || fip->field_writecount == TIFF_VARIABLE2
583                                   || fip->field_writecount == TIFF_SPP
584                                   || tv->count > 1) {
585                                 _TIFFmemcpy(tv->value, va_arg(ap, void *),
586                                     tv->count * tv_size);
587                         } else {
588                                 char *val = (char *)tv->value;
589                                 assert( tv->count == 1 );
590
591                                 switch (fip->field_type) {
592                                 case TIFF_BYTE:
593                                 case TIFF_UNDEFINED:
594                                         {
595                                                 uint8 v = (uint8)va_arg(ap, int);
596                                                 _TIFFmemcpy(val, &v, tv_size);
597                                         }
598                                         break;
599                                 case TIFF_SBYTE:
600                                         {
601                                                 int8 v = (int8)va_arg(ap, int);
602                                                 _TIFFmemcpy(val, &v, tv_size);
603                                         }
604                                         break;
605                                 case TIFF_SHORT:
606                                         {
607                                                 uint16 v = (uint16)va_arg(ap, int);
608                                                 _TIFFmemcpy(val, &v, tv_size);
609                                         }
610                                         break;
611                                 case TIFF_SSHORT:
612                                         {
613                                                 int16 v = (int16)va_arg(ap, int);
614                                                 _TIFFmemcpy(val, &v, tv_size);
615                                         }
616                                         break;
617                                 case TIFF_LONG:
618                                 case TIFF_IFD:
619                                         {
620                                                 uint32 v = va_arg(ap, uint32);
621                                                 _TIFFmemcpy(val, &v, tv_size);
622                                         }
623                                         break;
624                                 case TIFF_SLONG:
625                                         {
626                                                 int32 v = va_arg(ap, int32);
627                                                 _TIFFmemcpy(val, &v, tv_size);
628                                         }
629                                         break;
630                                 case TIFF_LONG8:
631                                 case TIFF_IFD8:
632                                         {
633                                                 uint64 v = va_arg(ap, uint64);
634                                                 _TIFFmemcpy(val, &v, tv_size);
635                                         }
636                                         break;
637                                 case TIFF_SLONG8:
638                                         {
639                                                 int64 v = va_arg(ap, int64);
640                                                 _TIFFmemcpy(val, &v, tv_size);
641                                         }
642                                         break;
643                                 case TIFF_RATIONAL:
644                                 case TIFF_SRATIONAL:
645                                 case TIFF_FLOAT:
646                                         {
647                                                 float v = (float)va_arg(ap, double);
648                                                 _TIFFmemcpy(val, &v, tv_size);
649                                         }
650                                         break;
651                                 case TIFF_DOUBLE:
652                                         {
653                                                 double v = va_arg(ap, double);
654                                                 _TIFFmemcpy(val, &v, tv_size);
655                                         }
656                                         break;
657                                 default:
658                                         _TIFFmemset(val, 0, tv_size);
659                                         status = 0;
660                                         break;
661                                 }
662                         }
663                 }
664         }
665         }
666         if (status) {
667                 const TIFFField* fip=TIFFFieldWithTag(tif,tag);
668                 if (fip)                
669                         TIFFSetFieldBit(tif, fip->field_bit);
670                 tif->tif_flags |= TIFF_DIRTYDIRECT;
671         }
672
673 end:
674         va_end(ap);
675         return (status);
676 badvalue:
677         {
678                 const TIFFField* fip=TIFFFieldWithTag(tif,tag);
679                 TIFFErrorExt(tif->tif_clientdata, module,
680                      "%s: Bad value %u for \"%s\" tag",
681                      tif->tif_name, v,
682                      fip ? fip->field_name : "Unknown");
683                 va_end(ap);
684         }
685         return (0);
686 badvalue32:
687         {
688                 const TIFFField* fip=TIFFFieldWithTag(tif,tag);
689                 TIFFErrorExt(tif->tif_clientdata, module,
690                      "%s: Bad value %u for \"%s\" tag",
691                      tif->tif_name, v32,
692                      fip ? fip->field_name : "Unknown");
693                 va_end(ap);
694         }
695         return (0);
696 }
697
698 /*
699  * Return 1/0 according to whether or not
700  * it is permissible to set the tag's value.
701  * Note that we allow ImageLength to be changed
702  * so that we can append and extend to images.
703  * Any other tag may not be altered once writing
704  * has commenced, unless its value has no effect
705  * on the format of the data that is written.
706  */
707 static int
708 OkToChangeTag(TIFF* tif, uint32 tag)
709 {
710         const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY);
711         if (!fip) {                     /* unknown tag */
712                 TIFFErrorExt(tif->tif_clientdata, "TIFFSetField", "%s: Unknown %stag %u",
713                     tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "", tag);
714                 return (0);
715         }
716         if (tag != TIFFTAG_IMAGELENGTH && (tif->tif_flags & TIFF_BEENWRITING) &&
717             !fip->field_oktochange) {
718                 /*
719                  * Consult info table to see if tag can be changed
720                  * after we've started writing.  We only allow changes
721                  * to those tags that don't/shouldn't affect the
722                  * compression and/or format of the data.
723                  */
724                 TIFFErrorExt(tif->tif_clientdata, "TIFFSetField",
725                     "%s: Cannot modify tag \"%s\" while writing",
726                     tif->tif_name, fip->field_name);
727                 return (0);
728         }
729         return (1);
730 }
731
732 /*
733  * Record the value of a field in the
734  * internal directory structure.  The
735  * field will be written to the file
736  * when/if the directory structure is
737  * updated.
738  */
739 int
740 TIFFSetField(TIFF* tif, uint32 tag, ...)
741 {
742         va_list ap;
743         int status;
744
745         va_start(ap, tag);
746         status = TIFFVSetField(tif, tag, ap);
747         va_end(ap);
748         return (status);
749 }
750
751 /*
752  * Clear the contents of the field in the internal structure.
753  */
754 int
755 TIFFUnsetField(TIFF* tif, uint32 tag)
756 {
757     const TIFFField *fip =  TIFFFieldWithTag(tif, tag);
758     TIFFDirectory* td = &tif->tif_dir;
759
760     if( !fip )
761         return 0;
762
763     if( fip->field_bit != FIELD_CUSTOM )
764         TIFFClrFieldBit(tif, fip->field_bit);
765     else
766     {
767         TIFFTagValue *tv = NULL;
768         int i;
769
770         for (i = 0; i < td->td_customValueCount; i++) {
771                 
772             tv = td->td_customValues + i;
773             if( tv->info->field_tag == tag )
774                 break;
775         }
776
777         if( i < td->td_customValueCount )
778         {
779             _TIFFfree(tv->value);
780             for( ; i < td->td_customValueCount-1; i++) {
781                 td->td_customValues[i] = td->td_customValues[i+1];
782             }
783             td->td_customValueCount--;
784         }
785     }
786         
787     tif->tif_flags |= TIFF_DIRTYDIRECT;
788
789     return (1);
790 }
791
792 /*
793  * Like TIFFSetField, but taking a varargs
794  * parameter list.  This routine is useful
795  * for building higher-level interfaces on
796  * top of the library.
797  */
798 int
799 TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
800 {
801         return OkToChangeTag(tif, tag) ?
802             (*tif->tif_tagmethods.vsetfield)(tif, tag, ap) : 0;
803 }
804
805 static int
806 _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
807 {
808         TIFFDirectory* td = &tif->tif_dir;
809         int ret_val = 1;
810         uint32 standard_tag = tag;
811         const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY);
812         
813         /*
814          * We want to force the custom code to be used for custom
815          * fields even if the tag happens to match a well known 
816          * one - important for reinterpreted handling of standard
817          * tag values in custom directories (ie. EXIF) 
818          */
819         if (fip->field_bit == FIELD_CUSTOM) {
820                 standard_tag = 0;
821         }
822
823         switch (standard_tag) {
824                 case TIFFTAG_SUBFILETYPE:
825                         *va_arg(ap, uint32*) = td->td_subfiletype;
826                         break;
827                 case TIFFTAG_IMAGEWIDTH:
828                         *va_arg(ap, uint32*) = td->td_imagewidth;
829                         break;
830                 case TIFFTAG_IMAGELENGTH:
831                         *va_arg(ap, uint32*) = td->td_imagelength;
832                         break;
833                 case TIFFTAG_BITSPERSAMPLE:
834                         *va_arg(ap, uint16*) = td->td_bitspersample;
835                         break;
836                 case TIFFTAG_COMPRESSION:
837                         *va_arg(ap, uint16*) = td->td_compression;
838                         break;
839                 case TIFFTAG_PHOTOMETRIC:
840                         *va_arg(ap, uint16*) = td->td_photometric;
841                         break;
842                 case TIFFTAG_THRESHHOLDING:
843                         *va_arg(ap, uint16*) = td->td_threshholding;
844                         break;
845                 case TIFFTAG_FILLORDER:
846                         *va_arg(ap, uint16*) = td->td_fillorder;
847                         break;
848                 case TIFFTAG_ORIENTATION:
849                         *va_arg(ap, uint16*) = td->td_orientation;
850                         break;
851                 case TIFFTAG_SAMPLESPERPIXEL:
852                         *va_arg(ap, uint16*) = td->td_samplesperpixel;
853                         break;
854                 case TIFFTAG_ROWSPERSTRIP:
855                         *va_arg(ap, uint32*) = td->td_rowsperstrip;
856                         break;
857                 case TIFFTAG_MINSAMPLEVALUE:
858                         *va_arg(ap, uint16*) = td->td_minsamplevalue;
859                         break;
860                 case TIFFTAG_MAXSAMPLEVALUE:
861                         *va_arg(ap, uint16*) = td->td_maxsamplevalue;
862                         break;
863                 case TIFFTAG_SMINSAMPLEVALUE:
864                         if (tif->tif_flags & TIFF_PERSAMPLE)
865                                 *va_arg(ap, double**) = td->td_sminsamplevalue;
866                         else
867                         {
868                                 /* libtiff historially treats this as a single value. */
869                                 uint16 i;
870                                 double v = td->td_sminsamplevalue[0];
871                                 for (i=1; i < td->td_samplesperpixel; ++i)
872                                         if( td->td_sminsamplevalue[i] < v )
873                                                 v = td->td_sminsamplevalue[i];
874                                 *va_arg(ap, double*) = v;
875                         }
876                         break;
877                 case TIFFTAG_SMAXSAMPLEVALUE:
878                         if (tif->tif_flags & TIFF_PERSAMPLE)
879                                 *va_arg(ap, double**) = td->td_smaxsamplevalue;
880                         else
881                         {
882                                 /* libtiff historially treats this as a single value. */
883                                 uint16 i;
884                                 double v = td->td_smaxsamplevalue[0];
885                                 for (i=1; i < td->td_samplesperpixel; ++i)
886                                         if( td->td_smaxsamplevalue[i] > v )
887                                                 v = td->td_smaxsamplevalue[i];
888                                 *va_arg(ap, double*) = v;
889                         }
890                         break;
891                 case TIFFTAG_XRESOLUTION:
892                         *va_arg(ap, float*) = td->td_xresolution;
893                         break;
894                 case TIFFTAG_YRESOLUTION:
895                         *va_arg(ap, float*) = td->td_yresolution;
896                         break;
897                 case TIFFTAG_PLANARCONFIG:
898                         *va_arg(ap, uint16*) = td->td_planarconfig;
899                         break;
900                 case TIFFTAG_XPOSITION:
901                         *va_arg(ap, float*) = td->td_xposition;
902                         break;
903                 case TIFFTAG_YPOSITION:
904                         *va_arg(ap, float*) = td->td_yposition;
905                         break;
906                 case TIFFTAG_RESOLUTIONUNIT:
907                         *va_arg(ap, uint16*) = td->td_resolutionunit;
908                         break;
909                 case TIFFTAG_PAGENUMBER:
910                         *va_arg(ap, uint16*) = td->td_pagenumber[0];
911                         *va_arg(ap, uint16*) = td->td_pagenumber[1];
912                         break;
913                 case TIFFTAG_HALFTONEHINTS:
914                         *va_arg(ap, uint16*) = td->td_halftonehints[0];
915                         *va_arg(ap, uint16*) = td->td_halftonehints[1];
916                         break;
917                 case TIFFTAG_COLORMAP:
918                         *va_arg(ap, uint16**) = td->td_colormap[0];
919                         *va_arg(ap, uint16**) = td->td_colormap[1];
920                         *va_arg(ap, uint16**) = td->td_colormap[2];
921                         break;
922                 case TIFFTAG_STRIPOFFSETS:
923                 case TIFFTAG_TILEOFFSETS:
924                         _TIFFFillStriles( tif );
925                         *va_arg(ap, uint64**) = td->td_stripoffset;
926                         break;
927                 case TIFFTAG_STRIPBYTECOUNTS:
928                 case TIFFTAG_TILEBYTECOUNTS:
929                         _TIFFFillStriles( tif );
930                         *va_arg(ap, uint64**) = td->td_stripbytecount;
931                         break;
932                 case TIFFTAG_MATTEING:
933                         *va_arg(ap, uint16*) =
934                             (td->td_extrasamples == 1 &&
935                             td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
936                         break;
937                 case TIFFTAG_EXTRASAMPLES:
938                         *va_arg(ap, uint16*) = td->td_extrasamples;
939                         *va_arg(ap, uint16**) = td->td_sampleinfo;
940                         break;
941                 case TIFFTAG_TILEWIDTH:
942                         *va_arg(ap, uint32*) = td->td_tilewidth;
943                         break;
944                 case TIFFTAG_TILELENGTH:
945                         *va_arg(ap, uint32*) = td->td_tilelength;
946                         break;
947                 case TIFFTAG_TILEDEPTH:
948                         *va_arg(ap, uint32*) = td->td_tiledepth;
949                         break;
950                 case TIFFTAG_DATATYPE:
951                         switch (td->td_sampleformat) {
952                                 case SAMPLEFORMAT_UINT:
953                                         *va_arg(ap, uint16*) = DATATYPE_UINT;
954                                         break;
955                                 case SAMPLEFORMAT_INT:
956                                         *va_arg(ap, uint16*) = DATATYPE_INT;
957                                         break;
958                                 case SAMPLEFORMAT_IEEEFP:
959                                         *va_arg(ap, uint16*) = DATATYPE_IEEEFP;
960                                         break;
961                                 case SAMPLEFORMAT_VOID:
962                                         *va_arg(ap, uint16*) = DATATYPE_VOID;
963                                         break;
964                         }
965                         break;
966                 case TIFFTAG_SAMPLEFORMAT:
967                         *va_arg(ap, uint16*) = td->td_sampleformat;
968                         break;
969                 case TIFFTAG_IMAGEDEPTH:
970                         *va_arg(ap, uint32*) = td->td_imagedepth;
971                         break;
972                 case TIFFTAG_SUBIFD:
973                         *va_arg(ap, uint16*) = td->td_nsubifd;
974                         *va_arg(ap, uint64**) = td->td_subifd;
975                         break;
976                 case TIFFTAG_YCBCRPOSITIONING:
977                         *va_arg(ap, uint16*) = td->td_ycbcrpositioning;
978                         break;
979                 case TIFFTAG_YCBCRSUBSAMPLING:
980                         *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[0];
981                         *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[1];
982                         break;
983                 case TIFFTAG_TRANSFERFUNCTION:
984                         *va_arg(ap, uint16**) = td->td_transferfunction[0];
985                         if (td->td_samplesperpixel - td->td_extrasamples > 1) {
986                                 *va_arg(ap, uint16**) = td->td_transferfunction[1];
987                                 *va_arg(ap, uint16**) = td->td_transferfunction[2];
988                         }
989                         break;
990                 case TIFFTAG_REFERENCEBLACKWHITE:
991                         *va_arg(ap, float**) = td->td_refblackwhite;
992                         break;
993                 case TIFFTAG_INKNAMES:
994                         *va_arg(ap, char**) = td->td_inknames;
995                         break;
996                 default:
997                         {
998                                 int i;
999
1000                                 /*
1001                                  * This can happen if multiple images are open
1002                                  * with different codecs which have private
1003                                  * tags.  The global tag information table may
1004                                  * then have tags that are valid for one file
1005                                  * but not the other. If the client tries to
1006                                  * get a tag that is not valid for the image's
1007                                  * codec then we'll arrive here.
1008                                  */
1009                                 if( fip == NULL || fip->field_bit != FIELD_CUSTOM )
1010                                 {
1011                                         TIFFErrorExt(tif->tif_clientdata, "_TIFFVGetField",
1012                                             "%s: Invalid %stag \"%s\" "
1013                                             "(not supported by codec)",
1014                                             tif->tif_name,
1015                                             isPseudoTag(tag) ? "pseudo-" : "",
1016                                             fip ? fip->field_name : "Unknown");
1017                                         ret_val = 0;
1018                                         break;
1019                                 }
1020
1021                                 /*
1022                                  * Do we have a custom value?
1023                                  */
1024                                 ret_val = 0;
1025                                 for (i = 0; i < td->td_customValueCount; i++) {
1026                                         TIFFTagValue *tv = td->td_customValues + i;
1027
1028                                         if (tv->info->field_tag != tag)
1029                                                 continue;
1030
1031                                         if (fip->field_passcount) {
1032                                                 if (fip->field_readcount == TIFF_VARIABLE2)
1033                                                         *va_arg(ap, uint32*) = (uint32)tv->count;
1034                                                 else  /* Assume TIFF_VARIABLE */
1035                                                         *va_arg(ap, uint16*) = (uint16)tv->count;
1036                                                 *va_arg(ap, void **) = tv->value;
1037                                                 ret_val = 1;
1038                                         } else if (fip->field_tag == TIFFTAG_DOTRANGE
1039                                                    && strcmp(fip->field_name,"DotRange") == 0) {
1040                                                 /* TODO: This is an evil exception and should not have been
1041                                                    handled this way ... likely best if we move it into
1042                                                    the directory structure with an explicit field in 
1043                                                    libtiff 4.1 and assign it a FIELD_ value */
1044                                                 *va_arg(ap, uint16*) = ((uint16 *)tv->value)[0];
1045                                                 *va_arg(ap, uint16*) = ((uint16 *)tv->value)[1];
1046                                                 ret_val = 1;
1047                                         } else {
1048                                                 if (fip->field_type == TIFF_ASCII
1049                                                     || fip->field_readcount == TIFF_VARIABLE
1050                                                     || fip->field_readcount == TIFF_VARIABLE2
1051                                                     || fip->field_readcount == TIFF_SPP
1052                                                     || tv->count > 1) {
1053                                                         *va_arg(ap, void **) = tv->value;
1054                                                         ret_val = 1;
1055                                                 } else {
1056                                                         char *val = (char *)tv->value;
1057                                                         assert( tv->count == 1 );
1058                                                         switch (fip->field_type) {
1059                                                         case TIFF_BYTE:
1060                                                         case TIFF_UNDEFINED:
1061                                                                 *va_arg(ap, uint8*) =
1062                                                                         *(uint8 *)val;
1063                                                                 ret_val = 1;
1064                                                                 break;
1065                                                         case TIFF_SBYTE:
1066                                                                 *va_arg(ap, int8*) =
1067                                                                         *(int8 *)val;
1068                                                                 ret_val = 1;
1069                                                                 break;
1070                                                         case TIFF_SHORT:
1071                                                                 *va_arg(ap, uint16*) =
1072                                                                         *(uint16 *)val;
1073                                                                 ret_val = 1;
1074                                                                 break;
1075                                                         case TIFF_SSHORT:
1076                                                                 *va_arg(ap, int16*) =
1077                                                                         *(int16 *)val;
1078                                                                 ret_val = 1;
1079                                                                 break;
1080                                                         case TIFF_LONG:
1081                                                         case TIFF_IFD:
1082                                                                 *va_arg(ap, uint32*) =
1083                                                                         *(uint32 *)val;
1084                                                                 ret_val = 1;
1085                                                                 break;
1086                                                         case TIFF_SLONG:
1087                                                                 *va_arg(ap, int32*) =
1088                                                                         *(int32 *)val;
1089                                                                 ret_val = 1;
1090                                                                 break;
1091                                                         case TIFF_LONG8:
1092                                                         case TIFF_IFD8:
1093                                                                 *va_arg(ap, uint64*) =
1094                                                                         *(uint64 *)val;
1095                                                                 ret_val = 1;
1096                                                                 break;
1097                                                         case TIFF_SLONG8:
1098                                                                 *va_arg(ap, int64*) =
1099                                                                         *(int64 *)val;
1100                                                                 ret_val = 1;
1101                                                                 break;
1102                                                         case TIFF_RATIONAL:
1103                                                         case TIFF_SRATIONAL:
1104                                                         case TIFF_FLOAT:
1105                                                                 *va_arg(ap, float*) =
1106                                                                         *(float *)val;
1107                                                                 ret_val = 1;
1108                                                                 break;
1109                                                         case TIFF_DOUBLE:
1110                                                                 *va_arg(ap, double*) =
1111                                                                         *(double *)val;
1112                                                                 ret_val = 1;
1113                                                                 break;
1114                                                         default:
1115                                                                 ret_val = 0;
1116                                                                 break;
1117                                                         }
1118                                                 }
1119                                         }
1120                                         break;
1121                                 }
1122                         }
1123         }
1124         return(ret_val);
1125 }
1126
1127 /*
1128  * Return the value of a field in the
1129  * internal directory structure.
1130  */
1131 int
1132 TIFFGetField(TIFF* tif, uint32 tag, ...)
1133 {
1134         int status;
1135         va_list ap;
1136
1137         va_start(ap, tag);
1138         status = TIFFVGetField(tif, tag, ap);
1139         va_end(ap);
1140         return (status);
1141 }
1142
1143 /*
1144  * Like TIFFGetField, but taking a varargs
1145  * parameter list.  This routine is useful
1146  * for building higher-level interfaces on
1147  * top of the library.
1148  */
1149 int
1150 TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
1151 {
1152         const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY);
1153         return (fip && (isPseudoTag(tag) || TIFFFieldSet(tif, fip->field_bit)) ?
1154             (*tif->tif_tagmethods.vgetfield)(tif, tag, ap) : 0);
1155 }
1156
1157 #define CleanupField(member) {          \
1158     if (td->member) {                   \
1159         _TIFFfree(td->member);          \
1160         td->member = 0;                 \
1161     }                                   \
1162 }
1163
1164 /*
1165  * Release storage associated with a directory.
1166  */
1167 void
1168 TIFFFreeDirectory(TIFF* tif)
1169 {
1170         TIFFDirectory *td = &tif->tif_dir;
1171         int            i;
1172
1173         _TIFFmemset(td->td_fieldsset, 0, FIELD_SETLONGS);
1174         CleanupField(td_sminsamplevalue);
1175         CleanupField(td_smaxsamplevalue);
1176         CleanupField(td_colormap[0]);
1177         CleanupField(td_colormap[1]);
1178         CleanupField(td_colormap[2]);
1179         CleanupField(td_sampleinfo);
1180         CleanupField(td_subifd);
1181         CleanupField(td_inknames);
1182         CleanupField(td_refblackwhite);
1183         CleanupField(td_transferfunction[0]);
1184         CleanupField(td_transferfunction[1]);
1185         CleanupField(td_transferfunction[2]);
1186         CleanupField(td_stripoffset);
1187         CleanupField(td_stripbytecount);
1188         TIFFClrFieldBit(tif, FIELD_YCBCRSUBSAMPLING);
1189         TIFFClrFieldBit(tif, FIELD_YCBCRPOSITIONING);
1190
1191         /* Cleanup custom tag values */
1192         for( i = 0; i < td->td_customValueCount; i++ ) {
1193                 if (td->td_customValues[i].value)
1194                         _TIFFfree(td->td_customValues[i].value);
1195         }
1196
1197         td->td_customValueCount = 0;
1198         CleanupField(td_customValues);
1199
1200 #if defined(DEFER_STRILE_LOAD)
1201         _TIFFmemset( &(td->td_stripoffset_entry), 0, sizeof(TIFFDirEntry));
1202         _TIFFmemset( &(td->td_stripbytecount_entry), 0, sizeof(TIFFDirEntry));
1203 #endif        
1204 }
1205 #undef CleanupField
1206
1207 /*
1208  * Client Tag extension support (from Niles Ritter).
1209  */
1210 static TIFFExtendProc _TIFFextender = (TIFFExtendProc) NULL;
1211
1212 TIFFExtendProc
1213 TIFFSetTagExtender(TIFFExtendProc extender)
1214 {
1215         TIFFExtendProc prev = _TIFFextender;
1216         _TIFFextender = extender;
1217         return (prev);
1218 }
1219
1220 /*
1221  * Setup for a new directory.  Should we automatically call
1222  * TIFFWriteDirectory() if the current one is dirty?
1223  *
1224  * The newly created directory will not exist on the file till
1225  * TIFFWriteDirectory(), TIFFFlush() or TIFFClose() is called.
1226  */
1227 int
1228 TIFFCreateDirectory(TIFF* tif)
1229 {
1230         TIFFDefaultDirectory(tif);
1231         tif->tif_diroff = 0;
1232         tif->tif_nextdiroff = 0;
1233         tif->tif_curoff = 0;
1234         tif->tif_row = (uint32) -1;
1235         tif->tif_curstrip = (uint32) -1;
1236
1237         return 0;
1238 }
1239
1240 int
1241 TIFFCreateCustomDirectory(TIFF* tif, const TIFFFieldArray* infoarray)
1242 {
1243         TIFFDefaultDirectory(tif);
1244
1245         /*
1246          * Reset the field definitions to match the application provided list. 
1247          * Hopefully TIFFDefaultDirectory() won't have done anything irreversable
1248          * based on it's assumption this is an image directory.
1249          */
1250         _TIFFSetupFields(tif, infoarray);
1251
1252         tif->tif_diroff = 0;
1253         tif->tif_nextdiroff = 0;
1254         tif->tif_curoff = 0;
1255         tif->tif_row = (uint32) -1;
1256         tif->tif_curstrip = (uint32) -1;
1257
1258         return 0;
1259 }
1260
1261 int
1262 TIFFCreateEXIFDirectory(TIFF* tif)
1263 {
1264         const TIFFFieldArray* exifFieldArray;
1265         exifFieldArray = _TIFFGetExifFields();
1266         return TIFFCreateCustomDirectory(tif, exifFieldArray);
1267 }
1268
1269 /*
1270  * Setup a default directory structure.
1271  */
1272 int
1273 TIFFDefaultDirectory(TIFF* tif)
1274 {
1275         register TIFFDirectory* td = &tif->tif_dir;
1276         const TIFFFieldArray* tiffFieldArray;
1277
1278         tiffFieldArray = _TIFFGetFields();
1279         _TIFFSetupFields(tif, tiffFieldArray);   
1280
1281         _TIFFmemset(td, 0, sizeof (*td));
1282         td->td_fillorder = FILLORDER_MSB2LSB;
1283         td->td_bitspersample = 1;
1284         td->td_threshholding = THRESHHOLD_BILEVEL;
1285         td->td_orientation = ORIENTATION_TOPLEFT;
1286         td->td_samplesperpixel = 1;
1287         td->td_rowsperstrip = (uint32) -1;
1288         td->td_tilewidth = 0;
1289         td->td_tilelength = 0;
1290         td->td_tiledepth = 1;
1291         td->td_stripbytecountsorted = 1; /* Our own arrays always sorted. */  
1292         td->td_resolutionunit = RESUNIT_INCH;
1293         td->td_sampleformat = SAMPLEFORMAT_UINT;
1294         td->td_imagedepth = 1;
1295         td->td_ycbcrsubsampling[0] = 2;
1296         td->td_ycbcrsubsampling[1] = 2;
1297         td->td_ycbcrpositioning = YCBCRPOSITION_CENTERED;
1298         tif->tif_postdecode = _TIFFNoPostDecode;  
1299         tif->tif_foundfield = NULL;
1300         tif->tif_tagmethods.vsetfield = _TIFFVSetField;  
1301         tif->tif_tagmethods.vgetfield = _TIFFVGetField;
1302         tif->tif_tagmethods.printdir = NULL;
1303         /*
1304          *  Give client code a chance to install their own
1305          *  tag extensions & methods, prior to compression overloads.
1306          */
1307         if (_TIFFextender)
1308                 (*_TIFFextender)(tif);
1309         (void) TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
1310         /*
1311          * NB: The directory is marked dirty as a result of setting
1312          * up the default compression scheme.  However, this really
1313          * isn't correct -- we want TIFF_DIRTYDIRECT to be set only
1314          * if the user does something.  We could just do the setup
1315          * by hand, but it seems better to use the normal mechanism
1316          * (i.e. TIFFSetField).
1317          */
1318         tif->tif_flags &= ~TIFF_DIRTYDIRECT;
1319
1320         /*
1321          * As per http://bugzilla.remotesensing.org/show_bug.cgi?id=19
1322          * we clear the ISTILED flag when setting up a new directory.
1323          * Should we also be clearing stuff like INSUBIFD?
1324          */
1325         tif->tif_flags &= ~TIFF_ISTILED;
1326
1327         return (1);
1328 }
1329
1330 static int
1331 TIFFAdvanceDirectory(TIFF* tif, uint64* nextdir, uint64* off)
1332 {
1333         static const char module[] = "TIFFAdvanceDirectory";
1334         if (isMapped(tif))
1335         {
1336                 uint64 poff=*nextdir;
1337                 if (!(tif->tif_flags&TIFF_BIGTIFF))
1338                 {
1339                         tmsize_t poffa,poffb,poffc,poffd;
1340                         uint16 dircount;
1341                         uint32 nextdir32;
1342                         poffa=(tmsize_t)poff;
1343                         poffb=poffa+sizeof(uint16);
1344                         if (((uint64)poffa!=poff)||(poffb<poffa)||(poffb<(tmsize_t)sizeof(uint16))||(poffb>tif->tif_size))
1345                         {
1346                                 TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory count");
1347                                 return(0);
1348                         }
1349                         _TIFFmemcpy(&dircount,tif->tif_base+poffa,sizeof(uint16));
1350                         if (tif->tif_flags&TIFF_SWAB)
1351                                 TIFFSwabShort(&dircount);
1352                         poffc=poffb+dircount*12;
1353                         poffd=poffc+sizeof(uint32);
1354                         if ((poffc<poffb)||(poffc<dircount*12)||(poffd<poffc)||(poffd<(tmsize_t)sizeof(uint32))||(poffd>tif->tif_size))
1355                         {
1356                                 TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory link");
1357                                 return(0);
1358                         }
1359                         if (off!=NULL)
1360                                 *off=(uint64)poffc;
1361                         _TIFFmemcpy(&nextdir32,tif->tif_base+poffc,sizeof(uint32));
1362                         if (tif->tif_flags&TIFF_SWAB)
1363                                 TIFFSwabLong(&nextdir32);
1364                         *nextdir=nextdir32;
1365                 }
1366                 else
1367                 {
1368                         tmsize_t poffa,poffb,poffc,poffd;
1369                         uint64 dircount64;
1370                         uint16 dircount16;
1371                         poffa=(tmsize_t)poff;
1372                         poffb=poffa+sizeof(uint64);
1373                         if (((uint64)poffa!=poff)||(poffb<poffa)||(poffb<(tmsize_t)sizeof(uint64))||(poffb>tif->tif_size))
1374                         {
1375                                 TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory count");
1376                                 return(0);
1377                         }
1378                         _TIFFmemcpy(&dircount64,tif->tif_base+poffa,sizeof(uint64));
1379                         if (tif->tif_flags&TIFF_SWAB)
1380                                 TIFFSwabLong8(&dircount64);
1381                         if (dircount64>0xFFFF)
1382                         {
1383                                 TIFFErrorExt(tif->tif_clientdata,module,"Sanity check on directory count failed");
1384                                 return(0);
1385                         }
1386                         dircount16=(uint16)dircount64;
1387                         poffc=poffb+dircount16*20;
1388                         poffd=poffc+sizeof(uint64);
1389                         if ((poffc<poffb)||(poffc<dircount16*20)||(poffd<poffc)||(poffd<(tmsize_t)sizeof(uint64))||(poffd>tif->tif_size))
1390                         {
1391                                 TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory link");
1392                                 return(0);
1393                         }
1394                         if (off!=NULL)
1395                                 *off=(uint64)poffc;
1396                         _TIFFmemcpy(nextdir,tif->tif_base+poffc,sizeof(uint64));
1397                         if (tif->tif_flags&TIFF_SWAB)
1398                                 TIFFSwabLong8(nextdir);
1399                 }
1400                 return(1);
1401         }
1402         else
1403         {
1404                 if (!(tif->tif_flags&TIFF_BIGTIFF))
1405                 {
1406                         uint16 dircount;
1407                         uint32 nextdir32;
1408                         if (!SeekOK(tif, *nextdir) ||
1409                             !ReadOK(tif, &dircount, sizeof (uint16))) {
1410                                 TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory count",
1411                                     tif->tif_name);
1412                                 return (0);
1413                         }
1414                         if (tif->tif_flags & TIFF_SWAB)
1415                                 TIFFSwabShort(&dircount);
1416                         if (off != NULL)
1417                                 *off = TIFFSeekFile(tif,
1418                                     dircount*12, SEEK_CUR);
1419                         else
1420                                 (void) TIFFSeekFile(tif,
1421                                     dircount*12, SEEK_CUR);
1422                         if (!ReadOK(tif, &nextdir32, sizeof (uint32))) {
1423                                 TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory link",
1424                                     tif->tif_name);
1425                                 return (0);
1426                         }
1427                         if (tif->tif_flags & TIFF_SWAB)
1428                                 TIFFSwabLong(&nextdir32);
1429                         *nextdir=nextdir32;
1430                 }
1431                 else
1432                 {
1433                         uint64 dircount64;
1434                         uint16 dircount16;
1435                         if (!SeekOK(tif, *nextdir) ||
1436                             !ReadOK(tif, &dircount64, sizeof (uint64))) {
1437                                 TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory count",
1438                                     tif->tif_name);
1439                                 return (0);
1440                         }
1441                         if (tif->tif_flags & TIFF_SWAB)
1442                                 TIFFSwabLong8(&dircount64);
1443                         if (dircount64>0xFFFF)
1444                         {
1445                                 TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory count");
1446                                 return(0);
1447                         }
1448                         dircount16 = (uint16)dircount64;
1449                         if (off != NULL)
1450                                 *off = TIFFSeekFile(tif,
1451                                     dircount16*20, SEEK_CUR);
1452                         else
1453                                 (void) TIFFSeekFile(tif,
1454                                     dircount16*20, SEEK_CUR);
1455                         if (!ReadOK(tif, nextdir, sizeof (uint64))) {
1456                                 TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory link",
1457                                     tif->tif_name);
1458                                 return (0);
1459                         }
1460                         if (tif->tif_flags & TIFF_SWAB)
1461                                 TIFFSwabLong8(nextdir);
1462                 }
1463                 return (1);
1464         }
1465 }
1466
1467 /*
1468  * Count the number of directories in a file.
1469  */
1470 uint16
1471 TIFFNumberOfDirectories(TIFF* tif)
1472 {
1473         uint64 nextdir;
1474         uint16 n;
1475         if (!(tif->tif_flags&TIFF_BIGTIFF))
1476                 nextdir = tif->tif_header.classic.tiff_diroff;
1477         else
1478                 nextdir = tif->tif_header.big.tiff_diroff;
1479         n = 0;
1480         while (nextdir != 0 && TIFFAdvanceDirectory(tif, &nextdir, NULL))
1481                 n++;
1482         return (n);
1483 }
1484
1485 /*
1486  * Set the n-th directory as the current directory.
1487  * NB: Directories are numbered starting at 0.
1488  */
1489 int
1490 TIFFSetDirectory(TIFF* tif, uint16 dirn)
1491 {
1492         uint64 nextdir;
1493         uint16 n;
1494
1495         if (!(tif->tif_flags&TIFF_BIGTIFF))
1496                 nextdir = tif->tif_header.classic.tiff_diroff;
1497         else
1498                 nextdir = tif->tif_header.big.tiff_diroff;
1499         for (n = dirn; n > 0 && nextdir != 0; n--)
1500                 if (!TIFFAdvanceDirectory(tif, &nextdir, NULL))
1501                         return (0);
1502         tif->tif_nextdiroff = nextdir;
1503         /*
1504          * Set curdir to the actual directory index.  The
1505          * -1 is because TIFFReadDirectory will increment
1506          * tif_curdir after successfully reading the directory.
1507          */
1508         tif->tif_curdir = (dirn - n) - 1;
1509         /*
1510          * Reset tif_dirnumber counter and start new list of seen directories.
1511          * We need this to prevent IFD loops.
1512          */
1513         tif->tif_dirnumber = 0;
1514         return (TIFFReadDirectory(tif));
1515 }
1516
1517 /*
1518  * Set the current directory to be the directory
1519  * located at the specified file offset.  This interface
1520  * is used mainly to access directories linked with
1521  * the SubIFD tag (e.g. thumbnail images).
1522  */
1523 int
1524 TIFFSetSubDirectory(TIFF* tif, uint64 diroff)
1525 {
1526         tif->tif_nextdiroff = diroff;
1527         /*
1528          * Reset tif_dirnumber counter and start new list of seen directories.
1529          * We need this to prevent IFD loops.
1530          */
1531         tif->tif_dirnumber = 0;
1532         return (TIFFReadDirectory(tif));
1533 }
1534
1535 /*
1536  * Return file offset of the current directory.
1537  */
1538 uint64
1539 TIFFCurrentDirOffset(TIFF* tif)
1540 {
1541         return (tif->tif_diroff);
1542 }
1543
1544 /*
1545  * Return an indication of whether or not we are
1546  * at the last directory in the file.
1547  */
1548 int
1549 TIFFLastDirectory(TIFF* tif)
1550 {
1551         return (tif->tif_nextdiroff == 0);
1552 }
1553
1554 /*
1555  * Unlink the specified directory from the directory chain.
1556  */
1557 int
1558 TIFFUnlinkDirectory(TIFF* tif, uint16 dirn)
1559 {
1560         static const char module[] = "TIFFUnlinkDirectory";
1561         uint64 nextdir;
1562         uint64 off;
1563         uint16 n;
1564
1565         if (tif->tif_mode == O_RDONLY) {
1566                 TIFFErrorExt(tif->tif_clientdata, module,
1567                              "Can not unlink directory in read-only file");
1568                 return (0);
1569         }
1570         /*
1571          * Go to the directory before the one we want
1572          * to unlink and nab the offset of the link
1573          * field we'll need to patch.
1574          */
1575         if (!(tif->tif_flags&TIFF_BIGTIFF))
1576         {
1577                 nextdir = tif->tif_header.classic.tiff_diroff;
1578                 off = 4;
1579         }
1580         else
1581         {
1582                 nextdir = tif->tif_header.big.tiff_diroff;
1583                 off = 8;
1584         }
1585         for (n = dirn-1; n > 0; n--) {
1586                 if (nextdir == 0) {
1587                         TIFFErrorExt(tif->tif_clientdata, module, "Directory %d does not exist", dirn);
1588                         return (0);
1589                 }
1590                 if (!TIFFAdvanceDirectory(tif, &nextdir, &off))
1591                         return (0);
1592         }
1593         /*
1594          * Advance to the directory to be unlinked and fetch
1595          * the offset of the directory that follows.
1596          */
1597         if (!TIFFAdvanceDirectory(tif, &nextdir, NULL))
1598                 return (0);
1599         /*
1600          * Go back and patch the link field of the preceding
1601          * directory to point to the offset of the directory
1602          * that follows.
1603          */
1604         (void) TIFFSeekFile(tif, off, SEEK_SET);
1605         if (!(tif->tif_flags&TIFF_BIGTIFF))
1606         {
1607                 uint32 nextdir32;
1608                 nextdir32=(uint32)nextdir;
1609                 assert((uint64)nextdir32==nextdir);
1610                 if (tif->tif_flags & TIFF_SWAB)
1611                         TIFFSwabLong(&nextdir32);
1612                 if (!WriteOK(tif, &nextdir32, sizeof (uint32))) {
1613                         TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link");
1614                         return (0);
1615                 }
1616         }
1617         else
1618         {
1619                 if (tif->tif_flags & TIFF_SWAB)
1620                         TIFFSwabLong8(&nextdir);
1621                 if (!WriteOK(tif, &nextdir, sizeof (uint64))) {
1622                         TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link");
1623                         return (0);
1624                 }
1625         }
1626         /*
1627          * Leave directory state setup safely.  We don't have
1628          * facilities for doing inserting and removing directories,
1629          * so it's safest to just invalidate everything.  This
1630          * means that the caller can only append to the directory
1631          * chain.
1632          */
1633         (*tif->tif_cleanup)(tif);
1634         if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) {
1635                 _TIFFfree(tif->tif_rawdata);
1636                 tif->tif_rawdata = NULL;
1637                 tif->tif_rawcc = 0;
1638                 tif->tif_rawdataoff = 0;
1639                 tif->tif_rawdataloaded = 0;
1640         }
1641         tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP|TIFF_POSTENCODE|TIFF_BUF4WRITE);
1642         TIFFFreeDirectory(tif);
1643         TIFFDefaultDirectory(tif);
1644         tif->tif_diroff = 0;                    /* force link on next write */
1645         tif->tif_nextdiroff = 0;                /* next write must be at end */
1646         tif->tif_curoff = 0;
1647         tif->tif_row = (uint32) -1;
1648         tif->tif_curstrip = (uint32) -1;
1649         return (1);
1650 }
1651
1652 /* vim: set ts=8 sts=8 sw=8 noet: */
1653 /*
1654  * Local Variables:
1655  * mode: c
1656  * c-basic-offset: 8
1657  * fill-column: 78
1658  * End:
1659  */