tif_aux.c
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:7k
源码类别:

打印编程

开发平台:

Visual C++

  1. /* $Id: tif_aux.c,v 1.19 2006/02/07 10:41:30 dron Exp $ */
  2. /*
  3.  * Copyright (c) 1991-1997 Sam Leffler
  4.  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
  5.  *
  6.  * Permission to use, copy, modify, distribute, and sell this software and 
  7.  * its documentation for any purpose is hereby granted without fee, provided
  8.  * that (i) the above copyright notices and this permission notice appear in
  9.  * all copies of the software and related documentation, and (ii) the names of
  10.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  11.  * publicity relating to the software without the specific, prior written
  12.  * permission of Sam Leffler and Silicon Graphics.
  13.  * 
  14.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  15.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  16.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  17.  * 
  18.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  19.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  20.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  21.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  22.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  23.  * OF THIS SOFTWARE.
  24.  */
  25. /*
  26.  * TIFF Library.
  27.  *
  28.  * Auxiliary Support Routines.
  29.  */
  30. #include "tiffiop.h"
  31. #include "tif_predict.h"
  32. #include <math.h>
  33. tdata_t
  34. _TIFFCheckMalloc(TIFF* tif, size_t nmemb, size_t elem_size, const char* what)
  35. {
  36. tdata_t cp = NULL;
  37. tsize_t bytes = nmemb * elem_size;
  38. /*
  39.  * XXX: Check for integer overflow.
  40.  */
  41. if (nmemb && elem_size && bytes / elem_size == nmemb)
  42. cp = _TIFFmalloc(bytes);
  43. if (cp == NULL)
  44. TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "No space %s", what);
  45. return (cp);
  46. }
  47. static int
  48. TIFFDefaultTransferFunction(TIFFDirectory* td)
  49. {
  50. uint16 **tf = td->td_transferfunction;
  51. tsize_t i, n, nbytes;
  52. tf[0] = tf[1] = tf[2] = 0;
  53. if (td->td_bitspersample >= sizeof(tsize_t) * 8 - 2)
  54. return 0;
  55. n = 1<<td->td_bitspersample;
  56. nbytes = n * sizeof (uint16);
  57. if (!(tf[0] = (uint16 *)_TIFFmalloc(nbytes)))
  58. return 0;
  59. tf[0][0] = 0;
  60. for (i = 1; i < n; i++) {
  61. double t = (double)i/((double) n-1.);
  62. tf[0][i] = (uint16)floor(65535.*pow(t, 2.2) + .5);
  63. }
  64. if (td->td_samplesperpixel - td->td_extrasamples > 1) {
  65. if (!(tf[1] = (uint16 *)_TIFFmalloc(nbytes)))
  66. goto bad;
  67. _TIFFmemcpy(tf[1], tf[0], nbytes);
  68. if (!(tf[2] = (uint16 *)_TIFFmalloc(nbytes)))
  69. goto bad;
  70. _TIFFmemcpy(tf[2], tf[0], nbytes);
  71. }
  72. return 1;
  73. bad:
  74. if (tf[0])
  75. _TIFFfree(tf[0]);
  76. if (tf[1])
  77. _TIFFfree(tf[1]);
  78. if (tf[2])
  79. _TIFFfree(tf[2]);
  80. tf[0] = tf[1] = tf[2] = 0;
  81. return 0;
  82. }
  83. /*
  84.  * Like TIFFGetField, but return any default
  85.  * value if the tag is not present in the directory.
  86.  *
  87.  * NB: We use the value in the directory, rather than
  88.  * explcit values so that defaults exist only one
  89.  * place in the library -- in TIFFDefaultDirectory.
  90.  */
  91. int
  92. TIFFVGetFieldDefaulted(TIFF* tif, ttag_t tag, va_list ap)
  93. {
  94. TIFFDirectory *td = &tif->tif_dir;
  95. if (TIFFVGetField(tif, tag, ap))
  96. return (1);
  97. switch (tag) {
  98. case TIFFTAG_SUBFILETYPE:
  99. *va_arg(ap, uint32 *) = td->td_subfiletype;
  100. return (1);
  101. case TIFFTAG_BITSPERSAMPLE:
  102. *va_arg(ap, uint16 *) = td->td_bitspersample;
  103. return (1);
  104. case TIFFTAG_THRESHHOLDING:
  105. *va_arg(ap, uint16 *) = td->td_threshholding;
  106. return (1);
  107. case TIFFTAG_FILLORDER:
  108. *va_arg(ap, uint16 *) = td->td_fillorder;
  109. return (1);
  110. case TIFFTAG_ORIENTATION:
  111. *va_arg(ap, uint16 *) = td->td_orientation;
  112. return (1);
  113. case TIFFTAG_SAMPLESPERPIXEL:
  114. *va_arg(ap, uint16 *) = td->td_samplesperpixel;
  115. return (1);
  116. case TIFFTAG_ROWSPERSTRIP:
  117. *va_arg(ap, uint32 *) = td->td_rowsperstrip;
  118. return (1);
  119. case TIFFTAG_MINSAMPLEVALUE:
  120. *va_arg(ap, uint16 *) = td->td_minsamplevalue;
  121. return (1);
  122. case TIFFTAG_MAXSAMPLEVALUE:
  123. *va_arg(ap, uint16 *) = td->td_maxsamplevalue;
  124. return (1);
  125. case TIFFTAG_PLANARCONFIG:
  126. *va_arg(ap, uint16 *) = td->td_planarconfig;
  127. return (1);
  128. case TIFFTAG_RESOLUTIONUNIT:
  129. *va_arg(ap, uint16 *) = td->td_resolutionunit;
  130. return (1);
  131. case TIFFTAG_PREDICTOR:
  132.                 {
  133. TIFFPredictorState* sp = (TIFFPredictorState*) tif->tif_data;
  134. *va_arg(ap, uint16*) = (uint16) sp->predictor;
  135. return 1;
  136.                 }
  137. case TIFFTAG_DOTRANGE:
  138. *va_arg(ap, uint16 *) = 0;
  139. *va_arg(ap, uint16 *) = (1<<td->td_bitspersample)-1;
  140. return (1);
  141. case TIFFTAG_INKSET:
  142. *va_arg(ap, uint16 *) = INKSET_CMYK;
  143. return 1;
  144. case TIFFTAG_NUMBEROFINKS:
  145. *va_arg(ap, uint16 *) = 4;
  146. return (1);
  147. case TIFFTAG_EXTRASAMPLES:
  148. *va_arg(ap, uint16 *) = td->td_extrasamples;
  149. *va_arg(ap, uint16 **) = td->td_sampleinfo;
  150. return (1);
  151. case TIFFTAG_MATTEING:
  152. *va_arg(ap, uint16 *) =
  153.     (td->td_extrasamples == 1 &&
  154.      td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
  155. return (1);
  156. case TIFFTAG_TILEDEPTH:
  157. *va_arg(ap, uint32 *) = td->td_tiledepth;
  158. return (1);
  159. case TIFFTAG_DATATYPE:
  160. *va_arg(ap, uint16 *) = td->td_sampleformat-1;
  161. return (1);
  162. case TIFFTAG_SAMPLEFORMAT:
  163. *va_arg(ap, uint16 *) = td->td_sampleformat;
  164.                 return(1);
  165. case TIFFTAG_IMAGEDEPTH:
  166. *va_arg(ap, uint32 *) = td->td_imagedepth;
  167. return (1);
  168. case TIFFTAG_YCBCRCOEFFICIENTS:
  169. {
  170. /* defaults are from CCIR Recommendation 601-1 */
  171. static float ycbcrcoeffs[] = { 0.299f, 0.587f, 0.114f };
  172. *va_arg(ap, float **) = ycbcrcoeffs;
  173. return 1;
  174. }
  175. case TIFFTAG_YCBCRSUBSAMPLING:
  176. *va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[0];
  177. *va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[1];
  178. return (1);
  179. case TIFFTAG_YCBCRPOSITIONING:
  180. *va_arg(ap, uint16 *) = td->td_ycbcrpositioning;
  181. return (1);
  182. case TIFFTAG_WHITEPOINT:
  183. {
  184. static float whitepoint[2];
  185. /* TIFF 6.0 specification tells that it is no default
  186.    value for the WhitePoint, but AdobePhotoshop TIFF
  187.    Technical Note tells that it should be CIE D50. */
  188. whitepoint[0] = D50_X0 / (D50_X0 + D50_Y0 + D50_Z0);
  189. whitepoint[1] = D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0);
  190. *va_arg(ap, float **) = whitepoint;
  191. return 1;
  192. }
  193. case TIFFTAG_TRANSFERFUNCTION:
  194. if (!td->td_transferfunction[0] &&
  195.     !TIFFDefaultTransferFunction(td)) {
  196. TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "No space for "TransferFunction" tag");
  197. return (0);
  198. }
  199. *va_arg(ap, uint16 **) = td->td_transferfunction[0];
  200. if (td->td_samplesperpixel - td->td_extrasamples > 1) {
  201. *va_arg(ap, uint16 **) = td->td_transferfunction[1];
  202. *va_arg(ap, uint16 **) = td->td_transferfunction[2];
  203. }
  204. return (1);
  205. case TIFFTAG_REFERENCEBLACKWHITE:
  206. {
  207. int i;
  208. static float ycbcr_refblackwhite[] = 
  209. { 0.0F, 255.0F, 128.0F, 255.0F, 128.0F, 255.0F };
  210. static float rgb_refblackwhite[6];
  211. for (i = 0; i < 3; i++) {
  212. rgb_refblackwhite[2 * i + 0] = 0.0F;
  213. rgb_refblackwhite[2 * i + 1] =
  214. (float)((1L<<td->td_bitspersample)-1L);
  215. }
  216. if (td->td_photometric == PHOTOMETRIC_YCBCR) {
  217. /*
  218.  * YCbCr (Class Y) images must have the
  219.  * ReferenceBlackWhite tag set. Fix the
  220.  * broken images, which lacks that tag.
  221.  */
  222. *va_arg(ap, float **) = ycbcr_refblackwhite;
  223. } else {
  224. /*
  225.  * Assume RGB (Class R)
  226.  */
  227. *va_arg(ap, float **) = rgb_refblackwhite;
  228. }
  229. return 1;
  230. }
  231. }
  232. return 0;
  233. }
  234. /*
  235.  * Like TIFFGetField, but return any default
  236.  * value if the tag is not present in the directory.
  237.  */
  238. int
  239. TIFFGetFieldDefaulted(TIFF* tif, ttag_t tag, ...)
  240. {
  241. int ok;
  242. va_list ap;
  243. va_start(ap, tag);
  244. ok =  TIFFVGetFieldDefaulted(tif, tag, ap);
  245. va_end(ap);
  246. return (ok);
  247. }
  248. /* vim: set ts=8 sts=8 sw=8 noet: */