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