kusano 7d535a
/* $Id: tif_print.c,v 1.60 2012-08-19 16:56:35 bfriesen Exp $ */
kusano 7d535a
kusano 7d535a
/*
kusano 7d535a
 * Copyright (c) 1988-1997 Sam Leffler
kusano 7d535a
 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
kusano 7d535a
 *
kusano 7d535a
 * Permission to use, copy, modify, distribute, and sell this software and 
kusano 7d535a
 * its documentation for any purpose is hereby granted without fee, provided
kusano 7d535a
 * that (i) the above copyright notices and this permission notice appear in
kusano 7d535a
 * all copies of the software and related documentation, and (ii) the names of
kusano 7d535a
 * Sam Leffler and Silicon Graphics may not be used in any advertising or
kusano 7d535a
 * publicity relating to the software without the specific, prior written
kusano 7d535a
 * permission of Sam Leffler and Silicon Graphics.
kusano 7d535a
 * 
kusano 7d535a
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
kusano 7d535a
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
kusano 7d535a
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
kusano 7d535a
 * 
kusano 7d535a
 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
kusano 7d535a
 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
kusano 7d535a
 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
kusano 7d535a
 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
kusano 7d535a
 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
kusano 7d535a
 * OF THIS SOFTWARE.
kusano 7d535a
 */
kusano 7d535a
kusano 7d535a
/*
kusano 7d535a
 * TIFF Library.
kusano 7d535a
 *
kusano 7d535a
 * Directory Printing Support
kusano 7d535a
 */
kusano 7d535a
#include "tiffiop.h"
kusano 7d535a
#include <stdio.h></stdio.h>
kusano 7d535a
kusano 7d535a
#include <ctype.h></ctype.h>
kusano 7d535a
kusano 7d535a
static void
kusano 7d535a
_TIFFprintAsciiBounded(FILE* fd, const char* cp, int max_chars);
kusano 7d535a
kusano 7d535a
static const char *photoNames[] = {
kusano 7d535a
    "min-is-white",				/* PHOTOMETRIC_MINISWHITE */
kusano 7d535a
    "min-is-black",				/* PHOTOMETRIC_MINISBLACK */
kusano 7d535a
    "RGB color",				/* PHOTOMETRIC_RGB */
kusano 7d535a
    "palette color (RGB from colormap)",	/* PHOTOMETRIC_PALETTE */
kusano 7d535a
    "transparency mask",			/* PHOTOMETRIC_MASK */
kusano 7d535a
    "separated",				/* PHOTOMETRIC_SEPARATED */
kusano 7d535a
    "YCbCr",					/* PHOTOMETRIC_YCBCR */
kusano 7d535a
    "7 (0x7)",
kusano 7d535a
    "CIE L*a*b*",				/* PHOTOMETRIC_CIELAB */
kusano 7d535a
    "ICC L*a*b*",				/* PHOTOMETRIC_ICCLAB */
kusano 7d535a
    "ITU L*a*b*" 				/* PHOTOMETRIC_ITULAB */
kusano 7d535a
};
kusano 7d535a
#define	NPHOTONAMES	(sizeof (photoNames) / sizeof (photoNames[0]))
kusano 7d535a
kusano 7d535a
static const char *orientNames[] = {
kusano 7d535a
    "0 (0x0)",
kusano 7d535a
    "row 0 top, col 0 lhs",			/* ORIENTATION_TOPLEFT */
kusano 7d535a
    "row 0 top, col 0 rhs",			/* ORIENTATION_TOPRIGHT */
kusano 7d535a
    "row 0 bottom, col 0 rhs",			/* ORIENTATION_BOTRIGHT */
kusano 7d535a
    "row 0 bottom, col 0 lhs",			/* ORIENTATION_BOTLEFT */
kusano 7d535a
    "row 0 lhs, col 0 top",			/* ORIENTATION_LEFTTOP */
kusano 7d535a
    "row 0 rhs, col 0 top",			/* ORIENTATION_RIGHTTOP */
kusano 7d535a
    "row 0 rhs, col 0 bottom",			/* ORIENTATION_RIGHTBOT */
kusano 7d535a
    "row 0 lhs, col 0 bottom",			/* ORIENTATION_LEFTBOT */
kusano 7d535a
};
kusano 7d535a
#define	NORIENTNAMES	(sizeof (orientNames) / sizeof (orientNames[0]))
kusano 7d535a
kusano 7d535a
static void
kusano 7d535a
_TIFFPrintField(FILE* fd, const TIFFField *fip,
kusano 7d535a
		uint32 value_count, void *raw_data)
