1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* $Id: tif_aux.c,v 1.26 2010-07-01 15:33:28 dron Exp $ */
2ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
3ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/*
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Copyright (c) 1991-1997 Sam Leffler
5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Copyright (c) 1991-1997 Silicon Graphics, Inc.
6ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Permission to use, copy, modify, distribute, and sell this software and
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * its documentation for any purpose is hereby granted without fee, provided
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * that (i) the above copyright notices and this permission notice appear in
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * all copies of the software and related documentation, and (ii) the names of
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Sam Leffler and Silicon Graphics may not be used in any advertising or
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * publicity relating to the software without the specific, prior written
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * permission of Sam Leffler and Silicon Graphics.
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * OF THIS SOFTWARE.
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/*
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * TIFF Library.
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Auxiliary Support Routines.
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "tiffiop.h"
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "tif_predict.h"
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <math.h>
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannuint32
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann_TIFFMultiply32(TIFF* tif, uint32 first, uint32 second, const char* where)
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	uint32 bytes = first * second;
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (second && bytes / second != first) {
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		TIFFErrorExt(tif->tif_clientdata, where, "Integer overflow in %s", where);
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		bytes = 0;
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	}
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	return bytes;
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannuint64
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann_TIFFMultiply64(TIFF* tif, uint64 first, uint64 second, const char* where)
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	uint64 bytes = first * second;
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (second && bytes / second != first) {
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		TIFFErrorExt(tif->tif_clientdata, where, "Integer overflow in %s", where);
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		bytes = 0;
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	}
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	return bytes;
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid*
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann_TIFFCheckRealloc(TIFF* tif, void* buffer,
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		  tmsize_t nmemb, tmsize_t elem_size, const char* what)
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	void* cp = NULL;
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	tmsize_t bytes = nmemb * elem_size;
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	/*
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	 * XXX: Check for integer overflow.
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	 */
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (nmemb && elem_size && bytes / elem_size == nmemb)
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		cp = _TIFFrealloc(buffer, bytes);
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (cp == NULL) {
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			     "Failed to allocate memory for %s "
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			     "(%ld elements of %ld bytes each)",
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			     what,(long) nmemb, (long) elem_size);
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	}
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	return cp;
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid*
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann_TIFFCheckMalloc(TIFF* tif, tmsize_t nmemb, tmsize_t elem_size, const char* what)
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	return _TIFFCheckRealloc(tif, NULL, nmemb, elem_size, what);
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannTIFFDefaultTransferFunction(TIFFDirectory* td)
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	uint16 **tf = td->td_transferfunction;
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	tmsize_t i, n, nbytes;
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	tf[0] = tf[1] = tf[2] = 0;
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (td->td_bitspersample >= sizeof(tmsize_t) * 8 - 2)
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return 0;
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	n = ((tmsize_t)1)<<td->td_bitspersample;
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	nbytes = n * sizeof (uint16);
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (!(tf[0] = (uint16 *)_TIFFmalloc(nbytes)))
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return 0;
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	tf[0][0] = 0;
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	for (i = 1; i < n; i++) {
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		double t = (double)i/((double) n-1.);
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		tf[0][i] = (uint16)floor(65535.*pow(t, 2.2) + .5);
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	}
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (td->td_samplesperpixel - td->td_extrasamples > 1) {
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		if (!(tf[1] = (uint16 *)_TIFFmalloc(nbytes)))
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			goto bad;
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		_TIFFmemcpy(tf[1], tf[0], nbytes);
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		if (!(tf[2] = (uint16 *)_TIFFmalloc(nbytes)))
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			goto bad;
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		_TIFFmemcpy(tf[2], tf[0], nbytes);
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	}
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	return 1;
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannbad:
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (tf[0])
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		_TIFFfree(tf[0]);
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (tf[1])
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		_TIFFfree(tf[1]);
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (tf[2])
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		_TIFFfree(tf[2]);
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	tf[0] = tf[1] = tf[2] = 0;
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	return 0;
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannTIFFDefaultRefBlackWhite(TIFFDirectory* td)
134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	int i;
136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (!(td->td_refblackwhite = (float *)_TIFFmalloc(6*sizeof (float))))
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return 0;
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (td->td_photometric == PHOTOMETRIC_YCBCR) {
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		/*
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		 * YCbCr (Class Y) images must have the ReferenceBlackWhite
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		 * tag set. Fix the broken images, which lacks that tag.
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		 */
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		td->td_refblackwhite[0] = 0.0F;
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		td->td_refblackwhite[1] = td->td_refblackwhite[3] =
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			td->td_refblackwhite[5] = 255.0F;
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		td->td_refblackwhite[2] = td->td_refblackwhite[4] = 128.0F;
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	} else {
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		/*
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		 * Assume RGB (Class R)
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		 */
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		for (i = 0; i < 3; i++) {
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		    td->td_refblackwhite[2*i+0] = 0;
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		    td->td_refblackwhite[2*i+1] =
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			    (float)((1L<<td->td_bitspersample)-1L);
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		}
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	}
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	return 1;
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/*
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Like TIFFGetField, but return any default
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * value if the tag is not present in the directory.
164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * NB:	We use the value in the directory, rather than
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *	explcit values so that defaults exist only one
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *	place in the library -- in TIFFDefaultDirectory.
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannTIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap)
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	TIFFDirectory *td = &tif->tif_dir;
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (TIFFVGetField(tif, tag, ap))
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	switch (tag) {
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_SUBFILETYPE:
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint32 *) = td->td_subfiletype;
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_BITSPERSAMPLE:
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = td->td_bitspersample;
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_THRESHHOLDING:
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = td->td_threshholding;
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_FILLORDER:
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = td->td_fillorder;
188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_ORIENTATION:
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = td->td_orientation;
191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_SAMPLESPERPIXEL:
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = td->td_samplesperpixel;
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_ROWSPERSTRIP:
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint32 *) = td->td_rowsperstrip;
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_MINSAMPLEVALUE:
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = td->td_minsamplevalue;
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_MAXSAMPLEVALUE:
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = td->td_maxsamplevalue;
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_PLANARCONFIG:
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = td->td_planarconfig;
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_RESOLUTIONUNIT:
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = td->td_resolutionunit;
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_PREDICTOR:
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                {
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			TIFFPredictorState* sp = (TIFFPredictorState*) tif->tif_data;
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			*va_arg(ap, uint16*) = (uint16) sp->predictor;
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			return 1;
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                }
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_DOTRANGE:
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = 0;
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = (1<<td->td_bitspersample)-1;
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_INKSET:
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = INKSET_CMYK;
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return 1;
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_NUMBEROFINKS:
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = 4;
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_EXTRASAMPLES:
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = td->td_extrasamples;
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 **) = td->td_sampleinfo;
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_MATTEING:
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) =
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		    (td->td_extrasamples == 1 &&
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		     td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_TILEDEPTH:
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint32 *) = td->td_tiledepth;
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_DATATYPE:
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = td->td_sampleformat-1;
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_SAMPLEFORMAT:
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = td->td_sampleformat;
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                return(1);
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_IMAGEDEPTH:
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint32 *) = td->td_imagedepth;
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_YCBCRCOEFFICIENTS:
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		{
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			/* defaults are from CCIR Recommendation 601-1 */
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			static float ycbcrcoeffs[] = { 0.299f, 0.587f, 0.114f };
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			*va_arg(ap, float **) = ycbcrcoeffs;
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			return 1;
253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		}
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_YCBCRSUBSAMPLING:
255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[0];
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[1];
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_YCBCRPOSITIONING:
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 *) = td->td_ycbcrpositioning;
260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_WHITEPOINT:
262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		{
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			static float whitepoint[2];
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			/* TIFF 6.0 specification tells that it is no default
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			   value for the WhitePoint, but AdobePhotoshop TIFF
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			   Technical Note tells that it should be CIE D50. */
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			whitepoint[0] =	D50_X0 / (D50_X0 + D50_Y0 + D50_Z0);
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			whitepoint[1] =	D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0);
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			*va_arg(ap, float **) = whitepoint;
271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			return 1;
272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		}
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_TRANSFERFUNCTION:
274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		if (!td->td_transferfunction[0] &&
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		    !TIFFDefaultTransferFunction(td)) {
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "No space for \"TransferFunction\" tag");
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			return (0);
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		}
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, uint16 **) = td->td_transferfunction[0];
280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		if (td->td_samplesperpixel - td->td_extrasamples > 1) {
281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			*va_arg(ap, uint16 **) = td->td_transferfunction[1];
282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			*va_arg(ap, uint16 **) = td->td_transferfunction[2];
283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		}
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	case TIFFTAG_REFERENCEBLACKWHITE:
286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		if (!td->td_refblackwhite && !TIFFDefaultRefBlackWhite(td))
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann			return (0);
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		*va_arg(ap, float **) = td->td_refblackwhite;
289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (1);
290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	}
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	return 0;
292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/*
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Like TIFFGetField, but return any default
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * value if the tag is not present in the directory.
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannTIFFGetFieldDefaulted(TIFF* tif, uint32 tag, ...)
300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	int ok;
302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	va_list ap;
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	va_start(ap, tag);
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	ok =  TIFFVGetFieldDefaulted(tif, tag, ap);
306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	va_end(ap);
307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	return (ok);
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstruct _Int64Parts {
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	int32 low, high;
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann};
313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmanntypedef union {
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	struct _Int64Parts part;
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	int64 value;
317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} _Int64;
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannfloat
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann_TIFFUInt64ToFloat(uint64 ui64)
321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	_Int64 i;
323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	i.value = ui64;
325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (i.part.high >= 0) {
326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (float)i.value;
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	} else {
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		long double df;
329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		df = (long double)i.value;
330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		df += 18446744073709551616.0; /* adding 2**64 */
331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (float)df;
332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	}
333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmanndouble
336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann_TIFFUInt64ToDouble(uint64 ui64)
337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann{
338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	_Int64 i;
339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	i.value = ui64;
341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	if (i.part.high >= 0) {
342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (double)i.value;
343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	} else {
344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		long double df;
345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		df = (long double)i.value;
346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		df += 18446744073709551616.0; /* adding 2**64 */
347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann		return (double)df;
348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann	}
349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* vim: set ts=8 sts=8 sw=8 noet: */
352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/*
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Local Variables:
354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * mode: c
355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * c-basic-offset: 8
356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * fill-column: 78
357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * End:
358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */
359