1 /* $Id: tif_dirread.c,v 1.174 2012-02-01 02:24:47 fwarmerdam 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);
3317 ma=(tmsize_t)offset;
3319 if (((uint64)ma!=offset)||(mb<ma)||(mb<size)||(mb>tif->tif_size))
3320 return(TIFFReadDirEntryErrIo);
3321 _TIFFmemcpy(dest,tif->tif_base+ma,size);
3323 return(TIFFReadDirEntryErrOk);
3326 static void TIFFReadDirEntryOutputErr(TIFF* tif, enum TIFFReadDirEntryErr err, const char* module, const char* tagname, int recover)
3330 case TIFFReadDirEntryErrCount:
3331 TIFFErrorExt(tif->tif_clientdata, module,
3332 "Incorrect count for \"%s\"",
3335 case TIFFReadDirEntryErrType:
3336 TIFFErrorExt(tif->tif_clientdata, module,
3337 "Incompatible type for \"%s\"",
3340 case TIFFReadDirEntryErrIo:
3341 TIFFErrorExt(tif->tif_clientdata, module,
3342 "IO error during reading of \"%s\"",
3345 case TIFFReadDirEntryErrRange:
3346 TIFFErrorExt(tif->tif_clientdata, module,
3347 "Incorrect value for \"%s\"",
3350 case TIFFReadDirEntryErrPsdif:
3351 TIFFErrorExt(tif->tif_clientdata, module,
3352 "Cannot handle different values per sample for \"%s\"",
3355 case TIFFReadDirEntryErrSizesan:
3356 TIFFErrorExt(tif->tif_clientdata, module,
3357 "Sanity check on size of \"%s\" value failed",
3360 case TIFFReadDirEntryErrAlloc:
3361 TIFFErrorExt(tif->tif_clientdata, module,
3362 "Out of memory reading of \"%s\"",
3366 assert(0); /* we should never get here */
3371 case TIFFReadDirEntryErrCount:
3372 TIFFErrorExt(tif->tif_clientdata, module,
3373 "Incorrect count for \"%s\"; tag ignored",
3376 case TIFFReadDirEntryErrType:
3377 TIFFWarningExt(tif->tif_clientdata, module,
3378 "Incompatible type for \"%s\"; tag ignored",
3381 case TIFFReadDirEntryErrIo:
3382 TIFFWarningExt(tif->tif_clientdata, module,
3383 "IO error during reading of \"%s\"; tag ignored",
3386 case TIFFReadDirEntryErrRange:
3387 TIFFWarningExt(tif->tif_clientdata, module,
3388 "Incorrect value for \"%s\"; tag ignored",
3391 case TIFFReadDirEntryErrPsdif:
3392 TIFFWarningExt(tif->tif_clientdata, module,
3393 "Cannot handle different values per sample for \"%s\"; tag ignored",
3396 case TIFFReadDirEntryErrSizesan:
3397 TIFFWarningExt(tif->tif_clientdata, module,
3398 "Sanity check on size of \"%s\" value failed; tag ignored",
3401 case TIFFReadDirEntryErrAlloc:
3402 TIFFWarningExt(tif->tif_clientdata, module,
3403 "Out of memory reading of \"%s\"; tag ignored",
3407 assert(0); /* we should never get here */
3414 * Read the next TIFF directory from a file and convert it to the internal
3415 * format. We read directories sequentially.
3418 TIFFReadDirectory(TIFF* tif)
3420 static const char module[] = "TIFFReadDirectory";
3425 const TIFFField* fip;
3426 uint32 fii=FAILED_FII;
3428 tif->tif_diroff=tif->tif_nextdiroff;
3429 if (!TIFFCheckDirOffset(tif,tif->tif_nextdiroff))
3430 return 0; /* last offset or bad offset (IFD looping) */
3431 (*tif->tif_cleanup)(tif); /* cleanup any previous compression state */
3433 nextdiroff = tif->tif_nextdiroff;
3434 dircount=TIFFFetchDirectory(tif,nextdiroff,&dir,&tif->tif_nextdiroff);
3437 TIFFErrorExt(tif->tif_clientdata,module,
3438 "Failed to read directory at offset " TIFF_UINT64_FORMAT,nextdiroff);
3441 TIFFReadDirectoryCheckOrder(tif,dir,dircount);
3444 * Mark duplicates of any tag to be ignored (bugzilla 1994)
3445 * to avoid certain pathological problems.
3450 for (ma=dir, mb=0; mb<dircount; ma++, mb++)
3454 for (na=ma+1, nb=mb+1; nb<dircount; na++, nb++)
3456 if (ma->tdir_tag==na->tdir_tag)
3457 na->tdir_tag=IGNORE;
3462 tif->tif_flags &= ~TIFF_BEENWRITING; /* reset before new dir */
3463 tif->tif_flags &= ~TIFF_BUF4WRITE; /* reset before new dir */
3464 /* free any old stuff and reinit */
3465 TIFFFreeDirectory(tif);
3466 TIFFDefaultDirectory(tif);
3468 * Electronic Arts writes gray-scale TIFF files
3469 * without a PlanarConfiguration directory entry.
3470 * Thus we setup a default value here, even though
3471 * the TIFF spec says there is no default value.
3473 TIFFSetField(tif,TIFFTAG_PLANARCONFIG,PLANARCONFIG_CONTIG);
3475 * Setup default value and then make a pass over
3476 * the fields to check type and tag information,
3477 * and to extract info required to size data
3478 * structures. A second pass is made afterwards
3479 * to read in everthing not taken in the first pass.
3480 * But we must process the Compression tag first
3481 * in order to merge in codec-private tag definitions (otherwise
3482 * we may get complaints about unknown tags). However, the
3483 * Compression tag may be dependent on the SamplesPerPixel
3484 * tag value because older TIFF specs permited Compression
3485 * to be written as a SamplesPerPixel-count tag entry.
3486 * Thus if we don't first figure out the correct SamplesPerPixel
3487 * tag value then we may end up ignoring the Compression tag
3488 * value because it has an incorrect count value (if the
3489 * true value of SamplesPerPixel is not 1).
3491 dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_SAMPLESPERPIXEL);
3494 if (!TIFFFetchNormalTag(tif,dp,0))
3496 dp->tdir_tag=IGNORE;
3498 dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_COMPRESSION);
3502 * The 5.0 spec says the Compression tag has one value, while
3503 * earlier specs say it has one value per sample. Because of
3504 * this, we accept the tag if one value is supplied with either
3508 enum TIFFReadDirEntryErr err;
3509 err=TIFFReadDirEntryShort(tif,dp,&value);
3510 if (err==TIFFReadDirEntryErrCount)
3511 err=TIFFReadDirEntryPersampleShort(tif,dp,&value);
3512 if (err!=TIFFReadDirEntryErrOk)
3514 TIFFReadDirEntryOutputErr(tif,err,module,"Compression",0);
3517 if (!TIFFSetField(tif,TIFFTAG_COMPRESSION,value))
3519 dp->tdir_tag=IGNORE;
3523 if (!TIFFSetField(tif,TIFFTAG_COMPRESSION,COMPRESSION_NONE))
3527 * First real pass over the directory.
3529 for (di=0, dp=dir; di<dircount; di++, dp++)
3531 if (dp->tdir_tag!=IGNORE)
3533 TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
3534 if (fii == FAILED_FII)
3536 TIFFWarningExt(tif->tif_clientdata, module,
3537 "Unknown field with tag %d (0x%x) encountered",
3538 dp->tdir_tag,dp->tdir_tag);
3539 /* the following knowingly leaks the
3540 anonymous field structure */
3541 if (!_TIFFMergeFields(tif,
3542 _TIFFCreateAnonField(tif,
3544 (TIFFDataType) dp->tdir_type),
3546 TIFFWarningExt(tif->tif_clientdata,
3548 "Registering anonymous field with tag %d (0x%x) failed",
3551 dp->tdir_tag=IGNORE;
3553 TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
3554 assert(fii != FAILED_FII);
3558 if (dp->tdir_tag!=IGNORE)
3560 fip=tif->tif_fields[fii];
3561 if (fip->field_bit==FIELD_IGNORE)
3562 dp->tdir_tag=IGNORE;
3565 switch (dp->tdir_tag)
3567 case TIFFTAG_STRIPOFFSETS:
3568 case TIFFTAG_STRIPBYTECOUNTS:
3569 case TIFFTAG_TILEOFFSETS:
3570 case TIFFTAG_TILEBYTECOUNTS:
3571 TIFFSetFieldBit(tif,fip->field_bit);
3573 case TIFFTAG_IMAGEWIDTH:
3574 case TIFFTAG_IMAGELENGTH:
3575 case TIFFTAG_IMAGEDEPTH:
3576 case TIFFTAG_TILELENGTH:
3577 case TIFFTAG_TILEWIDTH:
3578 case TIFFTAG_TILEDEPTH:
3579 case TIFFTAG_PLANARCONFIG:
3580 case TIFFTAG_ROWSPERSTRIP:
3581 case TIFFTAG_EXTRASAMPLES:
3582 if (!TIFFFetchNormalTag(tif,dp,0))
3584 dp->tdir_tag=IGNORE;
3592 * If a) compression is OJPEG, b) planarconfig tag says it's separate,
3593 * c) strip offsets/bytecounts tag are both present and
3594 * d) both contain exactly one value, then we consistently find
3595 * that the buggy implementation of the buggy compression scheme
3596 * matches contig planarconfig best. So we 'fix-up' the tag here
3598 if ((tif->tif_dir.td_compression==COMPRESSION_OJPEG)&&
3599 (tif->tif_dir.td_planarconfig==PLANARCONFIG_SEPARATE))
3601 if (!_TIFFFillStriles(tif))
3603 dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_STRIPOFFSETS);
3604 if ((dp!=0)&&(dp->tdir_count==1))
3606 dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,
3607 TIFFTAG_STRIPBYTECOUNTS);
3608 if ((dp!=0)&&(dp->tdir_count==1))
3610 tif->tif_dir.td_planarconfig=PLANARCONFIG_CONTIG;
3611 TIFFWarningExt(tif->tif_clientdata,module,
3612 "Planarconfig tag value assumed incorrect, "
3613 "assuming data is contig instead of chunky");
3618 * Allocate directory structure and setup defaults.
3620 if (!TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS))
3622 MissingRequired(tif,"ImageLength");
3626 * Setup appropriate structures (by strip or by tile)
3628 if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) {
3629 tif->tif_dir.td_nstrips = TIFFNumberOfStrips(tif);
3630 tif->tif_dir.td_tilewidth = tif->tif_dir.td_imagewidth;
3631 tif->tif_dir.td_tilelength = tif->tif_dir.td_rowsperstrip;
3632 tif->tif_dir.td_tiledepth = tif->tif_dir.td_imagedepth;
3633 tif->tif_flags &= ~TIFF_ISTILED;
3635 tif->tif_dir.td_nstrips = TIFFNumberOfTiles(tif);
3636 tif->tif_flags |= TIFF_ISTILED;
3638 if (!tif->tif_dir.td_nstrips) {
3639 TIFFErrorExt(tif->tif_clientdata, module,
3640 "Cannot handle zero number of %s",
3641 isTiled(tif) ? "tiles" : "strips");
3644 tif->tif_dir.td_stripsperimage = tif->tif_dir.td_nstrips;
3645 if (tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE)
3646 tif->tif_dir.td_stripsperimage /= tif->tif_dir.td_samplesperpixel;
3647 if (!TIFFFieldSet(tif, FIELD_STRIPOFFSETS)) {
3648 if ((tif->tif_dir.td_compression==COMPRESSION_OJPEG) &&
3649 (isTiled(tif)==0) &&
3650 (tif->tif_dir.td_nstrips==1)) {
3653 * If a) compression is OJPEG, b) it's not a tiled TIFF,
3654 * and c) the number of strips is 1,
3655 * then we tolerate the absence of stripoffsets tag,
3656 * because, presumably, all required data is in the
3657 * JpegInterchangeFormat stream.
3659 TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS);
3661 MissingRequired(tif,
3662 isTiled(tif) ? "TileOffsets" : "StripOffsets");
3667 * Second pass: extract other information.
3669 for (di=0, dp=dir; di<dircount; di++, dp++)
3671 switch (dp->tdir_tag)
3675 case TIFFTAG_MINSAMPLEVALUE:
3676 case TIFFTAG_MAXSAMPLEVALUE:
3677 case TIFFTAG_BITSPERSAMPLE:
3678 case TIFFTAG_DATATYPE:
3679 case TIFFTAG_SAMPLEFORMAT:
3681 * The MinSampleValue, MaxSampleValue, BitsPerSample
3682 * DataType and SampleFormat tags are supposed to be
3683 * written as one value/sample, but some vendors
3684 * incorrectly write one value only -- so we accept
3685 * that as well (yech). Other vendors write correct
3686 * value for NumberOfSamples, but incorrect one for
3687 * BitsPerSample and friends, and we will read this
3692 enum TIFFReadDirEntryErr err;
3693 err=TIFFReadDirEntryShort(tif,dp,&value);
3694 if (err==TIFFReadDirEntryErrCount)
3695 err=TIFFReadDirEntryPersampleShort(tif,dp,&value);
3696 if (err!=TIFFReadDirEntryErrOk)
3698 fip = TIFFFieldWithTag(tif,dp->tdir_tag);
3699 TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0);
3702 if (!TIFFSetField(tif,dp->tdir_tag,value))
3706 case TIFFTAG_SMINSAMPLEVALUE:
3707 case TIFFTAG_SMAXSAMPLEVALUE:
3711 enum TIFFReadDirEntryErr err;
3714 if (dp->tdir_count != (uint64)tif->tif_dir.td_samplesperpixel)
3715 err = TIFFReadDirEntryErrCount;
3717 err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
3718 if (err!=TIFFReadDirEntryErrOk)
3720 fip = TIFFFieldWithTag(tif,dp->tdir_tag);
3721 TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0);
3724 saved_flags = tif->tif_flags;
3725 tif->tif_flags |= TIFF_PERSAMPLE;
3726 m = TIFFSetField(tif,dp->tdir_tag,data);
3727 tif->tif_flags = saved_flags;
3733 case TIFFTAG_STRIPOFFSETS:
3734 case TIFFTAG_TILEOFFSETS:
3735 #if defined(DEFER_STRILE_LOAD)
3736 _TIFFmemcpy( &(tif->tif_dir.td_stripoffset_entry),
3737 dp, sizeof(TIFFDirEntry) );
3739 if (!TIFFFetchStripThing(tif,dp,tif->tif_dir.td_nstrips,&tif->tif_dir.td_stripoffset))
3743 case TIFFTAG_STRIPBYTECOUNTS:
3744 case TIFFTAG_TILEBYTECOUNTS:
3745 #if defined(DEFER_STRILE_LOAD)
3746 _TIFFmemcpy( &(tif->tif_dir.td_stripbytecount_entry),
3747 dp, sizeof(TIFFDirEntry) );
3749 if (!TIFFFetchStripThing(tif,dp,tif->tif_dir.td_nstrips,&tif->tif_dir.td_stripbytecount))
3753 case TIFFTAG_COLORMAP:
3754 case TIFFTAG_TRANSFERFUNCTION:
3756 enum TIFFReadDirEntryErr err;
3757 uint32 countpersample;
3758 uint32 countrequired;
3759 uint32 incrementpersample;
3761 countpersample=(1L<<tif->tif_dir.td_bitspersample);
3762 if ((dp->tdir_tag==TIFFTAG_TRANSFERFUNCTION)&&(dp->tdir_count==(uint64)countpersample))
3764 countrequired=countpersample;
3765 incrementpersample=0;
3769 countrequired=3*countpersample;
3770 incrementpersample=countpersample;
3772 if (dp->tdir_count!=(uint64)countrequired)
3773 err=TIFFReadDirEntryErrCount;
3775 err=TIFFReadDirEntryShortArray(tif,dp,&value);
3776 if (err!=TIFFReadDirEntryErrOk)
3778 fip = TIFFFieldWithTag(tif,dp->tdir_tag);
3779 TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",1);
3783 TIFFSetField(tif,dp->tdir_tag,value,value+incrementpersample,value+2*incrementpersample);
3788 /* BEGIN REV 4.0 COMPATIBILITY */
3789 case TIFFTAG_OSUBFILETYPE:
3793 if (TIFFReadDirEntryShort(tif,dp,&valueo)==TIFFReadDirEntryErrOk)
3797 case OFILETYPE_REDUCEDIMAGE: value=FILETYPE_REDUCEDIMAGE; break;
3798 case OFILETYPE_PAGE: value=FILETYPE_PAGE; break;
3799 default: value=0; break;
3802 TIFFSetField(tif,TIFFTAG_SUBFILETYPE,value);
3806 /* END REV 4.0 COMPATIBILITY */
3808 (void) TIFFFetchNormalTag(tif, dp, TRUE);
3814 * - If a) compression is OJPEG, and b) photometric tag is missing,
3815 * then we consistently find that photometric should be YCbCr
3816 * - If a) compression is OJPEG, and b) photometric tag says it's RGB,
3817 * then we consistently find that the buggy implementation of the
3818 * buggy compression scheme matches photometric YCbCr instead.
3819 * - If a) compression is OJPEG, and b) bitspersample tag is missing,
3820 * then we consistently find bitspersample should be 8.
3821 * - If a) compression is OJPEG, b) samplesperpixel tag is missing,
3822 * and c) photometric is RGB or YCbCr, then we consistently find
3823 * samplesperpixel should be 3
3824 * - If a) compression is OJPEG, b) samplesperpixel tag is missing,
3825 * and c) photometric is MINISWHITE or MINISBLACK, then we consistently
3826 * find samplesperpixel should be 3
3828 if (tif->tif_dir.td_compression==COMPRESSION_OJPEG)
3830 if (!TIFFFieldSet(tif,FIELD_PHOTOMETRIC))
3832 TIFFWarningExt(tif->tif_clientdata, module,
3833 "Photometric tag is missing, assuming data is YCbCr");
3834 if (!TIFFSetField(tif,TIFFTAG_PHOTOMETRIC,PHOTOMETRIC_YCBCR))
3837 else if (tif->tif_dir.td_photometric==PHOTOMETRIC_RGB)
3839 tif->tif_dir.td_photometric=PHOTOMETRIC_YCBCR;
3840 TIFFWarningExt(tif->tif_clientdata, module,
3841 "Photometric tag value assumed incorrect, "
3842 "assuming data is YCbCr instead of RGB");
3844 if (!TIFFFieldSet(tif,FIELD_BITSPERSAMPLE))
3846 TIFFWarningExt(tif->tif_clientdata,module,
3847 "BitsPerSample tag is missing, assuming 8 bits per sample");
3848 if (!TIFFSetField(tif,TIFFTAG_BITSPERSAMPLE,8))
3851 if (!TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
3853 if (tif->tif_dir.td_photometric==PHOTOMETRIC_RGB)
3855 TIFFWarningExt(tif->tif_clientdata,module,
3856 "SamplesPerPixel tag is missing, "
3857 "assuming correct SamplesPerPixel value is 3");
3858 if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,3))
3861 if (tif->tif_dir.td_photometric==PHOTOMETRIC_YCBCR)
3863 TIFFWarningExt(tif->tif_clientdata,module,
3864 "SamplesPerPixel tag is missing, "
3865 "applying correct SamplesPerPixel value of 3");
3866 if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,3))
3869 else if ((tif->tif_dir.td_photometric==PHOTOMETRIC_MINISWHITE)
3870 || (tif->tif_dir.td_photometric==PHOTOMETRIC_MINISBLACK))
3873 * SamplesPerPixel tag is missing, but is not required
3874 * by spec. Assume correct SamplesPerPixel value of 1.
3876 if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,1))
3882 * Verify Palette image has a Colormap.
3884 if (tif->tif_dir.td_photometric == PHOTOMETRIC_PALETTE &&
3885 !TIFFFieldSet(tif, FIELD_COLORMAP)) {
3886 if ( tif->tif_dir.td_bitspersample>=8 && tif->tif_dir.td_samplesperpixel==3)
3887 tif->tif_dir.td_photometric = PHOTOMETRIC_RGB;
3888 else if (tif->tif_dir.td_bitspersample>=8)
3889 tif->tif_dir.td_photometric = PHOTOMETRIC_MINISBLACK;
3891 MissingRequired(tif, "Colormap");
3897 * We do no further messing with strip/tile offsets/bytecounts in OJPEG
3900 if (tif->tif_dir.td_compression!=COMPRESSION_OJPEG)
3903 * Attempt to deal with a missing StripByteCounts tag.
3905 if (!TIFFFieldSet(tif, FIELD_STRIPBYTECOUNTS)) {
3907 * Some manufacturers violate the spec by not giving
3908 * the size of the strips. In this case, assume there
3909 * is one uncompressed strip of data.
3911 if ((tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG &&
3912 tif->tif_dir.td_nstrips > 1) ||
3913 (tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE &&
3914 tif->tif_dir.td_nstrips != (uint32)tif->tif_dir.td_samplesperpixel)) {
3915 MissingRequired(tif, "StripByteCounts");
3918 TIFFWarningExt(tif->tif_clientdata, module,
3919 "TIFF directory is missing required "
3920 "\"StripByteCounts\" field, calculating from imagelength");
3921 if (EstimateStripByteCounts(tif, dir, dircount) < 0)
3924 * Assume we have wrong StripByteCount value (in case
3925 * of single strip) in following cases:
3926 * - it is equal to zero along with StripOffset;
3927 * - it is larger than file itself (in case of uncompressed
3929 * - it is smaller than the size of the bytes per row
3930 * multiplied on the number of rows. The last case should
3931 * not be checked in the case of writing new image,
3932 * because we may do not know the exact strip size
3933 * until the whole image will be written and directory
3936 #define BYTECOUNTLOOKSBAD \
3937 ( (tif->tif_dir.td_stripbytecount[0] == 0 && tif->tif_dir.td_stripoffset[0] != 0) || \
3938 (tif->tif_dir.td_compression == COMPRESSION_NONE && \
3939 tif->tif_dir.td_stripbytecount[0] > TIFFGetFileSize(tif) - tif->tif_dir.td_stripoffset[0]) || \
3940 (tif->tif_mode == O_RDONLY && \
3941 tif->tif_dir.td_compression == COMPRESSION_NONE && \
3942 tif->tif_dir.td_stripbytecount[0] < TIFFScanlineSize64(tif) * tif->tif_dir.td_imagelength) )
3944 } else if (tif->tif_dir.td_nstrips == 1
3945 && _TIFFFillStriles(tif)
3946 && tif->tif_dir.td_stripoffset[0] != 0
3947 && BYTECOUNTLOOKSBAD) {
3949 * XXX: Plexus (and others) sometimes give a value of
3950 * zero for a tag when they don't know what the
3951 * correct value is! Try and handle the simple case
3952 * of estimating the size of a one strip image.
3954 TIFFWarningExt(tif->tif_clientdata, module,
3955 "Bogus \"StripByteCounts\" field, ignoring and calculating from imagelength");
3956 if(EstimateStripByteCounts(tif, dir, dircount) < 0)
3959 #if !defined(DEFER_STRILE_LOAD)
3960 } else if (tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG
3961 && tif->tif_dir.td_nstrips > 2
3962 && tif->tif_dir.td_compression == COMPRESSION_NONE
3963 && tif->tif_dir.td_stripbytecount[0] != tif->tif_dir.td_stripbytecount[1]
3964 && tif->tif_dir.td_stripbytecount[0] != 0
3965 && tif->tif_dir.td_stripbytecount[1] != 0 ) {
3967 * XXX: Some vendors fill StripByteCount array with
3968 * absolutely wrong values (it can be equal to
3969 * StripOffset array, for example). Catch this case
3972 * We avoid this check if deferring strile loading
3973 * as it would always force us to load the strip/tile
3976 TIFFWarningExt(tif->tif_clientdata, module,
3977 "Wrong \"StripByteCounts\" field, ignoring and calculating from imagelength");
3978 if (EstimateStripByteCounts(tif, dir, dircount) < 0)
3980 #endif /* !defined(DEFER_STRILE_LOAD) */
3988 if (!TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE))
3990 if (tif->tif_dir.td_bitspersample>=16)
3991 tif->tif_dir.td_maxsamplevalue=0xFFFF;
3993 tif->tif_dir.td_maxsamplevalue = (uint16)((1L<<tif->tif_dir.td_bitspersample)-1);
3996 * XXX: We can optimize checking for the strip bounds using the sorted
3997 * bytecounts array. See also comments for TIFFAppendToStrip()
3998 * function in tif_write.c.
4000 #if !defined(DEFER_STRILE_LOAD)
4001 if (tif->tif_dir.td_nstrips > 1) {
4004 tif->tif_dir.td_stripbytecountsorted = 1;
4005 for (strip = 1; strip < tif->tif_dir.td_nstrips; strip++) {
4006 if (tif->tif_dir.td_stripoffset[strip - 1] >
4007 tif->tif_dir.td_stripoffset[strip]) {
4008 tif->tif_dir.td_stripbytecountsorted = 0;
4013 #endif /* !defined(DEFER_STRILE_LOAD) */
4016 * An opportunity for compression mode dependent tag fixup
4018 (*tif->tif_fixuptags)(tif);
4021 * Some manufacturers make life difficult by writing
4022 * large amounts of uncompressed data as a single strip.
4023 * This is contrary to the recommendations of the spec.
4024 * The following makes an attempt at breaking such images
4025 * into strips closer to the recommended 8k bytes. A
4026 * side effect, however, is that the RowsPerStrip tag
4027 * value may be changed.
4029 if ((tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG)&&
4030 (tif->tif_dir.td_nstrips==1)&&
4031 (tif->tif_dir.td_compression==COMPRESSION_NONE)&&
4032 ((tif->tif_flags&(TIFF_STRIPCHOP|TIFF_ISTILED))==TIFF_STRIPCHOP))
4034 if ( !_TIFFFillStriles(tif) || !tif->tif_dir.td_stripbytecount )
4036 ChopUpSingleUncompressedStrip(tif);
4040 * Clear the dirty directory flag.
4042 tif->tif_flags &= ~TIFF_DIRTYDIRECT;
4043 tif->tif_flags &= ~TIFF_DIRTYSTRIP;
4046 * Reinitialize i/o since we are starting on a new directory.
4048 tif->tif_row = (uint32) -1;
4049 tif->tif_curstrip = (uint32) -1;
4050 tif->tif_col = (uint32) -1;
4051 tif->tif_curtile = (uint32) -1;
4052 tif->tif_tilesize = (tmsize_t) -1;
4054 tif->tif_scanlinesize = TIFFScanlineSize(tif);
4055 if (!tif->tif_scanlinesize) {
4056 TIFFErrorExt(tif->tif_clientdata, module,
4057 "Cannot handle zero scanline size");
4062 tif->tif_tilesize = TIFFTileSize(tif);
4063 if (!tif->tif_tilesize) {
4064 TIFFErrorExt(tif->tif_clientdata, module,
4065 "Cannot handle zero tile size");
4069 if (!TIFFStripSize(tif)) {
4070 TIFFErrorExt(tif->tif_clientdata, module,
4071 "Cannot handle zero strip size");
4083 TIFFReadDirectoryCheckOrder(TIFF* tif, TIFFDirEntry* dir, uint16 dircount)
4085 static const char module[] = "TIFFReadDirectoryCheckOrder";
4090 for (n=0, o=dir; n<dircount; n++, o++)
4094 TIFFWarningExt(tif->tif_clientdata,module,
4095 "Invalid TIFF directory; tags are not sorted in ascending order");
4102 static TIFFDirEntry*
4103 TIFFReadDirectoryFindEntry(TIFF* tif, TIFFDirEntry* dir, uint16 dircount, uint16 tagid)
4108 for (m=dir, n=0; n<dircount; m++, n++)
4110 if (m->tdir_tag==tagid)
4117 TIFFReadDirectoryFindFieldInfo(TIFF* tif, uint16 tagid, uint32* fii)
4121 mc=(int32)tif->tif_nfields;
4130 if (tif->tif_fields[mb]->field_tag==(uint32)tagid)
4132 if (tif->tif_fields[mb]->field_tag<(uint32)tagid)
4141 if (tif->tif_fields[mb-1]->field_tag!=(uint32)tagid)
4149 * Read custom directory from the arbitarry offset.
4150 * The code is very similar to TIFFReadDirectory().
4153 TIFFReadCustomDirectory(TIFF* tif, toff_t diroff,
4154 const TIFFFieldArray* infoarray)
4156 static const char module[] = "TIFFReadCustomDirectory";
4161 const TIFFField* fip;
4163 _TIFFSetupFields(tif, infoarray);
4164 dircount=TIFFFetchDirectory(tif,diroff,&dir,NULL);
4167 TIFFErrorExt(tif->tif_clientdata,module,
4168 "Failed to read custom directory at offset " TIFF_UINT64_FORMAT,diroff);
4171 TIFFFreeDirectory(tif);
4172 _TIFFmemset(&tif->tif_dir, 0, sizeof(TIFFDirectory));
4173 TIFFReadDirectoryCheckOrder(tif,dir,dircount);
4174 for (di=0, dp=dir; di<dircount; di++, dp++)
4176 TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
4177 if (fii == FAILED_FII)
4179 TIFFWarningExt(tif->tif_clientdata, module,
4180 "Unknown field with tag %d (0x%x) encountered",
4181 dp->tdir_tag, dp->tdir_tag);
4182 if (!_TIFFMergeFields(tif, _TIFFCreateAnonField(tif,
4184 (TIFFDataType) dp->tdir_type),
4186 TIFFWarningExt(tif->tif_clientdata, module,
4187 "Registering anonymous field with tag %d (0x%x) failed",
4188 dp->tdir_tag, dp->tdir_tag);
4189 dp->tdir_tag=IGNORE;
4191 TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
4192 assert( fii != FAILED_FII );
4195 if (dp->tdir_tag!=IGNORE)
4197 fip=tif->tif_fields[fii];
4198 if (fip->field_bit==FIELD_IGNORE)
4199 dp->tdir_tag=IGNORE;
4202 /* check data type */
4203 while ((fip->field_type!=TIFF_ANY)&&(fip->field_type!=dp->tdir_type))
4206 if ((fii==tif->tif_nfields)||
4207 (tif->tif_fields[fii]->field_tag!=(uint32)dp->tdir_tag))
4212 fip=tif->tif_fields[fii];
4216 TIFFWarningExt(tif->tif_clientdata, module,
4217 "Wrong data type %d for \"%s\"; tag ignored",
4218 dp->tdir_type,fip->field_name);
4219 dp->tdir_tag=IGNORE;
4223 /* check count if known in advance */
4224 if ((fip->field_readcount!=TIFF_VARIABLE)&&
4225 (fip->field_readcount!=TIFF_VARIABLE2))
4228 if (fip->field_readcount==TIFF_SPP)
4229 expected=(uint32)tif->tif_dir.td_samplesperpixel;
4231 expected=(uint32)fip->field_readcount;
4232 if (!CheckDirCount(tif,dp,expected))
4233 dp->tdir_tag=IGNORE;
4237 switch (dp->tdir_tag)
4241 case EXIFTAG_SUBJECTDISTANCE:
4242 (void) TIFFFetchSubjectDistance(tif,dp);
4245 (void) TIFFFetchNormalTag(tif, dp, TRUE);
4256 * EXIF is important special case of custom IFD, so we have a special
4257 * function to read it.
4260 TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff)
4262 const TIFFFieldArray* exifFieldArray;
4263 exifFieldArray = _TIFFGetExifFields();
4264 return TIFFReadCustomDirectory(tif, diroff, exifFieldArray);
4268 EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount)
4270 static const char module[] = "EstimateStripByteCounts";
4273 TIFFDirectory *td = &tif->tif_dir;
4276 _TIFFFillStriles( tif );
4278 if (td->td_stripbytecount)
4279 _TIFFfree(td->td_stripbytecount);
4280 td->td_stripbytecount = (uint64*)
4281 _TIFFCheckMalloc(tif, td->td_nstrips, sizeof (uint64),
4282 "for \"StripByteCounts\" array");
4283 if( td->td_stripbytecount == NULL )
4286 if (td->td_compression != COMPRESSION_NONE) {
4290 filesize = TIFFGetFileSize(tif);
4291 if (!(tif->tif_flags&TIFF_BIGTIFF))
4292 space=sizeof(TIFFHeaderClassic)+2+dircount*12+4;
4294 space=sizeof(TIFFHeaderBig)+8+dircount*20+8;
4295 /* calculate amount of space used by indirect values */
4296 for (dp = dir, n = dircount; n > 0; n--, dp++)
4298 uint32 typewidth = TIFFDataWidth((TIFFDataType) dp->tdir_type);
4300 typewidth = TIFFDataWidth((TIFFDataType) dp->tdir_type);
4301 if (typewidth == 0) {
4302 TIFFErrorExt(tif->tif_clientdata, module,
4303 "Cannot determine size of unknown tag type %d",
4307 datasize=(uint64)typewidth*dp->tdir_count;
4308 if (!(tif->tif_flags&TIFF_BIGTIFF))
4320 space = filesize - space;
4321 if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
4322 space /= td->td_samplesperpixel;
4323 for (strip = 0; strip < td->td_nstrips; strip++)
4324 td->td_stripbytecount[strip] = space;
4326 * This gross hack handles the case were the offset to
4327 * the last strip is past the place where we think the strip
4328 * should begin. Since a strip of data must be contiguous,
4329 * it's safe to assume that we've overestimated the amount
4330 * of data in the strip and trim this number back accordingly.
4333 if (td->td_stripoffset[strip]+td->td_stripbytecount[strip] > filesize)
4334 td->td_stripbytecount[strip] = filesize - td->td_stripoffset[strip];
4335 } else if (isTiled(tif)) {
4336 uint64 bytespertile = TIFFTileSize64(tif);
4338 for (strip = 0; strip < td->td_nstrips; strip++)
4339 td->td_stripbytecount[strip] = bytespertile;
4341 uint64 rowbytes = TIFFScanlineSize64(tif);
4342 uint32 rowsperstrip = td->td_imagelength/td->td_stripsperimage;
4343 for (strip = 0; strip < td->td_nstrips; strip++)
4344 td->td_stripbytecount[strip] = rowbytes * rowsperstrip;
4346 TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
4347 if (!TIFFFieldSet(tif, FIELD_ROWSPERSTRIP))
4348 td->td_rowsperstrip = td->td_imagelength;
4353 MissingRequired(TIFF* tif, const char* tagname)
4355 static const char module[] = "MissingRequired";
4357 TIFFErrorExt(tif->tif_clientdata, module,
4358 "TIFF directory is missing required \"%s\" field",
4363 * Check the directory offset against the list of already seen directory
4364 * offsets. This is a trick to prevent IFD looping. The one can create TIFF
4365 * file with looped directory pointers. We will maintain a list of already
4366 * seen directories and check every IFD offset against that list.
4369 TIFFCheckDirOffset(TIFF* tif, uint64 diroff)
4373 if (diroff == 0) /* no more directories */
4376 for (n = 0; n < tif->tif_dirnumber && tif->tif_dirlist; n++) {
4377 if (tif->tif_dirlist[n] == diroff)
4381 tif->tif_dirnumber++;
4383 if (tif->tif_dirnumber > tif->tif_dirlistsize) {
4384 uint64* new_dirlist;
4387 * XXX: Reduce memory allocation granularity of the dirlist
4390 new_dirlist = (uint64*)_TIFFCheckRealloc(tif, tif->tif_dirlist,
4391 tif->tif_dirnumber, 2 * sizeof(uint64), "for IFD list");
4394 tif->tif_dirlistsize = 2 * tif->tif_dirnumber;
4395 tif->tif_dirlist = new_dirlist;
4398 tif->tif_dirlist[tif->tif_dirnumber - 1] = diroff;
4404 * Check the count field of a directory entry against a known value. The
4405 * caller is expected to skip/ignore the tag if there is a mismatch.
4408 CheckDirCount(TIFF* tif, TIFFDirEntry* dir, uint32 count)
4410 if ((uint64)count > dir->tdir_count) {
4411 const TIFFField* fip = TIFFFieldWithTag(tif, dir->tdir_tag);
4412 TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
4413 "incorrect count for field \"%s\" (" TIFF_UINT64_FORMAT ", expecting %u); tag ignored",
4414 fip ? fip->field_name : "unknown tagname",
4415 dir->tdir_count, count);
4417 } else if ((uint64)count < dir->tdir_count) {
4418 const TIFFField* fip = TIFFFieldWithTag(tif, dir->tdir_tag);
4419 TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
4420 "incorrect count for field \"%s\" (" TIFF_UINT64_FORMAT ", expecting %u); tag trimmed",
4421 fip ? fip->field_name : "unknown tagname",
4422 dir->tdir_count, count);
4423 dir->tdir_count = count;
4430 * Read IFD structure from the specified offset. If the pointer to
4431 * nextdiroff variable has been specified, read it too. Function returns a
4432 * number of fields in the directory or 0 if failed.
4435 TIFFFetchDirectory(TIFF* tif, uint64 diroff, TIFFDirEntry** pdir,
4438 static const char module[] = "TIFFFetchDirectory";
4450 tif->tif_diroff = diroff;
4453 if (!isMapped(tif)) {
4454 if (!SeekOK(tif, tif->tif_diroff)) {
4455 TIFFErrorExt(tif->tif_clientdata, module,
4456 "%s: Seek error accessing TIFF directory",
4460 if (!(tif->tif_flags&TIFF_BIGTIFF))
4462 if (!ReadOK(tif, &dircount16, sizeof (uint16))) {
4463 TIFFErrorExt(tif->tif_clientdata, module,
4464 "%s: Can not read TIFF directory count",
4468 if (tif->tif_flags & TIFF_SWAB)
4469 TIFFSwabShort(&dircount16);
4470 if (dircount16>4096)
4472 TIFFErrorExt(tif->tif_clientdata, module,
4473 "Sanity check on directory count failed, this is probably not a valid IFD offset");
4479 if (!ReadOK(tif, &dircount64, sizeof (uint64))) {
4480 TIFFErrorExt(tif->tif_clientdata, module,
4481 "%s: Can not read TIFF directory count",
4485 if (tif->tif_flags & TIFF_SWAB)
4486 TIFFSwabLong8(&dircount64);
4487 if (dircount64>4096)
4489 TIFFErrorExt(tif->tif_clientdata, module,
4490 "Sanity check on directory count failed, this is probably not a valid IFD offset");
4493 dircount16 = (uint16)dircount64;
4496 origdir = _TIFFCheckMalloc(tif, dircount16,
4497 dirsize, "to read TIFF directory");
4498 if (origdir == NULL)
4500 if (!ReadOK(tif, origdir, (tmsize_t)(dircount16*dirsize))) {
4501 TIFFErrorExt(tif->tif_clientdata, module,
4502 "%.100s: Can not read TIFF directory",
4508 * Read offset to next directory for sequential scans if
4513 if (!(tif->tif_flags&TIFF_BIGTIFF))
4515 uint32 nextdiroff32;
4516 if (!ReadOK(tif, &nextdiroff32, sizeof(uint32)))
4518 if (tif->tif_flags&TIFF_SWAB)
4519 TIFFSwabLong(&nextdiroff32);
4520 *nextdiroff=nextdiroff32;
4522 if (!ReadOK(tif, nextdiroff, sizeof(uint64)))
4524 if (tif->tif_flags&TIFF_SWAB)
4525 TIFFSwabLong8(nextdiroff);
4530 tmsize_t off = (tmsize_t) tif->tif_diroff;
4531 if ((uint64)off!=tif->tif_diroff)
4533 TIFFErrorExt(tif->tif_clientdata,module,"Can not read TIFF directory count");
4538 * Check for integer overflow when validating the dir_off,
4539 * otherwise a very high offset may cause an OOB read and
4540 * crash the client. Make two comparisons instead of
4542 * off + sizeof(uint16) > tif->tif_size
4544 * to avoid overflow.
4546 if (!(tif->tif_flags&TIFF_BIGTIFF))
4548 m=off+sizeof(uint16);
4549 if ((m<off)||(m<(tmsize_t)sizeof(uint16))||(m>tif->tif_size)) {
4550 TIFFErrorExt(tif->tif_clientdata, module,
4551 "Can not read TIFF directory count");
4554 _TIFFmemcpy(&dircount16, tif->tif_base + off,
4557 off += sizeof (uint16);
4558 if (tif->tif_flags & TIFF_SWAB)
4559 TIFFSwabShort(&dircount16);
4560 if (dircount16>4096)
4562 TIFFErrorExt(tif->tif_clientdata, module,
4563 "Sanity check on directory count failed, this is probably not a valid IFD offset");
4572 m=off+sizeof(uint64);
4573 if ((m<off)||(m<(tmsize_t)sizeof(uint64))||(m>tif->tif_size)) {
4574 TIFFErrorExt(tif->tif_clientdata, module,
4575 "Can not read TIFF directory count");
4578 _TIFFmemcpy(&dircount64, tif->tif_base + off,
4581 off += sizeof (uint64);
4582 if (tif->tif_flags & TIFF_SWAB)
4583 TIFFSwabLong8(&dircount64);
4584 if (dircount64>4096)
4586 TIFFErrorExt(tif->tif_clientdata, module,
4587 "Sanity check on directory count failed, this is probably not a valid IFD offset");
4590 dircount16 = (uint16)dircount64;
4593 if (dircount16 == 0 )
4595 TIFFErrorExt(tif->tif_clientdata, module,
4596 "Sanity check on directory count failed, zero tag directories not supported");
4599 origdir = _TIFFCheckMalloc(tif, dircount16,
4601 "to read TIFF directory");
4602 if (origdir == NULL)
4604 m=off+dircount16*dirsize;
4605 if ((m<off)||(m<(tmsize_t)(dircount16*dirsize))||(m>tif->tif_size)) {
4606 TIFFErrorExt(tif->tif_clientdata, module,
4607 "Can not read TIFF directory");
4611 _TIFFmemcpy(origdir, tif->tif_base + off,
4612 dircount16 * dirsize);
4615 off += dircount16 * dirsize;
4616 if (!(tif->tif_flags&TIFF_BIGTIFF))
4618 uint32 nextdiroff32;
4619 m=off+sizeof(uint32);
4620 if ((m<off)||(m<(tmsize_t)sizeof(uint32))||(m>tif->tif_size))
4623 _TIFFmemcpy(&nextdiroff32, tif->tif_base + off,
4625 if (tif->tif_flags&TIFF_SWAB)
4626 TIFFSwabLong(&nextdiroff32);
4627 *nextdiroff = nextdiroff32;
4631 m=off+sizeof(uint64);
4632 if ((m<off)||(m<(tmsize_t)sizeof(uint64))||(m>tif->tif_size))
4635 _TIFFmemcpy(nextdiroff, tif->tif_base + off,
4637 if (tif->tif_flags&TIFF_SWAB)
4638 TIFFSwabLong8(nextdiroff);
4642 dir = (TIFFDirEntry*)_TIFFCheckMalloc(tif, dircount16,
4643 sizeof(TIFFDirEntry),
4644 "to read TIFF directory");
4652 for (n=0; n<dircount16; n++)
4654 if (tif->tif_flags&TIFF_SWAB)
4655 TIFFSwabShort((uint16*)ma);
4656 mb->tdir_tag=*(uint16*)ma;
4658 if (tif->tif_flags&TIFF_SWAB)
4659 TIFFSwabShort((uint16*)ma);
4660 mb->tdir_type=*(uint16*)ma;
4662 if (!(tif->tif_flags&TIFF_BIGTIFF))
4664 if (tif->tif_flags&TIFF_SWAB)
4665 TIFFSwabLong((uint32*)ma);
4666 mb->tdir_count=(uint64)(*(uint32*)ma);
4668 *(uint32*)(&mb->tdir_offset)=*(uint32*)ma;
4673 if (tif->tif_flags&TIFF_SWAB)
4674 TIFFSwabLong8((uint64*)ma);
4675 mb->tdir_count=TIFFReadUInt64(ma);
4677 mb->tdir_offset.toff_long8=TIFFReadUInt64(ma);
4688 * Fetch a tag that is not handled by special case code.
4691 TIFFFetchNormalTag(TIFF* tif, TIFFDirEntry* dp, int recover)
4693 static const char module[] = "TIFFFetchNormalTag";
4694 enum TIFFReadDirEntryErr err;
4696 const TIFFField* fip = NULL;
4697 TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
4698 if( fii == FAILED_FII )
4700 TIFFErrorExt(tif->tif_clientdata, "TIFFFetchNormalTag",
4701 "No definition found for tag %d",
4705 fip=tif->tif_fields[fii];
4706 assert(fip->set_field_type!=TIFF_SETGET_OTHER); /* if so, we shouldn't arrive here but deal with this in specialized code */
4707 assert(fip->set_field_type!=TIFF_SETGET_INT); /* if so, we shouldn't arrive here as this is only the case for pseudo-tags */
4708 err=TIFFReadDirEntryErrOk;
4709 switch (fip->set_field_type)
4711 case TIFF_SETGET_UNDEFINED:
4713 case TIFF_SETGET_ASCII:
4716 assert(fip->field_passcount==0);
4717 err=TIFFReadDirEntryByteArray(tif,dp,&data);
4718 if (err==TIFFReadDirEntryErrOk)
4725 while (mb<(uint32)dp->tdir_count)
4732 if (mb+1<(uint32)dp->tdir_count)
4733 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);
4734 else if (mb+1>(uint32)dp->tdir_count)
4737 TIFFWarningExt(tif->tif_clientdata,module,"ASCII value for tag \"%s\" does not end in null byte",fip->field_name);
4738 if ((uint32)dp->tdir_count+1!=dp->tdir_count+1)
4741 o=_TIFFmalloc((uint32)dp->tdir_count+1);
4748 _TIFFmemcpy(o,data,(uint32)dp->tdir_count);
4749 o[(uint32)dp->tdir_count]=0;
4754 n=TIFFSetField(tif,dp->tdir_tag,data);
4762 case TIFF_SETGET_UINT8:
4765 assert(fip->field_readcount==1);
4766 assert(fip->field_passcount==0);
4767 err=TIFFReadDirEntryByte(tif,dp,&data);
4768 if (err==TIFFReadDirEntryErrOk)
4770 if (!TIFFSetField(tif,dp->tdir_tag,data))
4775 case TIFF_SETGET_UINT16:
4778 assert(fip->field_readcount==1);
4779 assert(fip->field_passcount==0);
4780 err=TIFFReadDirEntryShort(tif,dp,&data);
4781 if (err==TIFFReadDirEntryErrOk)
4783 if (!TIFFSetField(tif,dp->tdir_tag,data))
4788 case TIFF_SETGET_UINT32:
4791 assert(fip->field_readcount==1);
4792 assert(fip->field_passcount==0);
4793 err=TIFFReadDirEntryLong(tif,dp,&data);
4794 if (err==TIFFReadDirEntryErrOk)
4796 if (!TIFFSetField(tif,dp->tdir_tag,data))
4801 case TIFF_SETGET_UINT64:
4804 assert(fip->field_readcount==1);
4805 assert(fip->field_passcount==0);
4806 err=TIFFReadDirEntryLong8(tif,dp,&data);
4807 if (err==TIFFReadDirEntryErrOk)
4809 if (!TIFFSetField(tif,dp->tdir_tag,data))
4814 case TIFF_SETGET_FLOAT:
4817 assert(fip->field_readcount==1);
4818 assert(fip->field_passcount==0);
4819 err=TIFFReadDirEntryFloat(tif,dp,&data);
4820 if (err==TIFFReadDirEntryErrOk)
4822 if (!TIFFSetField(tif,dp->tdir_tag,data))
4827 case TIFF_SETGET_DOUBLE:
4830 assert(fip->field_readcount==1);
4831 assert(fip->field_passcount==0);
4832 err=TIFFReadDirEntryDouble(tif,dp,&data);
4833 if (err==TIFFReadDirEntryErrOk)
4835 if (!TIFFSetField(tif,dp->tdir_tag,data))
4840 case TIFF_SETGET_IFD8:
4843 assert(fip->field_readcount==1);
4844 assert(fip->field_passcount==0);
4845 err=TIFFReadDirEntryIfd8(tif,dp,&data);
4846 if (err==TIFFReadDirEntryErrOk)
4848 if (!TIFFSetField(tif,dp->tdir_tag,data))
4853 case TIFF_SETGET_UINT16_PAIR:
4856 assert(fip->field_readcount==2);
4857 assert(fip->field_passcount==0);
4858 if (dp->tdir_count!=2)
4860 err=TIFFReadDirEntryShortArray(tif,dp,&data);
4861 if (err==TIFFReadDirEntryErrOk)
4864 m=TIFFSetField(tif,dp->tdir_tag,data[0],data[1]);
4871 case TIFF_SETGET_C0_UINT8:
4874 assert(fip->field_readcount>=1);
4875 assert(fip->field_passcount==0);
4876 if (dp->tdir_count!=(uint64)fip->field_readcount)
4880 err=TIFFReadDirEntryByteArray(tif,dp,&data);
4881 if (err==TIFFReadDirEntryErrOk)
4884 m=TIFFSetField(tif,dp->tdir_tag,data);
4893 case TIFF_SETGET_C0_UINT16:
4896 assert(fip->field_readcount>=1);
4897 assert(fip->field_passcount==0);
4898 if (dp->tdir_count!=(uint64)fip->field_readcount)
4902 err=TIFFReadDirEntryShortArray(tif,dp,&data);
4903 if (err==TIFFReadDirEntryErrOk)
4906 m=TIFFSetField(tif,dp->tdir_tag,data);
4915 case TIFF_SETGET_C0_UINT32:
4918 assert(fip->field_readcount>=1);
4919 assert(fip->field_passcount==0);
4920 if (dp->tdir_count!=(uint64)fip->field_readcount)
4924 err=TIFFReadDirEntryLongArray(tif,dp,&data);
4925 if (err==TIFFReadDirEntryErrOk)
4928 m=TIFFSetField(tif,dp->tdir_tag,data);
4937 case TIFF_SETGET_C0_FLOAT:
4940 assert(fip->field_readcount>=1);
4941 assert(fip->field_passcount==0);
4942 if (dp->tdir_count!=(uint64)fip->field_readcount)
4946 err=TIFFReadDirEntryFloatArray(tif,dp,&data);
4947 if (err==TIFFReadDirEntryErrOk)
4950 m=TIFFSetField(tif,dp->tdir_tag,data);
4959 case TIFF_SETGET_C16_ASCII:
4962 assert(fip->field_readcount==TIFF_VARIABLE);
4963 assert(fip->field_passcount==1);
4964 if (dp->tdir_count>0xFFFF)
4965 err=TIFFReadDirEntryErrCount;
4968 err=TIFFReadDirEntryByteArray(tif,dp,&data);
4969 if (err==TIFFReadDirEntryErrOk)
4972 m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
4981 case TIFF_SETGET_C16_UINT8:
4984 assert(fip->field_readcount==TIFF_VARIABLE);
4985 assert(fip->field_passcount==1);
4986 if (dp->tdir_count>0xFFFF)
4987 err=TIFFReadDirEntryErrCount;
4990 err=TIFFReadDirEntryByteArray(tif,dp,&data);
4991 if (err==TIFFReadDirEntryErrOk)
4994 m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5003 case TIFF_SETGET_C16_UINT16:
5006 assert(fip->field_readcount==TIFF_VARIABLE);
5007 assert(fip->field_passcount==1);
5008 if (dp->tdir_count>0xFFFF)
5009 err=TIFFReadDirEntryErrCount;
5012 err=TIFFReadDirEntryShortArray(tif,dp,&data);
5013 if (err==TIFFReadDirEntryErrOk)
5016 m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5025 case TIFF_SETGET_C16_UINT32:
5028 assert(fip->field_readcount==TIFF_VARIABLE);
5029 assert(fip->field_passcount==1);
5030 if (dp->tdir_count>0xFFFF)
5031 err=TIFFReadDirEntryErrCount;
5034 err=TIFFReadDirEntryLongArray(tif,dp,&data);
5035 if (err==TIFFReadDirEntryErrOk)
5038 m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5047 case TIFF_SETGET_C16_UINT64:
5050 assert(fip->field_readcount==TIFF_VARIABLE);
5051 assert(fip->field_passcount==1);
5052 if (dp->tdir_count>0xFFFF)
5053 err=TIFFReadDirEntryErrCount;
5056 err=TIFFReadDirEntryLong8Array(tif,dp,&data);
5057 if (err==TIFFReadDirEntryErrOk)
5060 m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5069 case TIFF_SETGET_C16_FLOAT:
5072 assert(fip->field_readcount==TIFF_VARIABLE);
5073 assert(fip->field_passcount==1);
5074 if (dp->tdir_count>0xFFFF)
5075 err=TIFFReadDirEntryErrCount;
5078 err=TIFFReadDirEntryFloatArray(tif,dp,&data);
5079 if (err==TIFFReadDirEntryErrOk)
5082 m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5091 case TIFF_SETGET_C16_DOUBLE:
5094 assert(fip->field_readcount==TIFF_VARIABLE);
5095 assert(fip->field_passcount==1);
5096 if (dp->tdir_count>0xFFFF)
5097 err=TIFFReadDirEntryErrCount;
5100 err=TIFFReadDirEntryDoubleArray(tif,dp,&data);
5101 if (err==TIFFReadDirEntryErrOk)
5104 m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5113 case TIFF_SETGET_C16_IFD8:
5116 assert(fip->field_readcount==TIFF_VARIABLE);
5117 assert(fip->field_passcount==1);
5118 if (dp->tdir_count>0xFFFF)
5119 err=TIFFReadDirEntryErrCount;
5122 err=TIFFReadDirEntryIfd8Array(tif,dp,&data);
5123 if (err==TIFFReadDirEntryErrOk)
5126 m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5135 case TIFF_SETGET_C32_ASCII:
5138 assert(fip->field_readcount==TIFF_VARIABLE2);
5139 assert(fip->field_passcount==1);
5140 err=TIFFReadDirEntryByteArray(tif,dp,&data);
5141 if (err==TIFFReadDirEntryErrOk)
5144 m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5152 case TIFF_SETGET_C32_UINT8:
5155 assert(fip->field_readcount==TIFF_VARIABLE2);
5156 assert(fip->field_passcount==1);
5157 err=TIFFReadDirEntryByteArray(tif,dp,&data);
5158 if (err==TIFFReadDirEntryErrOk)
5161 m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5169 case TIFF_SETGET_C32_SINT8:
5172 assert(fip->field_readcount==TIFF_VARIABLE2);
5173 assert(fip->field_passcount==1);
5174 err=TIFFReadDirEntrySbyteArray(tif,dp,&data);
5175 if (err==TIFFReadDirEntryErrOk)
5178 m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5186 case TIFF_SETGET_C32_UINT16:
5189 assert(fip->field_readcount==TIFF_VARIABLE2);
5190 assert(fip->field_passcount==1);
5191 err=TIFFReadDirEntryShortArray(tif,dp,&data);
5192 if (err==TIFFReadDirEntryErrOk)
5195 m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5203 case TIFF_SETGET_C32_SINT16:
5206 assert(fip->field_readcount==TIFF_VARIABLE2);
5207 assert(fip->field_passcount==1);
5208 err=TIFFReadDirEntrySshortArray(tif,dp,&data);
5209 if (err==TIFFReadDirEntryErrOk)
5212 m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5220 case TIFF_SETGET_C32_UINT32:
5223 assert(fip->field_readcount==TIFF_VARIABLE2);
5224 assert(fip->field_passcount==1);
5225 err=TIFFReadDirEntryLongArray(tif,dp,&data);
5226 if (err==TIFFReadDirEntryErrOk)
5229 m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5237 case TIFF_SETGET_C32_SINT32:
5240 assert(fip->field_readcount==TIFF_VARIABLE2);
5241 assert(fip->field_passcount==1);
5242 err=TIFFReadDirEntrySlongArray(tif,dp,&data);
5243 if (err==TIFFReadDirEntryErrOk)
5246 m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5254 case TIFF_SETGET_C32_UINT64:
5257 assert(fip->field_readcount==TIFF_VARIABLE2);
5258 assert(fip->field_passcount==1);
5259 err=TIFFReadDirEntryLong8Array(tif,dp,&data);
5260 if (err==TIFFReadDirEntryErrOk)
5263 m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5271 case TIFF_SETGET_C32_SINT64:
5274 assert(fip->field_readcount==TIFF_VARIABLE2);
5275 assert(fip->field_passcount==1);
5276 err=TIFFReadDirEntrySlong8Array(tif,dp,&data);
5277 if (err==TIFFReadDirEntryErrOk)
5280 m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5288 case TIFF_SETGET_C32_FLOAT:
5291 assert(fip->field_readcount==TIFF_VARIABLE2);
5292 assert(fip->field_passcount==1);
5293 err=TIFFReadDirEntryFloatArray(tif,dp,&data);
5294 if (err==TIFFReadDirEntryErrOk)
5297 m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5305 case TIFF_SETGET_C32_DOUBLE:
5308 assert(fip->field_readcount==TIFF_VARIABLE2);
5309 assert(fip->field_passcount==1);
5310 err=TIFFReadDirEntryDoubleArray(tif,dp,&data);
5311 if (err==TIFFReadDirEntryErrOk)
5314 m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5322 case TIFF_SETGET_C32_IFD8:
5325 assert(fip->field_readcount==TIFF_VARIABLE2);
5326 assert(fip->field_passcount==1);
5327 err=TIFFReadDirEntryIfd8Array(tif,dp,&data);
5328 if (err==TIFFReadDirEntryErrOk)
5331 m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5340 assert(0); /* we should never get here */
5343 if (err!=TIFFReadDirEntryErrOk)
5345 TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",recover);
5352 * Fetch a set of offsets or lengths.
5353 * While this routine says "strips", in fact it's also used for tiles.
5356 TIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, uint32 nstrips, uint64** lpp)
5358 static const char module[] = "TIFFFetchStripThing";
5359 enum TIFFReadDirEntryErr err;
5361 err=TIFFReadDirEntryLong8Array(tif,dir,&data);
5362 if (err!=TIFFReadDirEntryErrOk)
5364 const TIFFField* fip = TIFFFieldWithTag(tif,dir->tdir_tag);
5365 TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0);
5368 if (dir->tdir_count!=(uint64)nstrips)
5370 uint64* resizeddata;
5371 resizeddata=(uint64*)_TIFFCheckMalloc(tif,nstrips,sizeof(uint64),"for strip array");
5372 if (resizeddata==0) {
5376 if (dir->tdir_count<(uint64)nstrips)
5378 _TIFFmemcpy(resizeddata,data,(uint32)dir->tdir_count*sizeof(uint64));
5379 _TIFFmemset(resizeddata+(uint32)dir->tdir_count,0,(nstrips-(uint32)dir->tdir_count)*sizeof(uint64));
5382 _TIFFmemcpy(resizeddata,data,nstrips*sizeof(uint64));
5391 * Fetch and set the SubjectDistance EXIF tag.
5394 TIFFFetchSubjectDistance(TIFF* tif, TIFFDirEntry* dir)
5396 static const char module[] = "TIFFFetchSubjectDistance";
5397 enum TIFFReadDirEntryErr err;
5400 assert(sizeof(double)==8);
5401 assert(sizeof(uint64)==8);
5402 assert(sizeof(uint32)==4);
5403 if (dir->tdir_count!=1)
5404 err=TIFFReadDirEntryErrCount;
5405 else if (dir->tdir_type!=TIFF_RATIONAL)
5406 err=TIFFReadDirEntryErrType;
5409 if (!(tif->tif_flags&TIFF_BIGTIFF))
5412 offset=*(uint32*)(&dir->tdir_offset);
5413 if (tif->tif_flags&TIFF_SWAB)
5414 TIFFSwabLong(&offset);
5415 err=TIFFReadDirEntryData(tif,offset,8,m.i);
5419 m.l=dir->tdir_offset.toff_long8;
5420 err=TIFFReadDirEntryErrOk;
5423 if (err==TIFFReadDirEntryErrOk)
5426 if (tif->tif_flags&TIFF_SWAB)
5427 TIFFSwabArrayOfLong(m.i,2);
5430 else if (m.i[0]==0xFFFFFFFF)
5432 * XXX: Numerator 0xFFFFFFFF means that we have infinite
5433 * distance. Indicate that with a negative floating point
5434 * SubjectDistance value.
5438 n=(double)m.i[0]/(double)m.i[1];
5439 return(TIFFSetField(tif,dir->tdir_tag,n));
5443 TIFFReadDirEntryOutputErr(tif,err,module,"SubjectDistance",TRUE);
5449 * Replace a single strip (tile) of uncompressed data by multiple strips
5450 * (tiles), each approximately STRIP_SIZE_DEFAULT bytes. This is useful for
5451 * dealing with large images or for dealing with machines with a limited
5455 ChopUpSingleUncompressedStrip(TIFF* tif)
5457 register TIFFDirectory *td = &tif->tif_dir;
5461 uint64 rowblockbytes;
5466 uint32 rowsperstrip;
5470 bytecount = td->td_stripbytecount[0];
5471 offset = td->td_stripoffset[0];
5472 assert(td->td_planarconfig == PLANARCONFIG_CONTIG);
5473 if ((td->td_photometric == PHOTOMETRIC_YCBCR)&&
5474 (!isUpSampled(tif)))
5475 rowblock = td->td_ycbcrsubsampling[1];
5478 rowblockbytes = TIFFVTileSize64(tif, rowblock);
5480 * Make the rows hold at least one scanline, but fill specified amount
5481 * of data if possible.
5483 if (rowblockbytes > STRIP_SIZE_DEFAULT) {
5484 stripbytes = rowblockbytes;
5485 rowsperstrip = rowblock;
5486 } else if (rowblockbytes > 0 ) {
5487 uint32 rowblocksperstrip;
5488 rowblocksperstrip = (uint32) (STRIP_SIZE_DEFAULT / rowblockbytes);
5489 rowsperstrip = rowblocksperstrip * rowblock;
5490 stripbytes = rowblocksperstrip * rowblockbytes;
5496 * never increase the number of strips in an image
5498 if (rowsperstrip >= td->td_rowsperstrip)
5500 nstrips64 = TIFFhowmany_64(bytecount, stripbytes);
5501 if ((nstrips64==0)||(nstrips64>0xFFFFFFFF)) /* something is wonky, do nothing. */
5503 nstrips32 = (uint32)nstrips64;
5505 newcounts = (uint64*) _TIFFCheckMalloc(tif, nstrips32, sizeof (uint64),
5506 "for chopped \"StripByteCounts\" array");
5507 newoffsets = (uint64*) _TIFFCheckMalloc(tif, nstrips32, sizeof (uint64),
5508 "for chopped \"StripOffsets\" array");
5509 if (newcounts == NULL || newoffsets == NULL) {
5511 * Unable to allocate new strip information, give up and use
5512 * the original one strip information.
5514 if (newcounts != NULL)
5515 _TIFFfree(newcounts);
5516 if (newoffsets != NULL)
5517 _TIFFfree(newoffsets);
5521 * Fill the strip information arrays with new bytecounts and offsets
5522 * that reflect the broken-up format.
5524 for (strip = 0; strip < nstrips32; strip++) {
5525 if (stripbytes > bytecount)
5526 stripbytes = bytecount;
5527 newcounts[strip] = stripbytes;
5528 newoffsets[strip] = offset;
5529 offset += stripbytes;
5530 bytecount -= stripbytes;
5533 * Replace old single strip info with multi-strip info.
5535 td->td_stripsperimage = td->td_nstrips = nstrips32;
5536 TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
5538 _TIFFfree(td->td_stripbytecount);
5539 _TIFFfree(td->td_stripoffset);
5540 td->td_stripbytecount = newcounts;
5541 td->td_stripoffset = newoffsets;
5542 td->td_stripbytecountsorted = 1;
5545 int _TIFFFillStriles( TIFF *tif )
5547 #if defined(DEFER_STRILE_LOAD)
5548 register TIFFDirectory *td = &tif->tif_dir;
5549 int return_value = 1;
5551 if( td->td_stripoffset != NULL )
5554 if( td->td_stripoffset_entry.tdir_count == 0 )
5557 if (!TIFFFetchStripThing(tif,&(td->td_stripoffset_entry),
5558 td->td_nstrips,&td->td_stripoffset))
5563 if (!TIFFFetchStripThing(tif,&(td->td_stripbytecount_entry),
5564 td->td_nstrips,&td->td_stripbytecount))
5569 _TIFFmemset( &(td->td_stripoffset_entry), 0, sizeof(TIFFDirEntry));
5570 _TIFFmemset( &(td->td_stripbytecount_entry), 0, sizeof(TIFFDirEntry));
5572 if (tif->tif_dir.td_nstrips > 1 && return_value == 1 ) {
5575 tif->tif_dir.td_stripbytecountsorted = 1;
5576 for (strip = 1; strip < tif->tif_dir.td_nstrips; strip++) {
5577 if (tif->tif_dir.td_stripoffset[strip - 1] >
5578 tif->tif_dir.td_stripoffset[strip]) {
5579 tif->tif_dir.td_stripbytecountsorted = 0;
5585 return return_value;
5586 #else /* !defined(DEFER_STRILE_LOAD) */
5593 /* vim: set ts=8 sts=8 sw=8 noet: */