kusano 7d535a
{
kusano 7d535a
	uint32 j;
kusano 7d535a
		
kusano 7d535a
	fprintf(fd, "  %s: ", fip->field_name);
kusano 7d535a
kusano 7d535a
	for(j = 0; j < value_count; j++) {
kusano 7d535a
		if(fip->field_type == TIFF_BYTE)
kusano 7d535a
			fprintf(fd, "%u", ((uint8 *) raw_data)[j]);
kusano 7d535a
		else if(fip->field_type == TIFF_UNDEFINED)
kusano 7d535a
			fprintf(fd, "0x%x",
kusano 7d535a
			    (unsigned int) ((unsigned char *) raw_data)[j]);
kusano 7d535a
		else if(fip->field_type == TIFF_SBYTE)
kusano 7d535a
			fprintf(fd, "%d", ((int8 *) raw_data)[j]);
kusano 7d535a
		else if(fip->field_type == TIFF_SHORT)
kusano 7d535a
			fprintf(fd, "%u", ((uint16 *) raw_data)[j]);
kusano 7d535a
		else if(fip->field_type == TIFF_SSHORT)
kusano 7d535a
			fprintf(fd, "%d", ((int16 *) raw_data)[j]);
kusano 7d535a
		else if(fip->field_type == TIFF_LONG)
kusano 7d535a
			fprintf(fd, "%lu",
kusano 7d535a
			    (unsigned long)((uint32 *) raw_data)[j]);
kusano 7d535a
		else if(fip->field_type == TIFF_SLONG)
kusano 7d535a
			fprintf(fd, "%ld", (long)((int32 *) raw_data)[j]);
kusano 7d535a
		else if(fip->field_type == TIFF_IFD)
kusano 7d535a
			fprintf(fd, "0x%lx",
kusano 7d535a
				(unsigned long)((uint32 *) raw_data)[j]);
kusano 7d535a
		else if(fip->field_type == TIFF_RATIONAL
kusano 7d535a
			|| fip->field_type == TIFF_SRATIONAL
kusano 7d535a
			|| fip->field_type == TIFF_FLOAT)
kusano 7d535a
			fprintf(fd, "%f", ((float *) raw_data)[j]);
kusano 7d535a
		else if(fip->field_type == TIFF_LONG8)
kusano 7d535a
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
kusano 7d535a
			fprintf(fd, "%I64u",
kusano 7d535a
			    (unsigned __int64)((uint64 *) raw_data)[j]);
kusano 7d535a
#else
kusano 7d535a
			fprintf(fd, "%llu",
kusano 7d535a
			    (unsigned long long)((uint64 *) raw_data)[j]);
kusano 7d535a
#endif
kusano 7d535a
		else if(fip->field_type == TIFF_SLONG8)
kusano 7d535a
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
kusano 7d535a
			fprintf(fd, "%I64d", (__int64)((int64 *) raw_data)[j]);
kusano 7d535a
#else
kusano 7d535a
			fprintf(fd, "%lld", (long long)((int64 *) raw_data)[j]);
kusano 7d535a
#endif
kusano 7d535a
		else if(fip->field_type == TIFF_IFD8)
kusano 7d535a
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
kusano 7d535a
			fprintf(fd, "0x%I64x",
kusano 7d535a
				(unsigned __int64)((uint64 *) raw_data)[j]);
kusano 7d535a
#else
kusano 7d535a
			fprintf(fd, "0x%llx",
kusano 7d535a
				(unsigned long long)((uint64 *) raw_data)[j]);
kusano 7d535a
#endif
kusano 7d535a
		else if(fip->field_type == TIFF_FLOAT)
kusano 7d535a
			fprintf(fd, "%f", ((float *)raw_data)[j]);
kusano 7d535a
		else if(fip->field_type == TIFF_DOUBLE)
kusano 7d535a
			fprintf(fd, "%f", ((double *) raw_data)[j]);
kusano 7d535a
		else if(fip->field_type == TIFF_ASCII) {
kusano 7d535a
			fprintf(fd, "%s", (char *) raw_data);
kusano 7d535a
			break;
kusano 7d535a
		}
kusano 7d535a
		else {
kusano 7d535a
			fprintf(fd, "<unsupported data="" in="" tiffprint="" type="">");</unsupported>
kusano 7d535a
			break;
kusano 7d535a
		}
kusano 7d535a
kusano 7d535a
		if(j < value_count - 1)
kusano 7d535a
			fprintf(fd, ",");
kusano 7d535a
	}
kusano 7d535a
kusano 7d535a
	fprintf(fd, "\n");
kusano 7d535a
}
kusano 7d535a
kusano 7d535a
static int
kusano 7d535a
_TIFFPrettyPrintField(TIFF* tif, const TIFFField *fip, FILE* fd, uint32 tag,
kusano 7d535a
		      uint32 value_count, void *raw_data)
