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