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