4 * Copyright (c) 1988-1997 Sam Leffler
5 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
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.
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.
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
30 * Directory Printing Support
37 static 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 */
46 "CIE L*a*b*", /* PHOTOMETRIC_CIELAB */
48 #define NPHOTONAMES (sizeof (photoNames) / sizeof (photoNames[0]))
50 static const char *orientNames
[] = {
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 */
61 #define NORIENTNAMES (sizeof (orientNames) / sizeof (orientNames[0]))
64 _TIFFPrintField(FILE* fd
, const TIFFFieldInfo
*fip
,
65 uint32 value_count
, void *raw_data
)
69 fprintf(fd
, " %s: ", fip
->field_name
);
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
)
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
)
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
);
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
]);
103 fprintf(fd
, "<unsupported data type in TIFFPrint>");
107 if(j
< value_count
- 1)
115 _TIFFPrettyPrintField(TIFF
* tif
, FILE* fd
, ttag_t tag
,
116 uint32 value_count
, void *raw_data
)
118 TIFFDirectory
*td
= &tif
->tif_dir
;
123 fprintf(fd
, " Ink Set: ");
124 switch (*((uint16
*)raw_data
)) {
126 fprintf(fd
, "CMYK\n");
129 fprintf(fd
, "%u (0x%x)\n",
130 *((uint16
*)raw_data
),
131 *((uint16
*)raw_data
));
135 case TIFFTAG_DOTRANGE
:
136 fprintf(fd
, " Dot Range: %u-%u\n",
137 ((uint16
*)raw_data
)[0], ((uint16
*)raw_data
)[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
:
146 fprintf(fd
, " Reference Black/White:\n");
147 for (i
= 0; i
< td
->td_samplesperpixel
; i
++)
148 fprintf(fd
, " %2d: %5g %5g\n", i
,
149 ((float *)raw_data
)[2*i
+0],
150 ((float *)raw_data
)[2*i
+1]);
153 case TIFFTAG_XMLPACKET
:
157 fprintf(fd
, " XMLPacket (XMP Metadata):\n" );
158 for(i
= 0; i
< value_count
; i
++)
159 fputc(((char *)raw_data
)[i
], fd
);
163 case TIFFTAG_RICHTIFFIPTC
:
165 * XXX: for some weird reason RichTIFFIPTC tag
166 * defined as array of LONG values.
169 " RichTIFFIPTC Data: <present>, %lu bytes\n",
170 (unsigned long) value_count
* 4);
172 case TIFFTAG_PHOTOSHOP
:
173 fprintf(fd
, " Photoshop Data: <present>, %lu bytes\n",
174 (unsigned long) value_count
);
176 case TIFFTAG_ICCPROFILE
:
177 fprintf(fd
, " ICC Profile: <present>, %lu bytes\n",
178 (unsigned long) value_count
);
180 case TIFFTAG_STONITS
:
182 " Sample to Nits conversion factor: %.4e\n",
183 *((double*)raw_data
));
191 * Print the contents of the current directory
192 * to the specified stdio file stream.
195 TIFFPrintDirectory(TIFF
* tif
, FILE* fd
, long flags
)
197 TIFFDirectory
*td
= &tif
->tif_dir
;
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:");
207 if (td
->td_subfiletype
& FILETYPE_REDUCEDIMAGE
) {
208 fprintf(fd
, "%sreduced-resolution image", sep
);
211 if (td
->td_subfiletype
& FILETYPE_PAGE
) {
212 fprintf(fd
, "%smulti-page document", sep
);
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
);
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
);
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
);
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
) {
242 fprintf(fd
, " (unitless)");
245 fprintf(fd
, " pixels/inch");
247 case RESUNIT_CENTIMETER
:
248 fprintf(fd
, " pixels/cm");
251 fprintf(fd
, " (unit %u = 0x%x)",
252 td
->td_resolutionunit
,
253 td
->td_resolutionunit
);
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");
270 case SAMPLEFORMAT_INT
:
271 fprintf(fd
, "signed integer\n");
273 case SAMPLEFORMAT_UINT
:
274 fprintf(fd
, "unsigned integer\n");
276 case SAMPLEFORMAT_IEEEFP
:
277 fprintf(fd
, "IEEE floating point\n");
279 case SAMPLEFORMAT_COMPLEXINT
:
280 fprintf(fd
, "complex signed integer\n");
282 case SAMPLEFORMAT_COMPLEXIEEEFP
:
283 fprintf(fd
, "complex IEEE floating point\n");
286 fprintf(fd
, "%u (0x%x)\n",
287 td
->td_sampleformat
, td
->td_sampleformat
);
291 if (TIFFFieldSet(tif
,FIELD_COMPRESSION
)) {
292 const TIFFCodec
* c
= TIFFFindCODEC(td
->td_compression
);
293 fprintf(fd
, " Compression Scheme: ");
295 fprintf(fd
, "%s\n", c
->name
);
297 fprintf(fd
, "%u (0x%x)\n",
298 td
->td_compression
, td
->td_compression
);
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
]);
305 switch (td
->td_photometric
) {
306 case PHOTOMETRIC_LOGL
:
307 fprintf(fd
, "CIE Log2(L)\n");
309 case PHOTOMETRIC_LOGLUV
:
310 fprintf(fd
, "CIE Log2(L) (u',v')\n");
313 fprintf(fd
, "%u (0x%x)\n",
314 td
->td_photometric
, td
->td_photometric
);
319 if (TIFFFieldSet(tif
,FIELD_EXTRASAMPLES
) && td
->td_extrasamples
) {
320 fprintf(fd
, " Extra Samples: %u<", td
->td_extrasamples
);
322 for (i
= 0; i
< td
->td_extrasamples
; i
++) {
323 switch (td
->td_sampleinfo
[i
]) {
324 case EXTRASAMPLE_UNSPECIFIED
:
325 fprintf(fd
, "%sunspecified", sep
);
327 case EXTRASAMPLE_ASSOCALPHA
:
328 fprintf(fd
, "%sassoc-alpha", sep
);
330 case EXTRASAMPLE_UNASSALPHA
:
331 fprintf(fd
, "%sunassoc-alpha", sep
);
334 fprintf(fd
, "%s%u (0x%x)", sep
,
335 td
->td_sampleinfo
[i
], td
->td_sampleinfo
[i
]);
342 if (TIFFFieldSet(tif
,FIELD_INKNAMES
)) {
344 fprintf(fd
, " Ink Names: ");
345 i
= td
->td_samplesperpixel
;
347 for (cp
= td
->td_inknames
; i
> 0; cp
= strchr(cp
,'\0')+1, i
--) {
349 _TIFFprintAscii(fd
, cp
);
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");
360 case THRESHHOLD_HALFTONE
:
361 fprintf(fd
, "halftone or dithered scan\n");
363 case THRESHHOLD_ERRORDIFFUSE
:
364 fprintf(fd
, "error diffused\n");
367 fprintf(fd
, "%u (0x%x)\n",
368 td
->td_threshholding
, td
->td_threshholding
);
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");
378 case FILLORDER_LSB2MSB
:
379 fprintf(fd
, "lsb-to-msb\n");
382 fprintf(fd
, "%u (0x%x)\n",
383 td
->td_fillorder
, td
->td_fillorder
);
387 if (TIFFFieldSet(tif
,FIELD_YCBCRSUBSAMPLING
))
390 * For hacky reasons (see tif_jpeg.c - JPEGFixupTestSubsampling),
391 * we need to fetch this rather than trust what is in our
394 uint16 subsampling
[2];
396 TIFFGetField( tif
, TIFFTAG_YCBCRSUBSAMPLING
,
397 subsampling
+ 0, subsampling
+ 1 );
398 fprintf(fd
, " YCbCr Subsampling: %u, %u\n",
399 subsampling
[0], subsampling
[1] );
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");
407 case YCBCRPOSITION_COSITED
:
408 fprintf(fd
, "cosited\n");
411 fprintf(fd
, "%u (0x%x)\n",
412 td
->td_ycbcrpositioning
, td
->td_ycbcrpositioning
);
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
]);
424 fprintf(fd
, "%u (0x%x)\n",
425 td
->td_orientation
, td
->td_orientation
);
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");
434 fprintf(fd
, "%lu\n", (unsigned long) td
->td_rowsperstrip
);
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");
452 case PLANARCONFIG_SEPARATE
:
453 fprintf(fd
, "separate image planes\n");
456 fprintf(fd
, "%u (0x%x)\n",
457 td
->td_planarconfig
, td
->td_planarconfig
);
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
) {
468 n
= 1L<<td
->td_bitspersample
;
469 for (l
= 0; l
< n
; l
++)
470 fprintf(fd
, " %5lu: %5u %5u %5u\n",
472 td
->td_colormap
[0][l
],
473 td
->td_colormap
[1][l
],
474 td
->td_colormap
[2][l
]);
476 fprintf(fd
, "(present)\n");
478 if (TIFFFieldSet(tif
,FIELD_TRANSFERFUNCTION
)) {
479 fprintf(fd
, " Transfer Function: ");
480 if (flags
& TIFFPRINT_CURVES
) {
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
++)
488 td
->td_transferfunction
[i
][l
]);
492 fprintf(fd
, "(present)\n");
494 if (TIFFFieldSet(tif
, FIELD_SUBIFD
)) {
495 fprintf(fd
, " SubIFD Offsets:");
496 for (i
= 0; i
< td
->td_nsubifd
; i
++)
497 fprintf(fd
, " %5lu", (long) td
->td_subifd
[i
]);
502 ** Custom tag support.
508 count
= (short) TIFFGetTagListCount(tif
);
509 for(i
= 0; i
< count
; i
++) {
510 ttag_t tag
= TIFFGetTagListEntry(tif
, i
);
511 const TIFFFieldInfo
*fip
;
516 fip
= TIFFFieldWithTag(tif
, tag
);
520 if(fip
->field_passcount
) {
521 if(TIFFGetField(tif
, tag
, &value_count
, &raw_data
) != 1)
524 if (fip
->field_readcount
== TIFF_VARIABLE
525 || fip
->field_readcount
== TIFF_VARIABLE2
)
527 else if (fip
->field_readcount
== TIFF_SPP
)
528 value_count
= td
->td_samplesperpixel
;
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
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)
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
)
550 if(TIFFGetField(tif
, tag
, raw_data
) != 1) {
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. */
562 raw_data
= _TIFFmalloc(
563 _TIFFDataSize(fip
->field_type
)
567 if(TIFFGetField(tif
, tag
, tmp
,
568 tmp
+ _TIFFDataSize(fip
->field_type
)) != 1) {
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
581 if (_TIFFPrettyPrintField(tif
, fd
, tag
, value_count
, raw_data
)) {
587 _TIFFPrintField(fd
, fip
, value_count
, raw_data
);
594 if (tif
->tif_tagmethods
.printdir
)
595 (*tif
->tif_tagmethods
.printdir
)(tif
, fd
, flags
);
596 if ((flags
& TIFFPRINT_STRIPS
) &&
597 TIFFFieldSet(tif
,FIELD_STRIPOFFSETS
)) {
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",
606 (unsigned long) td
->td_stripoffset
[s
],
607 (unsigned long) td
->td_stripbytecount
[s
]);
612 _TIFFprintAscii(FILE* fd
, const char* cp
)
614 for (; *cp
!= '\0'; cp
++) {
617 if (isprint((int)*cp
)) {
621 for (tp
= "\tt\bb\rr\nn\vv"; *tp
; tp
++)
625 fprintf(fd
, "\\%c", *tp
);
627 fprintf(fd
, "\\%03o", *cp
& 0xff);
632 _TIFFprintAsciiTag(FILE* fd
, const char* name
, const char* value
)
634 fprintf(fd
, " %s: \"", name
);
635 _TIFFprintAscii(fd
, value
);
639 /* vim: set ts=8 sts=8 sw=8 noet: */