1
/* $Id: tif_dirread.c,v 1.178 2012-08-19 16:56:34 bfriesen Exp $ */
4
* Copyright (c) 1988-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
* Directory Read Support Routines.
33
/* Suggested pending improvements:
34
* - add a field 'ignore' to the TIFFDirEntry structure, to flag status,
35
* eliminating current use of the IGNORE value, and therefore eliminating
36
* current irrational behaviour on tags with tag id code 0
37
* - add a field 'field_info' to the TIFFDirEntry structure, and set that with
38
* the pointer to the appropriate TIFFField structure early on in
39
* TIFFReadDirectory, so as to eliminate current possibly repetitive lookup.
44
#define IGNORE 0 /* tag placeholder used below */
45
#define FAILED_FII ((uint32) -1)
48
# define TIFFCvtIEEEFloatToNative(tif, n, fp)
49
# define TIFFCvtIEEEDoubleToNative(tif, n, dp)
51
extern void TIFFCvtIEEEFloatToNative(TIFF*, uint32, float*);
52
extern void TIFFCvtIEEEDoubleToNative(TIFF*, uint32, double*);
55
enum TIFFReadDirEntryErr {
56
TIFFReadDirEntryErrOk = 0,
57
TIFFReadDirEntryErrCount = 1,
58
TIFFReadDirEntryErrType = 2,
59
TIFFReadDirEntryErrIo = 3,
60
TIFFReadDirEntryErrRange = 4,
61
TIFFReadDirEntryErrPsdif = 5,
62
TIFFReadDirEntryErrSizesan = 6,
63
TIFFReadDirEntryErrAlloc = 7,
66
static enum TIFFReadDirEntryErr TIFFReadDirEntryByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value);
67
static enum TIFFReadDirEntryErr TIFFReadDirEntryShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value);
68
static enum TIFFReadDirEntryErr TIFFReadDirEntryLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value);
69
static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value);
70
static enum TIFFReadDirEntryErr TIFFReadDirEntryFloat(TIFF* tif, TIFFDirEntry* direntry, float* value);
71
static enum TIFFReadDirEntryErr TIFFReadDirEntryDouble(TIFF* tif, TIFFDirEntry* direntry, double* value);
72
static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8(TIFF* tif, TIFFDirEntry* direntry, uint64* value);
74
static enum TIFFReadDirEntryErr TIFFReadDirEntryArray(TIFF* tif, TIFFDirEntry* direntry, uint32* count, uint32 desttypesize, void** value);
75
static enum TIFFReadDirEntryErr TIFFReadDirEntryByteArray(TIFF* tif, TIFFDirEntry* direntry, uint8** value);
76
static enum TIFFReadDirEntryErr TIFFReadDirEntrySbyteArray(TIFF* tif, TIFFDirEntry* direntry, int8** value);
77
static enum TIFFReadDirEntryErr TIFFReadDirEntryShortArray(TIFF* tif, TIFFDirEntry* direntry, uint16** value);
78
static enum TIFFReadDirEntryErr TIFFReadDirEntrySshortArray(TIFF* tif, TIFFDirEntry* direntry, int16** value);
79
static enum TIFFReadDirEntryErr TIFFReadDirEntryLongArray(TIFF* tif, TIFFDirEntry* direntry, uint32** value);
80
static enum TIFFReadDirEntryErr TIFFReadDirEntrySlongArray(TIFF* tif, TIFFDirEntry* direntry, int32** value);
81
static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value);
82
static enum TIFFReadDirEntryErr TIFFReadDirEntrySlong8Array(TIFF* tif, TIFFDirEntry* direntry, int64** value);
83
static enum TIFFReadDirEntryErr TIFFReadDirEntryFloatArray(TIFF* tif, TIFFDirEntry* direntry, float** value);
84
static enum TIFFReadDirEntryErr TIFFReadDirEntryDoubleArray(TIFF* tif, TIFFDirEntry* direntry, double** value);
85
static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value);
87
static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value);
89
static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleDouble(TIFF* tif, TIFFDirEntry* direntry, double* value);
92
static void TIFFReadDirEntryCheckedByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value);
93
static void TIFFReadDirEntryCheckedSbyte(TIFF* tif, TIFFDirEntry* direntry, int8* value);
94
static void TIFFReadDirEntryCheckedShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value);
95
static void TIFFReadDirEntryCheckedSshort(TIFF* tif, TIFFDirEntry* direntry, int16* value);
96
static void TIFFReadDirEntryCheckedLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value);
97
static void TIFFReadDirEntryCheckedSlong(TIFF* tif, TIFFDirEntry* direntry, int32* value);
98
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value);
99
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSlong8(TIFF* tif, TIFFDirEntry* direntry, int64* value);
100
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedRational(TIFF* tif, TIFFDirEntry* direntry, double* value);
101
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSrational(TIFF* tif, TIFFDirEntry* direntry, double* value);
102
static void TIFFReadDirEntryCheckedFloat(TIFF* tif, TIFFDirEntry* direntry, float* value);
103
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedDouble(TIFF* tif, TIFFDirEntry* direntry, double* value);
105
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSbyte(int8 value);
106
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteShort(uint16 value);
107
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSshort(int16 value);
108
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong(uint32 value);
109
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong(int32 value);
110
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong8(uint64 value);
111
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong8(int64 value);
113
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteByte(uint8 value);
114
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteShort(uint16 value);
115
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSshort(int16 value);
116
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong(uint32 value);
117
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong(int32 value);
118
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong8(uint64 value);
119
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong8(int64 value);
121
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSbyte(int8 value);
122
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSshort(int16 value);
123
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong(uint32 value);
124
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong(int32 value);
125
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong8(uint64 value);
126
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong8(int64 value);
128
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortShort(uint16 value);
129
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong(uint32 value);
130
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong(int32 value);
131
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong8(uint64 value);
132
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong8(int64 value);
134
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSbyte(int8 value);
135
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSshort(int16 value);
136
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong(int32 value);
137
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongLong8(uint64 value);
138
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong8(int64 value);
140
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongLong(uint32 value);
141
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongLong8(uint64 value);
142
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongSlong8(int64 value);
144
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Sbyte(int8 value);
145
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Sshort(int16 value);
146
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Slong(int32 value);
147
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Slong8(int64 value);
149
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlong8Long8(uint64 value);
151
static enum TIFFReadDirEntryErr TIFFReadDirEntryData(TIFF* tif, uint64 offset, tmsize_t size, void* dest);
152
static void TIFFReadDirEntryOutputErr(TIFF* tif, enum TIFFReadDirEntryErr err, const char* module, const char* tagname, int recover);
154
static void TIFFReadDirectoryCheckOrder(TIFF* tif, TIFFDirEntry* dir, uint16 dircount);
155
static TIFFDirEntry* TIFFReadDirectoryFindEntry(TIFF* tif, TIFFDirEntry* dir, uint16 dircount, uint16 tagid);
156
static void TIFFReadDirectoryFindFieldInfo(TIFF* tif, uint16 tagid, uint32* fii);
158
static int EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount);
159
static void MissingRequired(TIFF*, const char*);
160
static int TIFFCheckDirOffset(TIFF* tif, uint64 diroff);
161
static int CheckDirCount(TIFF*, TIFFDirEntry*, uint32);
162
static uint16 TIFFFetchDirectory(TIFF* tif, uint64 diroff, TIFFDirEntry** pdir, uint64* nextdiroff);
163
static int TIFFFetchNormalTag(TIFF*, TIFFDirEntry*, int recover);
164
static int TIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, uint32 nstrips, uint64** lpp);
165
static int TIFFFetchSubjectDistance(TIFF*, TIFFDirEntry*);
166
static void ChopUpSingleUncompressedStrip(TIFF*);
167
static uint64 TIFFReadUInt64(const uint8 *value);
169
typedef union _UInt64Aligned_t
179
Unaligned safe copy of a uint64 value from an octet array.
181
static uint64 TIFFReadUInt64(const uint8 *value)
183
UInt64Aligned_t result;
185
result.c[0]=value[0];
186
result.c[1]=value[1];
187
result.c[2]=value[2];
188
result.c[3]=value[3];
189
result.c[4]=value[4];
190
result.c[5]=value[5];
191
result.c[6]=value[6];
192
result.c[7]=value[7];
197
static enum TIFFReadDirEntryErr TIFFReadDirEntryByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value)
199
enum TIFFReadDirEntryErr err;
200
if (direntry->tdir_count!=1)
201
return(TIFFReadDirEntryErrCount);
202
switch (direntry->tdir_type)
205
TIFFReadDirEntryCheckedByte(tif,direntry,value);
206
return(TIFFReadDirEntryErrOk);
210
TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
211
err=TIFFReadDirEntryCheckRangeByteSbyte(m);
212
if (err!=TIFFReadDirEntryErrOk)
215
return(TIFFReadDirEntryErrOk);
220
TIFFReadDirEntryCheckedShort(tif,direntry,&m);
221
err=TIFFReadDirEntryCheckRangeByteShort(m);
222
if (err!=TIFFReadDirEntryErrOk)
225
return(TIFFReadDirEntryErrOk);
230
TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
231
err=TIFFReadDirEntryCheckRangeByteSshort(m);
232
if (err!=TIFFReadDirEntryErrOk)
235
return(TIFFReadDirEntryErrOk);
240
TIFFReadDirEntryCheckedLong(tif,direntry,&m);
241
err=TIFFReadDirEntryCheckRangeByteLong(m);
242
if (err!=TIFFReadDirEntryErrOk)
245
return(TIFFReadDirEntryErrOk);
250
TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
251
err=TIFFReadDirEntryCheckRangeByteSlong(m);
252
if (err!=TIFFReadDirEntryErrOk)
255
return(TIFFReadDirEntryErrOk);
260
err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
261
if (err!=TIFFReadDirEntryErrOk)
263
err=TIFFReadDirEntryCheckRangeByteLong8(m);
264
if (err!=TIFFReadDirEntryErrOk)
267
return(TIFFReadDirEntryErrOk);
272
err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
273
if (err!=TIFFReadDirEntryErrOk)
275
err=TIFFReadDirEntryCheckRangeByteSlong8(m);
276
if (err!=TIFFReadDirEntryErrOk)
279
return(TIFFReadDirEntryErrOk);
282
return(TIFFReadDirEntryErrType);
286
static enum TIFFReadDirEntryErr TIFFReadDirEntryShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value)
288
enum TIFFReadDirEntryErr err;
289
if (direntry->tdir_count!=1)
290
return(TIFFReadDirEntryErrCount);
291
switch (direntry->tdir_type)
296
TIFFReadDirEntryCheckedByte(tif,direntry,&m);
298
return(TIFFReadDirEntryErrOk);
303
TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
304
err=TIFFReadDirEntryCheckRangeShortSbyte(m);
305
if (err!=TIFFReadDirEntryErrOk)
308
return(TIFFReadDirEntryErrOk);
311
TIFFReadDirEntryCheckedShort(tif,direntry,value);
312
return(TIFFReadDirEntryErrOk);
316
TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
317
err=TIFFReadDirEntryCheckRangeShortSshort(m);
318
if (err!=TIFFReadDirEntryErrOk)
321
return(TIFFReadDirEntryErrOk);
326
TIFFReadDirEntryCheckedLong(tif,direntry,&m);
327
err=TIFFReadDirEntryCheckRangeShortLong(m);
328
if (err!=TIFFReadDirEntryErrOk)
331
return(TIFFReadDirEntryErrOk);
336
TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
337
err=TIFFReadDirEntryCheckRangeShortSlong(m);
338
if (err!=TIFFReadDirEntryErrOk)
341
return(TIFFReadDirEntryErrOk);
346
err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
347
if (err!=TIFFReadDirEntryErrOk)
349
err=TIFFReadDirEntryCheckRangeShortLong8(m);
350
if (err!=TIFFReadDirEntryErrOk)
353
return(TIFFReadDirEntryErrOk);
358
err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
359
if (err!=TIFFReadDirEntryErrOk)
361
err=TIFFReadDirEntryCheckRangeShortSlong8(m);
362
if (err!=TIFFReadDirEntryErrOk)
365
return(TIFFReadDirEntryErrOk);
368
return(TIFFReadDirEntryErrType);
372
static enum TIFFReadDirEntryErr TIFFReadDirEntryLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value)
374
enum TIFFReadDirEntryErr err;
375
if (direntry->tdir_count!=1)
376
return(TIFFReadDirEntryErrCount);
377
switch (direntry->tdir_type)
382
TIFFReadDirEntryCheckedByte(tif,direntry,&m);
384
return(TIFFReadDirEntryErrOk);
389
TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
390
err=TIFFReadDirEntryCheckRangeLongSbyte(m);
391
if (err!=TIFFReadDirEntryErrOk)
394
return(TIFFReadDirEntryErrOk);
399
TIFFReadDirEntryCheckedShort(tif,direntry,&m);
401
return(TIFFReadDirEntryErrOk);
406
TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
407
err=TIFFReadDirEntryCheckRangeLongSshort(m);
408
if (err!=TIFFReadDirEntryErrOk)
411
return(TIFFReadDirEntryErrOk);
414
TIFFReadDirEntryCheckedLong(tif,direntry,value);
415
return(TIFFReadDirEntryErrOk);
419
TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
420
err=TIFFReadDirEntryCheckRangeLongSlong(m);
421
if (err!=TIFFReadDirEntryErrOk)
424
return(TIFFReadDirEntryErrOk);
429
err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
430
if (err!=TIFFReadDirEntryErrOk)
432
err=TIFFReadDirEntryCheckRangeLongLong8(m);
433
if (err!=TIFFReadDirEntryErrOk)
436
return(TIFFReadDirEntryErrOk);
441
err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
442
if (err!=TIFFReadDirEntryErrOk)
444
err=TIFFReadDirEntryCheckRangeLongSlong8(m);
445
if (err!=TIFFReadDirEntryErrOk)
448
return(TIFFReadDirEntryErrOk);
451
return(TIFFReadDirEntryErrType);
455
static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value)
457
enum TIFFReadDirEntryErr err;
458
if (direntry->tdir_count!=1)
459
return(TIFFReadDirEntryErrCount);
460
switch (direntry->tdir_type)
465
TIFFReadDirEntryCheckedByte(tif,direntry,&m);
467
return(TIFFReadDirEntryErrOk);
472
TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
473
err=TIFFReadDirEntryCheckRangeLong8Sbyte(m);
474
if (err!=TIFFReadDirEntryErrOk)
477
return(TIFFReadDirEntryErrOk);
482
TIFFReadDirEntryCheckedShort(tif,direntry,&m);
484
return(TIFFReadDirEntryErrOk);
489
TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
490
err=TIFFReadDirEntryCheckRangeLong8Sshort(m);
491
if (err!=TIFFReadDirEntryErrOk)
494
return(TIFFReadDirEntryErrOk);
499
TIFFReadDirEntryCheckedLong(tif,direntry,&m);
501
return(TIFFReadDirEntryErrOk);
506
TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
507
err=TIFFReadDirEntryCheckRangeLong8Slong(m);
508
if (err!=TIFFReadDirEntryErrOk)
511
return(TIFFReadDirEntryErrOk);
514
err=TIFFReadDirEntryCheckedLong8(tif,direntry,value);
519
err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
520
if (err!=TIFFReadDirEntryErrOk)
522
err=TIFFReadDirEntryCheckRangeLong8Slong8(m);
523
if (err!=TIFFReadDirEntryErrOk)
526
return(TIFFReadDirEntryErrOk);
529
return(TIFFReadDirEntryErrType);
533
static enum TIFFReadDirEntryErr TIFFReadDirEntryFloat(TIFF* tif, TIFFDirEntry* direntry, float* value)
535
enum TIFFReadDirEntryErr err;
536
if (direntry->tdir_count!=1)
537
return(TIFFReadDirEntryErrCount);
538
switch (direntry->tdir_type)
543
TIFFReadDirEntryCheckedByte(tif,direntry,&m);
545
return(TIFFReadDirEntryErrOk);
550
TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
552
return(TIFFReadDirEntryErrOk);
557
TIFFReadDirEntryCheckedShort(tif,direntry,&m);
559
return(TIFFReadDirEntryErrOk);
564
TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
566
return(TIFFReadDirEntryErrOk);
571
TIFFReadDirEntryCheckedLong(tif,direntry,&m);
573
return(TIFFReadDirEntryErrOk);
578
TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
580
return(TIFFReadDirEntryErrOk);
585
err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
586
if (err!=TIFFReadDirEntryErrOk)
588
#if defined(__WIN32__) && (_MSC_VER < 1500)
590
* XXX: MSVC 6.0 does not support conversion
591
* of 64-bit integers into floating point
594
*value = _TIFFUInt64ToFloat(m);
598
return(TIFFReadDirEntryErrOk);
603
err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
604
if (err!=TIFFReadDirEntryErrOk)
607
return(TIFFReadDirEntryErrOk);
612
err=TIFFReadDirEntryCheckedRational(tif,direntry,&m);
613
if (err!=TIFFReadDirEntryErrOk)
616
return(TIFFReadDirEntryErrOk);
621
err=TIFFReadDirEntryCheckedSrational(tif,direntry,&m);
622
if (err!=TIFFReadDirEntryErrOk)
625
return(TIFFReadDirEntryErrOk);
628
TIFFReadDirEntryCheckedFloat(tif,direntry,value);
629
return(TIFFReadDirEntryErrOk);
633
err=TIFFReadDirEntryCheckedDouble(tif,direntry,&m);
634
if (err!=TIFFReadDirEntryErrOk)
637
return(TIFFReadDirEntryErrOk);
640
return(TIFFReadDirEntryErrType);
644
static enum TIFFReadDirEntryErr TIFFReadDirEntryDouble(TIFF* tif, TIFFDirEntry* direntry, double* value)
646
enum TIFFReadDirEntryErr err;
647
if (direntry->tdir_count!=1)
648
return(TIFFReadDirEntryErrCount);
649
switch (direntry->tdir_type)
654
TIFFReadDirEntryCheckedByte(tif,direntry,&m);
656
return(TIFFReadDirEntryErrOk);
661
TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
663
return(TIFFReadDirEntryErrOk);
668
TIFFReadDirEntryCheckedShort(tif,direntry,&m);
670
return(TIFFReadDirEntryErrOk);
675
TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
677
return(TIFFReadDirEntryErrOk);
682
TIFFReadDirEntryCheckedLong(tif,direntry,&m);
684
return(TIFFReadDirEntryErrOk);
689
TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
691
return(TIFFReadDirEntryErrOk);
696
err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
697
if (err!=TIFFReadDirEntryErrOk)
699
#if defined(__WIN32__) && (_MSC_VER < 1500)
701
* XXX: MSVC 6.0 does not support conversion
702
* of 64-bit integers into floating point
705
*value = _TIFFUInt64ToDouble(m);
709
return(TIFFReadDirEntryErrOk);
714
err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
715
if (err!=TIFFReadDirEntryErrOk)
718
return(TIFFReadDirEntryErrOk);
721
err=TIFFReadDirEntryCheckedRational(tif,direntry,value);
724
err=TIFFReadDirEntryCheckedSrational(tif,direntry,value);
729
TIFFReadDirEntryCheckedFloat(tif,direntry,&m);
731
return(TIFFReadDirEntryErrOk);
734
err=TIFFReadDirEntryCheckedDouble(tif,direntry,value);
737
return(TIFFReadDirEntryErrType);
741
static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8(TIFF* tif, TIFFDirEntry* direntry, uint64* value)
743
enum TIFFReadDirEntryErr err;
744
if (direntry->tdir_count!=1)
745
return(TIFFReadDirEntryErrCount);
746
switch (direntry->tdir_type)
752
TIFFReadDirEntryCheckedLong(tif,direntry,&m);
754
return(TIFFReadDirEntryErrOk);
758
err=TIFFReadDirEntryCheckedLong8(tif,direntry,value);
761
return(TIFFReadDirEntryErrType);
765
static enum TIFFReadDirEntryErr TIFFReadDirEntryArray(TIFF* tif, TIFFDirEntry* direntry, uint32* count, uint32 desttypesize, void** value)
770
typesize=TIFFDataWidth(direntry->tdir_type);
771
if ((direntry->tdir_count==0)||(typesize==0))
774
return(TIFFReadDirEntryErrOk);
779
* As a sanity check, make sure we have no more than a 2GB tag array
780
* in either the current data type or the dest data type. This also
781
* avoids problems with overflow of tmsize_t on 32bit systems.
783
if ((uint64)(2147483647/typesize)<direntry->tdir_count)
784
return(TIFFReadDirEntryErrSizesan);
785
if ((uint64)(2147483647/desttypesize)<direntry->tdir_count)
786
return(TIFFReadDirEntryErrSizesan);
788
*count=(uint32)direntry->tdir_count;
789
datasize=(*count)*typesize;
790
assert((tmsize_t)datasize>0);
791
data=_TIFFCheckMalloc(tif, *count, typesize, "ReadDirEntryArray");
793
return(TIFFReadDirEntryErrAlloc);
794
if (!(tif->tif_flags&TIFF_BIGTIFF))
797
_TIFFmemcpy(data,&direntry->tdir_offset,datasize);
800
enum TIFFReadDirEntryErr err;
801
uint32 offset = direntry->tdir_offset.toff_long;
802
if (tif->tif_flags&TIFF_SWAB)
803
TIFFSwabLong(&offset);
804
err=TIFFReadDirEntryData(tif,(uint64)offset,(tmsize_t)datasize,data);
805
if (err!=TIFFReadDirEntryErrOk)
815
_TIFFmemcpy(data,&direntry->tdir_offset,datasize);
818
enum TIFFReadDirEntryErr err;
819
uint64 offset = direntry->tdir_offset.toff_long8;
820
if (tif->tif_flags&TIFF_SWAB)
821
TIFFSwabLong8(&offset);
822
err=TIFFReadDirEntryData(tif,offset,(tmsize_t)datasize,data);
823
if (err!=TIFFReadDirEntryErrOk)
831
return(TIFFReadDirEntryErrOk);
834
static enum TIFFReadDirEntryErr TIFFReadDirEntryByteArray(TIFF* tif, TIFFDirEntry* direntry, uint8** value)
836
enum TIFFReadDirEntryErr err;
840
switch (direntry->tdir_type)
854
return(TIFFReadDirEntryErrType);
856
err=TIFFReadDirEntryArray(tif,direntry,&count,1,&origdata);
857
if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
862
switch (direntry->tdir_type)
867
*value=(uint8*)origdata;
868
return(TIFFReadDirEntryErrOk);
874
for (n=0; n<count; n++)
876
err=TIFFReadDirEntryCheckRangeByteSbyte(*m);
877
if (err!=TIFFReadDirEntryErrOk)
884
*value=(uint8*)origdata;
885
return(TIFFReadDirEntryErrOk);
888
data=(uint8*)_TIFFmalloc(count);
892
return(TIFFReadDirEntryErrAlloc);
894
switch (direntry->tdir_type)
901
ma=(uint16*)origdata;
903
for (n=0; n<count; n++)
905
if (tif->tif_flags&TIFF_SWAB)
907
err=TIFFReadDirEntryCheckRangeByteShort(*ma);
908
if (err!=TIFFReadDirEntryErrOk)
910
*mb++=(uint8)(*ma++);
921
for (n=0; n<count; n++)
923
if (tif->tif_flags&TIFF_SWAB)
924
TIFFSwabShort((uint16*)ma);
925
err=TIFFReadDirEntryCheckRangeByteSshort(*ma);
926
if (err!=TIFFReadDirEntryErrOk)
928
*mb++=(uint8)(*ma++);
937
ma=(uint32*)origdata;
939
for (n=0; n<count; n++)
941
if (tif->tif_flags&TIFF_SWAB)
943
err=TIFFReadDirEntryCheckRangeByteLong(*ma);
944
if (err!=TIFFReadDirEntryErrOk)
946
*mb++=(uint8)(*ma++);
957
for (n=0; n<count; n++)
959
if (tif->tif_flags&TIFF_SWAB)
960
TIFFSwabLong((uint32*)ma);
961
err=TIFFReadDirEntryCheckRangeByteSlong(*ma);
962
if (err!=TIFFReadDirEntryErrOk)
964
*mb++=(uint8)(*ma++);
973
ma=(uint64*)origdata;
975
for (n=0; n<count; n++)
977
if (tif->tif_flags&TIFF_SWAB)
979
err=TIFFReadDirEntryCheckRangeByteLong8(*ma);
980
if (err!=TIFFReadDirEntryErrOk)
982
*mb++=(uint8)(*ma++);
993
for (n=0; n<count; n++)
995
if (tif->tif_flags&TIFF_SWAB)
996
TIFFSwabLong8((uint64*)ma);
997
err=TIFFReadDirEntryCheckRangeByteSlong8(*ma);
998
if (err!=TIFFReadDirEntryErrOk)
1000
*mb++=(uint8)(*ma++);
1005
_TIFFfree(origdata);
1006
if (err!=TIFFReadDirEntryErrOk)
1012
return(TIFFReadDirEntryErrOk);
1015
static enum TIFFReadDirEntryErr TIFFReadDirEntrySbyteArray(TIFF* tif, TIFFDirEntry* direntry, int8** value)
1017
enum TIFFReadDirEntryErr err;
1021
switch (direntry->tdir_type)
1023
case TIFF_UNDEFINED:
1034
return(TIFFReadDirEntryErrType);
1036
err=TIFFReadDirEntryArray(tif,direntry,&count,1,&origdata);
1037
if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
1042
switch (direntry->tdir_type)
1044
case TIFF_UNDEFINED:
1050
for (n=0; n<count; n++)
1052
err=TIFFReadDirEntryCheckRangeSbyteByte(*m);
1053
if (err!=TIFFReadDirEntryErrOk)
1055
_TIFFfree(origdata);
1060
*value=(int8*)origdata;
1061
return(TIFFReadDirEntryErrOk);
1064
*value=(int8*)origdata;
1065
return(TIFFReadDirEntryErrOk);
1067
data=(int8*)_TIFFmalloc(count);
1070
_TIFFfree(origdata);
1071
return(TIFFReadDirEntryErrAlloc);
1073
switch (direntry->tdir_type)
1080
ma=(uint16*)origdata;
1082
for (n=0; n<count; n++)
1084
if (tif->tif_flags&TIFF_SWAB)
1086
err=TIFFReadDirEntryCheckRangeSbyteShort(*ma);
1087
if (err!=TIFFReadDirEntryErrOk)
1089
*mb++=(int8)(*ma++);
1098
ma=(int16*)origdata;
1100
for (n=0; n<count; n++)
1102
if (tif->tif_flags&TIFF_SWAB)
1103
TIFFSwabShort((uint16*)ma);
1104
err=TIFFReadDirEntryCheckRangeSbyteSshort(*ma);
1105
if (err!=TIFFReadDirEntryErrOk)
1107
*mb++=(int8)(*ma++);
1116
ma=(uint32*)origdata;
1118
for (n=0; n<count; n++)
1120
if (tif->tif_flags&TIFF_SWAB)
1122
err=TIFFReadDirEntryCheckRangeSbyteLong(*ma);
1123
if (err!=TIFFReadDirEntryErrOk)
1125
*mb++=(int8)(*ma++);
1134
ma=(int32*)origdata;
1136
for (n=0; n<count; n++)
1138
if (tif->tif_flags&TIFF_SWAB)
1139
TIFFSwabLong((uint32*)ma);
1140
err=TIFFReadDirEntryCheckRangeSbyteSlong(*ma);
1141
if (err!=TIFFReadDirEntryErrOk)
1143
*mb++=(int8)(*ma++);
1152
ma=(uint64*)origdata;
1154
for (n=0; n<count; n++)
1156
if (tif->tif_flags&TIFF_SWAB)
1158
err=TIFFReadDirEntryCheckRangeSbyteLong8(*ma);
1159
if (err!=TIFFReadDirEntryErrOk)
1161
*mb++=(int8)(*ma++);
1170
ma=(int64*)origdata;
1172
for (n=0; n<count; n++)
1174
if (tif->tif_flags&TIFF_SWAB)
1175
TIFFSwabLong8((uint64*)ma);
1176
err=TIFFReadDirEntryCheckRangeSbyteSlong8(*ma);
1177
if (err!=TIFFReadDirEntryErrOk)
1179
*mb++=(int8)(*ma++);
1184
_TIFFfree(origdata);
1185
if (err!=TIFFReadDirEntryErrOk)
1191
return(TIFFReadDirEntryErrOk);
1194
static enum TIFFReadDirEntryErr TIFFReadDirEntryShortArray(TIFF* tif, TIFFDirEntry* direntry, uint16** value)
1196
enum TIFFReadDirEntryErr err;
1200
switch (direntry->tdir_type)
1212
return(TIFFReadDirEntryErrType);
1214
err=TIFFReadDirEntryArray(tif,direntry,&count,2,&origdata);
1215
if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
1220
switch (direntry->tdir_type)
1223
*value=(uint16*)origdata;
1224
if (tif->tif_flags&TIFF_SWAB)
1225
TIFFSwabArrayOfShort(*value,count);
1226
return(TIFFReadDirEntryErrOk);
1232
for (n=0; n<count; n++)
1234
if (tif->tif_flags&TIFF_SWAB)
1235
TIFFSwabShort((uint16*)m);
1236
err=TIFFReadDirEntryCheckRangeShortSshort(*m);
1237
if (err!=TIFFReadDirEntryErrOk)
1239
_TIFFfree(origdata);
1244
*value=(uint16*)origdata;
1245
return(TIFFReadDirEntryErrOk);
1248
data=(uint16*)_TIFFmalloc(count*2);
1251
_TIFFfree(origdata);
1252
return(TIFFReadDirEntryErrAlloc);
1254
switch (direntry->tdir_type)
1261
ma=(uint8*)origdata;
1263
for (n=0; n<count; n++)
1264
*mb++=(uint16)(*ma++);
1274
for (n=0; n<count; n++)
1276
err=TIFFReadDirEntryCheckRangeShortSbyte(*ma);
1277
if (err!=TIFFReadDirEntryErrOk)
1279
*mb++=(uint16)(*ma++);
1288
ma=(uint32*)origdata;
1290
for (n=0; n<count; n++)
1292
if (tif->tif_flags&TIFF_SWAB)
1294
err=TIFFReadDirEntryCheckRangeShortLong(*ma);
1295
if (err!=TIFFReadDirEntryErrOk)
1297
*mb++=(uint16)(*ma++);
1306
ma=(int32*)origdata;
1308
for (n=0; n<count; n++)
1310
if (tif->tif_flags&TIFF_SWAB)
1311
TIFFSwabLong((uint32*)ma);
1312
err=TIFFReadDirEntryCheckRangeShortSlong(*ma);
1313
if (err!=TIFFReadDirEntryErrOk)
1315
*mb++=(uint16)(*ma++);
1324
ma=(uint64*)origdata;
1326
for (n=0; n<count; n++)
1328
if (tif->tif_flags&TIFF_SWAB)
1330
err=TIFFReadDirEntryCheckRangeShortLong8(*ma);
1331
if (err!=TIFFReadDirEntryErrOk)
1333
*mb++=(uint16)(*ma++);
1342
ma=(int64*)origdata;
1344
for (n=0; n<count; n++)
1346
if (tif->tif_flags&TIFF_SWAB)
1347
TIFFSwabLong8((uint64*)ma);
1348
err=TIFFReadDirEntryCheckRangeShortSlong8(*ma);
1349
if (err!=TIFFReadDirEntryErrOk)
1351
*mb++=(uint16)(*ma++);
1356
_TIFFfree(origdata);
1357
if (err!=TIFFReadDirEntryErrOk)
1363
return(TIFFReadDirEntryErrOk);
1366
static enum TIFFReadDirEntryErr TIFFReadDirEntrySshortArray(TIFF* tif, TIFFDirEntry* direntry, int16** value)
1368
enum TIFFReadDirEntryErr err;
1372
switch (direntry->tdir_type)
1384
return(TIFFReadDirEntryErrType);
1386
err=TIFFReadDirEntryArray(tif,direntry,&count,2,&origdata);
1387
if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
1392
switch (direntry->tdir_type)
1398
m=(uint16*)origdata;
1399
for (n=0; n<count; n++)
1401
if (tif->tif_flags&TIFF_SWAB)
1403
err=TIFFReadDirEntryCheckRangeSshortShort(*m);
1404
if (err!=TIFFReadDirEntryErrOk)
1406
_TIFFfree(origdata);
1411
*value=(int16*)origdata;
1412
return(TIFFReadDirEntryErrOk);
1415
*value=(int16*)origdata;
1416
if (tif->tif_flags&TIFF_SWAB)
1417
TIFFSwabArrayOfShort((uint16*)(*value),count);
1418
return(TIFFReadDirEntryErrOk);
1420
data=(int16*)_TIFFmalloc(count*2);
1423
_TIFFfree(origdata);
1424
return(TIFFReadDirEntryErrAlloc);
1426
switch (direntry->tdir_type)
1433
ma=(uint8*)origdata;
1435
for (n=0; n<count; n++)
1436
*mb++=(int16)(*ma++);
1446
for (n=0; n<count; n++)
1447
*mb++=(int16)(*ma++);
1455
ma=(uint32*)origdata;
1457
for (n=0; n<count; n++)
1459
if (tif->tif_flags&TIFF_SWAB)
1461
err=TIFFReadDirEntryCheckRangeSshortLong(*ma);
1462
if (err!=TIFFReadDirEntryErrOk)
1464
*mb++=(int16)(*ma++);
1473
ma=(int32*)origdata;
1475
for (n=0; n<count; n++)
1477
if (tif->tif_flags&TIFF_SWAB)
1478
TIFFSwabLong((uint32*)ma);
1479
err=TIFFReadDirEntryCheckRangeSshortSlong(*ma);
1480
if (err!=TIFFReadDirEntryErrOk)
1482
*mb++=(int16)(*ma++);
1491
ma=(uint64*)origdata;
1493
for (n=0; n<count; n++)
1495
if (tif->tif_flags&TIFF_SWAB)
1497
err=TIFFReadDirEntryCheckRangeSshortLong8(*ma);
1498
if (err!=TIFFReadDirEntryErrOk)
1500
*mb++=(int16)(*ma++);
1509
ma=(int64*)origdata;
1511
for (n=0; n<count; n++)
1513
if (tif->tif_flags&TIFF_SWAB)
1514
TIFFSwabLong8((uint64*)ma);
1515
err=TIFFReadDirEntryCheckRangeSshortSlong8(*ma);
1516
if (err!=TIFFReadDirEntryErrOk)
1518
*mb++=(int16)(*ma++);
1523
_TIFFfree(origdata);
1524
if (err!=TIFFReadDirEntryErrOk)
1530
return(TIFFReadDirEntryErrOk);
1533
static enum TIFFReadDirEntryErr TIFFReadDirEntryLongArray(TIFF* tif, TIFFDirEntry* direntry, uint32** value)
1535
enum TIFFReadDirEntryErr err;
1539
switch (direntry->tdir_type)
1551
return(TIFFReadDirEntryErrType);
1553
err=TIFFReadDirEntryArray(tif,direntry,&count,4,&origdata);
1554
if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
1559
switch (direntry->tdir_type)
1562
*value=(uint32*)origdata;
1563
if (tif->tif_flags&TIFF_SWAB)
1564
TIFFSwabArrayOfLong(*value,count);
1565
return(TIFFReadDirEntryErrOk);
1571
for (n=0; n<count; n++)
1573
if (tif->tif_flags&TIFF_SWAB)
1574
TIFFSwabLong((uint32*)m);
1575
err=TIFFReadDirEntryCheckRangeLongSlong(*m);
1576
if (err!=TIFFReadDirEntryErrOk)
1578
_TIFFfree(origdata);
1583
*value=(uint32*)origdata;
1584
return(TIFFReadDirEntryErrOk);
1587
data=(uint32*)_TIFFmalloc(count*4);
1590
_TIFFfree(origdata);
1591
return(TIFFReadDirEntryErrAlloc);
1593
switch (direntry->tdir_type)
1600
ma=(uint8*)origdata;
1602
for (n=0; n<count; n++)
1603
*mb++=(uint32)(*ma++);
1613
for (n=0; n<count; n++)
1615
err=TIFFReadDirEntryCheckRangeLongSbyte(*ma);
1616
if (err!=TIFFReadDirEntryErrOk)
1618
*mb++=(uint32)(*ma++);
1627
ma=(uint16*)origdata;
1629
for (n=0; n<count; n++)
1631
if (tif->tif_flags&TIFF_SWAB)
1633
*mb++=(uint32)(*ma++);
1642
ma=(int16*)origdata;
1644
for (n=0; n<count; n++)
1646
if (tif->tif_flags&TIFF_SWAB)
1647
TIFFSwabShort((uint16*)ma);
1648
err=TIFFReadDirEntryCheckRangeLongSshort(*ma);
1649
if (err!=TIFFReadDirEntryErrOk)
1651
*mb++=(uint32)(*ma++);
1660
ma=(uint64*)origdata;
1662
for (n=0; n<count; n++)
1664
if (tif->tif_flags&TIFF_SWAB)
1666
err=TIFFReadDirEntryCheckRangeLongLong8(*ma);
1667
if (err!=TIFFReadDirEntryErrOk)
1669
*mb++=(uint32)(*ma++);
1678
ma=(int64*)origdata;
1680
for (n=0; n<count; n++)
1682
if (tif->tif_flags&TIFF_SWAB)
1683
TIFFSwabLong8((uint64*)ma);
1684
err=TIFFReadDirEntryCheckRangeLongSlong8(*ma);
1685
if (err!=TIFFReadDirEntryErrOk)
1687
*mb++=(uint32)(*ma++);
1692
_TIFFfree(origdata);
1693
if (err!=TIFFReadDirEntryErrOk)
1699
return(TIFFReadDirEntryErrOk);
1702
static enum TIFFReadDirEntryErr TIFFReadDirEntrySlongArray(TIFF* tif, TIFFDirEntry* direntry, int32** value)
1704
enum TIFFReadDirEntryErr err;
1708
switch (direntry->tdir_type)
1720
return(TIFFReadDirEntryErrType);
1722
err=TIFFReadDirEntryArray(tif,direntry,&count,4,&origdata);
1723
if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
1728
switch (direntry->tdir_type)
1734
m=(uint32*)origdata;
1735
for (n=0; n<count; n++)
1737
if (tif->tif_flags&TIFF_SWAB)
1738
TIFFSwabLong((uint32*)m);
1739
err=TIFFReadDirEntryCheckRangeSlongLong(*m);
1740
if (err!=TIFFReadDirEntryErrOk)
1742
_TIFFfree(origdata);
1747
*value=(int32*)origdata;
1748
return(TIFFReadDirEntryErrOk);
1751
*value=(int32*)origdata;
1752
if (tif->tif_flags&TIFF_SWAB)
1753
TIFFSwabArrayOfLong((uint32*)(*value),count);
1754
return(TIFFReadDirEntryErrOk);
1756
data=(int32*)_TIFFmalloc(count*4);
1759
_TIFFfree(origdata);
1760
return(TIFFReadDirEntryErrAlloc);
1762
switch (direntry->tdir_type)
1769
ma=(uint8*)origdata;
1771
for (n=0; n<count; n++)
1772
*mb++=(int32)(*ma++);
1782
for (n=0; n<count; n++)
1783
*mb++=(int32)(*ma++);
1791
ma=(uint16*)origdata;
1793
for (n=0; n<count; n++)
1795
if (tif->tif_flags&TIFF_SWAB)
1797
*mb++=(int32)(*ma++);
1806
ma=(int16*)origdata;
1808
for (n=0; n<count; n++)
1810
if (tif->tif_flags&TIFF_SWAB)
1811
TIFFSwabShort((uint16*)ma);
1812
*mb++=(int32)(*ma++);
1821
ma=(uint64*)origdata;
1823
for (n=0; n<count; n++)
1825
if (tif->tif_flags&TIFF_SWAB)
1827
err=TIFFReadDirEntryCheckRangeSlongLong8(*ma);
1828
if (err!=TIFFReadDirEntryErrOk)
1830
*mb++=(int32)(*ma++);
1839
ma=(int64*)origdata;
1841
for (n=0; n<count; n++)
1843
if (tif->tif_flags&TIFF_SWAB)
1844
TIFFSwabLong8((uint64*)ma);
1845
err=TIFFReadDirEntryCheckRangeSlongSlong8(*ma);
1846
if (err!=TIFFReadDirEntryErrOk)
1848
*mb++=(int32)(*ma++);
1853
_TIFFfree(origdata);
1854
if (err!=TIFFReadDirEntryErrOk)
1860
return(TIFFReadDirEntryErrOk);
1863
static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value)
1865
enum TIFFReadDirEntryErr err;
1869
switch (direntry->tdir_type)
1881
return(TIFFReadDirEntryErrType);
1883
err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata);
1884
if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
1889
switch (direntry->tdir_type)
1892
*value=(uint64*)origdata;
1893
if (tif->tif_flags&TIFF_SWAB)
1894
TIFFSwabArrayOfLong8(*value,count);
1895
return(TIFFReadDirEntryErrOk);
1901
for (n=0; n<count; n++)
1903
if (tif->tif_flags&TIFF_SWAB)
1904
TIFFSwabLong8((uint64*)m);
1905
err=TIFFReadDirEntryCheckRangeLong8Slong8(*m);
1906
if (err!=TIFFReadDirEntryErrOk)
1908
_TIFFfree(origdata);
1913
*value=(uint64*)origdata;
1914
return(TIFFReadDirEntryErrOk);
1917
data=(uint64*)_TIFFmalloc(count*8);
1920
_TIFFfree(origdata);
1921
return(TIFFReadDirEntryErrAlloc);
1923
switch (direntry->tdir_type)
1930
ma=(uint8*)origdata;
1932
for (n=0; n<count; n++)
1933
*mb++=(uint64)(*ma++);
1943
for (n=0; n<count; n++)
1945
err=TIFFReadDirEntryCheckRangeLong8Sbyte(*ma);
1946
if (err!=TIFFReadDirEntryErrOk)
1948
*mb++=(uint64)(*ma++);
1957
ma=(uint16*)origdata;
1959
for (n=0; n<count; n++)
1961
if (tif->tif_flags&TIFF_SWAB)
1963
*mb++=(uint64)(*ma++);
1972
ma=(int16*)origdata;
1974
for (n=0; n<count; n++)
1976
if (tif->tif_flags&TIFF_SWAB)
1977
TIFFSwabShort((uint16*)ma);
1978
err=TIFFReadDirEntryCheckRangeLong8Sshort(*ma);
1979
if (err!=TIFFReadDirEntryErrOk)
1981
*mb++=(uint64)(*ma++);
1990
ma=(uint32*)origdata;
1992
for (n=0; n<count; n++)
1994
if (tif->tif_flags&TIFF_SWAB)
1996
*mb++=(uint64)(*ma++);
2005
ma=(int32*)origdata;
2007
for (n=0; n<count; n++)
2009
if (tif->tif_flags&TIFF_SWAB)
2010
TIFFSwabLong((uint32*)ma);
2011
err=TIFFReadDirEntryCheckRangeLong8Slong(*ma);
2012
if (err!=TIFFReadDirEntryErrOk)
2014
*mb++=(uint64)(*ma++);
2019
_TIFFfree(origdata);
2020
if (err!=TIFFReadDirEntryErrOk)
2026
return(TIFFReadDirEntryErrOk);
2029
static enum TIFFReadDirEntryErr TIFFReadDirEntrySlong8Array(TIFF* tif, TIFFDirEntry* direntry, int64** value)
2031
enum TIFFReadDirEntryErr err;
2035
switch (direntry->tdir_type)
2047
return(TIFFReadDirEntryErrType);
2049
err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata);
2050
if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
2055
switch (direntry->tdir_type)
2061
m=(uint64*)origdata;
2062
for (n=0; n<count; n++)
2064
if (tif->tif_flags&TIFF_SWAB)
2066
err=TIFFReadDirEntryCheckRangeSlong8Long8(*m);
2067
if (err!=TIFFReadDirEntryErrOk)
2069
_TIFFfree(origdata);
2074
*value=(int64*)origdata;
2075
return(TIFFReadDirEntryErrOk);
2078
*value=(int64*)origdata;
2079
if (tif->tif_flags&TIFF_SWAB)
2080
TIFFSwabArrayOfLong8((uint64*)(*value),count);
2081
return(TIFFReadDirEntryErrOk);
2083
data=(int64*)_TIFFmalloc(count*8);
2086
_TIFFfree(origdata);
2087
return(TIFFReadDirEntryErrAlloc);
2089
switch (direntry->tdir_type)
2096
ma=(uint8*)origdata;
2098
for (n=0; n<count; n++)
2099
*mb++=(int64)(*ma++);
2109
for (n=0; n<count; n++)
2110
*mb++=(int64)(*ma++);
2118
ma=(uint16*)origdata;
2120
for (n=0; n<count; n++)
2122
if (tif->tif_flags&TIFF_SWAB)
2124
*mb++=(int64)(*ma++);
2133
ma=(int16*)origdata;
2135
for (n=0; n<count; n++)
2137
if (tif->tif_flags&TIFF_SWAB)
2138
TIFFSwabShort((uint16*)ma);
2139
*mb++=(int64)(*ma++);
2148
ma=(uint32*)origdata;
2150
for (n=0; n<count; n++)
2152
if (tif->tif_flags&TIFF_SWAB)
2154
*mb++=(int64)(*ma++);
2163
ma=(int32*)origdata;
2165
for (n=0; n<count; n++)
2167
if (tif->tif_flags&TIFF_SWAB)
2168
TIFFSwabLong((uint32*)ma);
2169
*mb++=(int64)(*ma++);
2174
_TIFFfree(origdata);
2175
if (err!=TIFFReadDirEntryErrOk)
2181
return(TIFFReadDirEntryErrOk);
2184
static enum TIFFReadDirEntryErr TIFFReadDirEntryFloatArray(TIFF* tif, TIFFDirEntry* direntry, float** value)
2186
enum TIFFReadDirEntryErr err;
2190
switch (direntry->tdir_type)
2201
case TIFF_SRATIONAL:
2206
return(TIFFReadDirEntryErrType);
2208
err=TIFFReadDirEntryArray(tif,direntry,&count,4,&origdata);
2209
if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
2214
switch (direntry->tdir_type)
2217
if (tif->tif_flags&TIFF_SWAB)
2218
TIFFSwabArrayOfLong((uint32*)origdata,count);
2219
TIFFCvtIEEEDoubleToNative(tif,count,(float*)origdata);
2220
*value=(float*)origdata;
2221
return(TIFFReadDirEntryErrOk);
2223
data=(float*)_TIFFmalloc(count*sizeof(float));
2226
_TIFFfree(origdata);
2227
return(TIFFReadDirEntryErrAlloc);
2229
switch (direntry->tdir_type)
2236
ma=(uint8*)origdata;
2238
for (n=0; n<count; n++)
2239
*mb++=(float)(*ma++);
2249
for (n=0; n<count; n++)
2250
*mb++=(float)(*ma++);
2258
ma=(uint16*)origdata;
2260
for (n=0; n<count; n++)
2262
if (tif->tif_flags&TIFF_SWAB)
2264
*mb++=(float)(*ma++);
2273
ma=(int16*)origdata;
2275
for (n=0; n<count; n++)
2277
if (tif->tif_flags&TIFF_SWAB)
2278
TIFFSwabShort((uint16*)ma);
2279
*mb++=(float)(*ma++);
2288
ma=(uint32*)origdata;
2290
for (n=0; n<count; n++)
2292
if (tif->tif_flags&TIFF_SWAB)
2294
*mb++=(float)(*ma++);
2303
ma=(int32*)origdata;
2305
for (n=0; n<count; n++)
2307
if (tif->tif_flags&TIFF_SWAB)
2308
TIFFSwabLong((uint32*)ma);
2309
*mb++=(float)(*ma++);
2318
ma=(uint64*)origdata;
2320
for (n=0; n<count; n++)
2322
if (tif->tif_flags&TIFF_SWAB)
2324
#if defined(__WIN32__) && (_MSC_VER < 1500)
2326
* XXX: MSVC 6.0 does not support
2327
* conversion of 64-bit integers into
2328
* floating point values.
2330
*mb++ = _TIFFUInt64ToFloat(*ma++);
2332
*mb++ = (float)(*ma++);
2342
ma=(int64*)origdata;
2344
for (n=0; n<count; n++)
2346
if (tif->tif_flags&TIFF_SWAB)
2347
TIFFSwabLong8((uint64*)ma);
2348
*mb++=(float)(*ma++);
2359
ma=(uint32*)origdata;
2361
for (n=0; n<count; n++)
2363
if (tif->tif_flags&TIFF_SWAB)
2366
if (tif->tif_flags&TIFF_SWAB)
2372
*mb++=(float)maa/(float)mab;
2376
case TIFF_SRATIONAL:
2383
ma=(uint32*)origdata;
2385
for (n=0; n<count; n++)
2387
if (tif->tif_flags&TIFF_SWAB)
2391
if (tif->tif_flags&TIFF_SWAB)
2397
*mb++=(float)maa/(float)mab;
2406
if (tif->tif_flags&TIFF_SWAB)
2407
TIFFSwabArrayOfLong8((uint64*)origdata,count);
2408
TIFFCvtIEEEDoubleToNative(tif,count,(double*)origdata);
2409
ma=(double*)origdata;
2411
for (n=0; n<count; n++)
2412
*mb++=(float)(*ma++);
2416
_TIFFfree(origdata);
2417
if (err!=TIFFReadDirEntryErrOk)
2423
return(TIFFReadDirEntryErrOk);
2426
static enum TIFFReadDirEntryErr
2427
TIFFReadDirEntryDoubleArray(TIFF* tif, TIFFDirEntry* direntry, double** value)
2429
enum TIFFReadDirEntryErr err;
2433
switch (direntry->tdir_type)
2444
case TIFF_SRATIONAL:
2449
return(TIFFReadDirEntryErrType);
2451
err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata);
2452
if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
2457
switch (direntry->tdir_type)
2460
if (tif->tif_flags&TIFF_SWAB)
2461
TIFFSwabArrayOfLong8((uint64*)origdata,count);
2462
TIFFCvtIEEEDoubleToNative(tif,count,(double*)origdata);
2463
*value=(double*)origdata;
2464
return(TIFFReadDirEntryErrOk);
2466
data=(double*)_TIFFmalloc(count*sizeof(double));
2469
_TIFFfree(origdata);
2470
return(TIFFReadDirEntryErrAlloc);
2472
switch (direntry->tdir_type)
2479
ma=(uint8*)origdata;
2481
for (n=0; n<count; n++)
2482
*mb++=(double)(*ma++);
2492
for (n=0; n<count; n++)
2493
*mb++=(double)(*ma++);
2501
ma=(uint16*)origdata;
2503
for (n=0; n<count; n++)
2505
if (tif->tif_flags&TIFF_SWAB)
2507
*mb++=(double)(*ma++);
2516
ma=(int16*)origdata;
2518
for (n=0; n<count; n++)
2520
if (tif->tif_flags&TIFF_SWAB)
2521
TIFFSwabShort((uint16*)ma);
2522
*mb++=(double)(*ma++);
2531
ma=(uint32*)origdata;
2533
for (n=0; n<count; n++)
2535
if (tif->tif_flags&TIFF_SWAB)
2537
*mb++=(double)(*ma++);
2546
ma=(int32*)origdata;
2548
for (n=0; n<count; n++)
2550
if (tif->tif_flags&TIFF_SWAB)
2551
TIFFSwabLong((uint32*)ma);
2552
*mb++=(double)(*ma++);
2561
ma=(uint64*)origdata;
2563
for (n=0; n<count; n++)
2565
if (tif->tif_flags&TIFF_SWAB)
2567
#if defined(__WIN32__) && (_MSC_VER < 1500)
2569
* XXX: MSVC 6.0 does not support
2570
* conversion of 64-bit integers into
2571
* floating point values.
2573
*mb++ = _TIFFUInt64ToDouble(*ma++);
2575
*mb++ = (double)(*ma++);
2585
ma=(int64*)origdata;
2587
for (n=0; n<count; n++)
2589
if (tif->tif_flags&TIFF_SWAB)
2590
TIFFSwabLong8((uint64*)ma);
2591
*mb++=(double)(*ma++);
2602
ma=(uint32*)origdata;
2604
for (n=0; n<count; n++)
2606
if (tif->tif_flags&TIFF_SWAB)
2609
if (tif->tif_flags&TIFF_SWAB)
2615
*mb++=(double)maa/(double)mab;
2619
case TIFF_SRATIONAL:
2626
ma=(uint32*)origdata;
2628
for (n=0; n<count; n++)
2630
if (tif->tif_flags&TIFF_SWAB)
2634
if (tif->tif_flags&TIFF_SWAB)
2640
*mb++=(double)maa/(double)mab;
2649
if (tif->tif_flags&TIFF_SWAB)
2650
TIFFSwabArrayOfLong((uint32*)origdata,count);
2651
TIFFCvtIEEEFloatToNative(tif,count,(float*)origdata);
2652
ma=(float*)origdata;
2654
for (n=0; n<count; n++)
2655
*mb++=(double)(*ma++);
2659
_TIFFfree(origdata);
2660
if (err!=TIFFReadDirEntryErrOk)
2666
return(TIFFReadDirEntryErrOk);
2669
static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value)
2671
enum TIFFReadDirEntryErr err;
2675
switch (direntry->tdir_type)
2683
return(TIFFReadDirEntryErrType);
2685
err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata);
2686
if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
2691
switch (direntry->tdir_type)
2695
*value=(uint64*)origdata;
2696
if (tif->tif_flags&TIFF_SWAB)
2697
TIFFSwabArrayOfLong8(*value,count);
2698
return(TIFFReadDirEntryErrOk);
2700
data=(uint64*)_TIFFmalloc(count*8);
2703
_TIFFfree(origdata);
2704
return(TIFFReadDirEntryErrAlloc);
2706
switch (direntry->tdir_type)
2714
ma=(uint32*)origdata;
2716
for (n=0; n<count; n++)
2718
if (tif->tif_flags&TIFF_SWAB)
2720
*mb++=(uint64)(*ma++);
2725
_TIFFfree(origdata);
2726
if (err!=TIFFReadDirEntryErrOk)
2732
return(TIFFReadDirEntryErrOk);
2735
static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value)
2737
enum TIFFReadDirEntryErr err;
2741
if (direntry->tdir_count<(uint64)tif->tif_dir.td_samplesperpixel)
2742
return(TIFFReadDirEntryErrCount);
2743
err=TIFFReadDirEntryShortArray(tif,direntry,&m);
2744
if (err!=TIFFReadDirEntryErrOk)
2747
nb=tif->tif_dir.td_samplesperpixel;
2754
err=TIFFReadDirEntryErrPsdif;
2764
static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleDouble(TIFF* tif, TIFFDirEntry* direntry, double* value)
2766
enum TIFFReadDirEntryErr err;
2770
if (direntry->tdir_count<(uint64)tif->tif_dir.td_samplesperpixel)
2771
return(TIFFReadDirEntryErrCount);
2772
err=TIFFReadDirEntryDoubleArray(tif,direntry,&m);
2773
if (err!=TIFFReadDirEntryErrOk)
2776
nb=tif->tif_dir.td_samplesperpixel;
2783
err=TIFFReadDirEntryErrPsdif;
2793
static void TIFFReadDirEntryCheckedByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value)
2796
*value=*(uint8*)(&direntry->tdir_offset);
2799
static void TIFFReadDirEntryCheckedSbyte(TIFF* tif, TIFFDirEntry* direntry, int8* value)
2802
*value=*(int8*)(&direntry->tdir_offset);
2805
static void TIFFReadDirEntryCheckedShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value)
2807
*value = direntry->tdir_offset.toff_short;
2808
/* *value=*(uint16*)(&direntry->tdir_offset); */
2809
if (tif->tif_flags&TIFF_SWAB)
2810
TIFFSwabShort(value);
2813
static void TIFFReadDirEntryCheckedSshort(TIFF* tif, TIFFDirEntry* direntry, int16* value)
2815
*value=*(int16*)(&direntry->tdir_offset);
2816
if (tif->tif_flags&TIFF_SWAB)
2817
TIFFSwabShort((uint16*)value);
2820
static void TIFFReadDirEntryCheckedLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value)
2822
*value=*(uint32*)(&direntry->tdir_offset);
2823
if (tif->tif_flags&TIFF_SWAB)
2824
TIFFSwabLong(value);
2827
static void TIFFReadDirEntryCheckedSlong(TIFF* tif, TIFFDirEntry* direntry, int32* value)
2829
*value=*(int32*)(&direntry->tdir_offset);
2830
if (tif->tif_flags&TIFF_SWAB)
2831
TIFFSwabLong((uint32*)value);
2834
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value)
2836
if (!(tif->tif_flags&TIFF_BIGTIFF))
2838
enum TIFFReadDirEntryErr err;
2839
uint32 offset = direntry->tdir_offset.toff_long;
2840
if (tif->tif_flags&TIFF_SWAB)
2841
TIFFSwabLong(&offset);
2842
err=TIFFReadDirEntryData(tif,offset,8,value);
2843
if (err!=TIFFReadDirEntryErrOk)
2847
*value = direntry->tdir_offset.toff_long8;
2848
if (tif->tif_flags&TIFF_SWAB)
2849
TIFFSwabLong8(value);
2850
return(TIFFReadDirEntryErrOk);
2853
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSlong8(TIFF* tif, TIFFDirEntry* direntry, int64* value)
2855
if (!(tif->tif_flags&TIFF_BIGTIFF))
2857
enum TIFFReadDirEntryErr err;
2858
uint32 offset = direntry->tdir_offset.toff_long;
2859
if (tif->tif_flags&TIFF_SWAB)
2860
TIFFSwabLong(&offset);
2861
err=TIFFReadDirEntryData(tif,offset,8,value);
2862
if (err!=TIFFReadDirEntryErrOk)
2866
*value=*(int64*)(&direntry->tdir_offset);
2867
if (tif->tif_flags&TIFF_SWAB)
2868
TIFFSwabLong8((uint64*)value);
2869
return(TIFFReadDirEntryErrOk);
2872
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedRational(TIFF* tif, TIFFDirEntry* direntry, double* value)
2876
assert(sizeof(double)==8);
2877
assert(sizeof(uint64)==8);
2878
assert(sizeof(uint32)==4);
2879
if (!(tif->tif_flags&TIFF_BIGTIFF))
2881
enum TIFFReadDirEntryErr err;
2882
uint32 offset = direntry->tdir_offset.toff_long;
2883
if (tif->tif_flags&TIFF_SWAB)
2884
TIFFSwabLong(&offset);
2885
err=TIFFReadDirEntryData(tif,offset,8,m.i);
2886
if (err!=TIFFReadDirEntryErrOk)
2890
m.l = direntry->tdir_offset.toff_long8;
2891
if (tif->tif_flags&TIFF_SWAB)
2892
TIFFSwabArrayOfLong(m.i,2);
2896
*value=(double)m.i[0]/(double)m.i[1];
2897
return(TIFFReadDirEntryErrOk);
2900
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSrational(TIFF* tif, TIFFDirEntry* direntry, double* value)
2903
assert(sizeof(double)==8);
2904
assert(sizeof(uint64)==8);
2905
assert(sizeof(int32)==4);
2906
assert(sizeof(uint32)==4);
2907
if (!(tif->tif_flags&TIFF_BIGTIFF))
2909
enum TIFFReadDirEntryErr err;
2910
uint32 offset = direntry->tdir_offset.toff_long;
2911
if (tif->tif_flags&TIFF_SWAB)
2912
TIFFSwabLong(&offset);
2913
err=TIFFReadDirEntryData(tif,offset,8,m.i);
2914
if (err!=TIFFReadDirEntryErrOk)
2918
m.l=direntry->tdir_offset.toff_long8;
2919
if (tif->tif_flags&TIFF_SWAB)
2920
TIFFSwabArrayOfLong(m.i,2);
2921
if ((int32)m.i[0]==0)
2924
*value=(double)((int32)m.i[0])/(double)m.i[1];
2925
return(TIFFReadDirEntryErrOk);
2928
static void TIFFReadDirEntryCheckedFloat(TIFF* tif, TIFFDirEntry* direntry, float* value)
2935
assert(sizeof(float)==4);
2936
assert(sizeof(uint32)==4);
2937
assert(sizeof(float_union)==4);
2938
float_union.i=*(uint32*)(&direntry->tdir_offset);
2939
*value=float_union.f;
2940
if (tif->tif_flags&TIFF_SWAB)
2941
TIFFSwabLong((uint32*)value);
2944
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedDouble(TIFF* tif, TIFFDirEntry* direntry, double* value)
2946
assert(sizeof(double)==8);
2947
assert(sizeof(uint64)==8);
2948
assert(sizeof(UInt64Aligned_t)==8);
2949
if (!(tif->tif_flags&TIFF_BIGTIFF))
2951
enum TIFFReadDirEntryErr err;
2952
uint32 offset = direntry->tdir_offset.toff_long;
2953
if (tif->tif_flags&TIFF_SWAB)
2954
TIFFSwabLong(&offset);
2955
err=TIFFReadDirEntryData(tif,offset,8,value);
2956
if (err!=TIFFReadDirEntryErrOk)
2961
UInt64Aligned_t uint64_union;
2962
uint64_union.l=direntry->tdir_offset.toff_long8;
2963
*value=uint64_union.d;
2965
if (tif->tif_flags&TIFF_SWAB)
2966
TIFFSwabLong8((uint64*)value);
2967
return(TIFFReadDirEntryErrOk);
2970
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSbyte(int8 value)
2973
return(TIFFReadDirEntryErrRange);
2975
return(TIFFReadDirEntryErrOk);
2978
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteShort(uint16 value)
2981
return(TIFFReadDirEntryErrRange);
2983
return(TIFFReadDirEntryErrOk);
2986
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSshort(int16 value)
2988
if ((value<0)||(value>0xFF))
2989
return(TIFFReadDirEntryErrRange);
2991
return(TIFFReadDirEntryErrOk);
2994
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong(uint32 value)
2997
return(TIFFReadDirEntryErrRange);
2999
return(TIFFReadDirEntryErrOk);
3002
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong(int32 value)
3004
if ((value<0)||(value>0xFF))
3005
return(TIFFReadDirEntryErrRange);
3007
return(TIFFReadDirEntryErrOk);
3010
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong8(uint64 value)
3013
return(TIFFReadDirEntryErrRange);
3015
return(TIFFReadDirEntryErrOk);
3018
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong8(int64 value)
3020
if ((value<0)||(value>0xFF))
3021
return(TIFFReadDirEntryErrRange);
3023
return(TIFFReadDirEntryErrOk);
3026
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteByte(uint8 value)
3029
return(TIFFReadDirEntryErrRange);
3031
return(TIFFReadDirEntryErrOk);
3034
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteShort(uint16 value)
3037
return(TIFFReadDirEntryErrRange);
3039
return(TIFFReadDirEntryErrOk);
3042
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSshort(int16 value)
3044
if ((value<-0x80)||(value>0x7F))
3045
return(TIFFReadDirEntryErrRange);
3047
return(TIFFReadDirEntryErrOk);
3050
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong(uint32 value)
3053
return(TIFFReadDirEntryErrRange);
3055
return(TIFFReadDirEntryErrOk);
3058
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong(int32 value)
3060
if ((value<-0x80)||(value>0x7F))
3061
return(TIFFReadDirEntryErrRange);
3063
return(TIFFReadDirEntryErrOk);
3066
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong8(uint64 value)
3069
return(TIFFReadDirEntryErrRange);
3071
return(TIFFReadDirEntryErrOk);
3074
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong8(int64 value)
3076
if ((value<-0x80)||(value>0x7F))
3077
return(TIFFReadDirEntryErrRange);
3079
return(TIFFReadDirEntryErrOk);
3082
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSbyte(int8 value)
3085
return(TIFFReadDirEntryErrRange);
3087
return(TIFFReadDirEntryErrOk);
3090
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSshort(int16 value)
3093
return(TIFFReadDirEntryErrRange);
3095
return(TIFFReadDirEntryErrOk);
3098
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong(uint32 value)
3101
return(TIFFReadDirEntryErrRange);
3103
return(TIFFReadDirEntryErrOk);
3106
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong(int32 value)
3108
if ((value<0)||(value>0xFFFF))
3109
return(TIFFReadDirEntryErrRange);
3111
return(TIFFReadDirEntryErrOk);
3114
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong8(uint64 value)
3117
return(TIFFReadDirEntryErrRange);
3119
return(TIFFReadDirEntryErrOk);
3122
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong8(int64 value)
3124
if ((value<0)||(value>0xFFFF))
3125
return(TIFFReadDirEntryErrRange);
3127
return(TIFFReadDirEntryErrOk);
3130
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortShort(uint16 value)
3133
return(TIFFReadDirEntryErrRange);
3135
return(TIFFReadDirEntryErrOk);
3138
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong(uint32 value)
3141
return(TIFFReadDirEntryErrRange);
3143
return(TIFFReadDirEntryErrOk);
3146
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong(int32 value)
3148
if ((value<-0x8000)||(value>0x7FFF))
3149
return(TIFFReadDirEntryErrRange);
3151
return(TIFFReadDirEntryErrOk);
3154
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong8(uint64 value)
3157
return(TIFFReadDirEntryErrRange);
3159
return(TIFFReadDirEntryErrOk);
3162
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong8(int64 value)
3164
if ((value<-0x8000)||(value>0x7FFF))
3165
return(TIFFReadDirEntryErrRange);
3167
return(TIFFReadDirEntryErrOk);
3170
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSbyte(int8 value)
3173
return(TIFFReadDirEntryErrRange);
3175
return(TIFFReadDirEntryErrOk);
3178
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSshort(int16 value)
3181
return(TIFFReadDirEntryErrRange);
3183
return(TIFFReadDirEntryErrOk);
3186
static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong(int32 value)
3189
return(TIFFReadDirEntryErrRange);
3191
return(TIFFReadDirEntryErrOk);
3195
* Largest 32-bit unsigned integer value.
3197
#if defined(__WIN32__) && defined(_MSC_VER)
3198
# define TIFF_UINT32_MAX 0xFFFFFFFFI64
3200
# define TIFF_UINT32_MAX 0xFFFFFFFFLL
3203
static enum TIFFReadDirEntryErr
3204
TIFFReadDirEntryCheckRangeLongLong8(uint64 value)
3206
if (value > TIFF_UINT32_MAX)
3207
return(TIFFReadDirEntryErrRange);
3209
return(TIFFReadDirEntryErrOk);
3212
static enum TIFFReadDirEntryErr
3213
TIFFReadDirEntryCheckRangeLongSlong8(int64 value)
3215
if ((value<0) || (value > TIFF_UINT32_MAX))
3216
return(TIFFReadDirEntryErrRange);
3218
return(TIFFReadDirEntryErrOk);
3221
#undef TIFF_UINT32_MAX
3223
static enum TIFFReadDirEntryErr
3224
TIFFReadDirEntryCheckRangeSlongLong(uint32 value)
3226
if (value > 0x7FFFFFFFUL)
3227
return(TIFFReadDirEntryErrRange);
3229
return(TIFFReadDirEntryErrOk);
3232
static enum TIFFReadDirEntryErr
3233
TIFFReadDirEntryCheckRangeSlongLong8(uint64 value)
3235
if (value > 0x7FFFFFFFUL)
3236
return(TIFFReadDirEntryErrRange);
3238
return(TIFFReadDirEntryErrOk);
3241
static enum TIFFReadDirEntryErr
3242
TIFFReadDirEntryCheckRangeSlongSlong8(int64 value)
3244
if ((value < 0L-0x80000000L) || (value > 0x7FFFFFFFL))
3245
return(TIFFReadDirEntryErrRange);
3247
return(TIFFReadDirEntryErrOk);
3250
static enum TIFFReadDirEntryErr
3251
TIFFReadDirEntryCheckRangeLong8Sbyte(int8 value)
3254
return(TIFFReadDirEntryErrRange);
3256
return(TIFFReadDirEntryErrOk);
3259
static enum TIFFReadDirEntryErr
3260
TIFFReadDirEntryCheckRangeLong8Sshort(int16 value)
3263
return(TIFFReadDirEntryErrRange);
3265
return(TIFFReadDirEntryErrOk);
3268
static enum TIFFReadDirEntryErr
3269
TIFFReadDirEntryCheckRangeLong8Slong(int32 value)
3272
return(TIFFReadDirEntryErrRange);
3274
return(TIFFReadDirEntryErrOk);
3277
static enum TIFFReadDirEntryErr
3278
TIFFReadDirEntryCheckRangeLong8Slong8(int64 value)
3281
return(TIFFReadDirEntryErrRange);
3283
return(TIFFReadDirEntryErrOk);
3287
* Largest 64-bit signed integer value.
3289
#if defined(__WIN32__) && defined(_MSC_VER)
3290
# define TIFF_INT64_MAX 0x7FFFFFFFFFFFFFFFI64
3292
# define TIFF_INT64_MAX 0x7FFFFFFFFFFFFFFFLL
3295
static enum TIFFReadDirEntryErr
3296
TIFFReadDirEntryCheckRangeSlong8Long8(uint64 value)
3298
if (value > TIFF_INT64_MAX)
3299
return(TIFFReadDirEntryErrRange);
3301
return(TIFFReadDirEntryErrOk);
3304
#undef TIFF_INT64_MAX
3306
static enum TIFFReadDirEntryErr
3307
TIFFReadDirEntryData(TIFF* tif, uint64 offset, tmsize_t size, void* dest)
3310
if (!isMapped(tif)) {
3311
if (!SeekOK(tif,offset))
3312
return(TIFFReadDirEntryErrIo);
3313
if (!ReadOK(tif,dest,size))
3314
return(TIFFReadDirEntryErrIo);
3319
if (((uint64)ma!=offset)
3321
|| (mb - ma != (size_t) size)
3322
|| (mb < (size_t)size)
3323
|| (mb > (size_t)tif->tif_size)
3325
return(TIFFReadDirEntryErrIo);
3326
_TIFFmemcpy(dest,tif->tif_base+ma,size);
3328
return(TIFFReadDirEntryErrOk);
3331
static void TIFFReadDirEntryOutputErr(TIFF* tif, enum TIFFReadDirEntryErr err, const char* module, const char* tagname, int recover)
3335
case TIFFReadDirEntryErrCount:
3336
TIFFErrorExt(tif->tif_clientdata, module,
3337
"Incorrect count for \"%s\"",
3340
case TIFFReadDirEntryErrType:
3341
TIFFErrorExt(tif->tif_clientdata, module,
3342
"Incompatible type for \"%s\"",
3345
case TIFFReadDirEntryErrIo:
3346
TIFFErrorExt(tif->tif_clientdata, module,
3347
"IO error during reading of \"%s\"",
3350
case TIFFReadDirEntryErrRange:
3351
TIFFErrorExt(tif->tif_clientdata, module,
3352
"Incorrect value for \"%s\"",
3355
case TIFFReadDirEntryErrPsdif:
3356
TIFFErrorExt(tif->tif_clientdata, module,
3357
"Cannot handle different values per sample for \"%s\"",
3360
case TIFFReadDirEntryErrSizesan:
3361
TIFFErrorExt(tif->tif_clientdata, module,
3362
"Sanity check on size of \"%s\" value failed",
3365
case TIFFReadDirEntryErrAlloc:
3366
TIFFErrorExt(tif->tif_clientdata, module,
3367
"Out of memory reading of \"%s\"",
3371
assert(0); /* we should never get here */
3376
case TIFFReadDirEntryErrCount:
3377
TIFFErrorExt(tif->tif_clientdata, module,
3378
"Incorrect count for \"%s\"; tag ignored",
3381
case TIFFReadDirEntryErrType:
3382
TIFFWarningExt(tif->tif_clientdata, module,
3383
"Incompatible type for \"%s\"; tag ignored",
3386
case TIFFReadDirEntryErrIo:
3387
TIFFWarningExt(tif->tif_clientdata, module,
3388
"IO error during reading of \"%s\"; tag ignored",
3391
case TIFFReadDirEntryErrRange:
3392
TIFFWarningExt(tif->tif_clientdata, module,
3393
"Incorrect value for \"%s\"; tag ignored",
3396
case TIFFReadDirEntryErrPsdif:
3397
TIFFWarningExt(tif->tif_clientdata, module,
3398
"Cannot handle different values per sample for \"%s\"; tag ignored",
3401
case TIFFReadDirEntryErrSizesan:
3402
TIFFWarningExt(tif->tif_clientdata, module,
3403
"Sanity check on size of \"%s\" value failed; tag ignored",
3406
case TIFFReadDirEntryErrAlloc:
3407
TIFFWarningExt(tif->tif_clientdata, module,
3408
"Out of memory reading of \"%s\"; tag ignored",
3412
assert(0); /* we should never get here */
3419
* Read the next TIFF directory from a file and convert it to the internal
3420
* format. We read directories sequentially.
3423
TIFFReadDirectory(TIFF* tif)
3425
static const char module[] = "TIFFReadDirectory";
3430
const TIFFField* fip;
3431
uint32 fii=FAILED_FII;
3433
tif->tif_diroff=tif->tif_nextdiroff;
3434
if (!TIFFCheckDirOffset(tif,tif->tif_nextdiroff))
3435
return 0; /* last offset or bad offset (IFD looping) */
3436
(*tif->tif_cleanup)(tif); /* cleanup any previous compression state */
3438
nextdiroff = tif->tif_nextdiroff;
3439
dircount=TIFFFetchDirectory(tif,nextdiroff,&dir,&tif->tif_nextdiroff);
3442
TIFFErrorExt(tif->tif_clientdata,module,
3443
"Failed to read directory at offset " TIFF_UINT64_FORMAT,nextdiroff);
3446
TIFFReadDirectoryCheckOrder(tif,dir,dircount);
3449
* Mark duplicates of any tag to be ignored (bugzilla 1994)
3450
* to avoid certain pathological problems.
3455
for (ma=dir, mb=0; mb<dircount; ma++, mb++)
3459
for (na=ma+1, nb=mb+1; nb<dircount; na++, nb++)
3461
if (ma->tdir_tag==na->tdir_tag)
3462
na->tdir_tag=IGNORE;
3467
tif->tif_flags &= ~TIFF_BEENWRITING; /* reset before new dir */
3468
tif->tif_flags &= ~TIFF_BUF4WRITE; /* reset before new dir */
3469
/* free any old stuff and reinit */
3470
TIFFFreeDirectory(tif);
3471
TIFFDefaultDirectory(tif);
3473
* Electronic Arts writes gray-scale TIFF files
3474
* without a PlanarConfiguration directory entry.
3475
* Thus we setup a default value here, even though
3476
* the TIFF spec says there is no default value.
3478
TIFFSetField(tif,TIFFTAG_PLANARCONFIG,PLANARCONFIG_CONTIG);
3480
* Setup default value and then make a pass over
3481
* the fields to check type and tag information,
3482
* and to extract info required to size data
3483
* structures. A second pass is made afterwards
3484
* to read in everthing not taken in the first pass.
3485
* But we must process the Compression tag first
3486
* in order to merge in codec-private tag definitions (otherwise
3487
* we may get complaints about unknown tags). However, the
3488
* Compression tag may be dependent on the SamplesPerPixel
3489
* tag value because older TIFF specs permited Compression
3490
* to be written as a SamplesPerPixel-count tag entry.
3491
* Thus if we don't first figure out the correct SamplesPerPixel
3492
* tag value then we may end up ignoring the Compression tag
3493
* value because it has an incorrect count value (if the
3494
* true value of SamplesPerPixel is not 1).
3496
dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_SAMPLESPERPIXEL);
3499
if (!TIFFFetchNormalTag(tif,dp,0))
3501
dp->tdir_tag=IGNORE;
3503
dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_COMPRESSION);
3507
* The 5.0 spec says the Compression tag has one value, while
3508
* earlier specs say it has one value per sample. Because of
3509
* this, we accept the tag if one value is supplied with either
3513
enum TIFFReadDirEntryErr err;
3514
err=TIFFReadDirEntryShort(tif,dp,&value);
3515
if (err==TIFFReadDirEntryErrCount)
3516
err=TIFFReadDirEntryPersampleShort(tif,dp,&value);
3517
if (err!=TIFFReadDirEntryErrOk)
3519
TIFFReadDirEntryOutputErr(tif,err,module,"Compression",0);
3522
if (!TIFFSetField(tif,TIFFTAG_COMPRESSION,value))
3524
dp->tdir_tag=IGNORE;
3528
if (!TIFFSetField(tif,TIFFTAG_COMPRESSION,COMPRESSION_NONE))
3532
* First real pass over the directory.
3534
for (di=0, dp=dir; di<dircount; di++, dp++)
3536
if (dp->tdir_tag!=IGNORE)
3538
TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
3539
if (fii == FAILED_FII)
3541
TIFFWarningExt(tif->tif_clientdata, module,
3542
"Unknown field with tag %d (0x%x) encountered",
3543
dp->tdir_tag,dp->tdir_tag);
3544
/* the following knowingly leaks the
3545
anonymous field structure */
3546
if (!_TIFFMergeFields(tif,
3547
_TIFFCreateAnonField(tif,
3549
(TIFFDataType) dp->tdir_type),
3551
TIFFWarningExt(tif->tif_clientdata,
3553
"Registering anonymous field with tag %d (0x%x) failed",
3556
dp->tdir_tag=IGNORE;
3558
TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
3559
assert(fii != FAILED_FII);
3563
if (dp->tdir_tag!=IGNORE)
3565
fip=tif->tif_fields[fii];
3566
if (fip->field_bit==FIELD_IGNORE)
3567
dp->tdir_tag=IGNORE;
3570
switch (dp->tdir_tag)
3572
case TIFFTAG_STRIPOFFSETS:
3573
case TIFFTAG_STRIPBYTECOUNTS:
3574
case TIFFTAG_TILEOFFSETS:
3575
case TIFFTAG_TILEBYTECOUNTS:
3576
TIFFSetFieldBit(tif,fip->field_bit);
3578
case TIFFTAG_IMAGEWIDTH:
3579
case TIFFTAG_IMAGELENGTH:
3580
case TIFFTAG_IMAGEDEPTH:
3581
case TIFFTAG_TILELENGTH:
3582
case TIFFTAG_TILEWIDTH:
3583
case TIFFTAG_TILEDEPTH:
3584
case TIFFTAG_PLANARCONFIG:
3585
case TIFFTAG_ROWSPERSTRIP:
3586
case TIFFTAG_EXTRASAMPLES:
3587
if (!TIFFFetchNormalTag(tif,dp,0))
3589
dp->tdir_tag=IGNORE;
3597
* If a) compression is OJPEG, b) planarconfig tag says it's separate,
3598
* c) strip offsets/bytecounts tag are both present and
3599
* d) both contain exactly one value, then we consistently find
3600
* that the buggy implementation of the buggy compression scheme
3601
* matches contig planarconfig best. So we 'fix-up' the tag here
3603
if ((tif->tif_dir.td_compression==COMPRESSION_OJPEG)&&
3604
(tif->tif_dir.td_planarconfig==PLANARCONFIG_SEPARATE))
3606
if (!_TIFFFillStriles(tif))
3608
dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_STRIPOFFSETS);
3609
if ((dp!=0)&&(dp->tdir_count==1))
3611
dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,
3612
TIFFTAG_STRIPBYTECOUNTS);
3613
if ((dp!=0)&&(dp->tdir_count==1))
3615
tif->tif_dir.td_planarconfig=PLANARCONFIG_CONTIG;
3616
TIFFWarningExt(tif->tif_clientdata,module,
3617
"Planarconfig tag value assumed incorrect, "
3618
"assuming data is contig instead of chunky");
3623
* Allocate directory structure and setup defaults.
3625
if (!TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS))
3627
MissingRequired(tif,"ImageLength");
3631
* Setup appropriate structures (by strip or by tile)
3633
if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) {
3634
tif->tif_dir.td_nstrips = TIFFNumberOfStrips(tif);
3635
tif->tif_dir.td_tilewidth = tif->tif_dir.td_imagewidth;
3636
tif->tif_dir.td_tilelength = tif->tif_dir.td_rowsperstrip;
3637
tif->tif_dir.td_tiledepth = tif->tif_dir.td_imagedepth;
3638
tif->tif_flags &= ~TIFF_ISTILED;
3640
tif->tif_dir.td_nstrips = TIFFNumberOfTiles(tif);
3641
tif->tif_flags |= TIFF_ISTILED;
3643
if (!tif->tif_dir.td_nstrips) {
3644
TIFFErrorExt(tif->tif_clientdata, module,
3645
"Cannot handle zero number of %s",
3646
isTiled(tif) ? "tiles" : "strips");
3649
tif->tif_dir.td_stripsperimage = tif->tif_dir.td_nstrips;
3650
if (tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE)
3651
tif->tif_dir.td_stripsperimage /= tif->tif_dir.td_samplesperpixel;
3652
if (!TIFFFieldSet(tif, FIELD_STRIPOFFSETS)) {
3653
if ((tif->tif_dir.td_compression==COMPRESSION_OJPEG) &&
3654
(isTiled(tif)==0) &&
3655
(tif->tif_dir.td_nstrips==1)) {
3658
* If a) compression is OJPEG, b) it's not a tiled TIFF,
3659
* and c) the number of strips is 1,
3660
* then we tolerate the absence of stripoffsets tag,
3661
* because, presumably, all required data is in the
3662
* JpegInterchangeFormat stream.
3664
TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS);
3666
MissingRequired(tif,
3667
isTiled(tif) ? "TileOffsets" : "StripOffsets");
3672
* Second pass: extract other information.
3674
for (di=0, dp=dir; di<dircount; di++, dp++)
3676
switch (dp->tdir_tag)
3680
case TIFFTAG_MINSAMPLEVALUE:
3681
case TIFFTAG_MAXSAMPLEVALUE:
3682
case TIFFTAG_BITSPERSAMPLE:
3683
case TIFFTAG_DATATYPE:
3684
case TIFFTAG_SAMPLEFORMAT:
3686
* The MinSampleValue, MaxSampleValue, BitsPerSample
3687
* DataType and SampleFormat tags are supposed to be
3688
* written as one value/sample, but some vendors
3689
* incorrectly write one value only -- so we accept
3690
* that as well (yech). Other vendors write correct
3691
* value for NumberOfSamples, but incorrect one for
3692
* BitsPerSample and friends, and we will read this
3697
enum TIFFReadDirEntryErr err;
3698
err=TIFFReadDirEntryShort(tif,dp,&value);
3699
if (err==TIFFReadDirEntryErrCount)
3700
err=TIFFReadDirEntryPersampleShort(tif,dp,&value);
3701
if (err!=TIFFReadDirEntryErrOk)
3703
fip = TIFFFieldWithTag(tif,dp->tdir_tag);
3704
TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0);
3707
if (!TIFFSetField(tif,dp->tdir_tag,value))
3711
case TIFFTAG_SMINSAMPLEVALUE:
3712
case TIFFTAG_SMAXSAMPLEVALUE:
3716
enum TIFFReadDirEntryErr err;
3719
if (dp->tdir_count != (uint64)tif->tif_dir.td_samplesperpixel)
3720
err = TIFFReadDirEntryErrCount;
3722
err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
3723
if (err!=TIFFReadDirEntryErrOk)
3725
fip = TIFFFieldWithTag(tif,dp->tdir_tag);
3726
TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0);
3729
saved_flags = tif->tif_flags;
3730
tif->tif_flags |= TIFF_PERSAMPLE;
3731
m = TIFFSetField(tif,dp->tdir_tag,data);
3732
tif->tif_flags = saved_flags;
3738
case TIFFTAG_STRIPOFFSETS:
3739
case TIFFTAG_TILEOFFSETS:
3740
#if defined(DEFER_STRILE_LOAD)
3741
_TIFFmemcpy( &(tif->tif_dir.td_stripoffset_entry),
3742
dp, sizeof(TIFFDirEntry) );
3744
if (!TIFFFetchStripThing(tif,dp,tif->tif_dir.td_nstrips,&tif->tif_dir.td_stripoffset))
3748
case TIFFTAG_STRIPBYTECOUNTS:
3749
case TIFFTAG_TILEBYTECOUNTS:
3750
#if defined(DEFER_STRILE_LOAD)
3751
_TIFFmemcpy( &(tif->tif_dir.td_stripbytecount_entry),
3752
dp, sizeof(TIFFDirEntry) );
3754
if (!TIFFFetchStripThing(tif,dp,tif->tif_dir.td_nstrips,&tif->tif_dir.td_stripbytecount))
3758
case TIFFTAG_COLORMAP:
3759
case TIFFTAG_TRANSFERFUNCTION:
3761
enum TIFFReadDirEntryErr err;
3762
uint32 countpersample;
3763
uint32 countrequired;
3764
uint32 incrementpersample;
3766
countpersample=(1L<<tif->tif_dir.td_bitspersample);
3767
if ((dp->tdir_tag==TIFFTAG_TRANSFERFUNCTION)&&(dp->tdir_count==(uint64)countpersample))
3769
countrequired=countpersample;
3770
incrementpersample=0;
3774
countrequired=3*countpersample;
3775
incrementpersample=countpersample;
3777
if (dp->tdir_count!=(uint64)countrequired)
3778
err=TIFFReadDirEntryErrCount;
3780
err=TIFFReadDirEntryShortArray(tif,dp,&value);
3781
if (err!=TIFFReadDirEntryErrOk)
3783
fip = TIFFFieldWithTag(tif,dp->tdir_tag);
3784
TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",1);
3788
TIFFSetField(tif,dp->tdir_tag,value,value+incrementpersample,value+2*incrementpersample);
3793
/* BEGIN REV 4.0 COMPATIBILITY */
3794
case TIFFTAG_OSUBFILETYPE:
3798
if (TIFFReadDirEntryShort(tif,dp,&valueo)==TIFFReadDirEntryErrOk)
3802
case OFILETYPE_REDUCEDIMAGE: value=FILETYPE_REDUCEDIMAGE; break;
3803
case OFILETYPE_PAGE: value=FILETYPE_PAGE; break;
3804
default: value=0; break;
3807
TIFFSetField(tif,TIFFTAG_SUBFILETYPE,value);
3811
/* END REV 4.0 COMPATIBILITY */
3813
(void) TIFFFetchNormalTag(tif, dp, TRUE);
3819
* - If a) compression is OJPEG, and b) photometric tag is missing,
3820
* then we consistently find that photometric should be YCbCr
3821
* - If a) compression is OJPEG, and b) photometric tag says it's RGB,
3822
* then we consistently find that the buggy implementation of the
3823
* buggy compression scheme matches photometric YCbCr instead.
3824
* - If a) compression is OJPEG, and b) bitspersample tag is missing,
3825
* then we consistently find bitspersample should be 8.
3826
* - If a) compression is OJPEG, b) samplesperpixel tag is missing,
3827
* and c) photometric is RGB or YCbCr, then we consistently find
3828
* samplesperpixel should be 3
3829
* - If a) compression is OJPEG, b) samplesperpixel tag is missing,
3830
* and c) photometric is MINISWHITE or MINISBLACK, then we consistently
3831
* find samplesperpixel should be 3
3833
if (tif->tif_dir.td_compression==COMPRESSION_OJPEG)
3835
if (!TIFFFieldSet(tif,FIELD_PHOTOMETRIC))
3837
TIFFWarningExt(tif->tif_clientdata, module,
3838
"Photometric tag is missing, assuming data is YCbCr");
3839
if (!TIFFSetField(tif,TIFFTAG_PHOTOMETRIC,PHOTOMETRIC_YCBCR))
3842
else if (tif->tif_dir.td_photometric==PHOTOMETRIC_RGB)
3844
tif->tif_dir.td_photometric=PHOTOMETRIC_YCBCR;
3845
TIFFWarningExt(tif->tif_clientdata, module,
3846
"Photometric tag value assumed incorrect, "
3847
"assuming data is YCbCr instead of RGB");
3849
if (!TIFFFieldSet(tif,FIELD_BITSPERSAMPLE))
3851
TIFFWarningExt(tif->tif_clientdata,module,
3852
"BitsPerSample tag is missing, assuming 8 bits per sample");
3853
if (!TIFFSetField(tif,TIFFTAG_BITSPERSAMPLE,8))
3856
if (!TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
3858
if (tif->tif_dir.td_photometric==PHOTOMETRIC_RGB)
3860
TIFFWarningExt(tif->tif_clientdata,module,
3861
"SamplesPerPixel tag is missing, "
3862
"assuming correct SamplesPerPixel value is 3");
3863
if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,3))
3866
if (tif->tif_dir.td_photometric==PHOTOMETRIC_YCBCR)
3868
TIFFWarningExt(tif->tif_clientdata,module,
3869
"SamplesPerPixel tag is missing, "
3870
"applying correct SamplesPerPixel value of 3");
3871
if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,3))
3874
else if ((tif->tif_dir.td_photometric==PHOTOMETRIC_MINISWHITE)
3875
|| (tif->tif_dir.td_photometric==PHOTOMETRIC_MINISBLACK))
3878
* SamplesPerPixel tag is missing, but is not required
3879
* by spec. Assume correct SamplesPerPixel value of 1.
3881
if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,1))
3887
* Verify Palette image has a Colormap.
3889
if (tif->tif_dir.td_photometric == PHOTOMETRIC_PALETTE &&
3890
!TIFFFieldSet(tif, FIELD_COLORMAP)) {
3891
if ( tif->tif_dir.td_bitspersample>=8 && tif->tif_dir.td_samplesperpixel==3)
3892
tif->tif_dir.td_photometric = PHOTOMETRIC_RGB;
3893
else if (tif->tif_dir.td_bitspersample>=8)
3894
tif->tif_dir.td_photometric = PHOTOMETRIC_MINISBLACK;
3896
MissingRequired(tif, "Colormap");
3902
* We do no further messing with strip/tile offsets/bytecounts in OJPEG
3905
if (tif->tif_dir.td_compression!=COMPRESSION_OJPEG)
3908
* Attempt to deal with a missing StripByteCounts tag.
3910
if (!TIFFFieldSet(tif, FIELD_STRIPBYTECOUNTS)) {
3912
* Some manufacturers violate the spec by not giving
3913
* the size of the strips. In this case, assume there
3914
* is one uncompressed strip of data.
3916
if ((tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG &&
3917
tif->tif_dir.td_nstrips > 1) ||
3918
(tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE &&
3919
tif->tif_dir.td_nstrips != (uint32)tif->tif_dir.td_samplesperpixel)) {
3920
MissingRequired(tif, "StripByteCounts");
3923
TIFFWarningExt(tif->tif_clientdata, module,
3924
"TIFF directory is missing required "
3925
"\"StripByteCounts\" field, calculating from imagelength");
3926
if (EstimateStripByteCounts(tif, dir, dircount) < 0)
3929
* Assume we have wrong StripByteCount value (in case
3930
* of single strip) in following cases:
3931
* - it is equal to zero along with StripOffset;
3932
* - it is larger than file itself (in case of uncompressed
3934
* - it is smaller than the size of the bytes per row
3935
* multiplied on the number of rows. The last case should
3936
* not be checked in the case of writing new image,
3937
* because we may do not know the exact strip size
3938
* until the whole image will be written and directory
3941
#define BYTECOUNTLOOKSBAD \
3942
( (tif->tif_dir.td_stripbytecount[0] == 0 && tif->tif_dir.td_stripoffset[0] != 0) || \
3943
(tif->tif_dir.td_compression == COMPRESSION_NONE && \
3944
tif->tif_dir.td_stripbytecount[0] > TIFFGetFileSize(tif) - tif->tif_dir.td_stripoffset[0]) || \
3945
(tif->tif_mode == O_RDONLY && \
3946
tif->tif_dir.td_compression == COMPRESSION_NONE && \
3947
tif->tif_dir.td_stripbytecount[0] < TIFFScanlineSize64(tif) * tif->tif_dir.td_imagelength) )
3949
} else if (tif->tif_dir.td_nstrips == 1
3950
&& _TIFFFillStriles(tif)
3951
&& tif->tif_dir.td_stripoffset[0] != 0
3952
&& BYTECOUNTLOOKSBAD) {
3954
* XXX: Plexus (and others) sometimes give a value of
3955
* zero for a tag when they don't know what the
3956
* correct value is! Try and handle the simple case
3957
* of estimating the size of a one strip image.
3959
TIFFWarningExt(tif->tif_clientdata, module,
3960
"Bogus \"StripByteCounts\" field, ignoring and calculating from imagelength");
3961
if(EstimateStripByteCounts(tif, dir, dircount) < 0)
3964
#if !defined(DEFER_STRILE_LOAD)
3965
} else if (tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG
3966
&& tif->tif_dir.td_nstrips > 2
3967
&& tif->tif_dir.td_compression == COMPRESSION_NONE
3968
&& tif->tif_dir.td_stripbytecount[0] != tif->tif_dir.td_stripbytecount[1]
3969
&& tif->tif_dir.td_stripbytecount[0] != 0
3970
&& tif->tif_dir.td_stripbytecount[1] != 0 ) {
3972
* XXX: Some vendors fill StripByteCount array with
3973
* absolutely wrong values (it can be equal to
3974
* StripOffset array, for example). Catch this case
3977
* We avoid this check if deferring strile loading
3978
* as it would always force us to load the strip/tile
3981
TIFFWarningExt(tif->tif_clientdata, module,
3982
"Wrong \"StripByteCounts\" field, ignoring and calculating from imagelength");
3983
if (EstimateStripByteCounts(tif, dir, dircount) < 0)
3985
#endif /* !defined(DEFER_STRILE_LOAD) */
3993
if (!TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE))
3995
if (tif->tif_dir.td_bitspersample>=16)
3996
tif->tif_dir.td_maxsamplevalue=0xFFFF;
3998
tif->tif_dir.td_maxsamplevalue = (uint16)((1L<<tif->tif_dir.td_bitspersample)-1);
4001
* XXX: We can optimize checking for the strip bounds using the sorted
4002
* bytecounts array. See also comments for TIFFAppendToStrip()
4003
* function in tif_write.c.
4005
#if !defined(DEFER_STRILE_LOAD)
4006
if (tif->tif_dir.td_nstrips > 1) {
4009
tif->tif_dir.td_stripbytecountsorted = 1;
4010
for (strip = 1; strip < tif->tif_dir.td_nstrips; strip++) {
4011
if (tif->tif_dir.td_stripoffset[strip - 1] >
4012
tif->tif_dir.td_stripoffset[strip]) {
4013
tif->tif_dir.td_stripbytecountsorted = 0;
4018
#endif /* !defined(DEFER_STRILE_LOAD) */
4021
* An opportunity for compression mode dependent tag fixup
4023
(*tif->tif_fixuptags)(tif);
4026
* Some manufacturers make life difficult by writing
4027
* large amounts of uncompressed data as a single strip.
4028
* This is contrary to the recommendations of the spec.
4029
* The following makes an attempt at breaking such images
4030
* into strips closer to the recommended 8k bytes. A
4031
* side effect, however, is that the RowsPerStrip tag
4032
* value may be changed.
4034
if ((tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG)&&
4035
(tif->tif_dir.td_nstrips==1)&&
4036
(tif->tif_dir.td_compression==COMPRESSION_NONE)&&
4037
((tif->tif_flags&(TIFF_STRIPCHOP|TIFF_ISTILED))==TIFF_STRIPCHOP))
4039
if ( !_TIFFFillStriles(tif) || !tif->tif_dir.td_stripbytecount )
4041
ChopUpSingleUncompressedStrip(tif);
4045
* Clear the dirty directory flag.
4047
tif->tif_flags &= ~TIFF_DIRTYDIRECT;
4048
tif->tif_flags &= ~TIFF_DIRTYSTRIP;
4051
* Reinitialize i/o since we are starting on a new directory.
4053
tif->tif_row = (uint32) -1;
4054
tif->tif_curstrip = (uint32) -1;
4055
tif->tif_col = (uint32) -1;
4056
tif->tif_curtile = (uint32) -1;
4057
tif->tif_tilesize = (tmsize_t) -1;
4059
tif->tif_scanlinesize = TIFFScanlineSize(tif);
4060
if (!tif->tif_scanlinesize) {
4061
TIFFErrorExt(tif->tif_clientdata, module,
4062
"Cannot handle zero scanline size");
4067
tif->tif_tilesize = TIFFTileSize(tif);
4068
if (!tif->tif_tilesize) {
4069
TIFFErrorExt(tif->tif_clientdata, module,
4070
"Cannot handle zero tile size");
4074
if (!TIFFStripSize(tif)) {
4075
TIFFErrorExt(tif->tif_clientdata, module,
4076
"Cannot handle zero strip size");
4088
TIFFReadDirectoryCheckOrder(TIFF* tif, TIFFDirEntry* dir, uint16 dircount)
4090
static const char module[] = "TIFFReadDirectoryCheckOrder";
4095
for (n=0, o=dir; n<dircount; n++, o++)
4099
TIFFWarningExt(tif->tif_clientdata,module,
4100
"Invalid TIFF directory; tags are not sorted in ascending order");
4107
static TIFFDirEntry*
4108
TIFFReadDirectoryFindEntry(TIFF* tif, TIFFDirEntry* dir, uint16 dircount, uint16 tagid)
4113
for (m=dir, n=0; n<dircount; m++, n++)
4115
if (m->tdir_tag==tagid)
4122
TIFFReadDirectoryFindFieldInfo(TIFF* tif, uint16 tagid, uint32* fii)
4126
mc=(int32)tif->tif_nfields;
4135
if (tif->tif_fields[mb]->field_tag==(uint32)tagid)
4137
if (tif->tif_fields[mb]->field_tag<(uint32)tagid)
4146
if (tif->tif_fields[mb-1]->field_tag!=(uint32)tagid)
4154
* Read custom directory from the arbitarry offset.
4155
* The code is very similar to TIFFReadDirectory().
4158
TIFFReadCustomDirectory(TIFF* tif, toff_t diroff,
4159
const TIFFFieldArray* infoarray)
4161
static const char module[] = "TIFFReadCustomDirectory";
4166
const TIFFField* fip;
4168
_TIFFSetupFields(tif, infoarray);
4169
dircount=TIFFFetchDirectory(tif,diroff,&dir,NULL);
4172
TIFFErrorExt(tif->tif_clientdata,module,
4173
"Failed to read custom directory at offset " TIFF_UINT64_FORMAT,diroff);
4176
TIFFFreeDirectory(tif);
4177
_TIFFmemset(&tif->tif_dir, 0, sizeof(TIFFDirectory));
4178
TIFFReadDirectoryCheckOrder(tif,dir,dircount);
4179
for (di=0, dp=dir; di<dircount; di++, dp++)
4181
TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
4182
if (fii == FAILED_FII)
4184
TIFFWarningExt(tif->tif_clientdata, module,
4185
"Unknown field with tag %d (0x%x) encountered",
4186
dp->tdir_tag, dp->tdir_tag);
4187
if (!_TIFFMergeFields(tif, _TIFFCreateAnonField(tif,
4189
(TIFFDataType) dp->tdir_type),
4191
TIFFWarningExt(tif->tif_clientdata, module,
4192
"Registering anonymous field with tag %d (0x%x) failed",
4193
dp->tdir_tag, dp->tdir_tag);
4194
dp->tdir_tag=IGNORE;
4196
TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
4197
assert( fii != FAILED_FII );
4200
if (dp->tdir_tag!=IGNORE)
4202
fip=tif->tif_fields[fii];
4203
if (fip->field_bit==FIELD_IGNORE)
4204
dp->tdir_tag=IGNORE;
4207
/* check data type */
4208
while ((fip->field_type!=TIFF_ANY)&&(fip->field_type!=dp->tdir_type))
4211
if ((fii==tif->tif_nfields)||
4212
(tif->tif_fields[fii]->field_tag!=(uint32)dp->tdir_tag))
4217
fip=tif->tif_fields[fii];
4221
TIFFWarningExt(tif->tif_clientdata, module,
4222
"Wrong data type %d for \"%s\"; tag ignored",
4223
dp->tdir_type,fip->field_name);
4224
dp->tdir_tag=IGNORE;
4228
/* check count if known in advance */
4229
if ((fip->field_readcount!=TIFF_VARIABLE)&&
4230
(fip->field_readcount!=TIFF_VARIABLE2))
4233
if (fip->field_readcount==TIFF_SPP)
4234
expected=(uint32)tif->tif_dir.td_samplesperpixel;
4236
expected=(uint32)fip->field_readcount;
4237
if (!CheckDirCount(tif,dp,expected))
4238
dp->tdir_tag=IGNORE;
4242
switch (dp->tdir_tag)
4246
case EXIFTAG_SUBJECTDISTANCE:
4247
(void) TIFFFetchSubjectDistance(tif,dp);
4250
(void) TIFFFetchNormalTag(tif, dp, TRUE);
4261
* EXIF is important special case of custom IFD, so we have a special
4262
* function to read it.
4265
TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff)
4267
const TIFFFieldArray* exifFieldArray;
4268
exifFieldArray = _TIFFGetExifFields();
4269
return TIFFReadCustomDirectory(tif, diroff, exifFieldArray);
4273
EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount)
4275
static const char module[] = "EstimateStripByteCounts";
4278
TIFFDirectory *td = &tif->tif_dir;
4281
_TIFFFillStriles( tif );
4283
if (td->td_stripbytecount)
4284
_TIFFfree(td->td_stripbytecount);
4285
td->td_stripbytecount = (uint64*)
4286
_TIFFCheckMalloc(tif, td->td_nstrips, sizeof (uint64),
4287
"for \"StripByteCounts\" array");
4288
if( td->td_stripbytecount == NULL )
4291
if (td->td_compression != COMPRESSION_NONE) {
4295
filesize = TIFFGetFileSize(tif);
4296
if (!(tif->tif_flags&TIFF_BIGTIFF))
4297
space=sizeof(TIFFHeaderClassic)+2+dircount*12+4;
4299
space=sizeof(TIFFHeaderBig)+8+dircount*20+8;
4300
/* calculate amount of space used by indirect values */
4301
for (dp = dir, n = dircount; n > 0; n--, dp++)
4303
uint32 typewidth = TIFFDataWidth((TIFFDataType) dp->tdir_type);
4305
typewidth = TIFFDataWidth((TIFFDataType) dp->tdir_type);
4306
if (typewidth == 0) {
4307
TIFFErrorExt(tif->tif_clientdata, module,
4308
"Cannot determine size of unknown tag type %d",
4312
datasize=(uint64)typewidth*dp->tdir_count;
4313
if (!(tif->tif_flags&TIFF_BIGTIFF))
4325
space = filesize - space;
4326
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
4327
space /= td->td_samplesperpixel;
4328
for (strip = 0; strip < td->td_nstrips; strip++)
4329
td->td_stripbytecount[strip] = space;
4331
* This gross hack handles the case were the offset to
4332
* the last strip is past the place where we think the strip
4333
* should begin. Since a strip of data must be contiguous,
4334
* it's safe to assume that we've overestimated the amount
4335
* of data in the strip and trim this number back accordingly.
4338
if (td->td_stripoffset[strip]+td->td_stripbytecount[strip] > filesize)
4339
td->td_stripbytecount[strip] = filesize - td->td_stripoffset[strip];
4340
} else if (isTiled(tif)) {
4341
uint64 bytespertile = TIFFTileSize64(tif);
4343
for (strip = 0; strip < td->td_nstrips; strip++)
4344
td->td_stripbytecount[strip] = bytespertile;
4346
uint64 rowbytes = TIFFScanlineSize64(tif);
4347
uint32 rowsperstrip = td->td_imagelength/td->td_stripsperimage;
4348
for (strip = 0; strip < td->td_nstrips; strip++)
4349
td->td_stripbytecount[strip] = rowbytes * rowsperstrip;
4351
TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
4352
if (!TIFFFieldSet(tif, FIELD_ROWSPERSTRIP))
4353
td->td_rowsperstrip = td->td_imagelength;
4358
MissingRequired(TIFF* tif, const char* tagname)
4360
static const char module[] = "MissingRequired";
4362
TIFFErrorExt(tif->tif_clientdata, module,
4363
"TIFF directory is missing required \"%s\" field",
4368
* Check the directory offset against the list of already seen directory
4369
* offsets. This is a trick to prevent IFD looping. The one can create TIFF
4370
* file with looped directory pointers. We will maintain a list of already
4371
* seen directories and check every IFD offset against that list.
4374
TIFFCheckDirOffset(TIFF* tif, uint64 diroff)
4378
if (diroff == 0) /* no more directories */
4381
for (n = 0; n < tif->tif_dirnumber && tif->tif_dirlist; n++) {
4382
if (tif->tif_dirlist[n] == diroff)
4386
tif->tif_dirnumber++;
4388
if (tif->tif_dirnumber > tif->tif_dirlistsize) {
4389
uint64* new_dirlist;
4392
* XXX: Reduce memory allocation granularity of the dirlist
4395
new_dirlist = (uint64*)_TIFFCheckRealloc(tif, tif->tif_dirlist,
4396
tif->tif_dirnumber, 2 * sizeof(uint64), "for IFD list");
4399
tif->tif_dirlistsize = 2 * tif->tif_dirnumber;
4400
tif->tif_dirlist = new_dirlist;
4403
tif->tif_dirlist[tif->tif_dirnumber - 1] = diroff;
4409
* Check the count field of a directory entry against a known value. The
4410
* caller is expected to skip/ignore the tag if there is a mismatch.
4413
CheckDirCount(TIFF* tif, TIFFDirEntry* dir, uint32 count)
4415
if ((uint64)count > dir->tdir_count) {
4416
const TIFFField* fip = TIFFFieldWithTag(tif, dir->tdir_tag);
4417
TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
4418
"incorrect count for field \"%s\" (" TIFF_UINT64_FORMAT ", expecting %u); tag ignored",
4419
fip ? fip->field_name : "unknown tagname",
4420
dir->tdir_count, count);
4422
} else if ((uint64)count < dir->tdir_count) {
4423
const TIFFField* fip = TIFFFieldWithTag(tif, dir->tdir_tag);
4424
TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
4425
"incorrect count for field \"%s\" (" TIFF_UINT64_FORMAT ", expecting %u); tag trimmed",
4426
fip ? fip->field_name : "unknown tagname",
4427
dir->tdir_count, count);
4428
dir->tdir_count = count;
4435
* Read IFD structure from the specified offset. If the pointer to
4436
* nextdiroff variable has been specified, read it too. Function returns a
4437
* number of fields in the directory or 0 if failed.
4440
TIFFFetchDirectory(TIFF* tif, uint64 diroff, TIFFDirEntry** pdir,
4443
static const char module[] = "TIFFFetchDirectory";
4455
tif->tif_diroff = diroff;
4458
if (!isMapped(tif)) {
4459
if (!SeekOK(tif, tif->tif_diroff)) {
4460
TIFFErrorExt(tif->tif_clientdata, module,
4461
"%s: Seek error accessing TIFF directory",
4465
if (!(tif->tif_flags&TIFF_BIGTIFF))
4467
if (!ReadOK(tif, &dircount16, sizeof (uint16))) {
4468
TIFFErrorExt(tif->tif_clientdata, module,
4469
"%s: Can not read TIFF directory count",
4473
if (tif->tif_flags & TIFF_SWAB)
4474
TIFFSwabShort(&dircount16);
4475
if (dircount16>4096)
4477
TIFFErrorExt(tif->tif_clientdata, module,
4478
"Sanity check on directory count failed, this is probably not a valid IFD offset");
4484
if (!ReadOK(tif, &dircount64, sizeof (uint64))) {
4485
TIFFErrorExt(tif->tif_clientdata, module,
4486
"%s: Can not read TIFF directory count",
4490
if (tif->tif_flags & TIFF_SWAB)
4491
TIFFSwabLong8(&dircount64);
4492
if (dircount64>4096)
4494
TIFFErrorExt(tif->tif_clientdata, module,
4495
"Sanity check on directory count failed, this is probably not a valid IFD offset");
4498
dircount16 = (uint16)dircount64;
4501
origdir = _TIFFCheckMalloc(tif, dircount16,
4502
dirsize, "to read TIFF directory");
4503
if (origdir == NULL)
4505
if (!ReadOK(tif, origdir, (tmsize_t)(dircount16*dirsize))) {
4506
TIFFErrorExt(tif->tif_clientdata, module,
4507
"%.100s: Can not read TIFF directory",
4513
* Read offset to next directory for sequential scans if
4518
if (!(tif->tif_flags&TIFF_BIGTIFF))
4520
uint32 nextdiroff32;
4521
if (!ReadOK(tif, &nextdiroff32, sizeof(uint32)))
4523
if (tif->tif_flags&TIFF_SWAB)
4524
TIFFSwabLong(&nextdiroff32);
4525
*nextdiroff=nextdiroff32;
4527
if (!ReadOK(tif, nextdiroff, sizeof(uint64)))
4529
if (tif->tif_flags&TIFF_SWAB)
4530
TIFFSwabLong8(nextdiroff);
4535
tmsize_t off = (tmsize_t) tif->tif_diroff;
4536
if ((uint64)off!=tif->tif_diroff)
4538
TIFFErrorExt(tif->tif_clientdata,module,"Can not read TIFF directory count");
4543
* Check for integer overflow when validating the dir_off,
4544
* otherwise a very high offset may cause an OOB read and
4545
* crash the client. Make two comparisons instead of
4547
* off + sizeof(uint16) > tif->tif_size
4549
* to avoid overflow.
4551
if (!(tif->tif_flags&TIFF_BIGTIFF))
4553
m=off+sizeof(uint16);
4554
if ((m<off)||(m<(tmsize_t)sizeof(uint16))||(m>tif->tif_size)) {
4555
TIFFErrorExt(tif->tif_clientdata, module,
4556
"Can not read TIFF directory count");
4559
_TIFFmemcpy(&dircount16, tif->tif_base + off,
4562
off += sizeof (uint16);
4563
if (tif->tif_flags & TIFF_SWAB)
4564
TIFFSwabShort(&dircount16);
4565
if (dircount16>4096)
4567
TIFFErrorExt(tif->tif_clientdata, module,
4568
"Sanity check on directory count failed, this is probably not a valid IFD offset");
4577
m=off+sizeof(uint64);
4578
if ((m<off)||(m<(tmsize_t)sizeof(uint64))||(m>tif->tif_size)) {
4579
TIFFErrorExt(tif->tif_clientdata, module,
4580
"Can not read TIFF directory count");
4583
_TIFFmemcpy(&dircount64, tif->tif_base + off,
4586
off += sizeof (uint64);
4587
if (tif->tif_flags & TIFF_SWAB)
4588
TIFFSwabLong8(&dircount64);
4589
if (dircount64>4096)
4591
TIFFErrorExt(tif->tif_clientdata, module,
4592
"Sanity check on directory count failed, this is probably not a valid IFD offset");
4595
dircount16 = (uint16)dircount64;
4598
if (dircount16 == 0 )
4600
TIFFErrorExt(tif->tif_clientdata, module,
4601
"Sanity check on directory count failed, zero tag directories not supported");
4604
origdir = _TIFFCheckMalloc(tif, dircount16,
4606
"to read TIFF directory");
4607
if (origdir == NULL)
4609
m=off+dircount16*dirsize;
4610
if ((m<off)||(m<(tmsize_t)(dircount16*dirsize))||(m>tif->tif_size)) {
4611
TIFFErrorExt(tif->tif_clientdata, module,
4612
"Can not read TIFF directory");
4616
_TIFFmemcpy(origdir, tif->tif_base + off,
4617
dircount16 * dirsize);
4620
off += dircount16 * dirsize;
4621
if (!(tif->tif_flags&TIFF_BIGTIFF))
4623
uint32 nextdiroff32;
4624
m=off+sizeof(uint32);
4625
if ((m<off)||(m<(tmsize_t)sizeof(uint32))||(m>tif->tif_size))
4628
_TIFFmemcpy(&nextdiroff32, tif->tif_base + off,
4630
if (tif->tif_flags&TIFF_SWAB)
4631
TIFFSwabLong(&nextdiroff32);
4632
*nextdiroff = nextdiroff32;
4636
m=off+sizeof(uint64);
4637
if ((m<off)||(m<(tmsize_t)sizeof(uint64))||(m>tif->tif_size))
4640
_TIFFmemcpy(nextdiroff, tif->tif_base + off,
4642
if (tif->tif_flags&TIFF_SWAB)
4643
TIFFSwabLong8(nextdiroff);
4647
dir = (TIFFDirEntry*)_TIFFCheckMalloc(tif, dircount16,
4648
sizeof(TIFFDirEntry),
4649
"to read TIFF directory");
4657
for (n=0; n<dircount16; n++)
4659
if (tif->tif_flags&TIFF_SWAB)
4660
TIFFSwabShort((uint16*)ma);
4661
mb->tdir_tag=*(uint16*)ma;
4663
if (tif->tif_flags&TIFF_SWAB)
4664
TIFFSwabShort((uint16*)ma);
4665
mb->tdir_type=*(uint16*)ma;
4667
if (!(tif->tif_flags&TIFF_BIGTIFF))
4669
if (tif->tif_flags&TIFF_SWAB)
4670
TIFFSwabLong((uint32*)ma);
4671
mb->tdir_count=(uint64)(*(uint32*)ma);
4673
*(uint32*)(&mb->tdir_offset)=*(uint32*)ma;
4678
if (tif->tif_flags&TIFF_SWAB)
4679
TIFFSwabLong8((uint64*)ma);
4680
mb->tdir_count=TIFFReadUInt64(ma);
4682
mb->tdir_offset.toff_long8=TIFFReadUInt64(ma);
4693
* Fetch a tag that is not handled by special case code.
4696
TIFFFetchNormalTag(TIFF* tif, TIFFDirEntry* dp, int recover)
4698
static const char module[] = "TIFFFetchNormalTag";
4699
enum TIFFReadDirEntryErr err;
4701
const TIFFField* fip = NULL;
4702
TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
4703
if( fii == FAILED_FII )
4705
TIFFErrorExt(tif->tif_clientdata, "TIFFFetchNormalTag",
4706
"No definition found for tag %d",
4710
fip=tif->tif_fields[fii];
4711
assert(fip->set_field_type!=TIFF_SETGET_OTHER); /* if so, we shouldn't arrive here but deal with this in specialized code */
4712
assert(fip->set_field_type!=TIFF_SETGET_INT); /* if so, we shouldn't arrive here as this is only the case for pseudo-tags */
4713
err=TIFFReadDirEntryErrOk;
4714
switch (fip->set_field_type)
4716
case TIFF_SETGET_UNDEFINED:
4718
case TIFF_SETGET_ASCII:
4721
assert(fip->field_passcount==0);
4722
err=TIFFReadDirEntryByteArray(tif,dp,&data);
4723
if (err==TIFFReadDirEntryErrOk)
4730
while (mb<(uint32)dp->tdir_count)
4737
if (mb+1<(uint32)dp->tdir_count)
4738
TIFFWarningExt(tif->tif_clientdata,module,"ASCII value for tag \"%s\" contains null byte in value; value incorrectly truncated during reading due to implementation limitations",fip->field_name);
4739
else if (mb+1>(uint32)dp->tdir_count)
4742
TIFFWarningExt(tif->tif_clientdata,module,"ASCII value for tag \"%s\" does not end in null byte",fip->field_name);
4743
if ((uint32)dp->tdir_count+1!=dp->tdir_count+1)
4746
o=_TIFFmalloc((uint32)dp->tdir_count+1);
4753
_TIFFmemcpy(o,data,(uint32)dp->tdir_count);
4754
o[(uint32)dp->tdir_count]=0;
4759
n=TIFFSetField(tif,dp->tdir_tag,data);
4767
case TIFF_SETGET_UINT8:
4770
assert(fip->field_readcount==1);
4771
assert(fip->field_passcount==0);
4772
err=TIFFReadDirEntryByte(tif,dp,&data);
4773
if (err==TIFFReadDirEntryErrOk)
4775
if (!TIFFSetField(tif,dp->tdir_tag,data))
4780
case TIFF_SETGET_UINT16:
4783
assert(fip->field_readcount==1);
4784
assert(fip->field_passcount==0);
4785
err=TIFFReadDirEntryShort(tif,dp,&data);
4786
if (err==TIFFReadDirEntryErrOk)
4788
if (!TIFFSetField(tif,dp->tdir_tag,data))
4793
case TIFF_SETGET_UINT32:
4796
assert(fip->field_readcount==1);
4797
assert(fip->field_passcount==0);
4798
err=TIFFReadDirEntryLong(tif,dp,&data);
4799
if (err==TIFFReadDirEntryErrOk)
4801
if (!TIFFSetField(tif,dp->tdir_tag,data))
4806
case TIFF_SETGET_UINT64:
4809
assert(fip->field_readcount==1);
4810
assert(fip->field_passcount==0);
4811
err=TIFFReadDirEntryLong8(tif,dp,&data);
4812
if (err==TIFFReadDirEntryErrOk)
4814
if (!TIFFSetField(tif,dp->tdir_tag,data))
4819
case TIFF_SETGET_FLOAT:
4822
assert(fip->field_readcount==1);
4823
assert(fip->field_passcount==0);
4824
err=TIFFReadDirEntryFloat(tif,dp,&data);
4825
if (err==TIFFReadDirEntryErrOk)
4827
if (!TIFFSetField(tif,dp->tdir_tag,data))
4832
case TIFF_SETGET_DOUBLE:
4835
assert(fip->field_readcount==1);
4836
assert(fip->field_passcount==0);
4837
err=TIFFReadDirEntryDouble(tif,dp,&data);
4838
if (err==TIFFReadDirEntryErrOk)
4840
if (!TIFFSetField(tif,dp->tdir_tag,data))
4845
case TIFF_SETGET_IFD8:
4848
assert(fip->field_readcount==1);
4849
assert(fip->field_passcount==0);
4850
err=TIFFReadDirEntryIfd8(tif,dp,&data);
4851
if (err==TIFFReadDirEntryErrOk)
4853
if (!TIFFSetField(tif,dp->tdir_tag,data))
4858
case TIFF_SETGET_UINT16_PAIR:
4861
assert(fip->field_readcount==2);
4862
assert(fip->field_passcount==0);
4863
if (dp->tdir_count!=2) {
4864
TIFFWarningExt(tif->tif_clientdata,module,
4865
"incorrect count for field \"%s\", expected 2, got %d",
4866
fip->field_name,(int)dp->tdir_count);
4869
err=TIFFReadDirEntryShortArray(tif,dp,&data);
4870
if (err==TIFFReadDirEntryErrOk)
4873
m=TIFFSetField(tif,dp->tdir_tag,data[0],data[1]);
4880
case TIFF_SETGET_C0_UINT8:
4883
assert(fip->field_readcount>=1);
4884
assert(fip->field_passcount==0);
4885
if (dp->tdir_count!=(uint64)fip->field_readcount) {
4886
TIFFWarningExt(tif->tif_clientdata,module,
4887
"incorrect count for field \"%s\", expected %d, got %d",
4888
fip->field_name,(int) fip->field_readcount, (int)dp->tdir_count);
4893
err=TIFFReadDirEntryByteArray(tif,dp,&data);
4894
if (err==TIFFReadDirEntryErrOk)
4897
m=TIFFSetField(tif,dp->tdir_tag,data);
4906
case TIFF_SETGET_C0_UINT16:
4909
assert(fip->field_readcount>=1);
4910
assert(fip->field_passcount==0);
4911
if (dp->tdir_count!=(uint64)fip->field_readcount)
4915
err=TIFFReadDirEntryShortArray(tif,dp,&data);
4916
if (err==TIFFReadDirEntryErrOk)
4919
m=TIFFSetField(tif,dp->tdir_tag,data);
4928
case TIFF_SETGET_C0_UINT32:
4931
assert(fip->field_readcount>=1);
4932
assert(fip->field_passcount==0);
4933
if (dp->tdir_count!=(uint64)fip->field_readcount)
4937
err=TIFFReadDirEntryLongArray(tif,dp,&data);
4938
if (err==TIFFReadDirEntryErrOk)
4941
m=TIFFSetField(tif,dp->tdir_tag,data);
4950
case TIFF_SETGET_C0_FLOAT:
4953
assert(fip->field_readcount>=1);
4954
assert(fip->field_passcount==0);
4955
if (dp->tdir_count!=(uint64)fip->field_readcount)
4959
err=TIFFReadDirEntryFloatArray(tif,dp,&data);
4960
if (err==TIFFReadDirEntryErrOk)
4963
m=TIFFSetField(tif,dp->tdir_tag,data);
4972
case TIFF_SETGET_C16_ASCII:
4975
assert(fip->field_readcount==TIFF_VARIABLE);
4976
assert(fip->field_passcount==1);
4977
if (dp->tdir_count>0xFFFF)
4978
err=TIFFReadDirEntryErrCount;
4981
err=TIFFReadDirEntryByteArray(tif,dp,&data);
4982
if (err==TIFFReadDirEntryErrOk)
4985
m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
4994
case TIFF_SETGET_C16_UINT8:
4997
assert(fip->field_readcount==TIFF_VARIABLE);
4998
assert(fip->field_passcount==1);
4999
if (dp->tdir_count>0xFFFF)
5000
err=TIFFReadDirEntryErrCount;
5003
err=TIFFReadDirEntryByteArray(tif,dp,&data);
5004
if (err==TIFFReadDirEntryErrOk)
5007
m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5016
case TIFF_SETGET_C16_UINT16:
5019
assert(fip->field_readcount==TIFF_VARIABLE);
5020
assert(fip->field_passcount==1);
5021
if (dp->tdir_count>0xFFFF)
5022
err=TIFFReadDirEntryErrCount;
5025
err=TIFFReadDirEntryShortArray(tif,dp,&data);
5026
if (err==TIFFReadDirEntryErrOk)
5029
m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5038
case TIFF_SETGET_C16_UINT32:
5041
assert(fip->field_readcount==TIFF_VARIABLE);
5042
assert(fip->field_passcount==1);
5043
if (dp->tdir_count>0xFFFF)
5044
err=TIFFReadDirEntryErrCount;
5047
err=TIFFReadDirEntryLongArray(tif,dp,&data);
5048
if (err==TIFFReadDirEntryErrOk)
5051
m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5060
case TIFF_SETGET_C16_UINT64:
5063
assert(fip->field_readcount==TIFF_VARIABLE);
5064
assert(fip->field_passcount==1);
5065
if (dp->tdir_count>0xFFFF)
5066
err=TIFFReadDirEntryErrCount;
5069
err=TIFFReadDirEntryLong8Array(tif,dp,&data);
5070
if (err==TIFFReadDirEntryErrOk)
5073
m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5082
case TIFF_SETGET_C16_FLOAT:
5085
assert(fip->field_readcount==TIFF_VARIABLE);
5086
assert(fip->field_passcount==1);
5087
if (dp->tdir_count>0xFFFF)
5088
err=TIFFReadDirEntryErrCount;
5091
err=TIFFReadDirEntryFloatArray(tif,dp,&data);
5092
if (err==TIFFReadDirEntryErrOk)
5095
m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5104
case TIFF_SETGET_C16_DOUBLE:
5107
assert(fip->field_readcount==TIFF_VARIABLE);
5108
assert(fip->field_passcount==1);
5109
if (dp->tdir_count>0xFFFF)
5110
err=TIFFReadDirEntryErrCount;
5113
err=TIFFReadDirEntryDoubleArray(tif,dp,&data);
5114
if (err==TIFFReadDirEntryErrOk)
5117
m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5126
case TIFF_SETGET_C16_IFD8:
5129
assert(fip->field_readcount==TIFF_VARIABLE);
5130
assert(fip->field_passcount==1);
5131
if (dp->tdir_count>0xFFFF)
5132
err=TIFFReadDirEntryErrCount;
5135
err=TIFFReadDirEntryIfd8Array(tif,dp,&data);
5136
if (err==TIFFReadDirEntryErrOk)
5139
m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5148
case TIFF_SETGET_C32_ASCII:
5151
assert(fip->field_readcount==TIFF_VARIABLE2);
5152
assert(fip->field_passcount==1);
5153
err=TIFFReadDirEntryByteArray(tif,dp,&data);
5154
if (err==TIFFReadDirEntryErrOk)
5157
m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5165
case TIFF_SETGET_C32_UINT8:
5168
assert(fip->field_readcount==TIFF_VARIABLE2);
5169
assert(fip->field_passcount==1);
5170
err=TIFFReadDirEntryByteArray(tif,dp,&data);
5171
if (err==TIFFReadDirEntryErrOk)
5174
m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5182
case TIFF_SETGET_C32_SINT8:
5185
assert(fip->field_readcount==TIFF_VARIABLE2);
5186
assert(fip->field_passcount==1);
5187
err=TIFFReadDirEntrySbyteArray(tif,dp,&data);
5188
if (err==TIFFReadDirEntryErrOk)
5191
m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5199
case TIFF_SETGET_C32_UINT16:
5202
assert(fip->field_readcount==TIFF_VARIABLE2);
5203
assert(fip->field_passcount==1);
5204
err=TIFFReadDirEntryShortArray(tif,dp,&data);
5205
if (err==TIFFReadDirEntryErrOk)
5208
m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5216
case TIFF_SETGET_C32_SINT16:
5219
assert(fip->field_readcount==TIFF_VARIABLE2);
5220
assert(fip->field_passcount==1);
5221
err=TIFFReadDirEntrySshortArray(tif,dp,&data);
5222
if (err==TIFFReadDirEntryErrOk)
5225
m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5233
case TIFF_SETGET_C32_UINT32:
5236
assert(fip->field_readcount==TIFF_VARIABLE2);
5237
assert(fip->field_passcount==1);
5238
err=TIFFReadDirEntryLongArray(tif,dp,&data);
5239
if (err==TIFFReadDirEntryErrOk)
5242
m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5250
case TIFF_SETGET_C32_SINT32:
5253
assert(fip->field_readcount==TIFF_VARIABLE2);
5254
assert(fip->field_passcount==1);
5255
err=TIFFReadDirEntrySlongArray(tif,dp,&data);
5256
if (err==TIFFReadDirEntryErrOk)
5259
m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5267
case TIFF_SETGET_C32_UINT64:
5270
assert(fip->field_readcount==TIFF_VARIABLE2);
5271
assert(fip->field_passcount==1);
5272
err=TIFFReadDirEntryLong8Array(tif,dp,&data);
5273
if (err==TIFFReadDirEntryErrOk)
5276
m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5284
case TIFF_SETGET_C32_SINT64:
5287
assert(fip->field_readcount==TIFF_VARIABLE2);
5288
assert(fip->field_passcount==1);
5289
err=TIFFReadDirEntrySlong8Array(tif,dp,&data);
5290
if (err==TIFFReadDirEntryErrOk)
5293
m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5301
case TIFF_SETGET_C32_FLOAT:
5304
assert(fip->field_readcount==TIFF_VARIABLE2);
5305
assert(fip->field_passcount==1);
5306
err=TIFFReadDirEntryFloatArray(tif,dp,&data);
5307
if (err==TIFFReadDirEntryErrOk)
5310
m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5318
case TIFF_SETGET_C32_DOUBLE:
5321
assert(fip->field_readcount==TIFF_VARIABLE2);
5322
assert(fip->field_passcount==1);
5323
err=TIFFReadDirEntryDoubleArray(tif,dp,&data);
5324
if (err==TIFFReadDirEntryErrOk)
5327
m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5335
case TIFF_SETGET_C32_IFD8:
5338
assert(fip->field_readcount==TIFF_VARIABLE2);
5339
assert(fip->field_passcount==1);
5340
err=TIFFReadDirEntryIfd8Array(tif,dp,&data);
5341
if (err==TIFFReadDirEntryErrOk)
5344
m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5353
assert(0); /* we should never get here */
5356
if (err!=TIFFReadDirEntryErrOk)
5358
TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",recover);
5365
* Fetch a set of offsets or lengths.
5366
* While this routine says "strips", in fact it's also used for tiles.
5369
TIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, uint32 nstrips, uint64** lpp)
5371
static const char module[] = "TIFFFetchStripThing";
5372
enum TIFFReadDirEntryErr err;
5374
err=TIFFReadDirEntryLong8Array(tif,dir,&data);
5375
if (err!=TIFFReadDirEntryErrOk)
5377
const TIFFField* fip = TIFFFieldWithTag(tif,dir->tdir_tag);
5378
TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0);
5381
if (dir->tdir_count!=(uint64)nstrips)
5383
uint64* resizeddata;
5384
resizeddata=(uint64*)_TIFFCheckMalloc(tif,nstrips,sizeof(uint64),"for strip array");
5385
if (resizeddata==0) {
5389
if (dir->tdir_count<(uint64)nstrips)
5391
_TIFFmemcpy(resizeddata,data,(uint32)dir->tdir_count*sizeof(uint64));
5392
_TIFFmemset(resizeddata+(uint32)dir->tdir_count,0,(nstrips-(uint32)dir->tdir_count)*sizeof(uint64));
5395
_TIFFmemcpy(resizeddata,data,nstrips*sizeof(uint64));
5404
* Fetch and set the SubjectDistance EXIF tag.
5407
TIFFFetchSubjectDistance(TIFF* tif, TIFFDirEntry* dir)
5409
static const char module[] = "TIFFFetchSubjectDistance";
5410
enum TIFFReadDirEntryErr err;
5413
assert(sizeof(double)==8);
5414
assert(sizeof(uint64)==8);
5415
assert(sizeof(uint32)==4);
5416
if (dir->tdir_count!=1)
5417
err=TIFFReadDirEntryErrCount;
5418
else if (dir->tdir_type!=TIFF_RATIONAL)
5419
err=TIFFReadDirEntryErrType;
5422
if (!(tif->tif_flags&TIFF_BIGTIFF))
5425
offset=*(uint32*)(&dir->tdir_offset);
5426
if (tif->tif_flags&TIFF_SWAB)
5427
TIFFSwabLong(&offset);
5428
err=TIFFReadDirEntryData(tif,offset,8,m.i);
5432
m.l=dir->tdir_offset.toff_long8;
5433
err=TIFFReadDirEntryErrOk;
5436
if (err==TIFFReadDirEntryErrOk)
5439
if (tif->tif_flags&TIFF_SWAB)
5440
TIFFSwabArrayOfLong(m.i,2);
5443
else if (m.i[0]==0xFFFFFFFF)
5445
* XXX: Numerator 0xFFFFFFFF means that we have infinite
5446
* distance. Indicate that with a negative floating point
5447
* SubjectDistance value.
5451
n=(double)m.i[0]/(double)m.i[1];
5452
return(TIFFSetField(tif,dir->tdir_tag,n));
5456
TIFFReadDirEntryOutputErr(tif,err,module,"SubjectDistance",TRUE);
5462
* Replace a single strip (tile) of uncompressed data by multiple strips
5463
* (tiles), each approximately STRIP_SIZE_DEFAULT bytes. This is useful for
5464
* dealing with large images or for dealing with machines with a limited
5468
ChopUpSingleUncompressedStrip(TIFF* tif)
5470
register TIFFDirectory *td = &tif->tif_dir;
5474
uint64 rowblockbytes;
5479
uint32 rowsperstrip;
5483
bytecount = td->td_stripbytecount[0];
5484
offset = td->td_stripoffset[0];
5485
assert(td->td_planarconfig == PLANARCONFIG_CONTIG);
5486
if ((td->td_photometric == PHOTOMETRIC_YCBCR)&&
5487
(!isUpSampled(tif)))
5488
rowblock = td->td_ycbcrsubsampling[1];
5491
rowblockbytes = TIFFVTileSize64(tif, rowblock);
5493
* Make the rows hold at least one scanline, but fill specified amount
5494
* of data if possible.
5496
if (rowblockbytes > STRIP_SIZE_DEFAULT) {
5497
stripbytes = rowblockbytes;
5498
rowsperstrip = rowblock;
5499
} else if (rowblockbytes > 0 ) {
5500
uint32 rowblocksperstrip;
5501
rowblocksperstrip = (uint32) (STRIP_SIZE_DEFAULT / rowblockbytes);
5502
rowsperstrip = rowblocksperstrip * rowblock;
5503
stripbytes = rowblocksperstrip * rowblockbytes;
5509
* never increase the number of strips in an image
5511
if (rowsperstrip >= td->td_rowsperstrip)
5513
nstrips64 = TIFFhowmany_64(bytecount, stripbytes);
5514
if ((nstrips64==0)||(nstrips64>0xFFFFFFFF)) /* something is wonky, do nothing. */
5516
nstrips32 = (uint32)nstrips64;
5518
newcounts = (uint64*) _TIFFCheckMalloc(tif, nstrips32, sizeof (uint64),
5519
"for chopped \"StripByteCounts\" array");
5520
newoffsets = (uint64*) _TIFFCheckMalloc(tif, nstrips32, sizeof (uint64),
5521
"for chopped \"StripOffsets\" array");
5522
if (newcounts == NULL || newoffsets == NULL) {
5524
* Unable to allocate new strip information, give up and use
5525
* the original one strip information.
5527
if (newcounts != NULL)
5528
_TIFFfree(newcounts);
5529
if (newoffsets != NULL)
5530
_TIFFfree(newoffsets);
5534
* Fill the strip information arrays with new bytecounts and offsets
5535
* that reflect the broken-up format.
5537
for (strip = 0; strip < nstrips32; strip++) {
5538
if (stripbytes > bytecount)
5539
stripbytes = bytecount;
5540
newcounts[strip] = stripbytes;
5541
newoffsets[strip] = offset;
5542
offset += stripbytes;
5543
bytecount -= stripbytes;
5546
* Replace old single strip info with multi-strip info.
5548
td->td_stripsperimage = td->td_nstrips = nstrips32;
5549
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
5551
_TIFFfree(td->td_stripbytecount);
5552
_TIFFfree(td->td_stripoffset);
5553
td->td_stripbytecount = newcounts;
5554
td->td_stripoffset = newoffsets;
5555
td->td_stripbytecountsorted = 1;
5558
int _TIFFFillStriles( TIFF *tif )
5560
#if defined(DEFER_STRILE_LOAD)
5561
register TIFFDirectory *td = &tif->tif_dir;
5562
int return_value = 1;
5564
if( td->td_stripoffset != NULL )
5567
if( td->td_stripoffset_entry.tdir_count == 0 )
5570
if (!TIFFFetchStripThing(tif,&(td->td_stripoffset_entry),
5571
td->td_nstrips,&td->td_stripoffset))
5576
if (!TIFFFetchStripThing(tif,&(td->td_stripbytecount_entry),
5577
td->td_nstrips,&td->td_stripbytecount))
5582
_TIFFmemset( &(td->td_stripoffset_entry), 0, sizeof(TIFFDirEntry));
5583
_TIFFmemset( &(td->td_stripbytecount_entry), 0, sizeof(TIFFDirEntry));
5585
if (tif->tif_dir.td_nstrips > 1 && return_value == 1 ) {
5588
tif->tif_dir.td_stripbytecountsorted = 1;
5589
for (strip = 1; strip < tif->tif_dir.td_nstrips; strip++) {
5590
if (tif->tif_dir.td_stripoffset[strip - 1] >
5591
tif->tif_dir.td_stripoffset[strip]) {
5592
tif->tif_dir.td_stripbytecountsorted = 0;
5598
return return_value;
5599
#else /* !defined(DEFER_STRILE_LOAD) */
5606
/* vim: set ts=8 sts=8 sw=8 noet: */