kusano 7d535a
{
kusano 7d535a
        (void) tif;
kusano 7d535a
kusano 7d535a
	/* do not try to pretty print auto-defined fields */
kusano 7d535a
	if (strncmp(fip->field_name,"Tag ", 4) == 0) {
kusano 7d535a
		return 0;
kusano 7d535a
	}
kusano 7d535a
        
kusano 7d535a
	switch (tag)
kusano 7d535a
	{
kusano 7d535a
		case TIFFTAG_INKSET:
kusano 7d535a
			if (value_count == 2 && fip->field_type == TIFF_SHORT) {
kusano 7d535a
				fprintf(fd, "  Ink Set: ");
kusano 7d535a
				switch (*((uint16*)raw_data)) {
kusano 7d535a
				case INKSET_CMYK:
kusano 7d535a
					fprintf(fd, "CMYK\n");
kusano 7d535a
					break;
kusano 7d535a
				default:
kusano 7d535a
					fprintf(fd, "%u (0x%x)\n",
kusano 7d535a
						*((uint16*)raw_data),
kusano 7d535a
						*((uint16*)raw_data));
kusano 7d535a
					break;
kusano 7d535a
				}
kusano 7d535a
				return 1;
kusano 7d535a
			}
kusano 7d535a
			return 0;
kusano 7d535a
kusano 7d535a
		case TIFFTAG_DOTRANGE:
kusano 7d535a
			if (value_count == 2 && fip->field_type == TIFF_SHORT) {
kusano 7d535a
				fprintf(fd, "  Dot Range: %u-%u\n",
kusano 7d535a
					((uint16*)raw_data)[0], ((uint16*)raw_data)[1]);
kusano 7d535a
				return 1;
kusano 7d535a
			}
kusano 7d535a
			return 0;
kusano 7d535a
kusano 7d535a
		case TIFFTAG_WHITEPOINT:
kusano 7d535a
			if (value_count == 2 && fip->field_type == TIFF_RATIONAL) {
kusano 7d535a
				fprintf(fd, "  White Point: %g-%g\n",
kusano 7d535a
					((float *)raw_data)[0], ((float *)raw_data)[1]);
kusano 7d535a
				return 1;
kusano 7d535a
			} 
kusano 7d535a
			return 0;
kusano 7d535a
kusano 7d535a
		case TIFFTAG_XMLPACKET:
kusano 7d535a
		{
kusano 7d535a
			uint32 i;
kusano 7d535a
kusano 7d535a
			fprintf(fd, "  XMLPacket (XMP Metadata):\n" );
kusano 7d535a
			for(i = 0; i < value_count; i++)
kusano 7d535a
				fputc(((char *)raw_data)[i], fd);
kusano 7d535a
			fprintf( fd, "\n" );
kusano 7d535a
			return 1;
kusano 7d535a
		}
kusano 7d535a
		case TIFFTAG_RICHTIFFIPTC:
kusano 7d535a
			/*
kusano 7d535a
			 * XXX: for some weird reason RichTIFFIPTC tag
kusano 7d535a
			 * defined as array of LONG values.
kusano 7d535a
			 */
kusano 7d535a
			fprintf(fd,
kusano 7d535a
			    "  RichTIFFIPTC Data: <present>, %lu bytes\n",</present>
kusano 7d535a
			    (unsigned long) value_count * 4);
kusano 7d535a
			return 1;
kusano 7d535a
kusano 7d535a
		case TIFFTAG_PHOTOSHOP:
kusano 7d535a
			fprintf(fd, "  Photoshop Data: <present>, %lu bytes\n",</present>
kusano 7d535a
			    (unsigned long) value_count);
kusano 7d535a
			return 1;
kusano 7d535a
kusano 7d535a
		case TIFFTAG_ICCPROFILE:
kusano 7d535a
			fprintf(fd, "  ICC Profile: <present>, %lu bytes\n",</present>
kusano 7d535a
			    (unsigned long) value_count);
kusano 7d535a
			return 1;
kusano 7d535a
kusano 7d535a
		case TIFFTAG_STONITS:
kusano 7d535a
			if (value_count == 1 && fip->field_type == TIFF_DOUBLE) { 
kusano 7d535a
				fprintf(fd,
kusano 7d535a
					"  Sample to Nits conversion factor: %.4e\n",
kusano 7d535a
					*((double*)raw_data));
kusano 7d535a
				return 1;
kusano 7d535a
			}
kusano 7d535a
			return 0;
kusano 7d535a
	}
kusano 7d535a
kusano 7d535a
	return 0;
kusano 7d535a
}
kusano 7d535a
kusano 7d535a
/*
kusano 7d535a
 * Print the contents of the current directory
kusano 7d535a
 * to the specified stdio file stream.
kusano 7d535a
 */
kusano 7d535a
void
kusano 7d535a
TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
kusano 7d535a
{
kusano 7d535a
	TIFFDirectory *td = &tif->tif_dir;
kusano 7d535a
	char *sep;
kusano 7d535a
	uint16 i;
kusano 7d535a
	long l, n;
kusano 7d535a
kusano 7d535a
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
kusano 7d535a
	fprintf(fd, "TIFF Directory at offset 0x%I64x (%I64u)\n",
kusano 7d535a
		(unsigned __int64) tif->tif_diroff,
kusano 7d535a
		(unsigned __int64) tif->tif_diroff);
kusano 7d535a
#else
kusano 7d535a
	fprintf(fd, "TIFF Directory at offset 0x%llx (%llu)\n",
kusano 7d535a
		(unsigned long long) tif->tif_diroff,
kusano 7d535a
		(unsigned long long) tif->tif_diroff);
kusano 7d535a
#endif
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_SUBFILETYPE)) {
kusano 7d535a
		fprintf(fd, "  Subfile Type:");
kusano 7d535a
		sep = " ";
kusano 7d535a
		if (td->td_subfiletype & FILETYPE_REDUCEDIMAGE) {
kusano 7d535a
			fprintf(fd, "%sreduced-resolution image", sep);
kusano 7d535a
			sep = "/";
kusano 7d535a
		}
kusano 7d535a
		if (td->td_subfiletype & FILETYPE_PAGE) {
kusano 7d535a
			fprintf(fd, "%smulti-page document", sep);
kusano 7d535a
			sep = "/";
kusano 7d535a
		}
kusano 7d535a
		if (td->td_subfiletype & FILETYPE_MASK)
kusano 7d535a
			fprintf(fd, "%stransparency mask", sep);
kusano 7d535a
		fprintf(fd, " (%lu = 0x%lx)\n",
kusano 7d535a
		    (long) td->td_subfiletype, (long) td->td_subfiletype);
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS)) {
kusano 7d535a
		fprintf(fd, "  Image Width: %lu Image Length: %lu",
kusano 7d535a
		    (unsigned long) td->td_imagewidth, (unsigned long) td->td_imagelength);
kusano 7d535a
		if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH))
