ReactOS 0.4.15-dev-5669-g09dde2c
tif_aux.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 1991-1997 Sam Leffler
3 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
4 *
5 * Permission to use, copy, modify, distribute, and sell this software and
6 * its documentation for any purpose is hereby granted without fee, provided
7 * that (i) the above copyright notices and this permission notice appear in
8 * all copies of the software and related documentation, and (ii) the names of
9 * Sam Leffler and Silicon Graphics may not be used in any advertising or
10 * publicity relating to the software without the specific, prior written
11 * permission of Sam Leffler and Silicon Graphics.
12 *
13 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
14 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
15 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
16 *
17 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
18 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
21 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22 * OF THIS SOFTWARE.
23 */
24
25/*
26 * TIFF Library.
27 *
28 * Auxiliary Support Routines.
29 */
30
31#include <precomp.h>
32#include "tif_predict.h"
33#include <math.h>
34#include <float.h>
35
37_TIFFMultiply32(TIFF* tif, uint32 first, uint32 second, const char* where)
38{
39 if (second && first > TIFF_UINT32_MAX / second) {
40 TIFFErrorExt(tif->tif_clientdata, where, "Integer overflow in %s", where);
41 return 0;
42 }
43
44 return first * second;
45}
46
48_TIFFMultiply64(TIFF* tif, uint64 first, uint64 second, const char* where)
49{
50 if (second && first > TIFF_UINT64_MAX / second) {
51 TIFFErrorExt(tif->tif_clientdata, where, "Integer overflow in %s", where);
52 return 0;
53 }
54
55 return first * second;
56}
57
59_TIFFMultiplySSize(TIFF* tif, tmsize_t first, tmsize_t second, const char* where)
60{
61 if( first <= 0 || second <= 0 )
62 {
63 if( tif != NULL && where != NULL )
64 {
65 TIFFErrorExt(tif->tif_clientdata, where,
66 "Invalid argument to _TIFFMultiplySSize() in %s", where);
67 }
68 return 0;
69 }
70
71 if( first > TIFF_TMSIZE_T_MAX / second )
72 {
73 if( tif != NULL && where != NULL )
74 {
75 TIFFErrorExt(tif->tif_clientdata, where,
76 "Integer overflow in %s", where);
77 }
78 return 0;
79 }
80 return first * second;
81}
82
84{
86 {
87 if( tif != NULL && module != NULL )
88 {
89 TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow");
90 }
91 return 0;
92 }
93 return (tmsize_t)val;
94}
95
96void*
98 tmsize_t nmemb, tmsize_t elem_size, const char* what)
99{
100 void* cp = NULL;
101 tmsize_t count = _TIFFMultiplySSize(tif, nmemb, elem_size, NULL);
102 /*
103 * Check for integer overflow.
104 */
105 if (count != 0)
106 {
108 }
109
110 if (cp == NULL) {
112 "Failed to allocate memory for %s "
113 "(%ld elements of %ld bytes each)",
114 what,(long) nmemb, (long) elem_size);
115 }
116
117 return cp;
118}
119
120void*
121_TIFFCheckMalloc(TIFF* tif, tmsize_t nmemb, tmsize_t elem_size, const char* what)
122{
123 return _TIFFCheckRealloc(tif, NULL, nmemb, elem_size, what);
124}
125
126static int
128{
130 tmsize_t i, n, nbytes;
131
132 tf[0] = tf[1] = tf[2] = 0;
133 if (td->td_bitspersample >= sizeof(tmsize_t) * 8 - 2)
134 return 0;
135
136 n = ((tmsize_t)1)<<td->td_bitspersample;
137 nbytes = n * sizeof (uint16);
138 tf[0] = (uint16 *)_TIFFmalloc(nbytes);
139 if (tf[0] == NULL)
140 return 0;
141 tf[0][0] = 0;
142 for (i = 1; i < n; i++) {
143 double t = (double)i/((double) n-1.);
144 tf[0][i] = (uint16)floor(65535.*pow(t, 2.2) + .5);
145 }
146
147 if (td->td_samplesperpixel - td->td_extrasamples > 1) {
148 tf[1] = (uint16 *)_TIFFmalloc(nbytes);
149 if(tf[1] == NULL)
150 goto bad;
151 _TIFFmemcpy(tf[1], tf[0], nbytes);
152 tf[2] = (uint16 *)_TIFFmalloc(nbytes);
153 if (tf[2] == NULL)
154 goto bad;
155 _TIFFmemcpy(tf[2], tf[0], nbytes);
156 }
157 return 1;
158
159bad:
160 if (tf[0])
161 _TIFFfree(tf[0]);
162 if (tf[1])
163 _TIFFfree(tf[1]);
164 if (tf[2])
165 _TIFFfree(tf[2]);
166 tf[0] = tf[1] = tf[2] = 0;
167 return 0;
168}
169
170static int
172{
173 int i;
174
175 td->td_refblackwhite = (float *)_TIFFmalloc(6*sizeof (float));
176 if (td->td_refblackwhite == NULL)
177 return 0;
179 /*
180 * YCbCr (Class Y) images must have the ReferenceBlackWhite
181 * tag set. Fix the broken images, which lacks that tag.
182 */
183 td->td_refblackwhite[0] = 0.0F;
184 td->td_refblackwhite[1] = td->td_refblackwhite[3] =
185 td->td_refblackwhite[5] = 255.0F;
186 td->td_refblackwhite[2] = td->td_refblackwhite[4] = 128.0F;
187 } else {
188 /*
189 * Assume RGB (Class R)
190 */
191 for (i = 0; i < 3; i++) {
192 td->td_refblackwhite[2*i+0] = 0;
193 td->td_refblackwhite[2*i+1] =
194 (float)((1L<<td->td_bitspersample)-1L);
195 }
196 }
197 return 1;
198}
199
200/*
201 * Like TIFFGetField, but return any default
202 * value if the tag is not present in the directory.
203 *
204 * NB: We use the value in the directory, rather than
205 * explicit values so that defaults exist only one
206 * place in the library -- in TIFFDefaultDirectory.
207 */
208int
210{
211 TIFFDirectory *td = &tif->tif_dir;
212
213 if (TIFFVGetField(tif, tag, ap))
214 return (1);
215 switch (tag) {
217 *va_arg(ap, uint32 *) = td->td_subfiletype;
218 return (1);
220 *va_arg(ap, uint16 *) = td->td_bitspersample;
221 return (1);
223 *va_arg(ap, uint16 *) = td->td_threshholding;
224 return (1);
226 *va_arg(ap, uint16 *) = td->td_fillorder;
227 return (1);
229 *va_arg(ap, uint16 *) = td->td_orientation;
230 return (1);
233 return (1);
235 *va_arg(ap, uint32 *) = td->td_rowsperstrip;
236 return (1);
239 return (1);
242 return (1);
244 *va_arg(ap, uint16 *) = td->td_planarconfig;
245 return (1);
248 return (1);
250 {
252 if( sp == NULL )
253 {
255 "Cannot get \"Predictor\" tag as plugin is not configured");
256 *va_arg(ap, uint16*) = 0;
257 return 0;
258 }
259 *va_arg(ap, uint16*) = (uint16) sp->predictor;
260 return 1;
261 }
262 case TIFFTAG_DOTRANGE:
263 *va_arg(ap, uint16 *) = 0;
264 *va_arg(ap, uint16 *) = (1<<td->td_bitspersample)-1;
265 return (1);
266 case TIFFTAG_INKSET:
268 return 1;
270 *va_arg(ap, uint16 *) = 4;
271 return (1);
273 *va_arg(ap, uint16 *) = td->td_extrasamples;
274 *va_arg(ap, uint16 **) = td->td_sampleinfo;
275 return (1);
276 case TIFFTAG_MATTEING:
277 *va_arg(ap, uint16 *) =
278 (td->td_extrasamples == 1 &&
280 return (1);
282 *va_arg(ap, uint32 *) = td->td_tiledepth;
283 return (1);
284 case TIFFTAG_DATATYPE:
285 *va_arg(ap, uint16 *) = td->td_sampleformat-1;
286 return (1);
288 *va_arg(ap, uint16 *) = td->td_sampleformat;
289 return(1);
291 *va_arg(ap, uint32 *) = td->td_imagedepth;
292 return (1);
294 {
295 /* defaults are from CCIR Recommendation 601-1 */
296 static float ycbcrcoeffs[] = { 0.299f, 0.587f, 0.114f };
297 *va_arg(ap, float **) = ycbcrcoeffs;
298 return 1;
299 }
301 *va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[0];
302 *va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[1];
303 return (1);
306 return (1);
308 {
309 static float whitepoint[2];
310
311 /* TIFF 6.0 specification tells that it is no default
312 value for the WhitePoint, but AdobePhotoshop TIFF
313 Technical Note tells that it should be CIE D50. */
314 whitepoint[0] = D50_X0 / (D50_X0 + D50_Y0 + D50_Z0);
315 whitepoint[1] = D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0);
316 *va_arg(ap, float **) = whitepoint;
317 return 1;
318 }
320 if (!td->td_transferfunction[0] &&
322 TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "No space for \"TransferFunction\" tag");
323 return (0);
324 }
325 *va_arg(ap, uint16 **) = td->td_transferfunction[0];
326 if (td->td_samplesperpixel - td->td_extrasamples > 1) {
327 *va_arg(ap, uint16 **) = td->td_transferfunction[1];
328 *va_arg(ap, uint16 **) = td->td_transferfunction[2];
329 }
330 return (1);
333 return (0);
334 *va_arg(ap, float **) = td->td_refblackwhite;
335 return (1);
336 }
337 return 0;
338}
339
340/*
341 * Like TIFFGetField, but return any default
342 * value if the tag is not present in the directory.
343 */
344int
346{
347 int ok;
348 va_list ap;
349
350 va_start(ap, tag);
352 va_end(ap);
353 return (ok);
354}
355
358};
359
360typedef union {
361 struct _Int64Parts part;
363} _Int64;
364
365float
367{
368 _Int64 i;
369
370 i.value = ui64;
371 if (i.part.high >= 0) {
372 return (float)i.value;
373 } else {
374 long double df;
375 df = (long double)i.value;
376 df += 18446744073709551616.0; /* adding 2**64 */
377 return (float)df;
378 }
379}
380
381double
383{
384 _Int64 i;
385
386 i.value = ui64;
387 if (i.part.high >= 0) {
388 return (double)i.value;
389 } else {
390 long double df;
391 df = (long double)i.value;
392 df += 18446744073709551616.0; /* adding 2**64 */
393 return (double)df;
394 }
395}
396
398{
399 if( val > FLT_MAX )
400 return FLT_MAX;
401 if( val < -FLT_MAX )
402 return -FLT_MAX;
403 return (float)val;
404}
405
406int _TIFFSeekOK(TIFF* tif, toff_t off)
407{
408 /* Huge offsets, especially -1 / UINT64_MAX, can cause issues */
409 /* See http://bugzilla.maptools.org/show_bug.cgi?id=2726 */
410 return off <= (~(uint64)0)/2 && TIFFSeekFile(tif,off,SEEK_SET)==off;
411}
412
413/* vim: set ts=8 sts=8 sw=8 noet: */
414/*
415 * Local Variables:
416 * mode: c
417 * c-basic-offset: 8
418 * fill-column: 78
419 * End:
420 */
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define va_arg(ap, T)
Definition: acmsvcex.h:89
#define ok(value,...)
Definition: atltest.h:57
unsigned short uint16
Definition: types.h:30
unsigned int uint32
Definition: types.h:32
return
Definition: dirsup.c:529
#define NULL
Definition: types.h:112
unsigned long long uint64
Definition: platform.h:18
long int32
Definition: platform.h:12
long long int64
Definition: platform.h:13
double pow(double x, double y)
Definition: freeldr.c:110
#define FLT_MAX
Definition: gcc_float.h:107
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLdouble GLdouble t
Definition: gl.h:2047
GLdouble n
Definition: glext.h:7729
GLuint buffer
Definition: glext.h:5915
const GLint * first
Definition: glext.h:5794
GLuint GLfloat * val
Definition: glext.h:7180
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
HFONT tf
Definition: icontest.c:17
_Check_return_ _CRTIMP double __cdecl floor(_In_ double x)
#define SEEK_SET
Definition: jmemansi.c:26
POINT cp
Definition: magnifier.c:59
static const WCHAR sp[]
Definition: suminfo.c:287
static const char mbstate_t *static wchar_t const char mbstate_t *static const wchar_t int *static double
Definition: string.c:80
static float(__cdecl *square_half_float)(float x
uint16 td_resolutionunit
Definition: tif_dir.h:88
uint16 td_sampleformat
Definition: tif_dir.h:76
uint16 td_samplesperpixel
Definition: tif_dir.h:82
uint32 td_imagedepth
Definition: tif_dir.h:72
float * td_refblackwhite
Definition: tif_dir.h:116
uint16 td_bitspersample
Definition: tif_dir.h:75
uint16 td_maxsamplevalue
Definition: tif_dir.h:84
uint32 td_rowsperstrip
Definition: tif_dir.h:83
uint32 td_tiledepth
Definition: tif_dir.h:73
uint16 td_photometric
Definition: tif_dir.h:78
uint16 td_fillorder
Definition: tif_dir.h:80
uint32 td_subfiletype
Definition: tif_dir.h:74
uint16 td_minsamplevalue
Definition: tif_dir.h:84
uint16 td_threshholding
Definition: tif_dir.h:79
uint16 td_planarconfig
Definition: tif_dir.h:89
uint16 * td_transferfunction[3]
Definition: tif_dir.h:115
uint16 td_ycbcrpositioning
Definition: tif_dir.h:113
uint16 * td_sampleinfo
Definition: tif_dir.h:95
uint16 td_extrasamples
Definition: tif_dir.h:94
uint16 td_orientation
Definition: tif_dir.h:81
uint16 td_ycbcrsubsampling[2]
Definition: tif_dir.h:112
int32 low
Definition: tif_aux.c:357
int32 high
Definition: tif_aux.c:357
Definition: ecma_167.h:138
Definition: tiffiop.h:115
thandle_t tif_clientdata
Definition: tiffiop.h:207
char * tif_name
Definition: tiffiop.h:116
TIFFDirectory tif_dir
Definition: tiffiop.h:151
uint8 * tif_data
Definition: tiffiop.h:191
int _TIFFSeekOK(TIFF *tif, toff_t off)
Definition: tif_aux.c:406
static int TIFFDefaultTransferFunction(TIFFDirectory *td)
Definition: tif_aux.c:127
uint64 _TIFFMultiply64(TIFF *tif, uint64 first, uint64 second, const char *where)
Definition: tif_aux.c:48
int TIFFGetFieldDefaulted(TIFF *tif, uint32 tag,...)
Definition: tif_aux.c:345
float _TIFFUInt64ToFloat(uint64 ui64)
Definition: tif_aux.c:366
double _TIFFUInt64ToDouble(uint64 ui64)
Definition: tif_aux.c:382
int TIFFVGetFieldDefaulted(TIFF *tif, uint32 tag, va_list ap)
Definition: tif_aux.c:209
void * _TIFFCheckRealloc(TIFF *tif, void *buffer, tmsize_t nmemb, tmsize_t elem_size, const char *what)
Definition: tif_aux.c:97
void * _TIFFCheckMalloc(TIFF *tif, tmsize_t nmemb, tmsize_t elem_size, const char *what)
Definition: tif_aux.c:121
float _TIFFClampDoubleToFloat(double val)
Definition: tif_aux.c:397
uint32 _TIFFMultiply32(TIFF *tif, uint32 first, uint32 second, const char *where)
Definition: tif_aux.c:37
static int TIFFDefaultRefBlackWhite(TIFFDirectory *td)
Definition: tif_aux.c:171
tmsize_t _TIFFCastUInt64ToSSize(TIFF *tif, uint64 val, const char *module)
Definition: tif_aux.c:83
tmsize_t _TIFFMultiplySSize(TIFF *tif, tmsize_t first, tmsize_t second, const char *where)
Definition: tif_aux.c:59
int TIFFVGetField(TIFF *tif, uint32 tag, va_list ap)
Definition: tif_dir.c:1250
void TIFFErrorExt(thandle_t fd, const char *module, const char *fmt,...)
Definition: tif_error.c:65
void _TIFFfree(void *p)
Definition: tif_unix.c:326
void * _TIFFmalloc(tmsize_t s)
Definition: tif_unix.c:309
void _TIFFmemcpy(void *d, const void *s, tmsize_t c)
Definition: tif_unix.c:344
void * _TIFFrealloc(void *p, tmsize_t s)
Definition: tif_unix.c:332
#define TIFFTAG_BITSPERSAMPLE
Definition: tiff.h:156
#define TIFFTAG_RESOLUTIONUNIT
Definition: tiff.h:261
#define TIFFTAG_WHITEPOINT
Definition: tiff.h:281
#define TIFFTAG_DOTRANGE
Definition: tiff.h:301
#define EXTRASAMPLE_ASSOCALPHA
Definition: tiff.h:305
#define TIFFTAG_FILLORDER
Definition: tiff.h:214
#define TIFFTAG_SAMPLESPERPIXEL
Definition: tiff.h:231
#define TIFFTAG_INKSET
Definition: tiff.h:296
#define TIFFTAG_DATATYPE
Definition: tiff.h:377
#define TIFFTAG_IMAGEDEPTH
Definition: tiff.h:378
#define TIFFTAG_MAXSAMPLEVALUE
Definition: tiff.h:235
#define TIFFTAG_TILEDEPTH
Definition: tiff.h:379
#define TIFFTAG_EXTRASAMPLES
Definition: tiff.h:303
#define TIFFTAG_YCBCRCOEFFICIENTS
Definition: tiff.h:361
#define TIFFTAG_ORIENTATION
Definition: tiff.h:222
#define TIFFTAG_MATTEING
Definition: tiff.h:376
#define TIFFTAG_MINSAMPLEVALUE
Definition: tiff.h:234
#define TIFFTAG_NUMBEROFINKS
Definition: tiff.h:300
#define PHOTOMETRIC_YCBCR
Definition: tiff.h:201
#define TIFFTAG_TRANSFERFUNCTION
Definition: tiff.h:272
#define INKSET_CMYK
Definition: tiff.h:297
#define TIFFTAG_YCBCRSUBSAMPLING
Definition: tiff.h:362
#define TIFFTAG_ROWSPERSTRIP
Definition: tiff.h:232
#define TIFFTAG_SAMPLEFORMAT
Definition: tiff.h:307
#define TIFFTAG_REFERENCEBLACKWHITE
Definition: tiff.h:366
#define TIFFTAG_PLANARCONFIG
Definition: tiff.h:238
#define TIFFTAG_SUBFILETYPE
Definition: tiff.h:146
#define TIFFTAG_PREDICTOR
Definition: tiff.h:277
#define TIFFTAG_YCBCRPOSITIONING
Definition: tiff.h:363
#define TIFFTAG_THRESHHOLDING
Definition: tiff.h:208
uint64 toff_t
Definition: tiffio.h:66
#define D50_X0
Definition: tiffio.h:130
TIFF_SSIZE_T tmsize_t
Definition: tiffio.h:65
#define D50_Y0
Definition: tiffio.h:131
#define D50_Z0
Definition: tiffio.h:132
#define TIFF_UINT64_MAX
Definition: tiffiop.h:91
#define TIFF_TMSIZE_T_MAX
Definition: tiffiop.h:81
#define TIFFSeekFile(tif, off, whence)
Definition: tiffiop.h:237
#define TIFF_UINT32_MAX
Definition: tiffiop.h:86
int64 value
Definition: tif_aux.c:362
void int int ULONGLONG int va_list * ap
Definition: winesup.h:36