1*3ac0a46fSAndroid Build Coastguard Worker /*
2*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 1988-1997 Sam Leffler
3*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 1991-1997 Silicon Graphics, Inc.
4*3ac0a46fSAndroid Build Coastguard Worker *
5*3ac0a46fSAndroid Build Coastguard Worker * Permission to use, copy, modify, distribute, and sell this software and
6*3ac0a46fSAndroid Build Coastguard Worker * its documentation for any purpose is hereby granted without fee, provided
7*3ac0a46fSAndroid Build Coastguard Worker * that (i) the above copyright notices and this permission notice appear in
8*3ac0a46fSAndroid Build Coastguard Worker * all copies of the software and related documentation, and (ii) the names of
9*3ac0a46fSAndroid Build Coastguard Worker * Sam Leffler and Silicon Graphics may not be used in any advertising or
10*3ac0a46fSAndroid Build Coastguard Worker * publicity relating to the software without the specific, prior written
11*3ac0a46fSAndroid Build Coastguard Worker * permission of Sam Leffler and Silicon Graphics.
12*3ac0a46fSAndroid Build Coastguard Worker *
13*3ac0a46fSAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
14*3ac0a46fSAndroid Build Coastguard Worker * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
15*3ac0a46fSAndroid Build Coastguard Worker * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
16*3ac0a46fSAndroid Build Coastguard Worker *
17*3ac0a46fSAndroid Build Coastguard Worker * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
18*3ac0a46fSAndroid Build Coastguard Worker * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19*3ac0a46fSAndroid Build Coastguard Worker * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20*3ac0a46fSAndroid Build Coastguard Worker * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
21*3ac0a46fSAndroid Build Coastguard Worker * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22*3ac0a46fSAndroid Build Coastguard Worker * OF THIS SOFTWARE.
23*3ac0a46fSAndroid Build Coastguard Worker */
24*3ac0a46fSAndroid Build Coastguard Worker
25*3ac0a46fSAndroid Build Coastguard Worker /*
26*3ac0a46fSAndroid Build Coastguard Worker * TIFF Library.
27*3ac0a46fSAndroid Build Coastguard Worker *
28*3ac0a46fSAndroid Build Coastguard Worker * Directory Printing Support
29*3ac0a46fSAndroid Build Coastguard Worker */
30*3ac0a46fSAndroid Build Coastguard Worker #include "tiffiop.h"
31*3ac0a46fSAndroid Build Coastguard Worker #include <stdio.h>
32*3ac0a46fSAndroid Build Coastguard Worker
33*3ac0a46fSAndroid Build Coastguard Worker #include <ctype.h>
34*3ac0a46fSAndroid Build Coastguard Worker
35*3ac0a46fSAndroid Build Coastguard Worker static void _TIFFprintAsciiBounded(FILE *fd, const char *cp, size_t max_chars);
36*3ac0a46fSAndroid Build Coastguard Worker
37*3ac0a46fSAndroid Build Coastguard Worker static const char *const photoNames[] = {
38*3ac0a46fSAndroid Build Coastguard Worker "min-is-white", /* PHOTOMETRIC_MINISWHITE */
39*3ac0a46fSAndroid Build Coastguard Worker "min-is-black", /* PHOTOMETRIC_MINISBLACK */
40*3ac0a46fSAndroid Build Coastguard Worker "RGB color", /* PHOTOMETRIC_RGB */
41*3ac0a46fSAndroid Build Coastguard Worker "palette color (RGB from colormap)", /* PHOTOMETRIC_PALETTE */
42*3ac0a46fSAndroid Build Coastguard Worker "transparency mask", /* PHOTOMETRIC_MASK */
43*3ac0a46fSAndroid Build Coastguard Worker "separated", /* PHOTOMETRIC_SEPARATED */
44*3ac0a46fSAndroid Build Coastguard Worker "YCbCr", /* PHOTOMETRIC_YCBCR */
45*3ac0a46fSAndroid Build Coastguard Worker "7 (0x7)",
46*3ac0a46fSAndroid Build Coastguard Worker "CIE L*a*b*", /* PHOTOMETRIC_CIELAB */
47*3ac0a46fSAndroid Build Coastguard Worker "ICC L*a*b*", /* PHOTOMETRIC_ICCLAB */
48*3ac0a46fSAndroid Build Coastguard Worker "ITU L*a*b*" /* PHOTOMETRIC_ITULAB */
49*3ac0a46fSAndroid Build Coastguard Worker };
50*3ac0a46fSAndroid Build Coastguard Worker #define NPHOTONAMES (sizeof(photoNames) / sizeof(photoNames[0]))
51*3ac0a46fSAndroid Build Coastguard Worker
52*3ac0a46fSAndroid Build Coastguard Worker static const char *const orientNames[] = {
53*3ac0a46fSAndroid Build Coastguard Worker "0 (0x0)",
54*3ac0a46fSAndroid Build Coastguard Worker "row 0 top, col 0 lhs", /* ORIENTATION_TOPLEFT */
55*3ac0a46fSAndroid Build Coastguard Worker "row 0 top, col 0 rhs", /* ORIENTATION_TOPRIGHT */
56*3ac0a46fSAndroid Build Coastguard Worker "row 0 bottom, col 0 rhs", /* ORIENTATION_BOTRIGHT */
57*3ac0a46fSAndroid Build Coastguard Worker "row 0 bottom, col 0 lhs", /* ORIENTATION_BOTLEFT */
58*3ac0a46fSAndroid Build Coastguard Worker "row 0 lhs, col 0 top", /* ORIENTATION_LEFTTOP */
59*3ac0a46fSAndroid Build Coastguard Worker "row 0 rhs, col 0 top", /* ORIENTATION_RIGHTTOP */
60*3ac0a46fSAndroid Build Coastguard Worker "row 0 rhs, col 0 bottom", /* ORIENTATION_RIGHTBOT */
61*3ac0a46fSAndroid Build Coastguard Worker "row 0 lhs, col 0 bottom", /* ORIENTATION_LEFTBOT */
62*3ac0a46fSAndroid Build Coastguard Worker };
63*3ac0a46fSAndroid Build Coastguard Worker #define NORIENTNAMES (sizeof(orientNames) / sizeof(orientNames[0]))
64*3ac0a46fSAndroid Build Coastguard Worker
65*3ac0a46fSAndroid Build Coastguard Worker static const struct tagname
66*3ac0a46fSAndroid Build Coastguard Worker {
67*3ac0a46fSAndroid Build Coastguard Worker uint16_t tag;
68*3ac0a46fSAndroid Build Coastguard Worker const char *name;
69*3ac0a46fSAndroid Build Coastguard Worker } tagnames[] = {
70*3ac0a46fSAndroid Build Coastguard Worker {TIFFTAG_GDAL_METADATA, "GDAL Metadata"},
71*3ac0a46fSAndroid Build Coastguard Worker {TIFFTAG_GDAL_NODATA, "GDAL NoDataValue"},
72*3ac0a46fSAndroid Build Coastguard Worker };
73*3ac0a46fSAndroid Build Coastguard Worker #define NTAGS (sizeof(tagnames) / sizeof(tagnames[0]))
74*3ac0a46fSAndroid Build Coastguard Worker
_TIFFPrintField(FILE * fd,const TIFFField * fip,uint32_t value_count,void * raw_data)75*3ac0a46fSAndroid Build Coastguard Worker static void _TIFFPrintField(FILE *fd, const TIFFField *fip,
76*3ac0a46fSAndroid Build Coastguard Worker uint32_t value_count, void *raw_data)
77*3ac0a46fSAndroid Build Coastguard Worker {
78*3ac0a46fSAndroid Build Coastguard Worker uint32_t j;
79*3ac0a46fSAndroid Build Coastguard Worker
80*3ac0a46fSAndroid Build Coastguard Worker /* Print a user-friendly name for tags of relatively common use, but */
81*3ac0a46fSAndroid Build Coastguard Worker /* which aren't registered by libtiff itself. */
82*3ac0a46fSAndroid Build Coastguard Worker const char *field_name = fip->field_name;
83*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldIsAnonymous(fip))
84*3ac0a46fSAndroid Build Coastguard Worker {
85*3ac0a46fSAndroid Build Coastguard Worker for (size_t i = 0; i < NTAGS; ++i)
86*3ac0a46fSAndroid Build Coastguard Worker {
87*3ac0a46fSAndroid Build Coastguard Worker if (fip->field_tag == tagnames[i].tag)
88*3ac0a46fSAndroid Build Coastguard Worker {
89*3ac0a46fSAndroid Build Coastguard Worker field_name = tagnames[i].name;
90*3ac0a46fSAndroid Build Coastguard Worker break;
91*3ac0a46fSAndroid Build Coastguard Worker }
92*3ac0a46fSAndroid Build Coastguard Worker }
93*3ac0a46fSAndroid Build Coastguard Worker }
94*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " %s: ", field_name);
95*3ac0a46fSAndroid Build Coastguard Worker
96*3ac0a46fSAndroid Build Coastguard Worker for (j = 0; j < value_count; j++)
97*3ac0a46fSAndroid Build Coastguard Worker {
98*3ac0a46fSAndroid Build Coastguard Worker if (fip->field_type == TIFF_BYTE)
99*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRIu8, ((uint8_t *)raw_data)[j]);
100*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_type == TIFF_UNDEFINED)
101*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "0x%" PRIx8, ((uint8_t *)raw_data)[j]);
102*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_type == TIFF_SBYTE)
103*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRId8, ((int8_t *)raw_data)[j]);
104*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_type == TIFF_SHORT)
105*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRIu16, ((uint16_t *)raw_data)[j]);
106*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_type == TIFF_SSHORT)
107*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRId16, ((int16_t *)raw_data)[j]);
108*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_type == TIFF_LONG)
109*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRIu32, ((uint32_t *)raw_data)[j]);
110*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_type == TIFF_SLONG)
111*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRId32, ((int32_t *)raw_data)[j]);
112*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_type == TIFF_IFD)
113*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "0x%" PRIx32, ((uint32_t *)raw_data)[j]);
114*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_type == TIFF_RATIONAL ||
115*3ac0a46fSAndroid Build Coastguard Worker fip->field_type == TIFF_SRATIONAL)
116*3ac0a46fSAndroid Build Coastguard Worker {
117*3ac0a46fSAndroid Build Coastguard Worker int tv_size = TIFFFieldSetGetSize(fip);
118*3ac0a46fSAndroid Build Coastguard Worker if (tv_size == 8)
119*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%lf", ((double *)raw_data)[j]);
120*3ac0a46fSAndroid Build Coastguard Worker else
121*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%f", ((float *)raw_data)[j]);
122*3ac0a46fSAndroid Build Coastguard Worker }
123*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_type == TIFF_FLOAT)
124*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%f", ((float *)raw_data)[j]);
125*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_type == TIFF_LONG8)
126*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRIu64, ((uint64_t *)raw_data)[j]);
127*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_type == TIFF_SLONG8)
128*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRId64, ((int64_t *)raw_data)[j]);
129*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_type == TIFF_IFD8)
130*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "0x%" PRIx64, ((uint64_t *)raw_data)[j]);
131*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_type == TIFF_DOUBLE)
132*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%lf", ((double *)raw_data)[j]);
133*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_type == TIFF_ASCII)
134*3ac0a46fSAndroid Build Coastguard Worker {
135*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%s", (char *)raw_data);
136*3ac0a46fSAndroid Build Coastguard Worker break;
137*3ac0a46fSAndroid Build Coastguard Worker }
138*3ac0a46fSAndroid Build Coastguard Worker else
139*3ac0a46fSAndroid Build Coastguard Worker {
140*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "<unsupported data type in TIFFPrint>");
141*3ac0a46fSAndroid Build Coastguard Worker break;
142*3ac0a46fSAndroid Build Coastguard Worker }
143*3ac0a46fSAndroid Build Coastguard Worker
144*3ac0a46fSAndroid Build Coastguard Worker if (j < value_count - 1)
145*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, ",");
146*3ac0a46fSAndroid Build Coastguard Worker }
147*3ac0a46fSAndroid Build Coastguard Worker
148*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "\n");
149*3ac0a46fSAndroid Build Coastguard Worker }
150*3ac0a46fSAndroid Build Coastguard Worker
_TIFFPrettyPrintField(TIFF * tif,const TIFFField * fip,FILE * fd,uint32_t tag,uint32_t value_count,void * raw_data)151*3ac0a46fSAndroid Build Coastguard Worker static int _TIFFPrettyPrintField(TIFF *tif, const TIFFField *fip, FILE *fd,
152*3ac0a46fSAndroid Build Coastguard Worker uint32_t tag, uint32_t value_count,
153*3ac0a46fSAndroid Build Coastguard Worker void *raw_data)
154*3ac0a46fSAndroid Build Coastguard Worker {
155*3ac0a46fSAndroid Build Coastguard Worker (void)tif;
156*3ac0a46fSAndroid Build Coastguard Worker
157*3ac0a46fSAndroid Build Coastguard Worker /* do not try to pretty print auto-defined fields */
158*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldIsAnonymous(fip))
159*3ac0a46fSAndroid Build Coastguard Worker {
160*3ac0a46fSAndroid Build Coastguard Worker return 0;
161*3ac0a46fSAndroid Build Coastguard Worker }
162*3ac0a46fSAndroid Build Coastguard Worker
163*3ac0a46fSAndroid Build Coastguard Worker switch (tag)
164*3ac0a46fSAndroid Build Coastguard Worker {
165*3ac0a46fSAndroid Build Coastguard Worker case TIFFTAG_INKSET:
166*3ac0a46fSAndroid Build Coastguard Worker if (value_count == 2 && fip->field_type == TIFF_SHORT)
167*3ac0a46fSAndroid Build Coastguard Worker {
168*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Ink Set: ");
169*3ac0a46fSAndroid Build Coastguard Worker switch (*((uint16_t *)raw_data))
170*3ac0a46fSAndroid Build Coastguard Worker {
171*3ac0a46fSAndroid Build Coastguard Worker case INKSET_CMYK:
172*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "CMYK\n");
173*3ac0a46fSAndroid Build Coastguard Worker break;
174*3ac0a46fSAndroid Build Coastguard Worker default:
175*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
176*3ac0a46fSAndroid Build Coastguard Worker *((uint16_t *)raw_data),
177*3ac0a46fSAndroid Build Coastguard Worker *((uint16_t *)raw_data));
178*3ac0a46fSAndroid Build Coastguard Worker break;
179*3ac0a46fSAndroid Build Coastguard Worker }
180*3ac0a46fSAndroid Build Coastguard Worker return 1;
181*3ac0a46fSAndroid Build Coastguard Worker }
182*3ac0a46fSAndroid Build Coastguard Worker return 0;
183*3ac0a46fSAndroid Build Coastguard Worker
184*3ac0a46fSAndroid Build Coastguard Worker case TIFFTAG_DOTRANGE:
185*3ac0a46fSAndroid Build Coastguard Worker if (value_count == 2 && fip->field_type == TIFF_SHORT)
186*3ac0a46fSAndroid Build Coastguard Worker {
187*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Dot Range: %" PRIu16 "-%" PRIu16 "\n",
188*3ac0a46fSAndroid Build Coastguard Worker ((uint16_t *)raw_data)[0], ((uint16_t *)raw_data)[1]);
189*3ac0a46fSAndroid Build Coastguard Worker return 1;
190*3ac0a46fSAndroid Build Coastguard Worker }
191*3ac0a46fSAndroid Build Coastguard Worker return 0;
192*3ac0a46fSAndroid Build Coastguard Worker
193*3ac0a46fSAndroid Build Coastguard Worker case TIFFTAG_WHITEPOINT:
194*3ac0a46fSAndroid Build Coastguard Worker if (value_count == 2 && fip->field_type == TIFF_RATIONAL)
195*3ac0a46fSAndroid Build Coastguard Worker {
196*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " White Point: %g-%g\n", ((float *)raw_data)[0],
197*3ac0a46fSAndroid Build Coastguard Worker ((float *)raw_data)[1]);
198*3ac0a46fSAndroid Build Coastguard Worker return 1;
199*3ac0a46fSAndroid Build Coastguard Worker }
200*3ac0a46fSAndroid Build Coastguard Worker return 0;
201*3ac0a46fSAndroid Build Coastguard Worker
202*3ac0a46fSAndroid Build Coastguard Worker case TIFFTAG_XMLPACKET:
203*3ac0a46fSAndroid Build Coastguard Worker {
204*3ac0a46fSAndroid Build Coastguard Worker uint32_t i;
205*3ac0a46fSAndroid Build Coastguard Worker
206*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " XMLPacket (XMP Metadata):\n");
207*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < value_count; i++)
208*3ac0a46fSAndroid Build Coastguard Worker fputc(((char *)raw_data)[i], fd);
209*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "\n");
210*3ac0a46fSAndroid Build Coastguard Worker return 1;
211*3ac0a46fSAndroid Build Coastguard Worker }
212*3ac0a46fSAndroid Build Coastguard Worker case TIFFTAG_RICHTIFFIPTC:
213*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " RichTIFFIPTC Data: <present>, %" PRIu32 " bytes\n",
214*3ac0a46fSAndroid Build Coastguard Worker value_count);
215*3ac0a46fSAndroid Build Coastguard Worker return 1;
216*3ac0a46fSAndroid Build Coastguard Worker
217*3ac0a46fSAndroid Build Coastguard Worker case TIFFTAG_PHOTOSHOP:
218*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Photoshop Data: <present>, %" PRIu32 " bytes\n",
219*3ac0a46fSAndroid Build Coastguard Worker value_count);
220*3ac0a46fSAndroid Build Coastguard Worker return 1;
221*3ac0a46fSAndroid Build Coastguard Worker
222*3ac0a46fSAndroid Build Coastguard Worker case TIFFTAG_ICCPROFILE:
223*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " ICC Profile: <present>, %" PRIu32 " bytes\n",
224*3ac0a46fSAndroid Build Coastguard Worker value_count);
225*3ac0a46fSAndroid Build Coastguard Worker return 1;
226*3ac0a46fSAndroid Build Coastguard Worker
227*3ac0a46fSAndroid Build Coastguard Worker case TIFFTAG_STONITS:
228*3ac0a46fSAndroid Build Coastguard Worker if (value_count == 1 && fip->field_type == TIFF_DOUBLE)
229*3ac0a46fSAndroid Build Coastguard Worker {
230*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Sample to Nits conversion factor: %.4e\n",
231*3ac0a46fSAndroid Build Coastguard Worker *((double *)raw_data));
232*3ac0a46fSAndroid Build Coastguard Worker return 1;
233*3ac0a46fSAndroid Build Coastguard Worker }
234*3ac0a46fSAndroid Build Coastguard Worker return 0;
235*3ac0a46fSAndroid Build Coastguard Worker }
236*3ac0a46fSAndroid Build Coastguard Worker
237*3ac0a46fSAndroid Build Coastguard Worker return 0;
238*3ac0a46fSAndroid Build Coastguard Worker }
239*3ac0a46fSAndroid Build Coastguard Worker
240*3ac0a46fSAndroid Build Coastguard Worker /*
241*3ac0a46fSAndroid Build Coastguard Worker * Print the contents of the current directory
242*3ac0a46fSAndroid Build Coastguard Worker * to the specified stdio file stream.
243*3ac0a46fSAndroid Build Coastguard Worker */
TIFFPrintDirectory(TIFF * tif,FILE * fd,long flags)244*3ac0a46fSAndroid Build Coastguard Worker void TIFFPrintDirectory(TIFF *tif, FILE *fd, long flags)
245*3ac0a46fSAndroid Build Coastguard Worker {
246*3ac0a46fSAndroid Build Coastguard Worker TIFFDirectory *td = &tif->tif_dir;
247*3ac0a46fSAndroid Build Coastguard Worker char *sep;
248*3ac0a46fSAndroid Build Coastguard Worker long l, n;
249*3ac0a46fSAndroid Build Coastguard Worker
250*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "TIFF Directory at offset 0x%" PRIx64 " (%" PRIu64 ")\n",
251*3ac0a46fSAndroid Build Coastguard Worker tif->tif_diroff, tif->tif_diroff);
252*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_SUBFILETYPE))
253*3ac0a46fSAndroid Build Coastguard Worker {
254*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Subfile Type:");
255*3ac0a46fSAndroid Build Coastguard Worker sep = " ";
256*3ac0a46fSAndroid Build Coastguard Worker if (td->td_subfiletype & FILETYPE_REDUCEDIMAGE)
257*3ac0a46fSAndroid Build Coastguard Worker {
258*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%sreduced-resolution image", sep);
259*3ac0a46fSAndroid Build Coastguard Worker sep = "/";
260*3ac0a46fSAndroid Build Coastguard Worker }
261*3ac0a46fSAndroid Build Coastguard Worker if (td->td_subfiletype & FILETYPE_PAGE)
262*3ac0a46fSAndroid Build Coastguard Worker {
263*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%smulti-page document", sep);
264*3ac0a46fSAndroid Build Coastguard Worker sep = "/";
265*3ac0a46fSAndroid Build Coastguard Worker }
266*3ac0a46fSAndroid Build Coastguard Worker if (td->td_subfiletype & FILETYPE_MASK)
267*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%stransparency mask", sep);
268*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " (%" PRIu32 " = 0x%" PRIx32 ")\n", td->td_subfiletype,
269*3ac0a46fSAndroid Build Coastguard Worker td->td_subfiletype);
270*3ac0a46fSAndroid Build Coastguard Worker }
271*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS))
272*3ac0a46fSAndroid Build Coastguard Worker {
273*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Image Width: %" PRIu32 " Image Length: %" PRIu32,
274*3ac0a46fSAndroid Build Coastguard Worker td->td_imagewidth, td->td_imagelength);
275*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_IMAGEDEPTH))
276*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Image Depth: %" PRIu32, td->td_imagedepth);
277*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "\n");
278*3ac0a46fSAndroid Build Coastguard Worker }
279*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_TILEDIMENSIONS))
280*3ac0a46fSAndroid Build Coastguard Worker {
281*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Tile Width: %" PRIu32 " Tile Length: %" PRIu32,
282*3ac0a46fSAndroid Build Coastguard Worker td->td_tilewidth, td->td_tilelength);
283*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_TILEDEPTH))
284*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Tile Depth: %" PRIu32, td->td_tiledepth);
285*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "\n");
286*3ac0a46fSAndroid Build Coastguard Worker }
287*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_RESOLUTION))
288*3ac0a46fSAndroid Build Coastguard Worker {
289*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Resolution: %g, %g", td->td_xresolution,
290*3ac0a46fSAndroid Build Coastguard Worker td->td_yresolution);
291*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_RESOLUTIONUNIT))
292*3ac0a46fSAndroid Build Coastguard Worker {
293*3ac0a46fSAndroid Build Coastguard Worker switch (td->td_resolutionunit)
294*3ac0a46fSAndroid Build Coastguard Worker {
295*3ac0a46fSAndroid Build Coastguard Worker case RESUNIT_NONE:
296*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " (unitless)");
297*3ac0a46fSAndroid Build Coastguard Worker break;
298*3ac0a46fSAndroid Build Coastguard Worker case RESUNIT_INCH:
299*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " pixels/inch");
300*3ac0a46fSAndroid Build Coastguard Worker break;
301*3ac0a46fSAndroid Build Coastguard Worker case RESUNIT_CENTIMETER:
302*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " pixels/cm");
303*3ac0a46fSAndroid Build Coastguard Worker break;
304*3ac0a46fSAndroid Build Coastguard Worker default:
305*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " (unit %" PRIu16 " = 0x%" PRIx16 ")",
306*3ac0a46fSAndroid Build Coastguard Worker td->td_resolutionunit, td->td_resolutionunit);
307*3ac0a46fSAndroid Build Coastguard Worker break;
308*3ac0a46fSAndroid Build Coastguard Worker }
309*3ac0a46fSAndroid Build Coastguard Worker }
310*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "\n");
311*3ac0a46fSAndroid Build Coastguard Worker }
312*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_POSITION))
313*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Position: %g, %g\n", td->td_xposition, td->td_yposition);
314*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_BITSPERSAMPLE))
315*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Bits/Sample: %" PRIu16 "\n", td->td_bitspersample);
316*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_SAMPLEFORMAT))
317*3ac0a46fSAndroid Build Coastguard Worker {
318*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Sample Format: ");
319*3ac0a46fSAndroid Build Coastguard Worker switch (td->td_sampleformat)
320*3ac0a46fSAndroid Build Coastguard Worker {
321*3ac0a46fSAndroid Build Coastguard Worker case SAMPLEFORMAT_VOID:
322*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "void\n");
323*3ac0a46fSAndroid Build Coastguard Worker break;
324*3ac0a46fSAndroid Build Coastguard Worker case SAMPLEFORMAT_INT:
325*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "signed integer\n");
326*3ac0a46fSAndroid Build Coastguard Worker break;
327*3ac0a46fSAndroid Build Coastguard Worker case SAMPLEFORMAT_UINT:
328*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "unsigned integer\n");
329*3ac0a46fSAndroid Build Coastguard Worker break;
330*3ac0a46fSAndroid Build Coastguard Worker case SAMPLEFORMAT_IEEEFP:
331*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "IEEE floating point\n");
332*3ac0a46fSAndroid Build Coastguard Worker break;
333*3ac0a46fSAndroid Build Coastguard Worker case SAMPLEFORMAT_COMPLEXINT:
334*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "complex signed integer\n");
335*3ac0a46fSAndroid Build Coastguard Worker break;
336*3ac0a46fSAndroid Build Coastguard Worker case SAMPLEFORMAT_COMPLEXIEEEFP:
337*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "complex IEEE floating point\n");
338*3ac0a46fSAndroid Build Coastguard Worker break;
339*3ac0a46fSAndroid Build Coastguard Worker default:
340*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
341*3ac0a46fSAndroid Build Coastguard Worker td->td_sampleformat, td->td_sampleformat);
342*3ac0a46fSAndroid Build Coastguard Worker break;
343*3ac0a46fSAndroid Build Coastguard Worker }
344*3ac0a46fSAndroid Build Coastguard Worker }
345*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_COMPRESSION))
346*3ac0a46fSAndroid Build Coastguard Worker {
347*3ac0a46fSAndroid Build Coastguard Worker const TIFFCodec *c = TIFFFindCODEC(td->td_compression);
348*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Compression Scheme: ");
349*3ac0a46fSAndroid Build Coastguard Worker if (c)
350*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%s\n", c->name);
351*3ac0a46fSAndroid Build Coastguard Worker else
352*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n", td->td_compression,
353*3ac0a46fSAndroid Build Coastguard Worker td->td_compression);
354*3ac0a46fSAndroid Build Coastguard Worker }
355*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_PHOTOMETRIC))
356*3ac0a46fSAndroid Build Coastguard Worker {
357*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Photometric Interpretation: ");
358*3ac0a46fSAndroid Build Coastguard Worker if (td->td_photometric < NPHOTONAMES)
359*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%s\n", photoNames[td->td_photometric]);
360*3ac0a46fSAndroid Build Coastguard Worker else
361*3ac0a46fSAndroid Build Coastguard Worker {
362*3ac0a46fSAndroid Build Coastguard Worker switch (td->td_photometric)
363*3ac0a46fSAndroid Build Coastguard Worker {
364*3ac0a46fSAndroid Build Coastguard Worker case PHOTOMETRIC_LOGL:
365*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "CIE Log2(L)\n");
366*3ac0a46fSAndroid Build Coastguard Worker break;
367*3ac0a46fSAndroid Build Coastguard Worker case PHOTOMETRIC_LOGLUV:
368*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "CIE Log2(L) (u',v')\n");
369*3ac0a46fSAndroid Build Coastguard Worker break;
370*3ac0a46fSAndroid Build Coastguard Worker default:
371*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
372*3ac0a46fSAndroid Build Coastguard Worker td->td_photometric, td->td_photometric);
373*3ac0a46fSAndroid Build Coastguard Worker break;
374*3ac0a46fSAndroid Build Coastguard Worker }
375*3ac0a46fSAndroid Build Coastguard Worker }
376*3ac0a46fSAndroid Build Coastguard Worker }
377*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_EXTRASAMPLES) && td->td_extrasamples)
378*3ac0a46fSAndroid Build Coastguard Worker {
379*3ac0a46fSAndroid Build Coastguard Worker uint16_t i;
380*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Extra Samples: %" PRIu16 "<", td->td_extrasamples);
381*3ac0a46fSAndroid Build Coastguard Worker sep = "";
382*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < td->td_extrasamples; i++)
383*3ac0a46fSAndroid Build Coastguard Worker {
384*3ac0a46fSAndroid Build Coastguard Worker switch (td->td_sampleinfo[i])
385*3ac0a46fSAndroid Build Coastguard Worker {
386*3ac0a46fSAndroid Build Coastguard Worker case EXTRASAMPLE_UNSPECIFIED:
387*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%sunspecified", sep);
388*3ac0a46fSAndroid Build Coastguard Worker break;
389*3ac0a46fSAndroid Build Coastguard Worker case EXTRASAMPLE_ASSOCALPHA:
390*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%sassoc-alpha", sep);
391*3ac0a46fSAndroid Build Coastguard Worker break;
392*3ac0a46fSAndroid Build Coastguard Worker case EXTRASAMPLE_UNASSALPHA:
393*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%sunassoc-alpha", sep);
394*3ac0a46fSAndroid Build Coastguard Worker break;
395*3ac0a46fSAndroid Build Coastguard Worker default:
396*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%s%" PRIu16 " (0x%" PRIx16 ")", sep,
397*3ac0a46fSAndroid Build Coastguard Worker td->td_sampleinfo[i], td->td_sampleinfo[i]);
398*3ac0a46fSAndroid Build Coastguard Worker break;
399*3ac0a46fSAndroid Build Coastguard Worker }
400*3ac0a46fSAndroid Build Coastguard Worker sep = ", ";
401*3ac0a46fSAndroid Build Coastguard Worker }
402*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, ">\n");
403*3ac0a46fSAndroid Build Coastguard Worker }
404*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_INKNAMES))
405*3ac0a46fSAndroid Build Coastguard Worker {
406*3ac0a46fSAndroid Build Coastguard Worker char *cp;
407*3ac0a46fSAndroid Build Coastguard Worker uint16_t i;
408*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Ink Names: ");
409*3ac0a46fSAndroid Build Coastguard Worker i = td->td_samplesperpixel;
410*3ac0a46fSAndroid Build Coastguard Worker sep = "";
411*3ac0a46fSAndroid Build Coastguard Worker for (cp = td->td_inknames;
412*3ac0a46fSAndroid Build Coastguard Worker i > 0 && cp < td->td_inknames + td->td_inknameslen;
413*3ac0a46fSAndroid Build Coastguard Worker cp = strchr(cp, '\0') + 1, i--)
414*3ac0a46fSAndroid Build Coastguard Worker {
415*3ac0a46fSAndroid Build Coastguard Worker size_t max_chars = td->td_inknameslen - (cp - td->td_inknames);
416*3ac0a46fSAndroid Build Coastguard Worker fputs(sep, fd);
417*3ac0a46fSAndroid Build Coastguard Worker _TIFFprintAsciiBounded(fd, cp, max_chars);
418*3ac0a46fSAndroid Build Coastguard Worker sep = ", ";
419*3ac0a46fSAndroid Build Coastguard Worker }
420*3ac0a46fSAndroid Build Coastguard Worker fputs("\n", fd);
421*3ac0a46fSAndroid Build Coastguard Worker }
422*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_NUMBEROFINKS))
423*3ac0a46fSAndroid Build Coastguard Worker {
424*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " NumberOfInks: %d\n", td->td_numberofinks);
425*3ac0a46fSAndroid Build Coastguard Worker }
426*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_THRESHHOLDING))
427*3ac0a46fSAndroid Build Coastguard Worker {
428*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Thresholding: ");
429*3ac0a46fSAndroid Build Coastguard Worker switch (td->td_threshholding)
430*3ac0a46fSAndroid Build Coastguard Worker {
431*3ac0a46fSAndroid Build Coastguard Worker case THRESHHOLD_BILEVEL:
432*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "bilevel art scan\n");
433*3ac0a46fSAndroid Build Coastguard Worker break;
434*3ac0a46fSAndroid Build Coastguard Worker case THRESHHOLD_HALFTONE:
435*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "halftone or dithered scan\n");
436*3ac0a46fSAndroid Build Coastguard Worker break;
437*3ac0a46fSAndroid Build Coastguard Worker case THRESHHOLD_ERRORDIFFUSE:
438*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "error diffused\n");
439*3ac0a46fSAndroid Build Coastguard Worker break;
440*3ac0a46fSAndroid Build Coastguard Worker default:
441*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
442*3ac0a46fSAndroid Build Coastguard Worker td->td_threshholding, td->td_threshholding);
443*3ac0a46fSAndroid Build Coastguard Worker break;
444*3ac0a46fSAndroid Build Coastguard Worker }
445*3ac0a46fSAndroid Build Coastguard Worker }
446*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_FILLORDER))
447*3ac0a46fSAndroid Build Coastguard Worker {
448*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " FillOrder: ");
449*3ac0a46fSAndroid Build Coastguard Worker switch (td->td_fillorder)
450*3ac0a46fSAndroid Build Coastguard Worker {
451*3ac0a46fSAndroid Build Coastguard Worker case FILLORDER_MSB2LSB:
452*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "msb-to-lsb\n");
453*3ac0a46fSAndroid Build Coastguard Worker break;
454*3ac0a46fSAndroid Build Coastguard Worker case FILLORDER_LSB2MSB:
455*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "lsb-to-msb\n");
456*3ac0a46fSAndroid Build Coastguard Worker break;
457*3ac0a46fSAndroid Build Coastguard Worker default:
458*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n", td->td_fillorder,
459*3ac0a46fSAndroid Build Coastguard Worker td->td_fillorder);
460*3ac0a46fSAndroid Build Coastguard Worker break;
461*3ac0a46fSAndroid Build Coastguard Worker }
462*3ac0a46fSAndroid Build Coastguard Worker }
463*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_YCBCRSUBSAMPLING))
464*3ac0a46fSAndroid Build Coastguard Worker {
465*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " YCbCr Subsampling: %" PRIu16 ", %" PRIu16 "\n",
466*3ac0a46fSAndroid Build Coastguard Worker td->td_ycbcrsubsampling[0], td->td_ycbcrsubsampling[1]);
467*3ac0a46fSAndroid Build Coastguard Worker }
468*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_YCBCRPOSITIONING))
469*3ac0a46fSAndroid Build Coastguard Worker {
470*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " YCbCr Positioning: ");
471*3ac0a46fSAndroid Build Coastguard Worker switch (td->td_ycbcrpositioning)
472*3ac0a46fSAndroid Build Coastguard Worker {
473*3ac0a46fSAndroid Build Coastguard Worker case YCBCRPOSITION_CENTERED:
474*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "centered\n");
475*3ac0a46fSAndroid Build Coastguard Worker break;
476*3ac0a46fSAndroid Build Coastguard Worker case YCBCRPOSITION_COSITED:
477*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "cosited\n");
478*3ac0a46fSAndroid Build Coastguard Worker break;
479*3ac0a46fSAndroid Build Coastguard Worker default:
480*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
481*3ac0a46fSAndroid Build Coastguard Worker td->td_ycbcrpositioning, td->td_ycbcrpositioning);
482*3ac0a46fSAndroid Build Coastguard Worker break;
483*3ac0a46fSAndroid Build Coastguard Worker }
484*3ac0a46fSAndroid Build Coastguard Worker }
485*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_HALFTONEHINTS))
486*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Halftone Hints: light %" PRIu16 " dark %" PRIu16 "\n",
487*3ac0a46fSAndroid Build Coastguard Worker td->td_halftonehints[0], td->td_halftonehints[1]);
488*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_ORIENTATION))
489*3ac0a46fSAndroid Build Coastguard Worker {
490*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Orientation: ");
491*3ac0a46fSAndroid Build Coastguard Worker if (td->td_orientation < NORIENTNAMES)
492*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%s\n", orientNames[td->td_orientation]);
493*3ac0a46fSAndroid Build Coastguard Worker else
494*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n", td->td_orientation,
495*3ac0a46fSAndroid Build Coastguard Worker td->td_orientation);
496*3ac0a46fSAndroid Build Coastguard Worker }
497*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_SAMPLESPERPIXEL))
498*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Samples/Pixel: %" PRIx16 "\n", td->td_samplesperpixel);
499*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_ROWSPERSTRIP))
500*3ac0a46fSAndroid Build Coastguard Worker {
501*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Rows/Strip: ");
502*3ac0a46fSAndroid Build Coastguard Worker if (td->td_rowsperstrip == (uint32_t)-1)
503*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "(infinite)\n");
504*3ac0a46fSAndroid Build Coastguard Worker else
505*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRIu32 "\n", td->td_rowsperstrip);
506*3ac0a46fSAndroid Build Coastguard Worker }
507*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_MINSAMPLEVALUE))
508*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Min Sample Value: %" PRIu16 "\n", td->td_minsamplevalue);
509*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE))
510*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Max Sample Value: %" PRIu16 "\n", td->td_maxsamplevalue);
511*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_SMINSAMPLEVALUE))
512*3ac0a46fSAndroid Build Coastguard Worker {
513*3ac0a46fSAndroid Build Coastguard Worker int i;
514*3ac0a46fSAndroid Build Coastguard Worker int count =
515*3ac0a46fSAndroid Build Coastguard Worker (tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1;
516*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " SMin Sample Value:");
517*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < count; ++i)
518*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " %g", td->td_sminsamplevalue[i]);
519*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "\n");
520*3ac0a46fSAndroid Build Coastguard Worker }
521*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_SMAXSAMPLEVALUE))
522*3ac0a46fSAndroid Build Coastguard Worker {
523*3ac0a46fSAndroid Build Coastguard Worker int i;
524*3ac0a46fSAndroid Build Coastguard Worker int count =
525*3ac0a46fSAndroid Build Coastguard Worker (tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1;
526*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " SMax Sample Value:");
527*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < count; ++i)
528*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " %g", td->td_smaxsamplevalue[i]);
529*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "\n");
530*3ac0a46fSAndroid Build Coastguard Worker }
531*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_PLANARCONFIG))
532*3ac0a46fSAndroid Build Coastguard Worker {
533*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Planar Configuration: ");
534*3ac0a46fSAndroid Build Coastguard Worker switch (td->td_planarconfig)
535*3ac0a46fSAndroid Build Coastguard Worker {
536*3ac0a46fSAndroid Build Coastguard Worker case PLANARCONFIG_CONTIG:
537*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "single image plane\n");
538*3ac0a46fSAndroid Build Coastguard Worker break;
539*3ac0a46fSAndroid Build Coastguard Worker case PLANARCONFIG_SEPARATE:
540*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "separate image planes\n");
541*3ac0a46fSAndroid Build Coastguard Worker break;
542*3ac0a46fSAndroid Build Coastguard Worker default:
543*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
544*3ac0a46fSAndroid Build Coastguard Worker td->td_planarconfig, td->td_planarconfig);
545*3ac0a46fSAndroid Build Coastguard Worker break;
546*3ac0a46fSAndroid Build Coastguard Worker }
547*3ac0a46fSAndroid Build Coastguard Worker }
548*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_PAGENUMBER))
549*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Page Number: %" PRIu16 "-%" PRIu16 "\n",
550*3ac0a46fSAndroid Build Coastguard Worker td->td_pagenumber[0], td->td_pagenumber[1]);
551*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_COLORMAP))
552*3ac0a46fSAndroid Build Coastguard Worker {
553*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Color Map: ");
554*3ac0a46fSAndroid Build Coastguard Worker if (flags & TIFFPRINT_COLORMAP)
555*3ac0a46fSAndroid Build Coastguard Worker {
556*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "\n");
557*3ac0a46fSAndroid Build Coastguard Worker n = 1L << td->td_bitspersample;
558*3ac0a46fSAndroid Build Coastguard Worker for (l = 0; l < n; l++)
559*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " %5ld: %5" PRIu16 " %5" PRIu16 " %5" PRIu16 "\n",
560*3ac0a46fSAndroid Build Coastguard Worker l, td->td_colormap[0][l], td->td_colormap[1][l],
561*3ac0a46fSAndroid Build Coastguard Worker td->td_colormap[2][l]);
562*3ac0a46fSAndroid Build Coastguard Worker }
563*3ac0a46fSAndroid Build Coastguard Worker else
564*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "(present)\n");
565*3ac0a46fSAndroid Build Coastguard Worker }
566*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_REFBLACKWHITE))
567*3ac0a46fSAndroid Build Coastguard Worker {
568*3ac0a46fSAndroid Build Coastguard Worker int i;
569*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Reference Black/White:\n");
570*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < 3; i++)
571*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " %2d: %5g %5g\n", i,
572*3ac0a46fSAndroid Build Coastguard Worker td->td_refblackwhite[2 * i + 0],
573*3ac0a46fSAndroid Build Coastguard Worker td->td_refblackwhite[2 * i + 1]);
574*3ac0a46fSAndroid Build Coastguard Worker }
575*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_TRANSFERFUNCTION))
576*3ac0a46fSAndroid Build Coastguard Worker {
577*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " Transfer Function: ");
578*3ac0a46fSAndroid Build Coastguard Worker if (flags & TIFFPRINT_CURVES)
579*3ac0a46fSAndroid Build Coastguard Worker {
580*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "\n");
581*3ac0a46fSAndroid Build Coastguard Worker n = 1L << td->td_bitspersample;
582*3ac0a46fSAndroid Build Coastguard Worker for (l = 0; l < n; l++)
583*3ac0a46fSAndroid Build Coastguard Worker {
584*3ac0a46fSAndroid Build Coastguard Worker uint16_t i;
585*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " %2ld: %5" PRIu16, l,
586*3ac0a46fSAndroid Build Coastguard Worker td->td_transferfunction[0][l]);
587*3ac0a46fSAndroid Build Coastguard Worker for (i = 1;
588*3ac0a46fSAndroid Build Coastguard Worker i < td->td_samplesperpixel - td->td_extrasamples && i < 3;
589*3ac0a46fSAndroid Build Coastguard Worker i++)
590*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " %5" PRIu16, td->td_transferfunction[i][l]);
591*3ac0a46fSAndroid Build Coastguard Worker fputc('\n', fd);
592*3ac0a46fSAndroid Build Coastguard Worker }
593*3ac0a46fSAndroid Build Coastguard Worker }
594*3ac0a46fSAndroid Build Coastguard Worker else
595*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "(present)\n");
596*3ac0a46fSAndroid Build Coastguard Worker }
597*3ac0a46fSAndroid Build Coastguard Worker if (TIFFFieldSet(tif, FIELD_SUBIFD) && (td->td_subifd))
598*3ac0a46fSAndroid Build Coastguard Worker {
599*3ac0a46fSAndroid Build Coastguard Worker uint16_t i;
600*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " SubIFD Offsets:");
601*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < td->td_nsubifd; i++)
602*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " %5" PRIu64, td->td_subifd[i]);
603*3ac0a46fSAndroid Build Coastguard Worker fputc('\n', fd);
604*3ac0a46fSAndroid Build Coastguard Worker }
605*3ac0a46fSAndroid Build Coastguard Worker
606*3ac0a46fSAndroid Build Coastguard Worker /*
607*3ac0a46fSAndroid Build Coastguard Worker ** Custom tag support.
608*3ac0a46fSAndroid Build Coastguard Worker */
609*3ac0a46fSAndroid Build Coastguard Worker {
610*3ac0a46fSAndroid Build Coastguard Worker int i;
611*3ac0a46fSAndroid Build Coastguard Worker short count;
612*3ac0a46fSAndroid Build Coastguard Worker
613*3ac0a46fSAndroid Build Coastguard Worker count = (short)TIFFGetTagListCount(tif);
614*3ac0a46fSAndroid Build Coastguard Worker for (i = 0; i < count; i++)
615*3ac0a46fSAndroid Build Coastguard Worker {
616*3ac0a46fSAndroid Build Coastguard Worker uint32_t tag = TIFFGetTagListEntry(tif, i);
617*3ac0a46fSAndroid Build Coastguard Worker const TIFFField *fip;
618*3ac0a46fSAndroid Build Coastguard Worker uint32_t value_count;
619*3ac0a46fSAndroid Build Coastguard Worker int mem_alloc = 0;
620*3ac0a46fSAndroid Build Coastguard Worker void *raw_data = NULL;
621*3ac0a46fSAndroid Build Coastguard Worker uint16_t dotrange[2]; /* must be kept in that scope and not moved in
622*3ac0a46fSAndroid Build Coastguard Worker the below TIFFTAG_DOTRANGE specific case */
623*3ac0a46fSAndroid Build Coastguard Worker
624*3ac0a46fSAndroid Build Coastguard Worker fip = TIFFFieldWithTag(tif, tag);
625*3ac0a46fSAndroid Build Coastguard Worker if (fip == NULL)
626*3ac0a46fSAndroid Build Coastguard Worker continue;
627*3ac0a46fSAndroid Build Coastguard Worker
628*3ac0a46fSAndroid Build Coastguard Worker if (fip->field_passcount)
629*3ac0a46fSAndroid Build Coastguard Worker {
630*3ac0a46fSAndroid Build Coastguard Worker if (fip->field_readcount == TIFF_VARIABLE2)
631*3ac0a46fSAndroid Build Coastguard Worker {
632*3ac0a46fSAndroid Build Coastguard Worker if (TIFFGetField(tif, tag, &value_count, &raw_data) != 1)
633*3ac0a46fSAndroid Build Coastguard Worker continue;
634*3ac0a46fSAndroid Build Coastguard Worker }
635*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_readcount == TIFF_VARIABLE)
636*3ac0a46fSAndroid Build Coastguard Worker {
637*3ac0a46fSAndroid Build Coastguard Worker uint16_t small_value_count;
638*3ac0a46fSAndroid Build Coastguard Worker if (TIFFGetField(tif, tag, &small_value_count, &raw_data) !=
639*3ac0a46fSAndroid Build Coastguard Worker 1)
640*3ac0a46fSAndroid Build Coastguard Worker continue;
641*3ac0a46fSAndroid Build Coastguard Worker value_count = small_value_count;
642*3ac0a46fSAndroid Build Coastguard Worker }
643*3ac0a46fSAndroid Build Coastguard Worker else
644*3ac0a46fSAndroid Build Coastguard Worker {
645*3ac0a46fSAndroid Build Coastguard Worker assert(fip->field_readcount == TIFF_VARIABLE ||
646*3ac0a46fSAndroid Build Coastguard Worker fip->field_readcount == TIFF_VARIABLE2);
647*3ac0a46fSAndroid Build Coastguard Worker continue;
648*3ac0a46fSAndroid Build Coastguard Worker }
649*3ac0a46fSAndroid Build Coastguard Worker }
650*3ac0a46fSAndroid Build Coastguard Worker else
651*3ac0a46fSAndroid Build Coastguard Worker {
652*3ac0a46fSAndroid Build Coastguard Worker if (fip->field_readcount == TIFF_VARIABLE ||
653*3ac0a46fSAndroid Build Coastguard Worker fip->field_readcount == TIFF_VARIABLE2)
654*3ac0a46fSAndroid Build Coastguard Worker value_count = 1;
655*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_readcount == TIFF_SPP)
656*3ac0a46fSAndroid Build Coastguard Worker value_count = td->td_samplesperpixel;
657*3ac0a46fSAndroid Build Coastguard Worker else
658*3ac0a46fSAndroid Build Coastguard Worker value_count = fip->field_readcount;
659*3ac0a46fSAndroid Build Coastguard Worker if (fip->field_tag == TIFFTAG_DOTRANGE &&
660*3ac0a46fSAndroid Build Coastguard Worker strcmp(fip->field_name, "DotRange") == 0)
661*3ac0a46fSAndroid Build Coastguard Worker {
662*3ac0a46fSAndroid Build Coastguard Worker /* TODO: This is an evil exception and should not have been
663*3ac0a46fSAndroid Build Coastguard Worker handled this way ... likely best if we move it into
664*3ac0a46fSAndroid Build Coastguard Worker the directory structure with an explicit field in
665*3ac0a46fSAndroid Build Coastguard Worker libtiff 4.1 and assign it a FIELD_ value */
666*3ac0a46fSAndroid Build Coastguard Worker raw_data = dotrange;
667*3ac0a46fSAndroid Build Coastguard Worker TIFFGetField(tif, tag, dotrange + 0, dotrange + 1);
668*3ac0a46fSAndroid Build Coastguard Worker }
669*3ac0a46fSAndroid Build Coastguard Worker else if (fip->field_type == TIFF_ASCII ||
670*3ac0a46fSAndroid Build Coastguard Worker fip->field_readcount == TIFF_VARIABLE ||
671*3ac0a46fSAndroid Build Coastguard Worker fip->field_readcount == TIFF_VARIABLE2 ||
672*3ac0a46fSAndroid Build Coastguard Worker fip->field_readcount == TIFF_SPP || value_count > 1)
673*3ac0a46fSAndroid Build Coastguard Worker {
674*3ac0a46fSAndroid Build Coastguard Worker if (TIFFGetField(tif, tag, &raw_data) != 1)
675*3ac0a46fSAndroid Build Coastguard Worker continue;
676*3ac0a46fSAndroid Build Coastguard Worker }
677*3ac0a46fSAndroid Build Coastguard Worker else
678*3ac0a46fSAndroid Build Coastguard Worker {
679*3ac0a46fSAndroid Build Coastguard Worker /*--: Rational2Double: For Rationals evaluate
680*3ac0a46fSAndroid Build Coastguard Worker * "set_field_type" to determine internal storage size. */
681*3ac0a46fSAndroid Build Coastguard Worker int tv_size = TIFFFieldSetGetSize(fip);
682*3ac0a46fSAndroid Build Coastguard Worker raw_data = _TIFFmallocExt(tif, tv_size * value_count);
683*3ac0a46fSAndroid Build Coastguard Worker mem_alloc = 1;
684*3ac0a46fSAndroid Build Coastguard Worker if (TIFFGetField(tif, tag, raw_data) != 1)
685*3ac0a46fSAndroid Build Coastguard Worker {
686*3ac0a46fSAndroid Build Coastguard Worker _TIFFfreeExt(tif, raw_data);
687*3ac0a46fSAndroid Build Coastguard Worker continue;
688*3ac0a46fSAndroid Build Coastguard Worker }
689*3ac0a46fSAndroid Build Coastguard Worker }
690*3ac0a46fSAndroid Build Coastguard Worker }
691*3ac0a46fSAndroid Build Coastguard Worker
692*3ac0a46fSAndroid Build Coastguard Worker /*
693*3ac0a46fSAndroid Build Coastguard Worker * Catch the tags which needs to be specially handled
694*3ac0a46fSAndroid Build Coastguard Worker * and pretty print them. If tag not handled in
695*3ac0a46fSAndroid Build Coastguard Worker * _TIFFPrettyPrintField() fall down and print it as
696*3ac0a46fSAndroid Build Coastguard Worker * any other tag.
697*3ac0a46fSAndroid Build Coastguard Worker */
698*3ac0a46fSAndroid Build Coastguard Worker if (raw_data != NULL &&
699*3ac0a46fSAndroid Build Coastguard Worker !_TIFFPrettyPrintField(tif, fip, fd, tag, value_count,
700*3ac0a46fSAndroid Build Coastguard Worker raw_data))
701*3ac0a46fSAndroid Build Coastguard Worker _TIFFPrintField(fd, fip, value_count, raw_data);
702*3ac0a46fSAndroid Build Coastguard Worker
703*3ac0a46fSAndroid Build Coastguard Worker if (mem_alloc)
704*3ac0a46fSAndroid Build Coastguard Worker _TIFFfreeExt(tif, raw_data);
705*3ac0a46fSAndroid Build Coastguard Worker }
706*3ac0a46fSAndroid Build Coastguard Worker }
707*3ac0a46fSAndroid Build Coastguard Worker
708*3ac0a46fSAndroid Build Coastguard Worker if (tif->tif_tagmethods.printdir)
709*3ac0a46fSAndroid Build Coastguard Worker (*tif->tif_tagmethods.printdir)(tif, fd, flags);
710*3ac0a46fSAndroid Build Coastguard Worker
711*3ac0a46fSAndroid Build Coastguard Worker if ((flags & TIFFPRINT_STRIPS) && TIFFFieldSet(tif, FIELD_STRIPOFFSETS))
712*3ac0a46fSAndroid Build Coastguard Worker {
713*3ac0a46fSAndroid Build Coastguard Worker uint32_t s;
714*3ac0a46fSAndroid Build Coastguard Worker
715*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " %" PRIu32 " %s:\n", td->td_nstrips,
716*3ac0a46fSAndroid Build Coastguard Worker isTiled(tif) ? "Tiles" : "Strips");
717*3ac0a46fSAndroid Build Coastguard Worker for (s = 0; s < td->td_nstrips; s++)
718*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " %3" PRIu32 ": [%8" PRIu64 ", %8" PRIu64 "]\n", s,
719*3ac0a46fSAndroid Build Coastguard Worker TIFFGetStrileOffset(tif, s),
720*3ac0a46fSAndroid Build Coastguard Worker TIFFGetStrileByteCount(tif, s));
721*3ac0a46fSAndroid Build Coastguard Worker }
722*3ac0a46fSAndroid Build Coastguard Worker }
723*3ac0a46fSAndroid Build Coastguard Worker
_TIFFprintAscii(FILE * fd,const char * cp)724*3ac0a46fSAndroid Build Coastguard Worker void _TIFFprintAscii(FILE *fd, const char *cp)
725*3ac0a46fSAndroid Build Coastguard Worker {
726*3ac0a46fSAndroid Build Coastguard Worker _TIFFprintAsciiBounded(fd, cp, strlen(cp));
727*3ac0a46fSAndroid Build Coastguard Worker }
728*3ac0a46fSAndroid Build Coastguard Worker
_TIFFprintAsciiBounded(FILE * fd,const char * cp,size_t max_chars)729*3ac0a46fSAndroid Build Coastguard Worker static void _TIFFprintAsciiBounded(FILE *fd, const char *cp, size_t max_chars)
730*3ac0a46fSAndroid Build Coastguard Worker {
731*3ac0a46fSAndroid Build Coastguard Worker for (; max_chars > 0 && *cp != '\0'; cp++, max_chars--)
732*3ac0a46fSAndroid Build Coastguard Worker {
733*3ac0a46fSAndroid Build Coastguard Worker const char *tp;
734*3ac0a46fSAndroid Build Coastguard Worker
735*3ac0a46fSAndroid Build Coastguard Worker if (isprint((int)*cp))
736*3ac0a46fSAndroid Build Coastguard Worker {
737*3ac0a46fSAndroid Build Coastguard Worker fputc(*cp, fd);
738*3ac0a46fSAndroid Build Coastguard Worker continue;
739*3ac0a46fSAndroid Build Coastguard Worker }
740*3ac0a46fSAndroid Build Coastguard Worker for (tp = "\tt\bb\rr\nn\vv"; *tp; tp++)
741*3ac0a46fSAndroid Build Coastguard Worker if (*tp++ == *cp)
742*3ac0a46fSAndroid Build Coastguard Worker break;
743*3ac0a46fSAndroid Build Coastguard Worker if (*tp)
744*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "\\%c", *tp);
745*3ac0a46fSAndroid Build Coastguard Worker else
746*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "\\%03o", *cp & 0xff);
747*3ac0a46fSAndroid Build Coastguard Worker }
748*3ac0a46fSAndroid Build Coastguard Worker }
749*3ac0a46fSAndroid Build Coastguard Worker
_TIFFprintAsciiTag(FILE * fd,const char * name,const char * value)750*3ac0a46fSAndroid Build Coastguard Worker void _TIFFprintAsciiTag(FILE *fd, const char *name, const char *value)
751*3ac0a46fSAndroid Build Coastguard Worker {
752*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, " %s: \"", name);
753*3ac0a46fSAndroid Build Coastguard Worker _TIFFprintAscii(fd, value);
754*3ac0a46fSAndroid Build Coastguard Worker fprintf(fd, "\"\n");
755*3ac0a46fSAndroid Build Coastguard Worker }
756