kusano 7d535a
			fprintf(fd, " Image Depth: %lu",
kusano 7d535a
			    (unsigned long) td->td_imagedepth);
kusano 7d535a
		fprintf(fd, "\n");
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS)) {
kusano 7d535a
		fprintf(fd, "  Tile Width: %lu Tile Length: %lu",
kusano 7d535a
		    (unsigned long) td->td_tilewidth, (unsigned long) td->td_tilelength);
kusano 7d535a
		if (TIFFFieldSet(tif,FIELD_TILEDEPTH))
kusano 7d535a
			fprintf(fd, " Tile Depth: %lu",
kusano 7d535a
			    (unsigned long) td->td_tiledepth);
kusano 7d535a
		fprintf(fd, "\n");
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_RESOLUTION)) {
kusano 7d535a
		fprintf(fd, "  Resolution: %g, %g",
kusano 7d535a
		    td->td_xresolution, td->td_yresolution);
kusano 7d535a
		if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT)) {
kusano 7d535a
			switch (td->td_resolutionunit) {
kusano 7d535a
			case RESUNIT_NONE:
kusano 7d535a
				fprintf(fd, " (unitless)");
kusano 7d535a
				break;
kusano 7d535a
			case RESUNIT_INCH:
kusano 7d535a
				fprintf(fd, " pixels/inch");
kusano 7d535a
				break;
kusano 7d535a
			case RESUNIT_CENTIMETER:
kusano 7d535a
				fprintf(fd, " pixels/cm");
kusano 7d535a
				break;
kusano 7d535a
			default:
kusano 7d535a
				fprintf(fd, " (unit %u = 0x%x)",
kusano 7d535a
				    td->td_resolutionunit,
kusano 7d535a
				    td->td_resolutionunit);
kusano 7d535a
				break;
kusano 7d535a
			}
kusano 7d535a
		}
