]> git.saurik.com Git - wxWidgets.git/blame - src/tiff/libtiff/tif_dir.c
Fit the generic preferences editor dialog to its pages size initially.
[wxWidgets.git] / src / tiff / libtiff / tif_dir.c
CommitLineData
8414a40c
VZ
1/* $Id$ */
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
43static void
44setByteArray(void** vpp, void* vp, size_t nmemb, size_t elem_size)
45{
46 if (*vpp)
47 _TIFFfree(*vpp), *vpp = 0;
48 if (vp) {
80ed523f 49 tmsize_t bytes = (tmsize_t)(nmemb * elem_size);
8414a40c
VZ
50 if (elem_size && bytes / elem_size == nmemb)
51 *vpp = (void*) _TIFFmalloc(bytes);
52 if (*vpp)
53 _TIFFmemcpy(*vpp, vp, bytes);
54 }
55}
56void _TIFFsetByteArray(void** vpp, void* vp, uint32 n)
57 { setByteArray(vpp, vp, n, 1); }
58void _TIFFsetString(char** cpp, char* cp)
59 { setByteArray((void**) cpp, (void*) cp, strlen(cp)+1, 1); }
60void _TIFFsetNString(char** cpp, char* cp, uint32 n)
61 { setByteArray((void**) cpp, (void*) cp, n, 1); }
62void _TIFFsetShortArray(uint16** wpp, uint16* wp, uint32 n)
63 { setByteArray((void**) wpp, (void*) wp, n, sizeof (uint16)); }
64void _TIFFsetLongArray(uint32** lpp, uint32* lp, uint32 n)
65 { setByteArray((void**) lpp, (void*) lp, n, sizeof (uint32)); }
80ed523f
VZ
66void _TIFFsetLong8Array(uint64** lpp, uint64* lp, uint32 n)
67 { setByteArray((void**) lpp, (void*) lp, n, sizeof (uint64)); }
8414a40c
VZ
68void _TIFFsetFloatArray(float** fpp, float* fp, uint32 n)
69 { setByteArray((void**) fpp, (void*) fp, n, sizeof (float)); }
70void _TIFFsetDoubleArray(double** dpp, double* dp, uint32 n)
71 { setByteArray((void**) dpp, (void*) dp, n, sizeof (double)); }
72
80ed523f
VZ
73static void
74setDoubleArrayOneValue(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
8414a40c
VZ
86/*
87 * Install extra samples information.
88 */
89static int
90setExtraSamples(TIFFDirectory* td, va_list ap, uint32* v)
91{
80ed523f
VZ
92/* XXX: Unassociated alpha data == 999 is a known Corel Draw bug, see below */
93#define EXTRASAMPLE_COREL_UNASSALPHA 999
94
8414a40c
VZ
95 uint16* va;
96 uint32 i;
97
80ed523f 98 *v = (uint16) va_arg(ap, uint16_vap);
8414a40c 99 if ((uint16) *v > td->td_samplesperpixel)
80ed523f 100 return 0;
8414a40c
VZ
101 va = va_arg(ap, uint16*);
102 if (*v > 0 && va == NULL) /* typically missing param */
80ed523f
VZ
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 }
8414a40c
VZ
118 td->td_extrasamples = (uint16) *v;
119 _TIFFsetShortArray(&td->td_sampleinfo, va, td->td_extrasamples);
80ed523f
VZ
120 return 1;
121
122#undef EXTRASAMPLE_COREL_UNASSALPHA
8414a40c
VZ
123}
124
80ed523f
VZ
125/*
126 * Confirm we have "samplesperpixel" ink names separated by \0. Returns
127 * zero if the ink names are not as expected.
128 */
8414a40c
VZ
129static uint32
130checkInkNamesString(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--) {
80ed523f
VZ
139 for (; cp < ep && *cp != '\0'; cp++) {}
140 if (cp >= ep)
141 goto bad;
8414a40c
VZ
142 cp++; /* skip \0 */
143 }
80ed523f 144 return ((uint32)(cp-s));
8414a40c
VZ
145 }
146bad:
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
155static int
80ed523f 156_TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
8414a40c
VZ
157{
158 static const char module[] = "_TIFFVSetField";
80ed523f 159
8414a40c
VZ
160 TIFFDirectory* td = &tif->tif_dir;
161 int status = 1;
162 uint32 v32, i, v;
163 char* s;
80ed523f
VZ
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 }
8414a40c 176
80ed523f 177 switch (standard_tag) {
8414a40c 178 case TIFFTAG_SUBFILETYPE:
80ed523f 179 td->td_subfiletype = (uint32) va_arg(ap, uint32);
8414a40c
VZ
180 break;
181 case TIFFTAG_IMAGEWIDTH:
80ed523f 182 td->td_imagewidth = (uint32) va_arg(ap, uint32);
8414a40c
VZ
183 break;
184 case TIFFTAG_IMAGELENGTH:
80ed523f 185 td->td_imagelength = (uint32) va_arg(ap, uint32);
8414a40c
VZ
186 break;
187 case TIFFTAG_BITSPERSAMPLE:
80ed523f 188 td->td_bitspersample = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
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) {
80ed523f
VZ
197 if (td->td_bitspersample == 8)
198 tif->tif_postdecode = _TIFFNoPostDecode;
199 else if (td->td_bitspersample == 16)
8414a40c
VZ
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:
80ed523f 212 v = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
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)) {
80ed523f 219 if ((uint32)td->td_compression == v)
8414a40c
VZ
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 )
80ed523f
VZ
228 td->td_compression = (uint16) v;
229 else
230 status = 0;
8414a40c
VZ
231 break;
232 case TIFFTAG_PHOTOMETRIC:
80ed523f 233 td->td_photometric = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
234 break;
235 case TIFFTAG_THRESHHOLDING:
80ed523f 236 td->td_threshholding = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
237 break;
238 case TIFFTAG_FILLORDER:
80ed523f 239 v = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
240 if (v != FILLORDER_LSB2MSB && v != FILLORDER_MSB2LSB)
241 goto badvalue;
242 td->td_fillorder = (uint16) v;
243 break;
8414a40c 244 case TIFFTAG_ORIENTATION:
80ed523f
VZ
245 v = (uint16) va_arg(ap, uint16_vap);
246 if (v < ORIENTATION_TOPLEFT || ORIENTATION_LEFTBOT < v)
247 goto badvalue;
248 else
8414a40c
VZ
249 td->td_orientation = (uint16) v;
250 break;
251 case TIFFTAG_SAMPLESPERPIXEL:
80ed523f 252 v = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
253 if (v == 0)
254 goto badvalue;
255 td->td_samplesperpixel = (uint16) v;
256 break;
257 case TIFFTAG_ROWSPERSTRIP:
80ed523f 258 v32 = (uint32) va_arg(ap, uint32);
8414a40c
VZ
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:
80ed523f 268 td->td_minsamplevalue = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
269 break;
270 case TIFFTAG_MAXSAMPLEVALUE:
80ed523f 271 td->td_maxsamplevalue = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
272 break;
273 case TIFFTAG_SMINSAMPLEVALUE:
80ed523f
VZ
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);
8414a40c
VZ
278 break;
279 case TIFFTAG_SMAXSAMPLEVALUE:
80ed523f
VZ
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);
8414a40c
VZ
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:
80ed523f 292 v = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
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:
80ed523f 304 v = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
305 if (v < RESUNIT_NONE || RESUNIT_CENTIMETER < v)
306 goto badvalue;
307 td->td_resolutionunit = (uint16) v;
308 break;
309 case TIFFTAG_PAGENUMBER:
80ed523f
VZ
310 td->td_pagenumber[0] = (uint16) va_arg(ap, uint16_vap);
311 td->td_pagenumber[1] = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
312 break;
313 case TIFFTAG_HALFTONEHINTS:
80ed523f
VZ
314 td->td_halftonehints[0] = (uint16) va_arg(ap, uint16_vap);
315 td->td_halftonehints[1] = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
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:
80ed523f 328 td->td_extrasamples = (((uint16) va_arg(ap, uint16_vap)) != 0);
8414a40c
VZ
329 if (td->td_extrasamples) {
330 uint16 sv = EXTRASAMPLE_ASSOCALPHA;
331 _TIFFsetShortArray(&td->td_sampleinfo, &sv, 1);
332 }
333 break;
334 case TIFFTAG_TILEWIDTH:
80ed523f 335 v32 = (uint32) va_arg(ap, uint32);
8414a40c
VZ
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:
80ed523f 346 v32 = (uint32) va_arg(ap, uint32);
8414a40c
VZ
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:
80ed523f 357 v32 = (uint32) va_arg(ap, uint32);
8414a40c
VZ
358 if (v32 == 0)
359 goto badvalue32;
360 td->td_tiledepth = v32;
361 break;
362 case TIFFTAG_DATATYPE:
80ed523f 363 v = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
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:
80ed523f 374 v = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
375 if (v < SAMPLEFORMAT_UINT || SAMPLEFORMAT_COMPLEXIEEEFP < v)
376 goto badvalue;
377 td->td_sampleformat = (uint16) v;
378
80ed523f
VZ
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;
8414a40c
VZ
389 break;
390 case TIFFTAG_IMAGEDEPTH:
80ed523f 391 td->td_imagedepth = (uint32) va_arg(ap, uint32);
8414a40c
VZ
392 break;
393 case TIFFTAG_SUBIFD:
394 if ((tif->tif_flags & TIFF_INSUBIFD) == 0) {
80ed523f
VZ
395 td->td_nsubifd = (uint16) va_arg(ap, uint16_vap);
396 _TIFFsetLong8Array(&td->td_subifd, (uint64*) va_arg(ap, uint64*),
8414a40c
VZ
397 (long) td->td_nsubifd);
398 } else {
80ed523f
VZ
399 TIFFErrorExt(tif->tif_clientdata, module,
400 "%s: Sorry, cannot nest SubIFDs",
401 tif->tif_name);
8414a40c
VZ
402 status = 0;
403 }
404 break;
405 case TIFFTAG_YCBCRPOSITIONING:
80ed523f 406 td->td_ycbcrpositioning = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
407 break;
408 case TIFFTAG_YCBCRSUBSAMPLING:
80ed523f
VZ
409 td->td_ycbcrsubsampling[0] = (uint16) va_arg(ap, uint16_vap);
410 td->td_ycbcrsubsampling[1] = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
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;
80ed523f
VZ
418 case TIFFTAG_REFERENCEBLACKWHITE:
419 /* XXX should check for null range */
420 _TIFFsetFloatArray(&td->td_refblackwhite, va_arg(ap, float*), 6);
421 break;
8414a40c 422 case TIFFTAG_INKNAMES:
80ed523f 423 v = (uint16) va_arg(ap, uint16_vap);
8414a40c
VZ
424 s = va_arg(ap, char*);
425 v = checkInkNamesString(tif, v, s);
80ed523f 426 status = v > 0;
8414a40c
VZ
427 if( v > 0 ) {
428 _TIFFsetNString(&td->td_inknames, s, v);
429 td->td_inknameslen = v;
430 }
431 break;
80ed523f
VZ
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;
8414a40c 438 break;
80ed523f
VZ
439 default: {
440 TIFFTagValue *tv;
441 int tv_size, iCustom;
8414a40c 442
80ed523f
VZ
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) {
8414a40c 453 TIFFErrorExt(tif->tif_clientdata, module,
80ed523f
VZ
454 "%s: Invalid %stag \"%s\" (not supported by codec)",
455 tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "",
456 fip ? fip->field_name : "Unknown");
8414a40c 457 status = 0;
80ed523f 458 break;
8414a40c
VZ
459 }
460
80ed523f
VZ
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 }
8414a40c 475
80ed523f
VZ
476 /*
477 * Grow the custom list if the entry was not found.
478 */
479 if(tv == NULL) {
480 TIFFTagValue *new_customValues;
8414a40c 481
80ed523f
VZ
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;
8414a40c
VZ
500 }
501
80ed523f
VZ
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) {
8414a40c
VZ
592 case TIFF_BYTE:
593 case TIFF_UNDEFINED:
80ed523f
VZ
594 {
595 uint8 v = (uint8)va_arg(ap, int);
596 _TIFFmemcpy(val, &v, tv_size);
597 }
598 break;
8414a40c 599 case TIFF_SBYTE:
80ed523f
VZ
600 {
601 int8 v = (int8)va_arg(ap, int);
602 _TIFFmemcpy(val, &v, tv_size);
603 }
604 break;
8414a40c 605 case TIFF_SHORT:
80ed523f
VZ
606 {
607 uint16 v = (uint16)va_arg(ap, int);
608 _TIFFmemcpy(val, &v, tv_size);
609 }
610 break;
8414a40c 611 case TIFF_SSHORT:
80ed523f
VZ
612 {
613 int16 v = (int16)va_arg(ap, int);
614 _TIFFmemcpy(val, &v, tv_size);
615 }
616 break;
8414a40c
VZ
617 case TIFF_LONG:
618 case TIFF_IFD:
80ed523f
VZ
619 {
620 uint32 v = va_arg(ap, uint32);
621 _TIFFmemcpy(val, &v, tv_size);
622 }
623 break;
8414a40c 624 case TIFF_SLONG:
80ed523f
VZ
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;
8414a40c
VZ
643 case TIFF_RATIONAL:
644 case TIFF_SRATIONAL:
645 case TIFF_FLOAT:
80ed523f
VZ
646 {
647 float v = (float)va_arg(ap, double);
648 _TIFFmemcpy(val, &v, tv_size);
649 }
650 break;
8414a40c 651 case TIFF_DOUBLE:
80ed523f
VZ
652 {
653 double v = va_arg(ap, double);
654 _TIFFmemcpy(val, &v, tv_size);
655 }
656 break;
8414a40c 657 default:
80ed523f
VZ
658 _TIFFmemset(val, 0, tv_size);
659 status = 0;
660 break;
661 }
662 }
8414a40c 663 }
80ed523f 664 }
8414a40c
VZ
665 }
666 if (status) {
80ed523f
VZ
667 const TIFFField* fip=TIFFFieldWithTag(tif,tag);
668 if (fip)
669 TIFFSetFieldBit(tif, fip->field_bit);
8414a40c
VZ
670 tif->tif_flags |= TIFF_DIRTYDIRECT;
671 }
672
673end:
674 va_end(ap);
675 return (status);
676badvalue:
80ed523f
VZ
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 }
8414a40c
VZ
685 return (0);
686badvalue32:
80ed523f
VZ
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 }
8414a40c
VZ
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 */
707static int
80ed523f 708OkToChangeTag(TIFF* tif, uint32 tag)
8414a40c 709{
80ed523f 710 const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY);
8414a40c
VZ
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 */
739int
80ed523f 740TIFFSetField(TIFF* tif, uint32 tag, ...)
8414a40c
VZ
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
80ed523f
VZ
751/*
752 * Clear the contents of the field in the internal structure.
753 */
754int
755TIFFUnsetField(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
8414a40c
VZ
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 */
798int
80ed523f 799TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
8414a40c
VZ
800{
801 return OkToChangeTag(tif, tag) ?
802 (*tif->tif_tagmethods.vsetfield)(tif, tag, ap) : 0;
803}
804
805static int
80ed523f 806_TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
8414a40c 807{
80ed523f
VZ
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 }
8414a40c 822
80ed523f
VZ
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;
8414a40c 999
80ed523f
VZ
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 }
8414a40c 1020
80ed523f
VZ
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;
8414a40c 1027
80ed523f
VZ
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;
8414a40c 1037 ret_val = 1;
80ed523f
VZ
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];
8414a40c 1046 ret_val = 1;
80ed523f
VZ
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;
8414a40c 1121 }
8414a40c 1122 }
80ed523f
VZ
1123 }
1124 return(ret_val);
8414a40c
VZ
1125}
1126
1127/*
1128 * Return the value of a field in the
1129 * internal directory structure.
1130 */
1131int
80ed523f 1132TIFFGetField(TIFF* tif, uint32 tag, ...)
8414a40c
VZ
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 */
1149int
80ed523f 1150TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
8414a40c 1151{
80ed523f 1152 const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY);
8414a40c
VZ
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 */
1167void
1168TIFFFreeDirectory(TIFF* tif)
1169{
1170 TIFFDirectory *td = &tif->tif_dir;
1171 int i;
1172
1173 _TIFFmemset(td->td_fieldsset, 0, FIELD_SETLONGS);
80ed523f
VZ
1174 CleanupField(td_sminsamplevalue);
1175 CleanupField(td_smaxsamplevalue);
8414a40c
VZ
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);
80ed523f 1182 CleanupField(td_refblackwhite);
8414a40c
VZ
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);
80ed523f
VZ
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
8414a40c
VZ
1204}
1205#undef CleanupField
1206
1207/*
1208 * Client Tag extension support (from Niles Ritter).
1209 */
1210static TIFFExtendProc _TIFFextender = (TIFFExtendProc) NULL;
1211
1212TIFFExtendProc
1213TIFFSetTagExtender(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 */
1227int
1228TIFFCreateDirectory(TIFF* tif)
1229{
80ed523f
VZ
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
1240int
1241TIFFCreateCustomDirectory(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
1261int
1262TIFFCreateEXIFDirectory(TIFF* tif)
1263{
1264 const TIFFFieldArray* exifFieldArray;
1265 exifFieldArray = _TIFFGetExifFields();
1266 return TIFFCreateCustomDirectory(tif, exifFieldArray);
8414a40c
VZ
1267}
1268
1269/*
1270 * Setup a default directory structure.
1271 */
1272int
1273TIFFDefaultDirectory(TIFF* tif)
1274{
1275 register TIFFDirectory* td = &tif->tif_dir;
80ed523f 1276 const TIFFFieldArray* tiffFieldArray;
8414a40c 1277
80ed523f
VZ
1278 tiffFieldArray = _TIFFGetFields();
1279 _TIFFSetupFields(tif, tiffFieldArray);
8414a40c
VZ
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;
80ed523f 1291 td->td_stripbytecountsorted = 1; /* Our own arrays always sorted. */
8414a40c
VZ
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;
80ed523f
VZ
1298 tif->tif_postdecode = _TIFFNoPostDecode;
1299 tif->tif_foundfield = NULL;
1300 tif->tif_tagmethods.vsetfield = _TIFFVSetField;
8414a40c
VZ
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
80ed523f
VZ
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;
8414a40c
VZ
1326
1327 return (1);
1328}
1329
1330static int
80ed523f 1331TIFFAdvanceDirectory(TIFF* tif, uint64* nextdir, uint64* off)
8414a40c 1332{
80ed523f
VZ
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 }
8414a40c
VZ
1465}
1466
1467/*
1468 * Count the number of directories in a file.
1469 */
80ed523f 1470uint16
8414a40c
VZ
1471TIFFNumberOfDirectories(TIFF* tif)
1472{
80ed523f
VZ
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);
8414a40c
VZ
1483}
1484
1485/*
1486 * Set the n-th directory as the current directory.
1487 * NB: Directories are numbered starting at 0.
1488 */
1489int
80ed523f 1490TIFFSetDirectory(TIFF* tif, uint16 dirn)
8414a40c 1491{
80ed523f
VZ
1492 uint64 nextdir;
1493 uint16 n;
8414a40c 1494
80ed523f
VZ
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;
8414a40c
VZ
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 */
1523int
80ed523f 1524TIFFSetSubDirectory(TIFF* tif, uint64 diroff)
8414a40c
VZ
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 */
80ed523f 1538uint64
8414a40c
VZ
1539TIFFCurrentDirOffset(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 */
1548int
1549TIFFLastDirectory(TIFF* tif)
1550{
1551 return (tif->tif_nextdiroff == 0);
1552}
1553
1554/*
1555 * Unlink the specified directory from the directory chain.
1556 */
1557int
80ed523f 1558TIFFUnlinkDirectory(TIFF* tif, uint16 dirn)
8414a40c
VZ
1559{
1560 static const char module[] = "TIFFUnlinkDirectory";
80ed523f
VZ
1561 uint64 nextdir;
1562 uint64 off;
1563 uint16 n;
8414a40c
VZ
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 */
80ed523f
VZ
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 }
8414a40c
VZ
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);
80ed523f
VZ
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 }
8414a40c
VZ
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;
80ed523f
VZ
1638 tif->tif_rawdataoff = 0;
1639 tif->tif_rawdataloaded = 0;
8414a40c 1640 }
80ed523f 1641 tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP|TIFF_POSTENCODE|TIFF_BUF4WRITE);
8414a40c
VZ
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;
80ed523f 1648 tif->tif_curstrip = (uint32) -1;
8414a40c
VZ
1649 return (1);
1650}
1651
8414a40c 1652/* vim: set ts=8 sts=8 sw=8 noet: */
80ed523f
VZ
1653/*
1654 * Local Variables:
1655 * mode: c
1656 * c-basic-offset: 8
1657 * fill-column: 78
1658 * End:
1659 */