1/* $Id: tif_print.c,v 1.36.2.4 2010-06-08 18:50:42 bfriesen 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 Printing Support 31 */ 32#include "tiffiop.h" 33#include <stdio.h> 34#include <string.h> 35#include <ctype.h> 36 37static const char *photoNames[] = { 38 "min-is-white", /* PHOTOMETRIC_MINISWHITE */ 39 "min-is-black", /* PHOTOMETRIC_MINISBLACK */ 40 "RGB color", /* PHOTOMETRIC_RGB */ 41 "palette color (RGB from colormap)", /* PHOTOMETRIC_PALETTE */ 42 "transparency mask", /* PHOTOMETRIC_MASK */ 43 "separated", /* PHOTOMETRIC_SEPARATED */ 44 "YCbCr", /* PHOTOMETRIC_YCBCR */ 45 "7 (0x7)", 46 "CIE L*a*b*", /* PHOTOMETRIC_CIELAB */ 47}; 48#define NPHOTONAMES (sizeof (photoNames) / sizeof (photoNames[0])) 49 50static const char *orientNames[] = { 51 "0 (0x0)", 52 "row 0 top, col 0 lhs", /* ORIENTATION_TOPLEFT */ 53 "row 0 top, col 0 rhs", /* ORIENTATION_TOPRIGHT */ 54 "row 0 bottom, col 0 rhs", /* ORIENTATION_BOTRIGHT */ 55 "row 0 bottom, col 0 lhs", /* ORIENTATION_BOTLEFT */ 56 "row 0 lhs, col 0 top", /* ORIENTATION_LEFTTOP */ 57 "row 0 rhs, col 0 top", /* ORIENTATION_RIGHTTOP */ 58 "row 0 rhs, col 0 bottom", /* ORIENTATION_RIGHTBOT */ 59 "row 0 lhs, col 0 bottom", /* ORIENTATION_LEFTBOT */ 60}; 61#define NORIENTNAMES (sizeof (orientNames) / sizeof (orientNames[0])) 62 63static void 64_TIFFPrintField(FILE* fd, const TIFFFieldInfo *fip, 65 uint32 value_count, void *raw_data) 66{ 67 uint32 j; 68 69 fprintf(fd, " %s: ", fip->field_name); 70 71 for(j = 0; j < value_count; j++) { 72 if(fip->field_type == TIFF_BYTE) 73 fprintf(fd, "%u", ((uint8 *) raw_data)[j]); 74 else if(fip->field_type == TIFF_UNDEFINED) 75 fprintf(fd, "0x%x", 76 (unsigned int) ((unsigned char *) raw_data)[j]); 77 else if(fip->field_type == TIFF_SBYTE) 78 fprintf(fd, "%d", ((int8 *) raw_data)[j]); 79 else if(fip->field_type == TIFF_SHORT) 80 fprintf(fd, "%u", ((uint16 *) raw_data)[j]); 81 else if(fip->field_type == TIFF_SSHORT) 82 fprintf(fd, "%d", ((int16 *) raw_data)[j]); 83 else if(fip->field_type == TIFF_LONG) 84 fprintf(fd, "%lu", 85 (unsigned long)((uint32 *) raw_data)[j]); 86 else if(fip->field_type == TIFF_SLONG) 87 fprintf(fd, "%ld", (long)((int32 *) raw_data)[j]); 88 else if(fip->field_type == TIFF_RATIONAL 89 || fip->field_type == TIFF_SRATIONAL 90 || fip->field_type == TIFF_FLOAT) 91 fprintf(fd, "%f", ((float *) raw_data)[j]); 92 else if(fip->field_type == TIFF_IFD) 93 fprintf(fd, "0x%ulx", ((uint32 *) raw_data)[j]); 94 else if(fip->field_type == TIFF_ASCII) { 95 fprintf(fd, "%s", (char *) raw_data); 96 break; 97 } 98 else if(fip->field_type == TIFF_DOUBLE) 99 fprintf(fd, "%f", ((double *) raw_data)[j]); 100 else if(fip->field_type == TIFF_FLOAT) 101 fprintf(fd, "%f", ((float *)raw_data)[j]); 102 else { 103 fprintf(fd, "<unsupported data type in TIFFPrint>"); 104 break; 105 } 106 107 if(j < value_count - 1) 108 fprintf(fd, ","); 109 } 110 111 fprintf(fd, "\n"); 112} 113 114static int 115_TIFFPrettyPrintField(TIFF* tif, FILE* fd, ttag_t tag, 116 uint32 value_count, void *raw_data) 117{ 118 TIFFDirectory *td = &tif->tif_dir; 119 120 switch (tag) 121 { 122 case TIFFTAG_INKSET: 123 fprintf(fd, " Ink Set: "); 124 switch (*((uint16*)raw_data)) { 125 case INKSET_CMYK: 126 fprintf(fd, "CMYK\n"); 127 break; 128 default: 129 fprintf(fd, "%u (0x%x)\n", 130 *((uint16*)raw_data), 131 *((uint16*)raw_data)); 132 break; 133 } 134 return 1; 135 case TIFFTAG_DOTRANGE: 136 fprintf(fd, " Dot Range: %u-%u\n", 137 ((uint16*)raw_data)[0], ((uint16*)raw_data)[1]); 138 return 1; 139 case TIFFTAG_WHITEPOINT: 140 fprintf(fd, " White Point: %g-%g\n", 141 ((float *)raw_data)[0], ((float *)raw_data)[1]); return 1; 142 case TIFFTAG_REFERENCEBLACKWHITE: 143 { 144 uint16 i; 145 146 fprintf(fd, " Reference Black/White:\n"); 147 for (i = 0; i < 3; i++) 148 fprintf(fd, " %2d: %5g %5g\n", i, 149 ((float *)raw_data)[2*i+0], 150 ((float *)raw_data)[2*i+1]); 151 return 1; 152 } 153 case TIFFTAG_XMLPACKET: 154 { 155 uint32 i; 156 157 fprintf(fd, " XMLPacket (XMP Metadata):\n" ); 158 for(i = 0; i < value_count; i++) 159 fputc(((char *)raw_data)[i], fd); 160 fprintf( fd, "\n" ); 161 return 1; 162 } 163 case TIFFTAG_RICHTIFFIPTC: 164 /* 165 * XXX: for some weird reason RichTIFFIPTC tag 166 * defined as array of LONG values. 167 */ 168 fprintf(fd, 169 " RichTIFFIPTC Data: <present>, %lu bytes\n", 170 (unsigned long) value_count * 4); 171 return 1; 172 case TIFFTAG_PHOTOSHOP: 173 fprintf(fd, " Photoshop Data: <present>, %lu bytes\n", 174 (unsigned long) value_count); 175 return 1; 176 case TIFFTAG_ICCPROFILE: 177 fprintf(fd, " ICC Profile: <present>, %lu bytes\n", 178 (unsigned long) value_count); 179 return 1; 180 case TIFFTAG_STONITS: 181 fprintf(fd, 182 " Sample to Nits conversion factor: %.4e\n", 183 *((double*)raw_data)); 184 return 1; 185 } 186 187 return 0; 188} 189 190/* 191 * Print the contents of the current directory 192 * to the specified stdio file stream. 193 */ 194void 195TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) 196{ 197 TIFFDirectory *td = &tif->tif_dir; 198 char *sep; 199 uint16 i; 200 long l, n; 201 202 fprintf(fd, "TIFF Directory at offset 0x%lx (%lu)\n", 203 (unsigned long)tif->tif_diroff, (unsigned long)tif->tif_diroff); 204 if (TIFFFieldSet(tif,FIELD_SUBFILETYPE)) { 205 fprintf(fd, " Subfile Type:"); 206 sep = " "; 207 if (td->td_subfiletype & FILETYPE_REDUCEDIMAGE) { 208 fprintf(fd, "%sreduced-resolution image", sep); 209 sep = "/"; 210 } 211 if (td->td_subfiletype & FILETYPE_PAGE) { 212 fprintf(fd, "%smulti-page document", sep); 213 sep = "/"; 214 } 215 if (td->td_subfiletype & FILETYPE_MASK) 216 fprintf(fd, "%stransparency mask", sep); 217 fprintf(fd, " (%lu = 0x%lx)\n", 218 (long) td->td_subfiletype, (long) td->td_subfiletype); 219 } 220 if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS)) { 221 fprintf(fd, " Image Width: %lu Image Length: %lu", 222 (unsigned long) td->td_imagewidth, (unsigned long) td->td_imagelength); 223 if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH)) 224 fprintf(fd, " Image Depth: %lu", 225 (unsigned long) td->td_imagedepth); 226 fprintf(fd, "\n"); 227 } 228 if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS)) { 229 fprintf(fd, " Tile Width: %lu Tile Length: %lu", 230 (unsigned long) td->td_tilewidth, (unsigned long) td->td_tilelength); 231 if (TIFFFieldSet(tif,FIELD_TILEDEPTH)) 232 fprintf(fd, " Tile Depth: %lu", 233 (unsigned long) td->td_tiledepth); 234 fprintf(fd, "\n"); 235 } 236 if (TIFFFieldSet(tif,FIELD_RESOLUTION)) { 237 fprintf(fd, " Resolution: %g, %g", 238 td->td_xresolution, td->td_yresolution); 239 if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT)) { 240 switch (td->td_resolutionunit) { 241 case RESUNIT_NONE: 242 fprintf(fd, " (unitless)"); 243 break; 244 case RESUNIT_INCH: 245 fprintf(fd, " pixels/inch"); 246 break; 247 case RESUNIT_CENTIMETER: 248 fprintf(fd, " pixels/cm"); 249 break; 250 default: 251 fprintf(fd, " (unit %u = 0x%x)", 252 td->td_resolutionunit, 253 td->td_resolutionunit); 254 break; 255 } 256 } 257 fprintf(fd, "\n"); 258 } 259 if (TIFFFieldSet(tif,FIELD_POSITION)) 260 fprintf(fd, " Position: %g, %g\n", 261 td->td_xposition, td->td_yposition); 262 if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE)) 263 fprintf(fd, " Bits/Sample: %u\n", td->td_bitspersample); 264 if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT)) { 265 fprintf(fd, " Sample Format: "); 266 switch (td->td_sampleformat) { 267 case SAMPLEFORMAT_VOID: 268 fprintf(fd, "void\n"); 269 break; 270 case SAMPLEFORMAT_INT: 271 fprintf(fd, "signed integer\n"); 272 break; 273 case SAMPLEFORMAT_UINT: 274 fprintf(fd, "unsigned integer\n"); 275 break; 276 case SAMPLEFORMAT_IEEEFP: 277 fprintf(fd, "IEEE floating point\n"); 278 break; 279 case SAMPLEFORMAT_COMPLEXINT: 280 fprintf(fd, "complex signed integer\n"); 281 break; 282 case SAMPLEFORMAT_COMPLEXIEEEFP: 283 fprintf(fd, "complex IEEE floating point\n"); 284 break; 285 default: 286 fprintf(fd, "%u (0x%x)\n", 287 td->td_sampleformat, td->td_sampleformat); 288 break; 289 } 290 } 291 if (TIFFFieldSet(tif,FIELD_COMPRESSION)) { 292 const TIFFCodec* c = TIFFFindCODEC(td->td_compression); 293 fprintf(fd, " Compression Scheme: "); 294 if (c) 295 fprintf(fd, "%s\n", c->name); 296 else 297 fprintf(fd, "%u (0x%x)\n", 298 td->td_compression, td->td_compression); 299 } 300 if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC)) { 301 fprintf(fd, " Photometric Interpretation: "); 302 if (td->td_photometric < NPHOTONAMES) 303 fprintf(fd, "%s\n", photoNames[td->td_photometric]); 304 else { 305 switch (td->td_photometric) { 306 case PHOTOMETRIC_LOGL: 307 fprintf(fd, "CIE Log2(L)\n"); 308 break; 309 case PHOTOMETRIC_LOGLUV: 310 fprintf(fd, "CIE Log2(L) (u',v')\n"); 311 break; 312 default: 313 fprintf(fd, "%u (0x%x)\n", 314 td->td_photometric, td->td_photometric); 315 break; 316 } 317 } 318 } 319 if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES) && td->td_extrasamples) { 320 fprintf(fd, " Extra Samples: %u<", td->td_extrasamples); 321 sep = ""; 322 for (i = 0; i < td->td_extrasamples; i++) { 323 switch (td->td_sampleinfo[i]) { 324 case EXTRASAMPLE_UNSPECIFIED: 325 fprintf(fd, "%sunspecified", sep); 326 break; 327 case EXTRASAMPLE_ASSOCALPHA: 328 fprintf(fd, "%sassoc-alpha", sep); 329 break; 330 case EXTRASAMPLE_UNASSALPHA: 331 fprintf(fd, "%sunassoc-alpha", sep); 332 break; 333 default: 334 fprintf(fd, "%s%u (0x%x)", sep, 335 td->td_sampleinfo[i], td->td_sampleinfo[i]); 336 break; 337 } 338 sep = ", "; 339 } 340 fprintf(fd, ">\n"); 341 } 342 if (TIFFFieldSet(tif,FIELD_INKNAMES)) { 343 char* cp; 344 fprintf(fd, " Ink Names: "); 345 i = td->td_samplesperpixel; 346 sep = ""; 347 for (cp = td->td_inknames; i > 0; cp = strchr(cp,'\0')+1, i--) { 348 fputs(sep, fd); 349 _TIFFprintAscii(fd, cp); 350 sep = ", "; 351 } 352 fputs("\n", fd); 353 } 354 if (TIFFFieldSet(tif,FIELD_THRESHHOLDING)) { 355 fprintf(fd, " Thresholding: "); 356 switch (td->td_threshholding) { 357 case THRESHHOLD_BILEVEL: 358 fprintf(fd, "bilevel art scan\n"); 359 break; 360 case THRESHHOLD_HALFTONE: 361 fprintf(fd, "halftone or dithered scan\n"); 362 break; 363 case THRESHHOLD_ERRORDIFFUSE: 364 fprintf(fd, "error diffused\n"); 365 break; 366 default: 367 fprintf(fd, "%u (0x%x)\n", 368 td->td_threshholding, td->td_threshholding); 369 break; 370 } 371 } 372 if (TIFFFieldSet(tif,FIELD_FILLORDER)) { 373 fprintf(fd, " FillOrder: "); 374 switch (td->td_fillorder) { 375 case FILLORDER_MSB2LSB: 376 fprintf(fd, "msb-to-lsb\n"); 377 break; 378 case FILLORDER_LSB2MSB: 379 fprintf(fd, "lsb-to-msb\n"); 380 break; 381 default: 382 fprintf(fd, "%u (0x%x)\n", 383 td->td_fillorder, td->td_fillorder); 384 break; 385 } 386 } 387 if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING)) 388 { 389 /* 390 * For hacky reasons (see tif_jpeg.c - JPEGFixupTestSubsampling), 391 * we need to fetch this rather than trust what is in our 392 * structures. 393 */ 394 uint16 subsampling[2]; 395 396 TIFFGetField( tif, TIFFTAG_YCBCRSUBSAMPLING, 397 subsampling + 0, subsampling + 1 ); 398 fprintf(fd, " YCbCr Subsampling: %u, %u\n", 399 subsampling[0], subsampling[1] ); 400 } 401 if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING)) { 402 fprintf(fd, " YCbCr Positioning: "); 403 switch (td->td_ycbcrpositioning) { 404 case YCBCRPOSITION_CENTERED: 405 fprintf(fd, "centered\n"); 406 break; 407 case YCBCRPOSITION_COSITED: 408 fprintf(fd, "cosited\n"); 409 break; 410 default: 411 fprintf(fd, "%u (0x%x)\n", 412 td->td_ycbcrpositioning, td->td_ycbcrpositioning); 413 break; 414 } 415 } 416 if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS)) 417 fprintf(fd, " Halftone Hints: light %u dark %u\n", 418 td->td_halftonehints[0], td->td_halftonehints[1]); 419 if (TIFFFieldSet(tif,FIELD_ORIENTATION)) { 420 fprintf(fd, " Orientation: "); 421 if (td->td_orientation < NORIENTNAMES) 422 fprintf(fd, "%s\n", orientNames[td->td_orientation]); 423 else 424 fprintf(fd, "%u (0x%x)\n", 425 td->td_orientation, td->td_orientation); 426 } 427 if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL)) 428 fprintf(fd, " Samples/Pixel: %u\n", td->td_samplesperpixel); 429 if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP)) { 430 fprintf(fd, " Rows/Strip: "); 431 if (td->td_rowsperstrip == (uint32) -1) 432 fprintf(fd, "(infinite)\n"); 433 else 434 fprintf(fd, "%lu\n", (unsigned long) td->td_rowsperstrip); 435 } 436 if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE)) 437 fprintf(fd, " Min Sample Value: %u\n", td->td_minsamplevalue); 438 if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE)) 439 fprintf(fd, " Max Sample Value: %u\n", td->td_maxsamplevalue); 440 if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE)) 441 fprintf(fd, " SMin Sample Value: %g\n", 442 td->td_sminsamplevalue); 443 if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE)) 444 fprintf(fd, " SMax Sample Value: %g\n", 445 td->td_smaxsamplevalue); 446 if (TIFFFieldSet(tif,FIELD_PLANARCONFIG)) { 447 fprintf(fd, " Planar Configuration: "); 448 switch (td->td_planarconfig) { 449 case PLANARCONFIG_CONTIG: 450 fprintf(fd, "single image plane\n"); 451 break; 452 case PLANARCONFIG_SEPARATE: 453 fprintf(fd, "separate image planes\n"); 454 break; 455 default: 456 fprintf(fd, "%u (0x%x)\n", 457 td->td_planarconfig, td->td_planarconfig); 458 break; 459 } 460 } 461 if (TIFFFieldSet(tif,FIELD_PAGENUMBER)) 462 fprintf(fd, " Page Number: %u-%u\n", 463 td->td_pagenumber[0], td->td_pagenumber[1]); 464 if (TIFFFieldSet(tif,FIELD_COLORMAP)) { 465 fprintf(fd, " Color Map: "); 466 if (flags & TIFFPRINT_COLORMAP) { 467 fprintf(fd, "\n"); 468 n = 1L<<td->td_bitspersample; 469 for (l = 0; l < n; l++) 470 fprintf(fd, " %5lu: %5u %5u %5u\n", 471 l, 472 td->td_colormap[0][l], 473 td->td_colormap[1][l], 474 td->td_colormap[2][l]); 475 } else 476 fprintf(fd, "(present)\n"); 477 } 478 if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION)) { 479 fprintf(fd, " Transfer Function: "); 480 if (flags & TIFFPRINT_CURVES) { 481 fprintf(fd, "\n"); 482 n = 1L<<td->td_bitspersample; 483 for (l = 0; l < n; l++) { 484 fprintf(fd, " %2lu: %5u", 485 l, td->td_transferfunction[0][l]); 486 for (i = 1; i < td->td_samplesperpixel; i++) 487 fprintf(fd, " %5u", 488 td->td_transferfunction[i][l]); 489 fputc('\n', fd); 490 } 491 } else 492 fprintf(fd, "(present)\n"); 493 } 494 if (TIFFFieldSet(tif, FIELD_SUBIFD) && (td->td_subifd)) { 495 fprintf(fd, " SubIFD Offsets:"); 496 for (i = 0; i < td->td_nsubifd; i++) 497 fprintf(fd, " %5lu", (long) td->td_subifd[i]); 498 fputc('\n', fd); 499 } 500 501 /* 502 ** Custom tag support. 503 */ 504 { 505 int i; 506 short count; 507 508 count = (short) TIFFGetTagListCount(tif); 509 for(i = 0; i < count; i++) { 510 ttag_t tag = TIFFGetTagListEntry(tif, i); 511 const TIFFFieldInfo *fip; 512 uint32 value_count; 513 int mem_alloc = 0; 514 void *raw_data; 515 516 fip = TIFFFieldWithTag(tif, tag); 517 if(fip == NULL) 518 continue; 519 520 if(fip->field_passcount) { 521 if(TIFFGetField(tif, tag, &value_count, &raw_data) != 1) 522 continue; 523 } else { 524 if (fip->field_readcount == TIFF_VARIABLE 525 || fip->field_readcount == TIFF_VARIABLE2) 526 value_count = 1; 527 else if (fip->field_readcount == TIFF_SPP) 528 value_count = td->td_samplesperpixel; 529 else 530 value_count = fip->field_readcount; 531 if ((fip->field_type == TIFF_ASCII 532 || fip->field_readcount == TIFF_VARIABLE 533 || fip->field_readcount == TIFF_VARIABLE2 534 || fip->field_readcount == TIFF_SPP 535 || value_count > 1) 536 && fip->field_tag != TIFFTAG_PAGENUMBER 537 && fip->field_tag != TIFFTAG_HALFTONEHINTS 538 && fip->field_tag != TIFFTAG_YCBCRSUBSAMPLING 539 && fip->field_tag != TIFFTAG_DOTRANGE) { 540 if(TIFFGetField(tif, tag, &raw_data) != 1) 541 continue; 542 } else if (fip->field_tag != TIFFTAG_PAGENUMBER 543 && fip->field_tag != TIFFTAG_HALFTONEHINTS 544 && fip->field_tag != TIFFTAG_YCBCRSUBSAMPLING 545 && fip->field_tag != TIFFTAG_DOTRANGE) { 546 raw_data = _TIFFmalloc( 547 _TIFFDataSize(fip->field_type) 548 * value_count); 549 mem_alloc = 1; 550 if(TIFFGetField(tif, tag, raw_data) != 1) { 551 _TIFFfree(raw_data); 552 continue; 553 } 554 } else { 555 /* 556 * XXX: Should be fixed and removed, see the 557 * notes related to TIFFTAG_PAGENUMBER, 558 * TIFFTAG_HALFTONEHINTS, 559 * TIFFTAG_YCBCRSUBSAMPLING and 560 * TIFFTAG_DOTRANGE tags in tif_dir.c. */ 561 char *tmp; 562 raw_data = _TIFFmalloc( 563 _TIFFDataSize(fip->field_type) 564 * value_count); 565 tmp = raw_data; 566 mem_alloc = 1; 567 if(TIFFGetField(tif, tag, tmp, 568 tmp + _TIFFDataSize(fip->field_type)) != 1) { 569 _TIFFfree(raw_data); 570 continue; 571 } 572 } 573 } 574 575 /* 576 * Catch the tags which needs to be specially handled and 577 * pretty print them. If tag not handled in 578 * _TIFFPrettyPrintField() fall down and print it as any other 579 * tag. 580 */ 581 if (_TIFFPrettyPrintField(tif, fd, tag, value_count, raw_data)) { 582 if(mem_alloc) 583 _TIFFfree(raw_data); 584 continue; 585 } 586 else 587 _TIFFPrintField(fd, fip, value_count, raw_data); 588 589 if(mem_alloc) 590 _TIFFfree(raw_data); 591 } 592 } 593 594 if (tif->tif_tagmethods.printdir) 595 (*tif->tif_tagmethods.printdir)(tif, fd, flags); 596 if ((flags & TIFFPRINT_STRIPS) && 597 TIFFFieldSet(tif,FIELD_STRIPOFFSETS)) { 598 tstrip_t s; 599 600 fprintf(fd, " %lu %s:\n", 601 (long) td->td_nstrips, 602 isTiled(tif) ? "Tiles" : "Strips"); 603 for (s = 0; s < td->td_nstrips; s++) 604 fprintf(fd, " %3lu: [%8lu, %8lu]\n", 605 (unsigned long) s, 606 (unsigned long) td->td_stripoffset[s], 607 (unsigned long) td->td_stripbytecount[s]); 608 } 609} 610 611void 612_TIFFprintAscii(FILE* fd, const char* cp) 613{ 614 for (; *cp != '\0'; cp++) { 615 const char* tp; 616 617 if (isprint((int)*cp)) { 618 fputc(*cp, fd); 619 continue; 620 } 621 for (tp = "\tt\bb\rr\nn\vv"; *tp; tp++) 622 if (*tp++ == *cp) 623 break; 624 if (*tp) 625 fprintf(fd, "\\%c", *tp); 626 else 627 fprintf(fd, "\\%03o", *cp & 0xff); 628 } 629} 630 631void 632_TIFFprintAsciiTag(FILE* fd, const char* name, const char* value) 633{ 634 fprintf(fd, " %s: \"", name); 635 _TIFFprintAscii(fd, value); 636 fprintf(fd, "\"\n"); 637} 638 639/* vim: set ts=8 sts=8 sw=8 noet: */ 640/* 641 * Local Variables: 642 * mode: c 643 * c-basic-offset: 8 644 * fill-column: 78 645 * End: 646 */ 647