kusano 7d535a
		fprintf(fd, "\n");
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_POSITION))
kusano 7d535a
		fprintf(fd, "  Position: %g, %g\n",
kusano 7d535a
		    td->td_xposition, td->td_yposition);
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE))
kusano 7d535a
		fprintf(fd, "  Bits/Sample: %u\n", td->td_bitspersample);
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT)) {
kusano 7d535a
		fprintf(fd, "  Sample Format: ");
kusano 7d535a
		switch (td->td_sampleformat) {
kusano 7d535a
		case SAMPLEFORMAT_VOID:
kusano 7d535a
			fprintf(fd, "void\n");
kusano 7d535a
			break;
kusano 7d535a
		case SAMPLEFORMAT_INT:
kusano 7d535a
			fprintf(fd, "signed integer\n");
kusano 7d535a
			break;
kusano 7d535a
		case SAMPLEFORMAT_UINT:
kusano 7d535a
			fprintf(fd, "unsigned integer\n");
kusano 7d535a
			break;
kusano 7d535a
		case SAMPLEFORMAT_IEEEFP:
kusano 7d535a
			fprintf(fd, "IEEE floating point\n");
kusano 7d535a
			break;
kusano 7d535a
		case SAMPLEFORMAT_COMPLEXINT:
kusano 7d535a
			fprintf(fd, "complex signed integer\n");
kusano 7d535a
			break;
kusano 7d535a
		case SAMPLEFORMAT_COMPLEXIEEEFP:
kusano 7d535a
			fprintf(fd, "complex IEEE floating point\n");
kusano 7d535a
			break;
kusano 7d535a
		default:
kusano 7d535a
			fprintf(fd, "%u (0x%x)\n",
kusano 7d535a
			    td->td_sampleformat, td->td_sampleformat);
kusano 7d535a
			break;
kusano 7d535a
		}
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_COMPRESSION)) {
kusano 7d535a
		const TIFFCodec* c = TIFFFindCODEC(td->td_compression);
kusano 7d535a
		fprintf(fd, "  Compression Scheme: ");
kusano 7d535a
		if (c)
kusano 7d535a
			fprintf(fd, "%s\n", c->name);
kusano 7d535a
		else
kusano 7d535a
			fprintf(fd, "%u (0x%x)\n",
kusano 7d535a
			    td->td_compression, td->td_compression);
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC)) {
kusano 7d535a
		fprintf(fd, "  Photometric Interpretation: ");
kusano 7d535a
		if (td->td_photometric < NPHOTONAMES)
kusano 7d535a
			fprintf(fd, "%s\n", photoNames[td->td_photometric]);
kusano 7d535a
		else {
kusano 7d535a
			switch (td->td_photometric) {
kusano 7d535a
			case PHOTOMETRIC_LOGL:
kusano 7d535a
				fprintf(fd, "CIE Log2(L)\n");
kusano 7d535a
				break;
kusano 7d535a
			case PHOTOMETRIC_LOGLUV:
kusano 7d535a
				fprintf(fd, "CIE Log2(L) (u',v')\n");
kusano 7d535a
				break;
kusano 7d535a
			default:
kusano 7d535a
				fprintf(fd, "%u (0x%x)\n",
kusano 7d535a
				    td->td_photometric, td->td_photometric);
kusano 7d535a
				break;
kusano 7d535a
			}
kusano 7d535a
		}
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES) && td->td_extrasamples) {
kusano 7d535a
		fprintf(fd, "  Extra Samples: %u<", td->td_extrasamples);
kusano 7d535a
		sep = "";
kusano 7d535a
		for (i = 0; i < td->td_extrasamples; i++) {
kusano 7d535a
			switch (td->td_sampleinfo[i]) {
kusano 7d535a
			case EXTRASAMPLE_UNSPECIFIED:
kusano 7d535a
				fprintf(fd, "%sunspecified", sep);
kusano 7d535a
				break;
kusano 7d535a
			case EXTRASAMPLE_ASSOCALPHA:
kusano 7d535a
				fprintf(fd, "%sassoc-alpha", sep);
kusano 7d535a
				break;
kusano 7d535a
			case EXTRASAMPLE_UNASSALPHA:
kusano 7d535a
				fprintf(fd, "%sunassoc-alpha", sep);
kusano 7d535a
				break;
kusano 7d535a
			default:
kusano 7d535a
				fprintf(fd, "%s%u (0x%x)", sep,
kusano 7d535a
				    td->td_sampleinfo[i], td->td_sampleinfo[i]);
kusano 7d535a
				break;
kusano 7d535a
			}
kusano 7d535a
			sep = ", ";
kusano 7d535a
		}
kusano 7d535a
		fprintf(fd, ">\n");
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_INKNAMES)) {
kusano 7d535a
		char* cp;
kusano 7d535a
		fprintf(fd, "  Ink Names: ");
kusano 7d535a
		i = td->td_samplesperpixel;
kusano 7d535a
		sep = "";
kusano 7d535a
		for (cp = td->td_inknames; 
kusano 7d535a
		     i > 0 && cp < td->td_inknames + td->td_inknameslen; 
kusano 7d535a
		     cp = strchr(cp,'\0')+1, i--) {
kusano 7d535a
			int max_chars = 
kusano 7d535a
				td->td_inknameslen - (cp - td->td_inknames);
kusano 7d535a
			fputs(sep, fd);
kusano 7d535a
			_TIFFprintAsciiBounded(fd, cp, max_chars);
kusano 7d535a
			sep = ", ";
kusano 7d535a
		}
kusano 7d535a
                fputs("\n", fd);
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_THRESHHOLDING)) {
kusano 7d535a
		fprintf(fd, "  Thresholding: ");
kusano 7d535a
		switch (td->td_threshholding) {
kusano 7d535a
		case THRESHHOLD_BILEVEL:
kusano 7d535a
			fprintf(fd, "bilevel art scan\n");
kusano 7d535a
			break;
kusano 7d535a
		case THRESHHOLD_HALFTONE:
kusano 7d535a
			fprintf(fd, "halftone or dithered scan\n");
kusano 7d535a
			break;
kusano 7d535a
		case THRESHHOLD_ERRORDIFFUSE:
kusano 7d535a
			fprintf(fd, "error diffused\n");
kusano 7d535a
			break;
kusano 7d535a
		default:
kusano 7d535a
			fprintf(fd, "%u (0x%x)\n",
kusano 7d535a
			    td->td_threshholding, td->td_threshholding);
kusano 7d535a
			break;
kusano 7d535a
		}
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_FILLORDER)) {
kusano 7d535a
		fprintf(fd, "  FillOrder: ");
kusano 7d535a
		switch (td->td_fillorder) {
kusano 7d535a
		case FILLORDER_MSB2LSB:
kusano 7d535a
			fprintf(fd, "msb-to-lsb\n");
kusano 7d535a
			break;
kusano 7d535a
		case FILLORDER_LSB2MSB:
kusano 7d535a
			fprintf(fd, "lsb-to-msb\n");
kusano 7d535a
			break;
kusano 7d535a
		default:
kusano 7d535a
			fprintf(fd, "%u (0x%x)\n",
kusano 7d535a
			    td->td_fillorder, td->td_fillorder);
kusano 7d535a
			break;
kusano 7d535a
		}
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING))
kusano 7d535a
        {
kusano 7d535a
		fprintf(fd, "  YCbCr Subsampling: %u, %u\n",
kusano 7d535a
			td->td_ycbcrsubsampling[0], td->td_ycbcrsubsampling[1] );
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING)) {
kusano 7d535a
		fprintf(fd, "  YCbCr Positioning: ");
kusano 7d535a
		switch (td->td_ycbcrpositioning) {
kusano 7d535a
		case YCBCRPOSITION_CENTERED:
kusano 7d535a
			fprintf(fd, "centered\n");
kusano 7d535a
			break;
kusano 7d535a
		case YCBCRPOSITION_COSITED:
kusano 7d535a
			fprintf(fd, "cosited\n");
kusano 7d535a
			break;
kusano 7d535a
		default:
kusano 7d535a
			fprintf(fd, "%u (0x%x)\n",
kusano 7d535a
			    td->td_ycbcrpositioning, td->td_ycbcrpositioning);
kusano 7d535a
			break;
kusano 7d535a
		}
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS))
kusano 7d535a
		fprintf(fd, "  Halftone Hints: light %u dark %u\n",
kusano 7d535a
		    td->td_halftonehints[0], td->td_halftonehints[1]);
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_ORIENTATION)) {
kusano 7d535a
		fprintf(fd, "  Orientation: ");
kusano 7d535a
		if (td->td_orientation < NORIENTNAMES)
kusano 7d535a
			fprintf(fd, "%s\n", orientNames[td->td_orientation]);
kusano 7d535a
		else
kusano 7d535a
			fprintf(fd, "%u (0x%x)\n",
kusano 7d535a
			    td->td_orientation, td->td_orientation);
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
kusano 7d535a
		fprintf(fd, "  Samples/Pixel: %u\n", td->td_samplesperpixel);
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP)) {
kusano 7d535a
		fprintf(fd, "  Rows/Strip: ");
kusano 7d535a
		if (td->td_rowsperstrip == (uint32) -1)
kusano 7d535a
			fprintf(fd, "(infinite)\n");
kusano 7d535a
		else
kusano 7d535a
			fprintf(fd, "%lu\n", (unsigned long) td->td_rowsperstrip);
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE))
kusano 7d535a
		fprintf(fd, "  Min Sample Value: %u\n", td->td_minsamplevalue);
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE))
kusano 7d535a
		fprintf(fd, "  Max Sample Value: %u\n", td->td_maxsamplevalue);
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE)) {
kusano 7d535a
		int count = (tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1;
kusano 7d535a
		fprintf(fd, "  SMin Sample Value:");
kusano 7d535a
		for (i = 0; i < count; ++i)
kusano 7d535a
			fprintf(fd, " %g", td->td_sminsamplevalue[i]);
kusano 7d535a
		fprintf(fd, "\n");
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE)) {
kusano 7d535a
		int count = (tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1;
kusano 7d535a
		fprintf(fd, "  SMax Sample Value:");
kusano 7d535a
		for (i = 0; i < count; ++i)
kusano 7d535a
			fprintf(fd, " %g", td->td_smaxsamplevalue[i]);
kusano 7d535a
		fprintf(fd, "\n");
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_PLANARCONFIG)) {
kusano 7d535a
		fprintf(fd, "  Planar Configuration: ");
kusano 7d535a
		switch (td->td_planarconfig) {
kusano 7d535a
		case PLANARCONFIG_CONTIG:
kusano 7d535a
			fprintf(fd, "single image plane\n");
kusano 7d535a
			break;
kusano 7d535a
		case PLANARCONFIG_SEPARATE:
kusano 7d535a
			fprintf(fd, "separate image planes\n");
kusano 7d535a
			break;
kusano 7d535a
		default:
kusano 7d535a
			fprintf(fd, "%u (0x%x)\n",
kusano 7d535a
			    td->td_planarconfig, td->td_planarconfig);
kusano 7d535a
			break;
kusano 7d535a
		}
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_PAGENUMBER))
kusano 7d535a
		fprintf(fd, "  Page Number: %u-%u\n",
kusano 7d535a
		    td->td_pagenumber[0], td->td_pagenumber[1]);
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_COLORMAP)) {
kusano 7d535a
		fprintf(fd, "  Color Map: ");
kusano 7d535a
		if (flags & TIFFPRINT_COLORMAP) {
kusano 7d535a
			fprintf(fd, "\n");
kusano 7d535a
			n = 1L<<td->td_bitspersample;</td->
kusano 7d535a
			for (l = 0; l < n; l++)
kusano 7d535a
				fprintf(fd, "   %5lu: %5u %5u %5u\n",
kusano 7d535a
				    l,
kusano 7d535a
				    td->td_colormap[0][l],
kusano 7d535a
				    td->td_colormap[1][l],
kusano 7d535a
				    td->td_colormap[2][l]);
kusano 7d535a
		} else
kusano 7d535a
			fprintf(fd, "(present)\n");
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_REFBLACKWHITE)) {
kusano 7d535a
		fprintf(fd, "  Reference Black/White:\n");
kusano 7d535a
		for (i = 0; i < 3; i++)
kusano 7d535a
		fprintf(fd, "    %2d: %5g %5g\n", i,
kusano 7d535a
			td->td_refblackwhite[2*i+0],
kusano 7d535a
			td->td_refblackwhite[2*i+1]);
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION)) {
kusano 7d535a
		fprintf(fd, "  Transfer Function: ");
kusano 7d535a
		if (flags & TIFFPRINT_CURVES) {
kusano 7d535a
			fprintf(fd, "\n");
kusano 7d535a
			n = 1L<<td->td_bitspersample;</td->
kusano 7d535a
			for (l = 0; l < n; l++) {
kusano 7d535a
				fprintf(fd, "    %2lu: %5u",
kusano 7d535a
				    l, td->td_transferfunction[0][l]);
kusano 7d535a
				for (i = 1; i < td->td_samplesperpixel; i++)
kusano 7d535a
					fprintf(fd, " %5u",
kusano 7d535a
					    td->td_transferfunction[i][l]);
kusano 7d535a
				fputc('\n', fd);
kusano 7d535a
			}
kusano 7d535a
		} else
kusano 7d535a
			fprintf(fd, "(present)\n");
kusano 7d535a
	}
