xref: /aosp_15_r20/external/pdfium/third_party/libtiff/tif_print.c (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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