4  * Copyright (c) 1991-1997 Sam Leffler 
   5  * Copyright (c) 1991-1997 Silicon Graphics, Inc. 
   7  * Permission to use, copy, modify, distribute, and sell this software and  
   8  * its documentation for any purpose is hereby granted without fee, provided 
   9  * that (i) the above copyright notices and this permission notice appear in 
  10  * all copies of the software and related documentation, and (ii) the names of 
  11  * Sam Leffler and Silicon Graphics may not be used in any advertising or 
  12  * publicity relating to the software without the specific, prior written 
  13  * permission of Sam Leffler and Silicon Graphics. 
  15  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,  
  16  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY  
  17  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.   
  19  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR 
  20  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, 
  21  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  22  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF  
  23  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE  
  30  * Auxiliary Support Routines. 
  33 #include "tif_predict.h" 
  37 TIFFDefaultTransferFunction(TIFFDirectory
* td
) 
  39         uint16 
**tf 
= td
->td_transferfunction
; 
  42         tf
[0] = tf
[1] = tf
[2] = 0; 
  43         if (td
->td_bitspersample 
>= sizeof(tsize_t
) * 8 - 2) 
  46         n 
= 1<<td
->td_bitspersample
; 
  47         nbytes 
= n 
* sizeof (uint16
); 
  48         if (!(tf
[0] = (uint16 
*)_TIFFmalloc(nbytes
))) 
  51         for (i 
= 1; i 
< n
; i
++) { 
  52                 double t 
= (double)i
/((double) n
-1.); 
  53                 tf
[0][i
] = (uint16
)floor(65535.*pow(t
, 2.2) + .5); 
  56         if (td
->td_samplesperpixel 
- td
->td_extrasamples 
> 1) { 
  57                 if (!(tf
[1] = (uint16 
*)_TIFFmalloc(nbytes
))) 
  59                 _TIFFmemcpy(tf
[1], tf
[0], nbytes
); 
  60                 if (!(tf
[2] = (uint16 
*)_TIFFmalloc(nbytes
))) 
  62                 _TIFFmemcpy(tf
[2], tf
[0], nbytes
); 
  73         tf
[0] = tf
[1] = tf
[2] = 0; 
  78 TIFFDefaultRefBlackWhite(TIFFDirectory
* td
) 
  82         if (!(td
->td_refblackwhite 
= (float *)_TIFFmalloc(6*sizeof (float)))) 
  84         for (i 
= 0; i 
< 3; i
++) { 
  85             td
->td_refblackwhite
[2*i
+0] = 0; 
  86             td
->td_refblackwhite
[2*i
+1] = (float)((1L<<td
->td_bitspersample
)-1L); 
  92  * Like TIFFGetField, but return any default 
  93  * value if the tag is not present in the directory. 
  95  * NB:  We use the value in the directory, rather than 
  96  *      explcit values so that defaults exist only one 
  97  *      place in the library -- in TIFFDefaultDirectory. 
 100 TIFFVGetFieldDefaulted(TIFF
* tif
, ttag_t tag
, va_list ap
) 
 102         TIFFDirectory 
*td 
= &tif
->tif_dir
; 
 104         if (TIFFVGetField(tif
, tag
, ap
)) 
 107         case TIFFTAG_SUBFILETYPE
: 
 108                 *va_arg(ap
, uint32 
*) = td
->td_subfiletype
; 
 110         case TIFFTAG_BITSPERSAMPLE
: 
 111                 *va_arg(ap
, uint16 
*) = td
->td_bitspersample
; 
 113         case TIFFTAG_THRESHHOLDING
: 
 114                 *va_arg(ap
, uint16 
*) = td
->td_threshholding
; 
 116         case TIFFTAG_FILLORDER
: 
 117                 *va_arg(ap
, uint16 
*) = td
->td_fillorder
; 
 119         case TIFFTAG_ORIENTATION
: 
 120                 *va_arg(ap
, uint16 
*) = td
->td_orientation
; 
 122         case TIFFTAG_SAMPLESPERPIXEL
: 
 123                 *va_arg(ap
, uint16 
*) = td
->td_samplesperpixel
; 
 125         case TIFFTAG_ROWSPERSTRIP
: 
 126                 *va_arg(ap
, uint32 
*) = td
->td_rowsperstrip
; 
 128         case TIFFTAG_MINSAMPLEVALUE
: 
 129                 *va_arg(ap
, uint16 
*) = td
->td_minsamplevalue
; 
 131         case TIFFTAG_MAXSAMPLEVALUE
: 
 132                 *va_arg(ap
, uint16 
*) = td
->td_maxsamplevalue
; 
 134         case TIFFTAG_PLANARCONFIG
: 
 135                 *va_arg(ap
, uint16 
*) = td
->td_planarconfig
; 
 137         case TIFFTAG_RESOLUTIONUNIT
: 
 138                 *va_arg(ap
, uint16 
*) = td
->td_resolutionunit
; 
 140         case TIFFTAG_PREDICTOR
: 
 142                         TIFFPredictorState
* sp 
= (TIFFPredictorState
*) tif
->tif_data
; 
 143                         *va_arg(ap
, uint16
*) = (uint16
) sp
->predictor
; 
 146         case TIFFTAG_DOTRANGE
: 
 147                 *va_arg(ap
, uint16 
*) = 0; 
 148                 *va_arg(ap
, uint16 
*) = (1<<td
->td_bitspersample
)-1; 
 151                 *va_arg(ap
, uint16 
*) = td
->td_inkset
; 
 153         case TIFFTAG_NUMBEROFINKS
: 
 154                 *va_arg(ap
, uint16 
*) = td
->td_ninks
; 
 156         case TIFFTAG_EXTRASAMPLES
: 
 157                 *va_arg(ap
, uint16 
*) = td
->td_extrasamples
; 
 158                 *va_arg(ap
, uint16 
**) = td
->td_sampleinfo
; 
 160         case TIFFTAG_MATTEING
: 
 161                 *va_arg(ap
, uint16 
*) = 
 162                     (td
->td_extrasamples 
== 1 && 
 163                      td
->td_sampleinfo
[0] == EXTRASAMPLE_ASSOCALPHA
); 
 165         case TIFFTAG_TILEDEPTH
: 
 166                 *va_arg(ap
, uint32 
*) = td
->td_tiledepth
; 
 168         case TIFFTAG_DATATYPE
: 
 169                 *va_arg(ap
, uint16 
*) = td
->td_sampleformat
-1; 
 171         case TIFFTAG_SAMPLEFORMAT
: 
 172                 *va_arg(ap
, uint16 
*) = td
->td_sampleformat
; 
 174         case TIFFTAG_IMAGEDEPTH
: 
 175                 *va_arg(ap
, uint32 
*) = td
->td_imagedepth
; 
 177         case TIFFTAG_YCBCRCOEFFICIENTS
: 
 178                 if (!td
->td_ycbcrcoeffs
) { 
 179                         td
->td_ycbcrcoeffs 
= (float *) 
 180                             _TIFFmalloc(3*sizeof (float)); 
 181                         if (!td
->td_ycbcrcoeffs
) 
 183                         /* defaults are from CCIR Recommendation 601-1 */ 
 184                         td
->td_ycbcrcoeffs
[0] = 0.299f
; 
 185                         td
->td_ycbcrcoeffs
[1] = 0.587f
; 
 186                         td
->td_ycbcrcoeffs
[2] = 0.114f
; 
 188                 *va_arg(ap
, float **) = td
->td_ycbcrcoeffs
; 
 190         case TIFFTAG_YCBCRSUBSAMPLING
: 
 191                 *va_arg(ap
, uint16 
*) = td
->td_ycbcrsubsampling
[0]; 
 192                 *va_arg(ap
, uint16 
*) = td
->td_ycbcrsubsampling
[1]; 
 194         case TIFFTAG_YCBCRPOSITIONING
: 
 195                 *va_arg(ap
, uint16 
*) = td
->td_ycbcrpositioning
; 
 197         case TIFFTAG_WHITEPOINT
: 
 198                 if (!td
->td_whitepoint
) { 
 199                         td
->td_whitepoint 
= (float *) 
 200                                 _TIFFmalloc(2 * sizeof (float)); 
 201                         if (!td
->td_whitepoint
) 
 203                         /* TIFF 6.0 specification says that it is no default 
 204                            value for the WhitePoint, but AdobePhotoshop TIFF 
 205                            Technical Note tells that it should be CIE D50. */ 
 206                         td
->td_whitepoint
[0] = 
 207                                 D50_X0 
/ (D50_X0 
+ D50_Y0 
+ D50_Z0
); 
 208                         td
->td_whitepoint
[1] = 
 209                                 D50_Y0 
/ (D50_X0 
+ D50_Y0 
+ D50_Z0
); 
 211                 *va_arg(ap
, float **) = td
->td_whitepoint
; 
 213         case TIFFTAG_TRANSFERFUNCTION
: 
 214                 if (!td
->td_transferfunction
[0] && 
 215                     !TIFFDefaultTransferFunction(td
)) { 
 216                         TIFFError(tif
->tif_name
, "No space for \"TransferFunction\" tag"); 
 219                 *va_arg(ap
, uint16 
**) = td
->td_transferfunction
[0]; 
 220                 if (td
->td_samplesperpixel 
- td
->td_extrasamples 
> 1) { 
 221                         *va_arg(ap
, uint16 
**) = td
->td_transferfunction
[1]; 
 222                         *va_arg(ap
, uint16 
**) = td
->td_transferfunction
[2]; 
 225         case TIFFTAG_REFERENCEBLACKWHITE
: 
 226                 if (!td
->td_refblackwhite 
&& !TIFFDefaultRefBlackWhite(td
)) 
 228                 *va_arg(ap
, float **) = td
->td_refblackwhite
; 
 235  * Like TIFFGetField, but return any default 
 236  * value if the tag is not present in the directory. 
 239 TIFFGetFieldDefaulted(TIFF
* tif
, ttag_t tag
, ...) 
 245         ok 
=  TIFFVGetFieldDefaulted(tif
, tag
, ap
);