kusano 7d535a
	if (TIFFFieldSet(tif, FIELD_SUBIFD) && (td->td_subifd)) {
kusano 7d535a
		fprintf(fd, "  SubIFD Offsets:");
kusano 7d535a
		for (i = 0; i < td->td_nsubifd; i++)
kusano 7d535a
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
kusano 7d535a
			fprintf(fd, " %5I64u",
kusano 7d535a
				(unsigned __int64) td->td_subifd[i]);
kusano 7d535a
#else
kusano 7d535a
			fprintf(fd, " %5llu",
kusano 7d535a
				(unsigned long long) td->td_subifd[i]);
kusano 7d535a
#endif
kusano 7d535a
		fputc('\n', fd);
kusano 7d535a
	}
kusano 7d535a
kusano 7d535a
	/*
kusano 7d535a
	** Custom tag support.
kusano 7d535a
	*/
kusano 7d535a
	{
kusano 7d535a
		int  i;
kusano 7d535a
		short count;
kusano 7d535a
kusano 7d535a
		count = (short) TIFFGetTagListCount(tif);
kusano 7d535a
		for(i = 0; i < count; i++) {
kusano 7d535a
			uint32 tag = TIFFGetTagListEntry(tif, i);
kusano 7d535a
			const TIFFField *fip;
kusano 7d535a
			uint32 value_count;
kusano 7d535a
			int mem_alloc = 0;
kusano 7d535a
			void *raw_data;
kusano 7d535a
kusano 7d535a
			fip = TIFFFieldWithTag(tif, tag);
kusano 7d535a
			if(fip == NULL)
kusano 7d535a
				continue;
kusano 7d535a
kusano 7d535a
			if(fip->field_passcount) {
kusano 7d535a
				if (fip->field_readcount == TIFF_VARIABLE ) {
kusano 7d535a
					if(TIFFGetField(tif, tag, &value_count, &raw_data) != 1)
kusano 7d535a
						continue;
kusano 7d535a
				} else if (fip->field_readcount == TIFF_VARIABLE2 ) {
kusano 7d535a
					uint16 small_value_count;
kusano 7d535a
					if(TIFFGetField(tif, tag, &small_value_count, &raw_data) != 1)
kusano 7d535a
						continue;
kusano 7d535a
					value_count = small_value_count;
kusano 7d535a
				} else {
kusano 7d535a
					assert (fip->field_readcount == TIFF_VARIABLE
kusano 7d535a
						|| fip->field_readcount == TIFF_VARIABLE2);
kusano 7d535a
					continue;
kusano 7d535a
				} 
kusano 7d535a
			} else {
kusano 7d535a
				if (fip->field_readcount == TIFF_VARIABLE
kusano 7d535a
				    || fip->field_readcount == TIFF_VARIABLE2)
kusano 7d535a
					value_count = 1;
kusano 7d535a
				else if (fip->field_readcount == TIFF_SPP)
kusano 7d535a
					value_count = td->td_samplesperpixel;
kusano 7d535a
				else
kusano 7d535a
					value_count = fip->field_readcount;
kusano 7d535a
				if (fip->field_tag == TIFFTAG_DOTRANGE
kusano 7d535a
				    && strcmp(fip->field_name,"DotRange") == 0) {
kusano 7d535a
					/* TODO: This is an evil exception and should not have been
kusano 7d535a
					   handled this way ... likely best if we move it into
kusano 7d535a
					   the directory structure with an explicit field in 
kusano 7d535a
					   libtiff 4.1 and assign it a FIELD_ value */
kusano 7d535a
					static uint16 dotrange[2];
kusano 7d535a
					raw_data = dotrange;
kusano 7d535a
					TIFFGetField(tif, tag, dotrange+0, dotrange+1);
kusano 7d535a
				} else if (fip->field_type == TIFF_ASCII
kusano 7d535a
					   || fip->field_readcount == TIFF_VARIABLE
kusano 7d535a
					   || fip->field_readcount == TIFF_VARIABLE2
kusano 7d535a
					   || fip->field_readcount == TIFF_SPP
kusano 7d535a
					   || value_count > 1) {
kusano 7d535a
					if(TIFFGetField(tif, tag, &raw_data) != 1)
kusano 7d535a
						continue;
kusano 7d535a
				} else {
kusano 7d535a
					raw_data = _TIFFmalloc(
kusano 7d535a
					    _TIFFDataSize(fip->field_type)
kusano 7d535a
					    * value_count);
kusano 7d535a
					mem_alloc = 1;
kusano 7d535a
					if(TIFFGetField(tif, tag, raw_data) != 1) {
kusano 7d535a
						_TIFFfree(raw_data);
kusano 7d535a
						continue;
kusano 7d535a
					}
kusano 7d535a
				}
kusano 7d535a
			}
kusano 7d535a
kusano 7d535a
			/*
kusano 7d535a
			 * Catch the tags which needs to be specially handled
kusano 7d535a
			 * and pretty print them. If tag not handled in
kusano 7d535a
			 * _TIFFPrettyPrintField() fall down and print it as
kusano 7d535a
			 * any other tag.
kusano 7d535a
			 */
kusano 7d535a
			if (!_TIFFPrettyPrintField(tif, fip, fd, tag, value_count, raw_data))
kusano 7d535a
				_TIFFPrintField(fd, fip, value_count, raw_data);
kusano 7d535a
kusano 7d535a
			if(mem_alloc)
kusano 7d535a
				_TIFFfree(raw_data);
kusano 7d535a
		}
kusano 7d535a
	}
