1
/* $Id: tif_print.c,v 1.36.2.4 2010-06-08 18:50:42 bfriesen Exp $ */
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 < 3; 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) && (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]);
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: */
1
/* $Id: tif_print.c,v 1.37 2011/04/10 17:14:09 drolon Exp $ */
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_WHITEPOINT:
136
fprintf(fd, " White Point: %g-%g\n",
137
((float *)raw_data)[0], ((float *)raw_data)[1]); return 1;
138
case TIFFTAG_REFERENCEBLACKWHITE:
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]);
149
case TIFFTAG_XMLPACKET:
153
fprintf(fd, " XMLPacket (XMP Metadata):\n" );
154
for(i = 0; i < value_count; i++)
155
fputc(((char *)raw_data)[i], fd);
159
case TIFFTAG_RICHTIFFIPTC:
161
* XXX: for some weird reason RichTIFFIPTC tag
162
* defined as array of LONG values.
165
" RichTIFFIPTC Data: <present>, %lu bytes\n",
166
(unsigned long) value_count * 4);
168
case TIFFTAG_PHOTOSHOP:
169
fprintf(fd, " Photoshop Data: <present>, %lu bytes\n",
170
(unsigned long) value_count);
172
case TIFFTAG_ICCPROFILE:
173
fprintf(fd, " ICC Profile: <present>, %lu bytes\n",
174
(unsigned long) value_count);
176
case TIFFTAG_STONITS:
178
" Sample to Nits conversion factor: %.4e\n",
179
*((double*)raw_data));
187
* Print the contents of the current directory
188
* to the specified stdio file stream.
191
TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
193
TIFFDirectory *td = &tif->tif_dir;
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:");
203
if (td->td_subfiletype & FILETYPE_REDUCEDIMAGE) {
204
fprintf(fd, "%sreduced-resolution image", sep);
207
if (td->td_subfiletype & FILETYPE_PAGE) {
208
fprintf(fd, "%smulti-page document", sep);
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);
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);
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);
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) {
238
fprintf(fd, " (unitless)");
241
fprintf(fd, " pixels/inch");
243
case RESUNIT_CENTIMETER:
244
fprintf(fd, " pixels/cm");
247
fprintf(fd, " (unit %u = 0x%x)",
248
td->td_resolutionunit,
249
td->td_resolutionunit);
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");
266
case SAMPLEFORMAT_INT:
267
fprintf(fd, "signed integer\n");
269
case SAMPLEFORMAT_UINT:
270
fprintf(fd, "unsigned integer\n");
272
case SAMPLEFORMAT_IEEEFP:
273
fprintf(fd, "IEEE floating point\n");
275
case SAMPLEFORMAT_COMPLEXINT:
276
fprintf(fd, "complex signed integer\n");
278
case SAMPLEFORMAT_COMPLEXIEEEFP:
279
fprintf(fd, "complex IEEE floating point\n");
282
fprintf(fd, "%u (0x%x)\n",
283
td->td_sampleformat, td->td_sampleformat);
287
if (TIFFFieldSet(tif,FIELD_COMPRESSION)) {
288
const TIFFCodec* c = TIFFFindCODEC(td->td_compression);
289
fprintf(fd, " Compression Scheme: ");
291
fprintf(fd, "%s\n", c->name);
293
fprintf(fd, "%u (0x%x)\n",
294
td->td_compression, td->td_compression);
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]);
301
switch (td->td_photometric) {
302
case PHOTOMETRIC_LOGL:
303
fprintf(fd, "CIE Log2(L)\n");
305
case PHOTOMETRIC_LOGLUV:
306
fprintf(fd, "CIE Log2(L) (u',v')\n");
309
fprintf(fd, "%u (0x%x)\n",
310
td->td_photometric, td->td_photometric);
315
if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES) && td->td_extrasamples) {
316
fprintf(fd, " Extra Samples: %u<", td->td_extrasamples);
318
for (i = 0; i < td->td_extrasamples; i++) {
319
switch (td->td_sampleinfo[i]) {
320
case EXTRASAMPLE_UNSPECIFIED:
321
fprintf(fd, "%sunspecified", sep);
323
case EXTRASAMPLE_ASSOCALPHA:
324
fprintf(fd, "%sassoc-alpha", sep);
326
case EXTRASAMPLE_UNASSALPHA:
327
fprintf(fd, "%sunassoc-alpha", sep);
330
fprintf(fd, "%s%u (0x%x)", sep,
331
td->td_sampleinfo[i], td->td_sampleinfo[i]);
338
if (TIFFFieldSet(tif,FIELD_INKNAMES)) {
340
fprintf(fd, " Ink Names: ");
341
i = td->td_samplesperpixel;
343
for (cp = td->td_inknames; i > 0; cp = strchr(cp,'\0')+1, i--) {
345
_TIFFprintAscii(fd, cp);
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");
356
case THRESHHOLD_HALFTONE:
357
fprintf(fd, "halftone or dithered scan\n");
359
case THRESHHOLD_ERRORDIFFUSE:
360
fprintf(fd, "error diffused\n");
363
fprintf(fd, "%u (0x%x)\n",
364
td->td_threshholding, td->td_threshholding);
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");
374
case FILLORDER_LSB2MSB:
375
fprintf(fd, "lsb-to-msb\n");
378
fprintf(fd, "%u (0x%x)\n",
379
td->td_fillorder, td->td_fillorder);
383
if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING))
386
* For hacky reasons (see tif_jpeg.c - JPEGFixupTestSubsampling),
387
* we need to fetch this rather than trust what is in our
390
uint16 subsampling[2];
392
TIFFGetField( tif, TIFFTAG_YCBCRSUBSAMPLING,
393
subsampling + 0, subsampling + 1 );
394
fprintf(fd, " YCbCr Subsampling: %u, %u\n",
395
subsampling[0], subsampling[1] );
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");
403
case YCBCRPOSITION_COSITED:
404
fprintf(fd, "cosited\n");
407
fprintf(fd, "%u (0x%x)\n",
408
td->td_ycbcrpositioning, td->td_ycbcrpositioning);
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]);
420
fprintf(fd, "%u (0x%x)\n",
421
td->td_orientation, td->td_orientation);
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");
430
fprintf(fd, "%lu\n", (unsigned long) td->td_rowsperstrip);
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");
448
case PLANARCONFIG_SEPARATE:
449
fprintf(fd, "separate image planes\n");
452
fprintf(fd, "%u (0x%x)\n",
453
td->td_planarconfig, td->td_planarconfig);
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) {
464
n = 1L<<td->td_bitspersample;
465
for (l = 0; l < n; l++)
466
fprintf(fd, " %5lu: %5u %5u %5u\n",
468
td->td_colormap[0][l],
469
td->td_colormap[1][l],
470
td->td_colormap[2][l]);
472
fprintf(fd, "(present)\n");
474
if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION)) {
475
fprintf(fd, " Transfer Function: ");
476
if (flags & TIFFPRINT_CURVES) {
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++)
484
td->td_transferfunction[i][l]);
488
fprintf(fd, "(present)\n");
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]);
498
** Custom tag support.
504
count = (short) TIFFGetTagListCount(tif);
505
for(i = 0; i < count; i++) {
506
ttag_t tag = TIFFGetTagListEntry(tif, i);
507
const TIFFFieldInfo *fip;
512
fip = TIFFFieldWithTag(tif, tag);
516
if(fip->field_passcount) {
517
if(TIFFGetField(tif, tag, &value_count, &raw_data) != 1)
520
if (fip->field_readcount == TIFF_VARIABLE
521
|| fip->field_readcount == TIFF_VARIABLE2)
523
else if (fip->field_readcount == TIFF_SPP)
524
value_count = td->td_samplesperpixel;
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
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)
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)
546
if(TIFFGetField(tif, tag, raw_data) != 1) {
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. */
558
raw_data = _TIFFmalloc(
559
_TIFFDataSize(fip->field_type)
563
if(TIFFGetField(tif, tag, tmp,
564
tmp + _TIFFDataSize(fip->field_type)) != 1) {
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
577
if (_TIFFPrettyPrintField(tif, fd, tag, value_count, raw_data)) {
583
_TIFFPrintField(fd, fip, value_count, raw_data);
590
if (tif->tif_tagmethods.printdir)
591
(*tif->tif_tagmethods.printdir)(tif, fd, flags);
592
if ((flags & TIFFPRINT_STRIPS) &&
593
TIFFFieldSet(tif,FIELD_STRIPOFFSETS)) {
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",
602
(unsigned long) td->td_stripoffset[s],
603
(unsigned long) td->td_stripbytecount[s]);
608
_TIFFprintAscii(FILE* fd, const char* cp)
610
for (; *cp != '\0'; cp++) {
613
if (isprint((int)*cp)) {
617
for (tp = "\tt\bb\rr\nn\vv"; *tp; tp++)
621
fprintf(fd, "\\%c", *tp);
623
fprintf(fd, "\\%03o", *cp & 0xff);
628
_TIFFprintAsciiTag(FILE* fd, const char* name, const char* value)
630
fprintf(fd, " %s: \"", name);
631
_TIFFprintAscii(fd, value);
635
/* vim: set ts=8 sts=8 sw=8 noet: */