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