kusano 7d535a
        
kusano 7d535a
	if (tif->tif_tagmethods.printdir)
kusano 7d535a
		(*tif->tif_tagmethods.printdir)(tif, fd, flags);
kusano 7d535a
kusano 7d535a
        _TIFFFillStriles( tif );
kusano 7d535a
        
kusano 7d535a
	if ((flags & TIFFPRINT_STRIPS) &&
kusano 7d535a
	    TIFFFieldSet(tif,FIELD_STRIPOFFSETS)) {
kusano 7d535a
		uint32 s;
kusano 7d535a
kusano 7d535a
		fprintf(fd, "  %lu %s:\n",
kusano 7d535a
		    (long) td->td_nstrips,
kusano 7d535a
		    isTiled(tif) ? "Tiles" : "Strips");
kusano 7d535a
		for (s = 0; s < td->td_nstrips; s++)
kusano 7d535a
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
kusano 7d535a
			fprintf(fd, "    %3lu: [%8I64u, %8I64u]\n",
kusano 7d535a
			    (unsigned long) s,
kusano 7d535a
			    (unsigned __int64) td->td_stripoffset[s],
kusano 7d535a
			    (unsigned __int64) td->td_stripbytecount[s]);
kusano 7d535a
#else
kusano 7d535a
			fprintf(fd, "    %3lu: [%8llu, %8llu]\n",
kusano 7d535a
			    (unsigned long) s,
kusano 7d535a
			    (unsigned long long) td->td_stripoffset[s],
kusano 7d535a
			    (unsigned long long) td->td_stripbytecount[s]);
kusano 7d535a
#endif
kusano 7d535a
	}
