Blame libtiff/tif_print.c

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