Blame libtiff/tif_print.c

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