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