kusano 7d535a
}
kusano 7d535a
kusano 7d535a
void
kusano 7d535a
_TIFFprintAscii(FILE* fd, const char* cp)
kusano 7d535a
{
kusano 7d535a
	_TIFFprintAsciiBounded( fd, cp, strlen(cp));
kusano 7d535a
}
kusano 7d535a
kusano 7d535a
static void
kusano 7d535a
_TIFFprintAsciiBounded(FILE* fd, const char* cp, int max_chars)
kusano 7d535a
{
kusano 7d535a
	for (; max_chars > 0 && *cp != '\0'; cp++, max_chars--) {
kusano 7d535a
		const char* tp;
kusano 7d535a
kusano 7d535a
		if (isprint((int)*cp)) {
kusano 7d535a
			fputc(*cp, fd);
kusano 7d535a
			continue;
kusano 7d535a
		}
kusano 7d535a
		for (tp = "\tt\bb\rr\nn\vv"; *tp; tp++)
kusano 7d535a
			if (*tp++ == *cp)
kusano 7d535a
				break;
kusano 7d535a
		if (*tp)
kusano 7d535a
			fprintf(fd, "\\%c", *tp);
kusano 7d535a
		else
kusano 7d535a
			fprintf(fd, "\\%03o", *cp & 0xff);
kusano 7d535a
	}
kusano 7d535a
}
kusano 7d535a
kusano 7d535a
void
kusano 7d535a
_TIFFprintAsciiTag(FILE* fd, const char* name, const char* value)
kusano 7d535a
{
kusano 7d535a
	fprintf(fd, "  %s: \"", name);
kusano 7d535a
	_TIFFprintAscii(fd, value);
kusano 7d535a
	fprintf(fd, "\"\n");
kusano 7d535a
}
kusano 7d535a
kusano 7d535a
/* vim: set ts=8 sts=8 sw=8 noet: */
kusano 7d535a
/*
kusano 7d535a
 * Local Variables:
kusano 7d535a
 * mode: c
kusano 7d535a
 * c-basic-offset: 8
kusano 7d535a
 * fill-column: 78
kusano 7d535a
 * End:
kusano 7d535a
 */