1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* $Id: tif_dirread.c,v 1.174 2012-02-01 02:24:47 fwarmerdam Exp $ */
2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Copyright (c) 1988-1997 Sam Leffler
5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Copyright (c) 1991-1997 Silicon Graphics, Inc.
6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Permission to use, copy, modify, distribute, and sell this software and
8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * its documentation for any purpose is hereby granted without fee, provided
9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * that (i) the above copyright notices and this permission notice appear in
10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * all copies of the software and related documentation, and (ii) the names of
11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Sam Leffler and Silicon Graphics may not be used in any advertising or
12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * publicity relating to the software without the specific, prior written
13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * permission of Sam Leffler and Silicon Graphics.
14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * OF THIS SOFTWARE.
25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * TIFF Library.
29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Directory Read Support Routines.
31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Suggested pending improvements:
34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * - add a field 'ignore' to the TIFFDirEntry structure, to flag status,
35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *   eliminating current use of the IGNORE value, and therefore eliminating
36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *   current irrational behaviour on tags with tag id code 0
37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * - add a field 'field_info' to the TIFFDirEntry structure, and set that with
38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *   the pointer to the appropriate TIFFField structure early on in
39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *   TIFFReadDirectory, so as to eliminate current possibly repetitive lookup.
40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "tiffiop.h"
43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define IGNORE 0          /* tag placeholder used below */
45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define FAILED_FII    ((uint32) -1)
46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_IEEEFP
48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# define TIFFCvtIEEEFloatToNative(tif, n, fp)
49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# define TIFFCvtIEEEDoubleToNative(tif, n, dp)
50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerextern void TIFFCvtIEEEFloatToNative(TIFF*, uint32, float*);
52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerextern void TIFFCvtIEEEDoubleToNative(TIFF*, uint32, double*);
53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerenum TIFFReadDirEntryErr {
56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFReadDirEntryErrOk = 0,
57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFReadDirEntryErrCount = 1,
58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFReadDirEntryErrType = 2,
59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFReadDirEntryErrIo = 3,
60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFReadDirEntryErrRange = 4,
61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFReadDirEntryErrPsdif = 5,
62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFReadDirEntryErrSizesan = 6,
63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFReadDirEntryErrAlloc = 7,
64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value);
67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value);
68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value);
69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value);
70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryFloat(TIFF* tif, TIFFDirEntry* direntry, float* value);
71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryDouble(TIFF* tif, TIFFDirEntry* direntry, double* value);
72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8(TIFF* tif, TIFFDirEntry* direntry, uint64* value);
73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryArray(TIFF* tif, TIFFDirEntry* direntry, uint32* count, uint32 desttypesize, void** value);
75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryByteArray(TIFF* tif, TIFFDirEntry* direntry, uint8** value);
76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntrySbyteArray(TIFF* tif, TIFFDirEntry* direntry, int8** value);
77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryShortArray(TIFF* tif, TIFFDirEntry* direntry, uint16** value);
78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntrySshortArray(TIFF* tif, TIFFDirEntry* direntry, int16** value);
79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryLongArray(TIFF* tif, TIFFDirEntry* direntry, uint32** value);
80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntrySlongArray(TIFF* tif, TIFFDirEntry* direntry, int32** value);
81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryLong8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value);
82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntrySlong8Array(TIFF* tif, TIFFDirEntry* direntry, int64** value);
83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryFloatArray(TIFF* tif, TIFFDirEntry* direntry, float** value);
84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryDoubleArray(TIFF* tif, TIFFDirEntry* direntry, double** value);
85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value);
86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value);
88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if 0
89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleDouble(TIFF* tif, TIFFDirEntry* direntry, double* value);
90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryCheckedByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value);
93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryCheckedSbyte(TIFF* tif, TIFFDirEntry* direntry, int8* value);
94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryCheckedShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value);
95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryCheckedSshort(TIFF* tif, TIFFDirEntry* direntry, int16* value);
96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryCheckedLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value);
97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryCheckedSlong(TIFF* tif, TIFFDirEntry* direntry, int32* value);
98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value);
99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSlong8(TIFF* tif, TIFFDirEntry* direntry, int64* value);
100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedRational(TIFF* tif, TIFFDirEntry* direntry, double* value);
101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSrational(TIFF* tif, TIFFDirEntry* direntry, double* value);
102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryCheckedFloat(TIFF* tif, TIFFDirEntry* direntry, float* value);
103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedDouble(TIFF* tif, TIFFDirEntry* direntry, double* value);
104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSbyte(int8 value);
106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteShort(uint16 value);
107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSshort(int16 value);
108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong(uint32 value);
109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong(int32 value);
110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong8(uint64 value);
111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong8(int64 value);
112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteByte(uint8 value);
114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteShort(uint16 value);
115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSshort(int16 value);
116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong(uint32 value);
117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong(int32 value);
118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong8(uint64 value);
119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong8(int64 value);
120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSbyte(int8 value);
122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSshort(int16 value);
123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong(uint32 value);
124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong(int32 value);
125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong8(uint64 value);
126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong8(int64 value);
127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortShort(uint16 value);
129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong(uint32 value);
130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong(int32 value);
131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong8(uint64 value);
132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong8(int64 value);
133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSbyte(int8 value);
135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSshort(int16 value);
136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong(int32 value);
137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongLong8(uint64 value);
138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong8(int64 value);
139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongLong(uint32 value);
141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongLong8(uint64 value);
142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongSlong8(int64 value);
143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Sbyte(int8 value);
145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Sshort(int16 value);
146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Slong(int32 value);
147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Slong8(int64 value);
148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlong8Long8(uint64 value);
150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryData(TIFF* tif, uint64 offset, tmsize_t size, void* dest);
152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryOutputErr(TIFF* tif, enum TIFFReadDirEntryErr err, const char* module, const char* tagname, int recover);
153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirectoryCheckOrder(TIFF* tif, TIFFDirEntry* dir, uint16 dircount);
155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic TIFFDirEntry* TIFFReadDirectoryFindEntry(TIFF* tif, TIFFDirEntry* dir, uint16 dircount, uint16 tagid);
156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirectoryFindFieldInfo(TIFF* tif, uint16 tagid, uint32* fii);
157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic int EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount);
159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void MissingRequired(TIFF*, const char*);
160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic int TIFFCheckDirOffset(TIFF* tif, uint64 diroff);
161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic int CheckDirCount(TIFF*, TIFFDirEntry*, uint32);
162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic uint16 TIFFFetchDirectory(TIFF* tif, uint64 diroff, TIFFDirEntry** pdir, uint64* nextdiroff);
163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic int TIFFFetchNormalTag(TIFF*, TIFFDirEntry*, int recover);
164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic int TIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, uint32 nstrips, uint64** lpp);
165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic int TIFFFetchSubjectDistance(TIFF*, TIFFDirEntry*);
166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void ChopUpSingleUncompressedStrip(TIFF*);
167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic uint64 TIFFReadUInt64(const uint8 *value);
168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef union _UInt64Aligned_t
170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        double d;
172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint64 l;
173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 i[2];
174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16 s[4];
175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint8  c[8];
176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} UInt64Aligned_t;
177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  Unaligned safe copy of a uint64 value from an octet array.
180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler*/
181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic uint64 TIFFReadUInt64(const uint8 *value)
182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    UInt64Aligned_t result;
184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    result.c[0]=value[0];
186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    result.c[1]=value[1];
187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    result.c[2]=value[2];
188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    result.c[3]=value[3];
189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    result.c[4]=value[4];
190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    result.c[5]=value[5];
191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    result.c[6]=value[6];
192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    result.c[7]=value[7];
193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return result.l;
195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value)
198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (direntry->tdir_count!=1)
201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrCount);
202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFReadDirEntryCheckedByte(tif,direntry,value);
206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrOk);
207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8 m;
210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeByteSbyte(m);
212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint8)m;
215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16 m;
220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedShort(tif,direntry,&m);
221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeByteShort(m);
222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint8)m;
225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16 m;
230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeByteSshort(m);
232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint8)m;
235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 m;
240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedLong(tif,direntry,&m);
241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeByteLong(m);
242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint8)m;
245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32 m;
250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeByteSlong(m);
252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint8)m;
255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64 m;
260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeByteLong8(m);
264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint8)m;
267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64 m;
272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeByteSlong8(m);
276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint8)m;
279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value)
287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (direntry->tdir_count!=1)
290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrCount);
291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8 m;
296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedByte(tif,direntry,&m);
297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint16)m;
298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8 m;
303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeShortSbyte(m);
305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint16)m;
308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFReadDirEntryCheckedShort(tif,direntry,value);
312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrOk);
313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16 m;
316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeShortSshort(m);
318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint16)m;
321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 m;
326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedLong(tif,direntry,&m);
327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeShortLong(m);
328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint16)m;
331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32 m;
336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeShortSlong(m);
338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint16)m;
341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64 m;
346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeShortLong8(m);
350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint16)m;
353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64 m;
358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeShortSlong8(m);
362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint16)m;
365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value)
373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (direntry->tdir_count!=1)
376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrCount);
377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8 m;
382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedByte(tif,direntry,&m);
383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint32)m;
384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8 m;
389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeLongSbyte(m);
391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint32)m;
394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16 m;
399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedShort(tif,direntry,&m);
400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint32)m;
401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16 m;
406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeLongSshort(m);
408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint32)m;
411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFReadDirEntryCheckedLong(tif,direntry,value);
415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrOk);
416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32 m;
419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeLongSlong(m);
421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint32)m;
424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64 m;
429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeLongLong8(m);
433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint32)m;
436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64 m;
441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeLongSlong8(m);
445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint32)m;
448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value)
456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (direntry->tdir_count!=1)
459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrCount);
460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8 m;
465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedByte(tif,direntry,&m);
466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint64)m;
467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8 m;
472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeLong8Sbyte(m);
474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint64)m;
477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16 m;
482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedShort(tif,direntry,&m);
483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint64)m;
484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16 m;
489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeLong8Sshort(m);
491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint64)m;
494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 m;
499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedLong(tif,direntry,&m);
500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint64)m;
501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32 m;
506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeLong8Slong(m);
508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint64)m;
511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            err=TIFFReadDirEntryCheckedLong8(tif,direntry,value);
515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(err);
516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64 m;
519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckRangeLong8Slong8(m);
523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint64)m;
526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryFloat(TIFF* tif, TIFFDirEntry* direntry, float* value)
534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (direntry->tdir_count!=1)
537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrCount);
538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8 m;
543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedByte(tif,direntry,&m);
544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(float)m;
545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8 m;
550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(float)m;
552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16 m;
557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedShort(tif,direntry,&m);
558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(float)m;
559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16 m;
564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(float)m;
566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 m;
571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedLong(tif,direntry,&m);
572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(float)m;
573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32 m;
578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(float)m;
580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64 m;
585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined(__WIN32__) && (_MSC_VER < 1500)
589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                /*
590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * XXX: MSVC 6.0 does not support conversion
591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * of 64-bit integers into floating point
592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * values.
593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 */
594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value = _TIFFUInt64ToFloat(m);
595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(float)m;
597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64 m;
603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(float)m;
607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_RATIONAL:
610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double m;
612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckedRational(tif,direntry,&m);
613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(float)m;
616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SRATIONAL:
619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double m;
621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckedSrational(tif,direntry,&m);
622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(float)m;
625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_FLOAT:
628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFReadDirEntryCheckedFloat(tif,direntry,value);
629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrOk);
630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_DOUBLE:
631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double m;
633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckedDouble(tif,direntry,&m);
634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(float)m;
637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryDouble(TIFF* tif, TIFFDirEntry* direntry, double* value)
645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (direntry->tdir_count!=1)
648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrCount);
649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8 m;
654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedByte(tif,direntry,&m);
655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(double)m;
656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8 m;
661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(double)m;
663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16 m;
668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedShort(tif,direntry,&m);
669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(double)m;
670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16 m;
675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(double)m;
677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 m;
682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedLong(tif,direntry,&m);
683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(double)m;
684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32 m;
689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(double)m;
691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64 m;
696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined(__WIN32__) && (_MSC_VER < 1500)
700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                /*
701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * XXX: MSVC 6.0 does not support conversion
702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * of 64-bit integers into floating point
703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * values.
704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 */
705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value = _TIFFUInt64ToDouble(m);
706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value = (double)m;
708793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64 m;
714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err!=TIFFReadDirEntryErrOk)
716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(err);
717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(double)m;
718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_RATIONAL:
721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            err=TIFFReadDirEntryCheckedRational(tif,direntry,value);
722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(err);
723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SRATIONAL:
724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            err=TIFFReadDirEntryCheckedSrational(tif,direntry,value);
725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(err);
726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_FLOAT:
727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float m;
729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedFloat(tif,direntry,&m);
730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(double)m;
731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_DOUBLE:
734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            err=TIFFReadDirEntryCheckedDouble(tif,direntry,value);
735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(err);
736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8(TIFF* tif, TIFFDirEntry* direntry, uint64* value)
742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (direntry->tdir_count!=1)
745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrCount);
746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_IFD:
750793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 m;
752793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirEntryCheckedLong(tif,direntry,&m);
753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint64)m;
754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_IFD8:
758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            err=TIFFReadDirEntryCheckedLong8(tif,direntry,value);
759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(err);
760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryArray(TIFF* tif, TIFFDirEntry* direntry, uint32* count, uint32 desttypesize, void** value)
766793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int typesize;
768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 datasize;
769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* data;
770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    typesize=TIFFDataWidth(direntry->tdir_type);
771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((direntry->tdir_count==0)||(typesize==0))
772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
773793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=0;
774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        (void) desttypesize;
777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /*
779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * As a sanity check, make sure we have no more than a 2GB tag array
780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * in either the current data type or the dest data type.  This also
781793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * avoids problems with overflow of tmsize_t on 32bit systems.
782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         */
783793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((uint64)(2147483647/typesize)<direntry->tdir_count)
784793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrSizesan);
785793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((uint64)(2147483647/desttypesize)<direntry->tdir_count)
786793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrSizesan);
787793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
788793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *count=(uint32)direntry->tdir_count;
789793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    datasize=(*count)*typesize;
790793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert((tmsize_t)datasize>0);
791793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    data=_TIFFCheckMalloc(tif, *count, typesize, "ReadDirEntryArray");
792793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (data==0)
793793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrAlloc);
794793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!(tif->tif_flags&TIFF_BIGTIFF))
795793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
796793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (datasize<=4)
797793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            _TIFFmemcpy(data,&direntry->tdir_offset,datasize);
798793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else
799793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
800793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            enum TIFFReadDirEntryErr err;
801793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            uint32 offset = direntry->tdir_offset.toff_long;
802793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags&TIFF_SWAB)
803793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabLong(&offset);
804793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            err=TIFFReadDirEntryData(tif,(uint64)offset,(tmsize_t)datasize,data);
805793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (err!=TIFFReadDirEntryErrOk)
806793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
807793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                _TIFFfree(data);
808793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(err);
809793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
810793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
811793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
812793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
813793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
814793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (datasize<=8)
815793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            _TIFFmemcpy(data,&direntry->tdir_offset,datasize);
816793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else
817793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
818793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            enum TIFFReadDirEntryErr err;
819793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            uint64 offset = direntry->tdir_offset.toff_long8;
820793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags&TIFF_SWAB)
821793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabLong8(&offset);
822793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            err=TIFFReadDirEntryData(tif,offset,(tmsize_t)datasize,data);
823793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (err!=TIFFReadDirEntryErrOk)
824793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
825793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                _TIFFfree(data);
826793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(err);
827793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
828793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
829793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
830793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=data;
831793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
832793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
833793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
834793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryByteArray(TIFF* tif, TIFFDirEntry* direntry, uint8** value)
835793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
836793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
837793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 count;
838793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* origdata;
839793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint8* data;
840793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
841793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
842793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_ASCII:
843793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_UNDEFINED:
844793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
845793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
846793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
847793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
848793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
849793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
850793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
851793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
852793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
853793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
854793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
855793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
856793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    err=TIFFReadDirEntryArray(tif,direntry,&count,1,&origdata);
857793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
858793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
859793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=0;
860793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
861793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
862793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
863793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
864793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_ASCII:
865793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_UNDEFINED:
866793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
867793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *value=(uint8*)origdata;
868793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrOk);
869793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
870793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
871793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* m;
872793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
873793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                m=(int8*)origdata;
874793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
875793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
876793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeByteSbyte(*m);
877793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
878793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
879793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(origdata);
880793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(err);
881793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
882793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m++;
883793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
884793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint8*)origdata;
885793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
886793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
887793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
888793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    data=(uint8*)_TIFFmalloc(count);
889793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (data==0)
890793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
891793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(origdata);
892793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrAlloc);
893793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
894793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
895793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
896793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
897793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
898793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* ma;
899793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* mb;
900793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
901793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint16*)origdata;
902793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
903793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
904793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
905793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
906793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort(ma);
907793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeByteShort(*ma);
908793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
909793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
910793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint8)(*ma++);
911793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
912793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
913793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
914793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
915793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
916793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* ma;
917793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* mb;
918793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
919793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int16*)origdata;
920793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
921793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
922793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
923793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
924793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort((uint16*)ma);
925793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeByteSshort(*ma);
926793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
927793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
928793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint8)(*ma++);
929793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
930793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
931793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
932793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
933793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
934793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* ma;
935793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* mb;
936793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
937793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint32*)origdata;
938793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
939793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
940793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
941793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
942793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
943793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeByteLong(*ma);
944793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
945793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
946793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint8)(*ma++);
947793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
948793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
949793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
950793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
951793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
952793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* ma;
953793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* mb;
954793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
955793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int32*)origdata;
956793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
957793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
958793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
959793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
960793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong((uint32*)ma);
961793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeByteSlong(*ma);
962793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
963793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
964793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint8)(*ma++);
965793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
966793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
967793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
968793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
969793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
970793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* ma;
971793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* mb;
972793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
973793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint64*)origdata;
974793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
975793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
976793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
977793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
978793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8(ma);
979793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeByteLong8(*ma);
980793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
981793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
982793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint8)(*ma++);
983793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
984793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
985793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
986793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
987793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
988793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* ma;
989793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* mb;
990793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
991793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int64*)origdata;
992793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
993793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
994793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
995793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
996793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8((uint64*)ma);
997793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeByteSlong8(*ma);
998793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
999793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1000793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint8)(*ma++);
1001793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1002793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1003793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1004793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1005793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(origdata);
1006793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err!=TIFFReadDirEntryErrOk)
1007793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1008793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(data);
1009793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
1010793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1011793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=data;
1012793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
1013793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1014793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1015793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntrySbyteArray(TIFF* tif, TIFFDirEntry* direntry, int8** value)
1016793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1017793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
1018793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 count;
1019793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* origdata;
1020793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int8* data;
1021793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1022793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1023793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_UNDEFINED:
1024793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
1025793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
1026793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
1027793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
1028793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
1029793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
1030793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
1031793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
1032793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1033793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
1034793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
1035793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1036793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    err=TIFFReadDirEntryArray(tif,direntry,&count,1,&origdata);
1037793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
1038793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1039793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=0;
1040793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
1041793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1042793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1043793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1044793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_UNDEFINED:
1045793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
1046793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1047793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* m;
1048793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1049793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                m=(uint8*)origdata;
1050793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1051793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1052793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSbyteByte(*m);
1053793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1054793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
1055793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(origdata);
1056793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(err);
1057793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
1058793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m++;
1059793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1060793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(int8*)origdata;
1061793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
1062793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1063793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
1064793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *value=(int8*)origdata;
1065793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrOk);
1066793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1067793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    data=(int8*)_TIFFmalloc(count);
1068793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (data==0)
1069793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1070793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(origdata);
1071793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrAlloc);
1072793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1073793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1074793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1075793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
1076793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1077793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* ma;
1078793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* mb;
1079793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1080793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint16*)origdata;
1081793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1082793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1083793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1084793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1085793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort(ma);
1086793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSbyteShort(*ma);
1087793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1088793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1089793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int8)(*ma++);
1090793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1091793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1092793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1093793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
1094793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1095793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* ma;
1096793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* mb;
1097793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1098793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int16*)origdata;
1099793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort((uint16*)ma);
1104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSbyteSshort(*ma);
1105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int8)(*ma++);
1108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
1112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* ma;
1114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* mb;
1115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint32*)origdata;
1117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
1122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSbyteLong(*ma);
1123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int8)(*ma++);
1126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
1130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* ma;
1132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* mb;
1133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int32*)origdata;
1135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong((uint32*)ma);
1140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSbyteSlong(*ma);
1141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int8)(*ma++);
1144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
1148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* ma;
1150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* mb;
1151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint64*)origdata;
1153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8(ma);
1158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSbyteLong8(*ma);
1159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int8)(*ma++);
1162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
1166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* ma;
1168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* mb;
1169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int64*)origdata;
1171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8((uint64*)ma);
1176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSbyteSlong8(*ma);
1177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int8)(*ma++);
1180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(origdata);
1185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err!=TIFFReadDirEntryErrOk)
1186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(data);
1188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
1189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=data;
1191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
1192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryShortArray(TIFF* tif, TIFFDirEntry* direntry, uint16** value)
1195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
1197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 count;
1198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* origdata;
1199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16* data;
1200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
1203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
1204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
1205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
1206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
1207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
1208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
1209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
1210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
1212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
1213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    err=TIFFReadDirEntryArray(tif,direntry,&count,2,&origdata);
1215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
1216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=0;
1218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
1219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
1223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *value=(uint16*)origdata;
1224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags&TIFF_SWAB)
1225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabArrayOfShort(*value,count);
1226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrOk);
1227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
1228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* m;
1230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                m=(int16*)origdata;
1232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort((uint16*)m);
1236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeShortSshort(*m);
1237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
1239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(origdata);
1240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(err);
1241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
1242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m++;
1243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint16*)origdata;
1245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
1246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    data=(uint16*)_TIFFmalloc(count*2);
1249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (data==0)
1250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(origdata);
1252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrAlloc);
1253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
1257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* ma;
1259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* mb;
1260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint8*)origdata;
1262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint16)(*ma++);
1265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
1268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* ma;
1270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* mb;
1271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int8*)origdata;
1273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeShortSbyte(*ma);
1277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint16)(*ma++);
1280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
1284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* ma;
1286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* mb;
1287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint32*)origdata;
1289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
1294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeShortLong(*ma);
1295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint16)(*ma++);
1298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
1302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* ma;
1304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* mb;
1305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int32*)origdata;
1307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong((uint32*)ma);
1312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeShortSlong(*ma);
1313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint16)(*ma++);
1316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
1320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* ma;
1322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* mb;
1323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint64*)origdata;
1325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8(ma);
1330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeShortLong8(*ma);
1331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint16)(*ma++);
1334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
1338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* ma;
1340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* mb;
1341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int64*)origdata;
1343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8((uint64*)ma);
1348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeShortSlong8(*ma);
1349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint16)(*ma++);
1352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(origdata);
1357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err!=TIFFReadDirEntryErrOk)
1358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(data);
1360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
1361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=data;
1363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
1364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntrySshortArray(TIFF* tif, TIFFDirEntry* direntry, int16** value)
1367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
1369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 count;
1370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* origdata;
1371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int16* data;
1372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
1375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
1376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
1377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
1378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
1379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
1380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
1381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
1382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
1384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
1385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    err=TIFFReadDirEntryArray(tif,direntry,&count,2,&origdata);
1387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
1388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=0;
1390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
1391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
1395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* m;
1397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                m=(uint16*)origdata;
1399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort(m);
1403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSshortShort(*m);
1404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
1406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(origdata);
1407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(err);
1408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
1409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m++;
1410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(int16*)origdata;
1412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
1413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
1415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *value=(int16*)origdata;
1416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags&TIFF_SWAB)
1417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabArrayOfShort((uint16*)(*value),count);
1418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrOk);
1419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    data=(int16*)_TIFFmalloc(count*2);
1421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (data==0)
1422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(origdata);
1424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrAlloc);
1425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
1429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* ma;
1431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* mb;
1432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint8*)origdata;
1434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int16)(*ma++);
1437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
1440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* ma;
1442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* mb;
1443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int8*)origdata;
1445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int16)(*ma++);
1448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
1451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* ma;
1453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* mb;
1454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint32*)origdata;
1456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
1461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSshortLong(*ma);
1462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int16)(*ma++);
1465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
1469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* ma;
1471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* mb;
1472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int32*)origdata;
1474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong((uint32*)ma);
1479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSshortSlong(*ma);
1480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int16)(*ma++);
1483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
1487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* ma;
1489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* mb;
1490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint64*)origdata;
1492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8(ma);
1497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSshortLong8(*ma);
1498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int16)(*ma++);
1501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
1505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* ma;
1507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* mb;
1508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int64*)origdata;
1510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8((uint64*)ma);
1515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSshortSlong8(*ma);
1516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int16)(*ma++);
1519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(origdata);
1524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err!=TIFFReadDirEntryErrOk)
1525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(data);
1527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
1528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=data;
1530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
1531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryLongArray(TIFF* tif, TIFFDirEntry* direntry, uint32** value)
1534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
1536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 count;
1537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* origdata;
1538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32* data;
1539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
1542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
1543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
1544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
1545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
1546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
1547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
1548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
1549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
1551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
1552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    err=TIFFReadDirEntryArray(tif,direntry,&count,4,&origdata);
1554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
1555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=0;
1557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
1558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
1562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *value=(uint32*)origdata;
1563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags&TIFF_SWAB)
1564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabArrayOfLong(*value,count);
1565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrOk);
1566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
1567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* m;
1569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                m=(int32*)origdata;
1571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong((uint32*)m);
1575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeLongSlong(*m);
1576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
1578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(origdata);
1579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(err);
1580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
1581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m++;
1582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint32*)origdata;
1584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
1585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    data=(uint32*)_TIFFmalloc(count*4);
1588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (data==0)
1589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(origdata);
1591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrAlloc);
1592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
1596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* ma;
1598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* mb;
1599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint8*)origdata;
1601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint32)(*ma++);
1604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
1607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* ma;
1609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* mb;
1610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int8*)origdata;
1612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeLongSbyte(*ma);
1616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint32)(*ma++);
1619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
1623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* ma;
1625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* mb;
1626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint16*)origdata;
1628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort(ma);
1633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint32)(*ma++);
1634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
1638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* ma;
1640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* mb;
1641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int16*)origdata;
1643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort((uint16*)ma);
1648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeLongSshort(*ma);
1649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint32)(*ma++);
1652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
1656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* ma;
1658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* mb;
1659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint64*)origdata;
1661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8(ma);
1666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeLongLong8(*ma);
1667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint32)(*ma++);
1670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
1674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* ma;
1676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* mb;
1677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int64*)origdata;
1679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8((uint64*)ma);
1684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeLongSlong8(*ma);
1685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint32)(*ma++);
1688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(origdata);
1693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err!=TIFFReadDirEntryErrOk)
1694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(data);
1696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
1697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=data;
1699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
1700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntrySlongArray(TIFF* tif, TIFFDirEntry* direntry, int32** value)
1703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
1705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 count;
1706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* origdata;
1707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int32* data;
1708793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
1711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
1712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
1713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
1714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
1715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
1716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
1717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
1718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
1720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
1721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    err=TIFFReadDirEntryArray(tif,direntry,&count,4,&origdata);
1723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
1724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=0;
1726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
1727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
1731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* m;
1733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                m=(uint32*)origdata;
1735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong((uint32*)m);
1739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSlongLong(*m);
1740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
1742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(origdata);
1743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(err);
1744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
1745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m++;
1746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(int32*)origdata;
1748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
1749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1750793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
1751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *value=(int32*)origdata;
1752793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags&TIFF_SWAB)
1753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabArrayOfLong((uint32*)(*value),count);
1754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrOk);
1755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    data=(int32*)_TIFFmalloc(count*4);
1757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (data==0)
1758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(origdata);
1760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrAlloc);
1761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
1765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1766793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* ma;
1767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* mb;
1768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint8*)origdata;
1770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int32)(*ma++);
1773793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
1776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* ma;
1778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* mb;
1779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int8*)origdata;
1781793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1783793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int32)(*ma++);
1784793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1785793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1786793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
1787793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1788793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* ma;
1789793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* mb;
1790793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1791793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint16*)origdata;
1792793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1793793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1794793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1795793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1796793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort(ma);
1797793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int32)(*ma++);
1798793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1799793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1800793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1801793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
1802793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1803793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* ma;
1804793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* mb;
1805793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1806793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int16*)origdata;
1807793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1808793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1809793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1810793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1811793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort((uint16*)ma);
1812793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int32)(*ma++);
1813793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1814793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1815793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1816793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
1817793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1818793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* ma;
1819793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* mb;
1820793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1821793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint64*)origdata;
1822793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1823793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1824793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1825793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1826793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8(ma);
1827793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSlongLong8(*ma);
1828793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1829793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1830793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int32)(*ma++);
1831793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1832793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1833793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1834793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
1835793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1836793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* ma;
1837793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* mb;
1838793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1839793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int64*)origdata;
1840793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1841793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1842793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1843793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1844793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8((uint64*)ma);
1845793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSlongSlong8(*ma);
1846793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1847793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1848793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int32)(*ma++);
1849793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1850793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1851793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1852793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1853793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(origdata);
1854793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err!=TIFFReadDirEntryErrOk)
1855793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1856793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(data);
1857793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
1858793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1859793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=data;
1860793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
1861793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1862793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1863793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryLong8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value)
1864793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1865793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
1866793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 count;
1867793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* origdata;
1868793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint64* data;
1869793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1870793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1871793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
1872793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
1873793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
1874793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
1875793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
1876793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
1877793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
1878793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
1879793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1880793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
1881793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
1882793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1883793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata);
1884793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
1885793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1886793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=0;
1887793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
1888793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1889793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1890793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1891793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
1892793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *value=(uint64*)origdata;
1893793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags&TIFF_SWAB)
1894793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabArrayOfLong8(*value,count);
1895793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrOk);
1896793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
1897793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1898793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* m;
1899793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1900793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                m=(int64*)origdata;
1901793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1902793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1903793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1904793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8((uint64*)m);
1905793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeLong8Slong8(*m);
1906793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1907793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
1908793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(origdata);
1909793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(err);
1910793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
1911793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m++;
1912793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1913793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(uint64*)origdata;
1914793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
1915793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1916793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1917793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    data=(uint64*)_TIFFmalloc(count*8);
1918793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (data==0)
1919793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1920793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(origdata);
1921793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrAlloc);
1922793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1923793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
1924793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1925793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
1926793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1927793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* ma;
1928793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* mb;
1929793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1930793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint8*)origdata;
1931793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1932793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1933793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint64)(*ma++);
1934793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1935793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1936793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
1937793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1938793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* ma;
1939793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* mb;
1940793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1941793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int8*)origdata;
1942793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1943793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1944793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1945793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeLong8Sbyte(*ma);
1946793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1947793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1948793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint64)(*ma++);
1949793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1950793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1951793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1952793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
1953793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1954793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* ma;
1955793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* mb;
1956793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1957793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint16*)origdata;
1958793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1959793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1960793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1961793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1962793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort(ma);
1963793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint64)(*ma++);
1964793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1965793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1966793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1967793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
1968793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1969793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* ma;
1970793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* mb;
1971793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1972793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int16*)origdata;
1973793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1974793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1975793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1976793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1977793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort((uint16*)ma);
1978793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeLong8Sshort(*ma);
1979793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
1980793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1981793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint64)(*ma++);
1982793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1983793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1984793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1985793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
1986793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1987793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* ma;
1988793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* mb;
1989793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
1990793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint32*)origdata;
1991793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
1992793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
1993793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1994793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
1995793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
1996793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint64)(*ma++);
1997793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1998793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1999793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2000793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
2001793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2002793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* ma;
2003793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* mb;
2004793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2005793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int32*)origdata;
2006793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2007793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2008793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2009793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2010793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong((uint32*)ma);
2011793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeLong8Slong(*ma);
2012793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
2013793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
2014793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint64)(*ma++);
2015793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2016793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2017793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2018793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2019793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(origdata);
2020793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err!=TIFFReadDirEntryErrOk)
2021793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2022793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(data);
2023793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
2024793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2025793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=data;
2026793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
2027793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2028793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2029793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntrySlong8Array(TIFF* tif, TIFFDirEntry* direntry, int64** value)
2030793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2031793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
2032793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 count;
2033793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* origdata;
2034793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int64* data;
2035793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
2036793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2037793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
2038793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
2039793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
2040793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
2041793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
2042793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
2043793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
2044793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
2045793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2046793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
2047793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
2048793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2049793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata);
2050793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
2051793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2052793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=0;
2053793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
2054793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2055793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
2056793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2057793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
2058793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2059793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* m;
2060793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2061793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                m=(uint64*)origdata;
2062793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2063793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2064793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2065793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8(m);
2066793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryCheckRangeSlong8Long8(*m);
2067793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
2068793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
2069793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(origdata);
2070793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(err);
2071793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
2072793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m++;
2073793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2074793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *value=(int64*)origdata;
2075793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return(TIFFReadDirEntryErrOk);
2076793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2077793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
2078793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *value=(int64*)origdata;
2079793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags&TIFF_SWAB)
2080793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabArrayOfLong8((uint64*)(*value),count);
2081793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrOk);
2082793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2083793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    data=(int64*)_TIFFmalloc(count*8);
2084793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (data==0)
2085793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2086793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(origdata);
2087793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrAlloc);
2088793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2089793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
2090793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2091793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
2092793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2093793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* ma;
2094793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* mb;
2095793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2096793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint8*)origdata;
2097793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2098793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2099793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int64)(*ma++);
2100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
2103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* ma;
2105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* mb;
2106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int8*)origdata;
2108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int64)(*ma++);
2111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
2114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* ma;
2116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* mb;
2117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint16*)origdata;
2119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort(ma);
2124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int64)(*ma++);
2125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
2129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* ma;
2131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* mb;
2132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int16*)origdata;
2134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort((uint16*)ma);
2139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int64)(*ma++);
2140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
2144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* ma;
2146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* mb;
2147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint32*)origdata;
2149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
2154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int64)(*ma++);
2155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
2159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* ma;
2161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* mb;
2162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int32*)origdata;
2164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong((uint32*)ma);
2169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(int64)(*ma++);
2170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(origdata);
2175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err!=TIFFReadDirEntryErrOk)
2176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(data);
2178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
2179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=data;
2181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
2182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryFloatArray(TIFF* tif, TIFFDirEntry* direntry, float** value)
2185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
2187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 count;
2188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* origdata;
2189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    float* data;
2190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
2191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
2193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
2194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
2195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
2196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
2197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
2198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
2199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
2200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_RATIONAL:
2201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SRATIONAL:
2202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_FLOAT:
2203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_DOUBLE:
2204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
2206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
2207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    err=TIFFReadDirEntryArray(tif,direntry,&count,4,&origdata);
2209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
2210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=0;
2212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
2213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
2215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_FLOAT:
2217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags&TIFF_SWAB)
2218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabArrayOfLong((uint32*)origdata,count);
2219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFCvtIEEEDoubleToNative(tif,count,(float*)origdata);
2220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *value=(float*)origdata;
2221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrOk);
2222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    data=(float*)_TIFFmalloc(count*sizeof(float));
2224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (data==0)
2225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(origdata);
2227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrAlloc);
2228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
2230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
2232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* ma;
2234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float* mb;
2235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint8*)origdata;
2237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(float)(*ma++);
2240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
2243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* ma;
2245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float* mb;
2246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int8*)origdata;
2248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(float)(*ma++);
2251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
2254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* ma;
2256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float* mb;
2257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint16*)origdata;
2259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort(ma);
2264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(float)(*ma++);
2265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
2269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* ma;
2271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float* mb;
2272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int16*)origdata;
2274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort((uint16*)ma);
2279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(float)(*ma++);
2280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
2284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* ma;
2286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float* mb;
2287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint32*)origdata;
2289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
2294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(float)(*ma++);
2295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
2299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* ma;
2301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float* mb;
2302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int32*)origdata;
2304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong((uint32*)ma);
2309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(float)(*ma++);
2310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
2314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* ma;
2316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float* mb;
2317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint64*)origdata;
2319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8(ma);
2324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined(__WIN32__) && (_MSC_VER < 1500)
2325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    /*
2326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                     * XXX: MSVC 6.0 does not support
2327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                     * conversion of 64-bit integers into
2328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                     * floating point values.
2329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                     */
2330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++ = _TIFFUInt64ToFloat(*ma++);
2331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
2332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++ = (float)(*ma++);
2333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
2334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
2338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* ma;
2340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float* mb;
2341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int64*)origdata;
2343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8((uint64*)ma);
2348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(float)(*ma++);
2349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_RATIONAL:
2353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* ma;
2355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 maa;
2356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 mab;
2357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float* mb;
2358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint32*)origdata;
2360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
2365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    maa=*ma++;
2366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
2368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    mab=*ma++;
2369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (mab==0)
2370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        *mb++=0.0;
2371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    else
2372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        *mb++=(float)maa/(float)mab;
2373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SRATIONAL:
2377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* ma;
2379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32 maa;
2380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 mab;
2381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float* mb;
2382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint32*)origdata;
2384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
2389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    maa=*(int32*)ma;
2390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    ma++;
2391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
2393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    mab=*ma++;
2394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (mab==0)
2395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        *mb++=0.0;
2396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    else
2397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        *mb++=(float)maa/(float)mab;
2398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_DOUBLE:
2402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double* ma;
2404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float* mb;
2405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (tif->tif_flags&TIFF_SWAB)
2407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    TIFFSwabArrayOfLong8((uint64*)origdata,count);
2408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFCvtIEEEDoubleToNative(tif,count,(double*)origdata);
2409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(double*)origdata;
2410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(float)(*ma++);
2413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(origdata);
2417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err!=TIFFReadDirEntryErrOk)
2418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(data);
2420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
2421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=data;
2423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
2424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr
2427793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirEntryDoubleArray(TIFF* tif, TIFFDirEntry* direntry, double** value)
2428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
2430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 count;
2431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* origdata;
2432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double* data;
2433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
2434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
2436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
2437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
2438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
2439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
2440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
2441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
2442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
2443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_RATIONAL:
2444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SRATIONAL:
2445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_FLOAT:
2446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_DOUBLE:
2447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
2449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
2450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata);
2452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
2453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=0;
2455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
2456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
2458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_DOUBLE:
2460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags&TIFF_SWAB)
2461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabArrayOfLong8((uint64*)origdata,count);
2462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFCvtIEEEDoubleToNative(tif,count,(double*)origdata);
2463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *value=(double*)origdata;
2464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrOk);
2465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    data=(double*)_TIFFmalloc(count*sizeof(double));
2467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (data==0)
2468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(origdata);
2470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrAlloc);
2471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
2473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_BYTE:
2475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* ma;
2477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double* mb;
2478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint8*)origdata;
2480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(double)(*ma++);
2483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SBYTE:
2486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* ma;
2488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double* mb;
2489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int8*)origdata;
2491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(double)(*ma++);
2494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SHORT:
2497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* ma;
2499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double* mb;
2500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint16*)origdata;
2502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort(ma);
2507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(double)(*ma++);
2508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SSHORT:
2512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* ma;
2514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double* mb;
2515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int16*)origdata;
2517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabShort((uint16*)ma);
2522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(double)(*ma++);
2523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
2527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* ma;
2529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double* mb;
2530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint32*)origdata;
2532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
2537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(double)(*ma++);
2538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG:
2542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* ma;
2544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double* mb;
2545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int32*)origdata;
2547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong((uint32*)ma);
2552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(double)(*ma++);
2553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
2557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* ma;
2559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double* mb;
2560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint64*)origdata;
2562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8(ma);
2567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined(__WIN32__) && (_MSC_VER < 1500)
2568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    /*
2569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                     * XXX: MSVC 6.0 does not support
2570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                     * conversion of 64-bit integers into
2571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                     * floating point values.
2572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                     */
2573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++ = _TIFFUInt64ToDouble(*ma++);
2574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
2575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++ = (double)(*ma++);
2576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
2577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SLONG8:
2581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* ma;
2583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double* mb;
2584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(int64*)origdata;
2586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong8((uint64*)ma);
2591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(double)(*ma++);
2592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_RATIONAL:
2596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* ma;
2598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 maa;
2599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 mab;
2600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double* mb;
2601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint32*)origdata;
2603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
2608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    maa=*ma++;
2609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
2611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    mab=*ma++;
2612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (mab==0)
2613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        *mb++=0.0;
2614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    else
2615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        *mb++=(double)maa/(double)mab;
2616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SRATIONAL:
2620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* ma;
2622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32 maa;
2623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 mab;
2624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double* mb;
2625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint32*)origdata;
2627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
2632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    maa=*(int32*)ma;
2633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    ma++;
2634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
2636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    mab=*ma++;
2637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (mab==0)
2638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        *mb++=0.0;
2639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    else
2640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        *mb++=(double)maa/(double)mab;
2641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_FLOAT:
2645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float* ma;
2647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double* mb;
2648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (tif->tif_flags&TIFF_SWAB)
2650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    TIFFSwabArrayOfLong((uint32*)origdata,count);
2651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFCvtIEEEFloatToNative(tif,count,(float*)origdata);
2652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(float*)origdata;
2653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(double)(*ma++);
2656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(origdata);
2660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err!=TIFFReadDirEntryErrOk)
2661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(data);
2663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
2664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=data;
2666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
2667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value)
2670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
2672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 count;
2673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* origdata;
2674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint64* data;
2675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
2676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
2678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
2679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_IFD:
2680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_IFD8:
2681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
2683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrType);
2684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata);
2686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
2687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=0;
2689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
2690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
2692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG8:
2694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_IFD8:
2695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *value=(uint64*)origdata;
2696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags&TIFF_SWAB)
2697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabArrayOfLong8(*value,count);
2698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrOk);
2699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    data=(uint64*)_TIFFmalloc(count*8);
2701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (data==0)
2702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(origdata);
2704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrAlloc);
2705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (direntry->tdir_type)
2707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2708793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_LONG:
2709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_IFD:
2710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* ma;
2712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* mb;
2713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 n;
2714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ma=(uint32*)origdata;
2715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                mb=data;
2716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for (n=0; n<count; n++)
2717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
2718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (tif->tif_flags&TIFF_SWAB)
2719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSwabLong(ma);
2720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *mb++=(uint64)(*ma++);
2721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
2722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(origdata);
2726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err!=TIFFReadDirEntryErrOk)
2727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(data);
2729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
2730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=data;
2732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
2733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value)
2736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
2738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16* m;
2739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16* na;
2740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16 nb;
2741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (direntry->tdir_count<(uint64)tif->tif_dir.td_samplesperpixel)
2742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrCount);
2743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    err=TIFFReadDirEntryShortArray(tif,direntry,&m);
2744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err!=TIFFReadDirEntryErrOk)
2745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
2746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    na=m;
2747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    nb=tif->tif_dir.td_samplesperpixel;
2748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=*na++;
2749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    nb--;
2750793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    while (nb>0)
2751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2752793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (*na++!=*value)
2753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
2754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            err=TIFFReadDirEntryErrPsdif;
2755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
2757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        nb--;
2758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(m);
2760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(err);
2761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if 0
2764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleDouble(TIFF* tif, TIFFDirEntry* direntry, double* value)
2765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2766793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
2767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double* m;
2768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double* na;
2769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16 nb;
2770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (direntry->tdir_count<(uint64)tif->tif_dir.td_samplesperpixel)
2771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrCount);
2772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    err=TIFFReadDirEntryDoubleArray(tif,direntry,&m);
2773793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err!=TIFFReadDirEntryErrOk)
2774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(err);
2775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    na=m;
2776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    nb=tif->tif_dir.td_samplesperpixel;
2777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=*na++;
2778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    nb--;
2779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    while (nb>0)
2780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2781793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (*na++!=*value)
2782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
2783793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            err=TIFFReadDirEntryErrPsdif;
2784793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
2785793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
2786793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        nb--;
2787793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2788793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(m);
2789793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(err);
2790793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2791793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
2792793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2793793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryCheckedByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value)
2794793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2795793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (void) tif;
2796793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=*(uint8*)(&direntry->tdir_offset);
2797793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2798793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2799793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryCheckedSbyte(TIFF* tif, TIFFDirEntry* direntry, int8* value)
2800793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2801793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (void) tif;
2802793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=*(int8*)(&direntry->tdir_offset);
2803793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2804793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2805793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryCheckedShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value)
2806793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2807793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value = direntry->tdir_offset.toff_short;
2808793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* *value=*(uint16*)(&direntry->tdir_offset); */
2809793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_flags&TIFF_SWAB)
2810793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFSwabShort(value);
2811793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2812793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2813793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryCheckedSshort(TIFF* tif, TIFFDirEntry* direntry, int16* value)
2814793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2815793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=*(int16*)(&direntry->tdir_offset);
2816793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_flags&TIFF_SWAB)
2817793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFSwabShort((uint16*)value);
2818793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2819793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2820793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryCheckedLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value)
2821793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2822793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=*(uint32*)(&direntry->tdir_offset);
2823793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_flags&TIFF_SWAB)
2824793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFSwabLong(value);
2825793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2826793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2827793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryCheckedSlong(TIFF* tif, TIFFDirEntry* direntry, int32* value)
2828793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2829793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=*(int32*)(&direntry->tdir_offset);
2830793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_flags&TIFF_SWAB)
2831793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFSwabLong((uint32*)value);
2832793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2833793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2834793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value)
2835793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2836793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!(tif->tif_flags&TIFF_BIGTIFF))
2837793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2838793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        enum TIFFReadDirEntryErr err;
2839793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint32 offset = direntry->tdir_offset.toff_long;
2840793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (tif->tif_flags&TIFF_SWAB)
2841793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFSwabLong(&offset);
2842793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        err=TIFFReadDirEntryData(tif,offset,8,value);
2843793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (err!=TIFFReadDirEntryErrOk)
2844793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(err);
2845793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2846793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
2847793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value = direntry->tdir_offset.toff_long8;
2848793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_flags&TIFF_SWAB)
2849793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFSwabLong8(value);
2850793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
2851793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2852793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2853793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSlong8(TIFF* tif, TIFFDirEntry* direntry, int64* value)
2854793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2855793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!(tif->tif_flags&TIFF_BIGTIFF))
2856793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2857793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        enum TIFFReadDirEntryErr err;
2858793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint32 offset = direntry->tdir_offset.toff_long;
2859793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (tif->tif_flags&TIFF_SWAB)
2860793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFSwabLong(&offset);
2861793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        err=TIFFReadDirEntryData(tif,offset,8,value);
2862793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (err!=TIFFReadDirEntryErrOk)
2863793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(err);
2864793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2865793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
2866793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=*(int64*)(&direntry->tdir_offset);
2867793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_flags&TIFF_SWAB)
2868793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFSwabLong8((uint64*)value);
2869793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
2870793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2871793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2872793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedRational(TIFF* tif, TIFFDirEntry* direntry, double* value)
2873793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2874793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    UInt64Aligned_t m;
2875793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2876793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(double)==8);
2877793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(uint64)==8);
2878793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(uint32)==4);
2879793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!(tif->tif_flags&TIFF_BIGTIFF))
2880793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2881793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        enum TIFFReadDirEntryErr err;
2882793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint32 offset = direntry->tdir_offset.toff_long;
2883793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (tif->tif_flags&TIFF_SWAB)
2884793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFSwabLong(&offset);
2885793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        err=TIFFReadDirEntryData(tif,offset,8,m.i);
2886793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (err!=TIFFReadDirEntryErrOk)
2887793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(err);
2888793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2889793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
2890793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        m.l = direntry->tdir_offset.toff_long8;
2891793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_flags&TIFF_SWAB)
2892793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFSwabArrayOfLong(m.i,2);
2893793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (m.i[0]==0)
2894793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=0.0;
2895793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
2896793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=(double)m.i[0]/(double)m.i[1];
2897793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
2898793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2899793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2900793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSrational(TIFF* tif, TIFFDirEntry* direntry, double* value)
2901793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2902793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    UInt64Aligned_t m;
2903793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(double)==8);
2904793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(uint64)==8);
2905793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(int32)==4);
2906793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(uint32)==4);
2907793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!(tif->tif_flags&TIFF_BIGTIFF))
2908793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2909793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        enum TIFFReadDirEntryErr err;
2910793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint32 offset = direntry->tdir_offset.toff_long;
2911793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (tif->tif_flags&TIFF_SWAB)
2912793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFSwabLong(&offset);
2913793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        err=TIFFReadDirEntryData(tif,offset,8,m.i);
2914793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (err!=TIFFReadDirEntryErrOk)
2915793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(err);
2916793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2917793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
2918793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        m.l=direntry->tdir_offset.toff_long8;
2919793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_flags&TIFF_SWAB)
2920793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFSwabArrayOfLong(m.i,2);
2921793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((int32)m.i[0]==0)
2922793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=0.0;
2923793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
2924793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *value=(double)((int32)m.i[0])/(double)m.i[1];
2925793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
2926793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2927793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2928793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryCheckedFloat(TIFF* tif, TIFFDirEntry* direntry, float* value)
2929793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2930793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         union
2931793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     {
2932793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       float  f;
2933793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       uint32 i;
2934793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     } float_union;
2935793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(float)==4);
2936793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(uint32)==4);
2937793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(float_union)==4);
2938793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    float_union.i=*(uint32*)(&direntry->tdir_offset);
2939793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *value=float_union.f;
2940793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_flags&TIFF_SWAB)
2941793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFSwabLong((uint32*)value);
2942793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2943793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2944793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedDouble(TIFF* tif, TIFFDirEntry* direntry, double* value)
2945793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2946793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(double)==8);
2947793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(uint64)==8);
2948793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(UInt64Aligned_t)==8);
2949793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!(tif->tif_flags&TIFF_BIGTIFF))
2950793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2951793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        enum TIFFReadDirEntryErr err;
2952793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint32 offset = direntry->tdir_offset.toff_long;
2953793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (tif->tif_flags&TIFF_SWAB)
2954793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFSwabLong(&offset);
2955793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        err=TIFFReadDirEntryData(tif,offset,8,value);
2956793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (err!=TIFFReadDirEntryErrOk)
2957793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(err);
2958793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2959793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
2960793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2961793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler           UInt64Aligned_t uint64_union;
2962793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler           uint64_union.l=direntry->tdir_offset.toff_long8;
2963793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler           *value=uint64_union.d;
2964793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2965793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_flags&TIFF_SWAB)
2966793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFSwabLong8((uint64*)value);
2967793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
2968793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2969793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2970793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSbyte(int8 value)
2971793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2972793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value<0)
2973793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
2974793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
2975793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
2976793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2977793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2978793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteShort(uint16 value)
2979793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2980793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value>0xFF)
2981793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
2982793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
2983793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
2984793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2985793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2986793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSshort(int16 value)
2987793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2988793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((value<0)||(value>0xFF))
2989793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
2990793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
2991793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
2992793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2993793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2994793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong(uint32 value)
2995793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2996793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value>0xFF)
2997793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
2998793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
2999793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3000793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3001793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3002793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong(int32 value)
3003793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3004793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((value<0)||(value>0xFF))
3005793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3006793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3007793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3008793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3009793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3010793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong8(uint64 value)
3011793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3012793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value>0xFF)
3013793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3014793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3015793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3016793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3017793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3018793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong8(int64 value)
3019793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3020793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((value<0)||(value>0xFF))
3021793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3022793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3023793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3024793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3025793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3026793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteByte(uint8 value)
3027793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3028793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value>0x7F)
3029793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3030793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3031793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3032793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3033793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3034793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteShort(uint16 value)
3035793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3036793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value>0x7F)
3037793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3038793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3039793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3040793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3041793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3042793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSshort(int16 value)
3043793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3044793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((value<-0x80)||(value>0x7F))
3045793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3046793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3047793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3048793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3049793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3050793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong(uint32 value)
3051793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3052793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value>0x7F)
3053793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3054793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3055793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3056793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3057793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3058793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong(int32 value)
3059793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3060793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((value<-0x80)||(value>0x7F))
3061793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3062793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3063793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3064793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3065793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3066793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong8(uint64 value)
3067793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3068793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value>0x7F)
3069793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3070793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3071793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3072793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3073793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3074793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong8(int64 value)
3075793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3076793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((value<-0x80)||(value>0x7F))
3077793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3078793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3079793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3080793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3081793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3082793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSbyte(int8 value)
3083793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3084793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value<0)
3085793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3086793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3087793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3088793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3089793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3090793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSshort(int16 value)
3091793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3092793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value<0)
3093793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3094793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3095793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3096793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3097793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3098793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong(uint32 value)
3099793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value>0xFFFF)
3101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong(int32 value)
3107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((value<0)||(value>0xFFFF))
3109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong8(uint64 value)
3115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value>0xFFFF)
3117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong8(int64 value)
3123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((value<0)||(value>0xFFFF))
3125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortShort(uint16 value)
3131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value>0x7FFF)
3133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong(uint32 value)
3139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value>0x7FFF)
3141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong(int32 value)
3147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((value<-0x8000)||(value>0x7FFF))
3149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong8(uint64 value)
3155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value>0x7FFF)
3157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong8(int64 value)
3163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((value<-0x8000)||(value>0x7FFF))
3165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSbyte(int8 value)
3171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value<0)
3173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSshort(int16 value)
3179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value<0)
3181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong(int32 value)
3187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value<0)
3189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
3195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Largest 32-bit unsigned integer value.
3196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
3197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined(__WIN32__) && defined(_MSC_VER)
3198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# define TIFF_UINT32_MAX 0xFFFFFFFFI64
3199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
3200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# define TIFF_UINT32_MAX 0xFFFFFFFFLL
3201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
3202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr
3204793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirEntryCheckRangeLongLong8(uint64 value)
3205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value > TIFF_UINT32_MAX)
3207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr
3213793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirEntryCheckRangeLongSlong8(int64 value)
3214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((value<0) || (value > TIFF_UINT32_MAX))
3216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#undef TIFF_UINT32_MAX
3222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr
3224793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirEntryCheckRangeSlongLong(uint32 value)
3225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value > 0x7FFFFFFFUL)
3227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr
3233793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirEntryCheckRangeSlongLong8(uint64 value)
3234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value > 0x7FFFFFFFUL)
3236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr
3242793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirEntryCheckRangeSlongSlong8(int64 value)
3243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((value < 0L-0x80000000L) || (value > 0x7FFFFFFFL))
3245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr
3251793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirEntryCheckRangeLong8Sbyte(int8 value)
3252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value < 0)
3254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr
3260793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirEntryCheckRangeLong8Sshort(int16 value)
3261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value < 0)
3263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr
3269793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirEntryCheckRangeLong8Slong(int32 value)
3270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value < 0)
3272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr
3278793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirEntryCheckRangeLong8Slong8(int64 value)
3279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value < 0)
3281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
3287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Largest 64-bit signed integer value.
3288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
3289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined(__WIN32__) && defined(_MSC_VER)
3290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# define TIFF_INT64_MAX 0x7FFFFFFFFFFFFFFFI64
3291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
3292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# define TIFF_INT64_MAX 0x7FFFFFFFFFFFFFFFLL
3293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
3294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr
3296793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirEntryCheckRangeSlong8Long8(uint64 value)
3297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (value > TIFF_INT64_MAX)
3299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrRange);
3300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFReadDirEntryErrOk);
3302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#undef TIFF_INT64_MAX
3305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic enum TIFFReadDirEntryErr
3307793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirEntryData(TIFF* tif, uint64 offset, tmsize_t size, void* dest)
3308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(size>0);
3310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!isMapped(tif)) {
3311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!SeekOK(tif,offset))
3312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrIo);
3313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!ReadOK(tif,dest,size))
3314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrIo);
3315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else {
3316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tmsize_t ma,mb;
3317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ma=(tmsize_t)offset;
3318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        mb=ma+size;
3319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (((uint64)ma!=offset)||(mb<ma)||(mb<size)||(mb>tif->tif_size))
3320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(TIFFReadDirEntryErrIo);
3321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFmemcpy(dest,tif->tif_base+ma,size);
3322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(TIFFReadDirEntryErrOk);
3324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void TIFFReadDirEntryOutputErr(TIFF* tif, enum TIFFReadDirEntryErr err, const char* module, const char* tagname, int recover)
3327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!recover) {
3329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        switch (err) {
3330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFReadDirEntryErrCount:
3331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
3332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         "Incorrect count for \"%s\"",
3333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         tagname);
3334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFReadDirEntryErrType:
3336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
3337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         "Incompatible type for \"%s\"",
3338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         tagname);
3339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFReadDirEntryErrIo:
3341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
3342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         "IO error during reading of \"%s\"",
3343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         tagname);
3344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFReadDirEntryErrRange:
3346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
3347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         "Incorrect value for \"%s\"",
3348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         tagname);
3349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFReadDirEntryErrPsdif:
3351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
3352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            "Cannot handle different values per sample for \"%s\"",
3353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         tagname);
3354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFReadDirEntryErrSizesan:
3356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
3357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "Sanity check on size of \"%s\" value failed",
3358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         tagname);
3359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFReadDirEntryErrAlloc:
3361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
3362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         "Out of memory reading of \"%s\"",
3363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         tagname);
3364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            default:
3366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(0);   /* we should never get here */
3367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
3369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else {
3370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        switch (err) {
3371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFReadDirEntryErrCount:
3372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
3373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "Incorrect count for \"%s\"; tag ignored",
3374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         tagname);
3375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFReadDirEntryErrType:
3377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFWarningExt(tif->tif_clientdata, module,
3378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "Incompatible type for \"%s\"; tag ignored",
3379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                           tagname);
3380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFReadDirEntryErrIo:
3382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFWarningExt(tif->tif_clientdata, module,
3383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            "IO error during reading of \"%s\"; tag ignored",
3384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                           tagname);
3385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFReadDirEntryErrRange:
3387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFWarningExt(tif->tif_clientdata, module,
3388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "Incorrect value for \"%s\"; tag ignored",
3389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                           tagname);
3390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFReadDirEntryErrPsdif:
3392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFWarningExt(tif->tif_clientdata, module,
3393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    "Cannot handle different values per sample for \"%s\"; tag ignored",
3394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                           tagname);
3395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFReadDirEntryErrSizesan:
3397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFWarningExt(tif->tif_clientdata, module,
3398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        "Sanity check on size of \"%s\" value failed; tag ignored",
3399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                           tagname);
3400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFReadDirEntryErrAlloc:
3402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFWarningExt(tif->tif_clientdata, module,
3403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "Out of memory reading of \"%s\"; tag ignored",
3404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                           tagname);
3405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            default:
3407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(0);   /* we should never get here */
3408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
3410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
3412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
3414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Read the next TIFF directory from a file and convert it to the internal
3415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * format. We read directories sequentially.
3416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
3417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint
3418793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirectory(TIFF* tif)
3419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
3420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static const char module[] = "TIFFReadDirectory";
3421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFDirEntry* dir;
3422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16 dircount;
3423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFDirEntry* dp;
3424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16 di;
3425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const TIFFField* fip;
3426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 fii=FAILED_FII;
3427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        toff_t nextdiroff;
3428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_diroff=tif->tif_nextdiroff;
3429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!TIFFCheckDirOffset(tif,tif->tif_nextdiroff))
3430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return 0;           /* last offset or bad offset (IFD looping) */
3431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (*tif->tif_cleanup)(tif);   /* cleanup any previous compression state */
3432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_curdir++;
3433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        nextdiroff = tif->tif_nextdiroff;
3434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    dircount=TIFFFetchDirectory(tif,nextdiroff,&dir,&tif->tif_nextdiroff);
3435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!dircount)
3436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
3437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFErrorExt(tif->tif_clientdata,module,
3438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            "Failed to read directory at offset " TIFF_UINT64_FORMAT,nextdiroff);
3439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return 0;
3440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFReadDirectoryCheckOrder(tif,dir,dircount);
3442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /*
3444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * Mark duplicates of any tag to be ignored (bugzilla 1994)
3445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * to avoid certain pathological problems.
3446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         */
3447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
3448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFDirEntry* ma;
3449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint16 mb;
3450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for (ma=dir, mb=0; mb<dircount; ma++, mb++)
3451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
3452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFDirEntry* na;
3453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            uint16 nb;
3454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            for (na=ma+1, nb=mb+1; nb<dircount; na++, nb++)
3455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
3456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (ma->tdir_tag==na->tdir_tag)
3457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    na->tdir_tag=IGNORE;
3458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
3459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
3460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_flags &= ~TIFF_BEENWRITING;    /* reset before new dir */
3463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_flags &= ~TIFF_BUF4WRITE;      /* reset before new dir */
3464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* free any old stuff and reinit */
3465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFFreeDirectory(tif);
3466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFDefaultDirectory(tif);
3467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
3468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * Electronic Arts writes gray-scale TIFF files
3469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * without a PlanarConfiguration directory entry.
3470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * Thus we setup a default value here, even though
3471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * the TIFF spec says there is no default value.
3472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
3473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFSetField(tif,TIFFTAG_PLANARCONFIG,PLANARCONFIG_CONTIG);
3474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
3475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * Setup default value and then make a pass over
3476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * the fields to check type and tag information,
3477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * and to extract info required to size data
3478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * structures.  A second pass is made afterwards
3479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * to read in everthing not taken in the first pass.
3480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * But we must process the Compression tag first
3481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * in order to merge in codec-private tag definitions (otherwise
3482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * we may get complaints about unknown tags).  However, the
3483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * Compression tag may be dependent on the SamplesPerPixel
3484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * tag value because older TIFF specs permited Compression
3485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * to be written as a SamplesPerPixel-count tag entry.
3486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * Thus if we don't first figure out the correct SamplesPerPixel
3487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * tag value then we may end up ignoring the Compression tag
3488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * value because it has an incorrect count value (if the
3489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * true value of SamplesPerPixel is not 1).
3490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
3491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_SAMPLESPERPIXEL);
3492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (dp)
3493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
3494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!TIFFFetchNormalTag(tif,dp,0))
3495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            goto bad;
3496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        dp->tdir_tag=IGNORE;
3497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_COMPRESSION);
3499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (dp)
3500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
3501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /*
3502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * The 5.0 spec says the Compression tag has one value, while
3503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * earlier specs say it has one value per sample.  Because of
3504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * this, we accept the tag if one value is supplied with either
3505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * count.
3506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         */
3507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint16 value;
3508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        enum TIFFReadDirEntryErr err;
3509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        err=TIFFReadDirEntryShort(tif,dp,&value);
3510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (err==TIFFReadDirEntryErrCount)
3511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            err=TIFFReadDirEntryPersampleShort(tif,dp,&value);
3512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (err!=TIFFReadDirEntryErrOk)
3513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
3514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFReadDirEntryOutputErr(tif,err,module,"Compression",0);
3515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            goto bad;
3516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
3517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!TIFFSetField(tif,TIFFTAG_COMPRESSION,value))
3518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            goto bad;
3519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        dp->tdir_tag=IGNORE;
3520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
3522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
3523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!TIFFSetField(tif,TIFFTAG_COMPRESSION,COMPRESSION_NONE))
3524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            goto bad;
3525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
3527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * First real pass over the directory.
3528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
3529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for (di=0, dp=dir; di<dircount; di++, dp++)
3530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
3531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (dp->tdir_tag!=IGNORE)
3532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
3533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
3534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (fii == FAILED_FII)
3535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
3536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFWarningExt(tif->tif_clientdata, module,
3537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "Unknown field with tag %d (0x%x) encountered",
3538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    dp->tdir_tag,dp->tdir_tag);
3539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                /* the following knowingly leaks the
3540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                   anonymous field structure */
3541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (!_TIFFMergeFields(tif,
3542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    _TIFFCreateAnonField(tif,
3543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        dp->tdir_tag,
3544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        (TIFFDataType) dp->tdir_type),
3545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    1)) {
3546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    TIFFWarningExt(tif->tif_clientdata,
3547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        module,
3548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        "Registering anonymous field with tag %d (0x%x) failed",
3549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        dp->tdir_tag,
3550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        dp->tdir_tag);
3551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    dp->tdir_tag=IGNORE;
3552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                } else {
3553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
3554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    assert(fii != FAILED_FII);
3555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
3556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
3557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
3558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (dp->tdir_tag!=IGNORE)
3559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
3560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            fip=tif->tif_fields[fii];
3561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (fip->field_bit==FIELD_IGNORE)
3562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                dp->tdir_tag=IGNORE;
3563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            else
3564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
3565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                switch (dp->tdir_tag)
3566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
3567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    case TIFFTAG_STRIPOFFSETS:
3568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    case TIFFTAG_STRIPBYTECOUNTS:
3569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    case TIFFTAG_TILEOFFSETS:
3570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    case TIFFTAG_TILEBYTECOUNTS:
3571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSetFieldBit(tif,fip->field_bit);
3572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
3573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    case TIFFTAG_IMAGEWIDTH:
3574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    case TIFFTAG_IMAGELENGTH:
3575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    case TIFFTAG_IMAGEDEPTH:
3576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    case TIFFTAG_TILELENGTH:
3577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    case TIFFTAG_TILEWIDTH:
3578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    case TIFFTAG_TILEDEPTH:
3579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    case TIFFTAG_PLANARCONFIG:
3580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    case TIFFTAG_ROWSPERSTRIP:
3581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    case TIFFTAG_EXTRASAMPLES:
3582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (!TIFFFetchNormalTag(tif,dp,0))
3583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            goto bad;
3584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        dp->tdir_tag=IGNORE;
3585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
3586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
3587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
3588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
3589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
3591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * XXX: OJPEG hack.
3592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * If a) compression is OJPEG, b) planarconfig tag says it's separate,
3593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * c) strip offsets/bytecounts tag are both present and
3594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * d) both contain exactly one value, then we consistently find
3595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * that the buggy implementation of the buggy compression scheme
3596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * matches contig planarconfig best. So we 'fix-up' the tag here
3597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
3598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((tif->tif_dir.td_compression==COMPRESSION_OJPEG)&&
3599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        (tif->tif_dir.td_planarconfig==PLANARCONFIG_SEPARATE))
3600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
3601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!_TIFFFillStriles(tif))
3602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            goto bad;
3603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_STRIPOFFSETS);
3604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if ((dp!=0)&&(dp->tdir_count==1))
3605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
3606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,
3607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFTAG_STRIPBYTECOUNTS);
3608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if ((dp!=0)&&(dp->tdir_count==1))
3609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
3610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                tif->tif_dir.td_planarconfig=PLANARCONFIG_CONTIG;
3611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFWarningExt(tif->tif_clientdata,module,
3612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "Planarconfig tag value assumed incorrect, "
3613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "assuming data is contig instead of chunky");
3614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
3615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
3616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
3618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * Allocate directory structure and setup defaults.
3619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
3620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS))
3621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
3622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        MissingRequired(tif,"ImageLength");
3623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        goto bad;
3624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
3626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * Setup appropriate structures (by strip or by tile)
3627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
3628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) {
3629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tif->tif_dir.td_nstrips = TIFFNumberOfStrips(tif);
3630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tif->tif_dir.td_tilewidth = tif->tif_dir.td_imagewidth;
3631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tif->tif_dir.td_tilelength = tif->tif_dir.td_rowsperstrip;
3632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tif->tif_dir.td_tiledepth = tif->tif_dir.td_imagedepth;
3633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tif->tif_flags &= ~TIFF_ISTILED;
3634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else {
3635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tif->tif_dir.td_nstrips = TIFFNumberOfTiles(tif);
3636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tif->tif_flags |= TIFF_ISTILED;
3637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!tif->tif_dir.td_nstrips) {
3639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFErrorExt(tif->tif_clientdata, module,
3640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            "Cannot handle zero number of %s",
3641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            isTiled(tif) ? "tiles" : "strips");
3642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        goto bad;
3643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_dir.td_stripsperimage = tif->tif_dir.td_nstrips;
3645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE)
3646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tif->tif_dir.td_stripsperimage /= tif->tif_dir.td_samplesperpixel;
3647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!TIFFFieldSet(tif, FIELD_STRIPOFFSETS)) {
3648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if ((tif->tif_dir.td_compression==COMPRESSION_OJPEG) &&
3649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            (isTiled(tif)==0) &&
3650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            (tif->tif_dir.td_nstrips==1)) {
3651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            /*
3652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * XXX: OJPEG hack.
3653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * If a) compression is OJPEG, b) it's not a tiled TIFF,
3654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * and c) the number of strips is 1,
3655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * then we tolerate the absence of stripoffsets tag,
3656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * because, presumably, all required data is in the
3657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * JpegInterchangeFormat stream.
3658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             */
3659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS);
3660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        } else {
3661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            MissingRequired(tif,
3662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                isTiled(tif) ? "TileOffsets" : "StripOffsets");
3663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            goto bad;
3664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
3665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
3667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * Second pass: extract other information.
3668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
3669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for (di=0, dp=dir; di<dircount; di++, dp++)
3670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
3671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        switch (dp->tdir_tag)
3672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
3673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case IGNORE:
3674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFTAG_MINSAMPLEVALUE:
3676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFTAG_MAXSAMPLEVALUE:
3677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFTAG_BITSPERSAMPLE:
3678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFTAG_DATATYPE:
3679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFTAG_SAMPLEFORMAT:
3680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                /*
3681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * The MinSampleValue, MaxSampleValue, BitsPerSample
3682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * DataType and SampleFormat tags are supposed to be
3683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * written as one value/sample, but some vendors
3684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * incorrectly write one value only -- so we accept
3685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * that as well (yech). Other vendors write correct
3686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * value for NumberOfSamples, but incorrect one for
3687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * BitsPerSample and friends, and we will read this
3688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * too.
3689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 */
3690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
3691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    uint16 value;
3692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    enum TIFFReadDirEntryErr err;
3693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryShort(tif,dp,&value);
3694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err==TIFFReadDirEntryErrCount)
3695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        err=TIFFReadDirEntryPersampleShort(tif,dp,&value);
3696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
3697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
3698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        fip = TIFFFieldWithTag(tif,dp->tdir_tag);
3699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0);
3700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        goto bad;
3701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
3702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!TIFFSetField(tif,dp->tdir_tag,value))
3703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        goto bad;
3704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
3705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFTAG_SMINSAMPLEVALUE:
3707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFTAG_SMAXSAMPLEVALUE:
3708793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
3709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    double *data;
3711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    enum TIFFReadDirEntryErr err;
3712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    uint32 saved_flags;
3713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    int m;
3714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (dp->tdir_count != (uint64)tif->tif_dir.td_samplesperpixel)
3715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        err = TIFFReadDirEntryErrCount;
3716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    else
3717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
3718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
3719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
3720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        fip = TIFFFieldWithTag(tif,dp->tdir_tag);
3721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0);
3722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        goto bad;
3723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
3724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    saved_flags = tif->tif_flags;
3725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    tif->tif_flags |= TIFF_PERSAMPLE;
3726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m = TIFFSetField(tif,dp->tdir_tag,data);
3727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    tif->tif_flags = saved_flags;
3728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    _TIFFfree(data);
3729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!m)
3730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        goto bad;
3731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
3732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFTAG_STRIPOFFSETS:
3734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFTAG_TILEOFFSETS:
3735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined(DEFER_STRILE_LOAD)
3736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                _TIFFmemcpy( &(tif->tif_dir.td_stripoffset_entry),
3737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                             dp, sizeof(TIFFDirEntry) );
3738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
3739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (!TIFFFetchStripThing(tif,dp,tif->tif_dir.td_nstrips,&tif->tif_dir.td_stripoffset))
3740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    goto bad;
3741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
3742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFTAG_STRIPBYTECOUNTS:
3744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFTAG_TILEBYTECOUNTS:
3745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined(DEFER_STRILE_LOAD)
3746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                _TIFFmemcpy( &(tif->tif_dir.td_stripbytecount_entry),
3747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                             dp, sizeof(TIFFDirEntry) );
3748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
3749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (!TIFFFetchStripThing(tif,dp,tif->tif_dir.td_nstrips,&tif->tif_dir.td_stripbytecount))
3750793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    goto bad;
3751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
3752793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFTAG_COLORMAP:
3754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFTAG_TRANSFERFUNCTION:
3755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
3756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    enum TIFFReadDirEntryErr err;
3757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    uint32 countpersample;
3758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    uint32 countrequired;
3759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    uint32 incrementpersample;
3760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    uint16* value=NULL;
3761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    countpersample=(1L<<tif->tif_dir.td_bitspersample);
3762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if ((dp->tdir_tag==TIFFTAG_TRANSFERFUNCTION)&&(dp->tdir_count==(uint64)countpersample))
3763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
3764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        countrequired=countpersample;
3765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        incrementpersample=0;
3766793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
3767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    else
3768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
3769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        countrequired=3*countpersample;
3770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        incrementpersample=countpersample;
3771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
3772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (dp->tdir_count!=(uint64)countrequired)
3773793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        err=TIFFReadDirEntryErrCount;
3774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    else
3775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        err=TIFFReadDirEntryShortArray(tif,dp,&value);
3776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err!=TIFFReadDirEntryErrOk)
3777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
3778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        fip = TIFFFieldWithTag(tif,dp->tdir_tag);
3779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",1);
3780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
3781793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    else
3782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
3783793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFSetField(tif,dp->tdir_tag,value,value+incrementpersample,value+2*incrementpersample);
3784793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(value);
3785793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
3786793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
3787793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3788793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* BEGIN REV 4.0 COMPATIBILITY */
3789793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            case TIFFTAG_OSUBFILETYPE:
3790793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
3791793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    uint16 valueo;
3792793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    uint32 value;
3793793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (TIFFReadDirEntryShort(tif,dp,&valueo)==TIFFReadDirEntryErrOk)
3794793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
3795793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        switch (valueo)
3796793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        {
3797793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            case OFILETYPE_REDUCEDIMAGE: value=FILETYPE_REDUCEDIMAGE; break;
3798793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            case OFILETYPE_PAGE: value=FILETYPE_PAGE; break;
3799793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            default: value=0; break;
3800793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        }
3801793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (value!=0)
3802793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            TIFFSetField(tif,TIFFTAG_SUBFILETYPE,value);
3803793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
3804793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
3805793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3806793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* END REV 4.0 COMPATIBILITY */
3807793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            default:
3808793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                (void) TIFFFetchNormalTag(tif, dp, TRUE);
3809793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
3810793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
3811793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3812793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
3813793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * OJPEG hack:
3814793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * - If a) compression is OJPEG, and b) photometric tag is missing,
3815793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * then we consistently find that photometric should be YCbCr
3816793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * - If a) compression is OJPEG, and b) photometric tag says it's RGB,
3817793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * then we consistently find that the buggy implementation of the
3818793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * buggy compression scheme matches photometric YCbCr instead.
3819793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * - If a) compression is OJPEG, and b) bitspersample tag is missing,
3820793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * then we consistently find bitspersample should be 8.
3821793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * - If a) compression is OJPEG, b) samplesperpixel tag is missing,
3822793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * and c) photometric is RGB or YCbCr, then we consistently find
3823793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * samplesperpixel should be 3
3824793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * - If a) compression is OJPEG, b) samplesperpixel tag is missing,
3825793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * and c) photometric is MINISWHITE or MINISBLACK, then we consistently
3826793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * find samplesperpixel should be 3
3827793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
3828793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_dir.td_compression==COMPRESSION_OJPEG)
3829793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
3830793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!TIFFFieldSet(tif,FIELD_PHOTOMETRIC))
3831793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
3832793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFWarningExt(tif->tif_clientdata, module,
3833793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "Photometric tag is missing, assuming data is YCbCr");
3834793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (!TIFFSetField(tif,TIFFTAG_PHOTOMETRIC,PHOTOMETRIC_YCBCR))
3835793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                goto bad;
3836793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
3837793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else if (tif->tif_dir.td_photometric==PHOTOMETRIC_RGB)
3838793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
3839793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            tif->tif_dir.td_photometric=PHOTOMETRIC_YCBCR;
3840793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFWarningExt(tif->tif_clientdata, module,
3841793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "Photometric tag value assumed incorrect, "
3842793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "assuming data is YCbCr instead of RGB");
3843793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
3844793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!TIFFFieldSet(tif,FIELD_BITSPERSAMPLE))
3845793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
3846793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFWarningExt(tif->tif_clientdata,module,
3847793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "BitsPerSample tag is missing, assuming 8 bits per sample");
3848793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (!TIFFSetField(tif,TIFFTAG_BITSPERSAMPLE,8))
3849793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                goto bad;
3850793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
3851793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
3852793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
3853793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_dir.td_photometric==PHOTOMETRIC_RGB)
3854793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
3855793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFWarningExt(tif->tif_clientdata,module,
3856793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "SamplesPerPixel tag is missing, "
3857793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "assuming correct SamplesPerPixel value is 3");
3858793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,3))
3859793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    goto bad;
3860793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
3861793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_dir.td_photometric==PHOTOMETRIC_YCBCR)
3862793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
3863793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFWarningExt(tif->tif_clientdata,module,
3864793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "SamplesPerPixel tag is missing, "
3865793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "applying correct SamplesPerPixel value of 3");
3866793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,3))
3867793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    goto bad;
3868793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
3869793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            else if ((tif->tif_dir.td_photometric==PHOTOMETRIC_MINISWHITE)
3870793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 || (tif->tif_dir.td_photometric==PHOTOMETRIC_MINISBLACK))
3871793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
3872793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                /*
3873793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * SamplesPerPixel tag is missing, but is not required
3874793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 * by spec.  Assume correct SamplesPerPixel value of 1.
3875793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 */
3876793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,1))
3877793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    goto bad;
3878793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
3879793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
3880793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3881793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
3882793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * Verify Palette image has a Colormap.
3883793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
3884793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_dir.td_photometric == PHOTOMETRIC_PALETTE &&
3885793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        !TIFFFieldSet(tif, FIELD_COLORMAP)) {
3886793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if ( tif->tif_dir.td_bitspersample>=8 && tif->tif_dir.td_samplesperpixel==3)
3887793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            tif->tif_dir.td_photometric = PHOTOMETRIC_RGB;
3888793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else if (tif->tif_dir.td_bitspersample>=8)
3889793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            tif->tif_dir.td_photometric = PHOTOMETRIC_MINISBLACK;
3890793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else {
3891793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            MissingRequired(tif, "Colormap");
3892793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            goto bad;
3893793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
3894793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3895793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
3896793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * OJPEG hack:
3897793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * We do no further messing with strip/tile offsets/bytecounts in OJPEG
3898793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * TIFFs
3899793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
3900793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_dir.td_compression!=COMPRESSION_OJPEG)
3901793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
3902793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /*
3903793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * Attempt to deal with a missing StripByteCounts tag.
3904793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         */
3905793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!TIFFFieldSet(tif, FIELD_STRIPBYTECOUNTS)) {
3906793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            /*
3907793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * Some manufacturers violate the spec by not giving
3908793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * the size of the strips.  In this case, assume there
3909793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * is one uncompressed strip of data.
3910793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             */
3911793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if ((tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG &&
3912793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                tif->tif_dir.td_nstrips > 1) ||
3913793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                (tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE &&
3914793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 tif->tif_dir.td_nstrips != (uint32)tif->tif_dir.td_samplesperpixel)) {
3915793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                MissingRequired(tif, "StripByteCounts");
3916793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                goto bad;
3917793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
3918793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFWarningExt(tif->tif_clientdata, module,
3919793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "TIFF directory is missing required "
3920793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "\"StripByteCounts\" field, calculating from imagelength");
3921793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (EstimateStripByteCounts(tif, dir, dircount) < 0)
3922793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                goto bad;
3923793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /*
3924793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * Assume we have wrong StripByteCount value (in case
3925793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * of single strip) in following cases:
3926793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         *   - it is equal to zero along with StripOffset;
3927793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         *   - it is larger than file itself (in case of uncompressed
3928793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         *     image);
3929793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         *   - it is smaller than the size of the bytes per row
3930793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         *     multiplied on the number of rows.  The last case should
3931793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         *     not be checked in the case of writing new image,
3932793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         *     because we may do not know the exact strip size
3933793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         *     until the whole image will be written and directory
3934793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         *     dumped out.
3935793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         */
3936793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        #define	BYTECOUNTLOOKSBAD \
3937793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            ( (tif->tif_dir.td_stripbytecount[0] == 0 && tif->tif_dir.td_stripoffset[0] != 0) || \
3938793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler              (tif->tif_dir.td_compression == COMPRESSION_NONE && \
3939793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               tif->tif_dir.td_stripbytecount[0] > TIFFGetFileSize(tif) - tif->tif_dir.td_stripoffset[0]) || \
3940793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler              (tif->tif_mode == O_RDONLY && \
3941793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               tif->tif_dir.td_compression == COMPRESSION_NONE && \
3942793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               tif->tif_dir.td_stripbytecount[0] < TIFFScanlineSize64(tif) * tif->tif_dir.td_imagelength) )
3943793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3944793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        } else if (tif->tif_dir.td_nstrips == 1
3945793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                           && _TIFFFillStriles(tif)
3946793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               && tif->tif_dir.td_stripoffset[0] != 0
3947793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               && BYTECOUNTLOOKSBAD) {
3948793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            /*
3949793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * XXX: Plexus (and others) sometimes give a value of
3950793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * zero for a tag when they don't know what the
3951793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * correct value is!  Try and handle the simple case
3952793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * of estimating the size of a one strip image.
3953793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             */
3954793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFWarningExt(tif->tif_clientdata, module,
3955793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "Bogus \"StripByteCounts\" field, ignoring and calculating from imagelength");
3956793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if(EstimateStripByteCounts(tif, dir, dircount) < 0)
3957793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                goto bad;
3958793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3959793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if !defined(DEFER_STRILE_LOAD)
3960793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        } else if (tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG
3961793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               && tif->tif_dir.td_nstrips > 2
3962793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               && tif->tif_dir.td_compression == COMPRESSION_NONE
3963793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               && tif->tif_dir.td_stripbytecount[0] != tif->tif_dir.td_stripbytecount[1]
3964793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               && tif->tif_dir.td_stripbytecount[0] != 0
3965793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               && tif->tif_dir.td_stripbytecount[1] != 0 ) {
3966793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            /*
3967793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * XXX: Some vendors fill StripByteCount array with
3968793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * absolutely wrong values (it can be equal to
3969793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * StripOffset array, for example). Catch this case
3970793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * here.
3971793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         *
3972793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         * We avoid this check if deferring strile loading
3973793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         * as it would always force us to load the strip/tile
3974793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         * information.
3975793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             */
3976793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFWarningExt(tif->tif_clientdata, module,
3977793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "Wrong \"StripByteCounts\" field, ignoring and calculating from imagelength");
3978793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (EstimateStripByteCounts(tif, dir, dircount) < 0)
3979793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                goto bad;
3980793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* !defined(DEFER_STRILE_LOAD) */
3981793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
3982793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3983793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (dir)
3984793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
3985793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(dir);
3986793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        dir=NULL;
3987793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3988793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE))
3989793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
3990793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (tif->tif_dir.td_bitspersample>=16)
3991793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            tif->tif_dir.td_maxsamplevalue=0xFFFF;
3992793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else
3993793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            tif->tif_dir.td_maxsamplevalue = (uint16)((1L<<tif->tif_dir.td_bitspersample)-1);
3994793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
3995793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
3996793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * XXX: We can optimize checking for the strip bounds using the sorted
3997793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * bytecounts array. See also comments for TIFFAppendToStrip()
3998793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * function in tif_write.c.
3999793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
4000793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if !defined(DEFER_STRILE_LOAD)
4001793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_dir.td_nstrips > 1) {
4002793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint32 strip;
4003793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4004793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tif->tif_dir.td_stripbytecountsorted = 1;
4005793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for (strip = 1; strip < tif->tif_dir.td_nstrips; strip++) {
4006793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_dir.td_stripoffset[strip - 1] >
4007793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                tif->tif_dir.td_stripoffset[strip]) {
4008793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                tif->tif_dir.td_stripbytecountsorted = 0;
4009793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
4010793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4011793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4012793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4013793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* !defined(DEFER_STRILE_LOAD) */
4014793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4015793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
4016793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * An opportunity for compression mode dependent tag fixup
4017793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
4018793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (*tif->tif_fixuptags)(tif);
4019793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4020793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
4021793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * Some manufacturers make life difficult by writing
4022793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * large amounts of uncompressed data as a single strip.
4023793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * This is contrary to the recommendations of the spec.
4024793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * The following makes an attempt at breaking such images
4025793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * into strips closer to the recommended 8k bytes.  A
4026793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * side effect, however, is that the RowsPerStrip tag
4027793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * value may be changed.
4028793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
4029793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG)&&
4030793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        (tif->tif_dir.td_nstrips==1)&&
4031793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        (tif->tif_dir.td_compression==COMPRESSION_NONE)&&
4032793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ((tif->tif_flags&(TIFF_STRIPCHOP|TIFF_ISTILED))==TIFF_STRIPCHOP))
4033793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
4034793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if ( !_TIFFFillStriles(tif) || !tif->tif_dir.td_stripbytecount )
4035793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return 0;
4036793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ChopUpSingleUncompressedStrip(tif);
4037793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4038793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4039793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /*
4040793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * Clear the dirty directory flag.
4041793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         */
4042793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_flags &= ~TIFF_DIRTYDIRECT;
4043793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_flags &= ~TIFF_DIRTYSTRIP;
4044793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4045793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
4046793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * Reinitialize i/o since we are starting on a new directory.
4047793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
4048793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_row = (uint32) -1;
4049793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_curstrip = (uint32) -1;
4050793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_col = (uint32) -1;
4051793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_curtile = (uint32) -1;
4052793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_tilesize = (tmsize_t) -1;
4053793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4054793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_scanlinesize = TIFFScanlineSize(tif);
4055793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!tif->tif_scanlinesize) {
4056793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFErrorExt(tif->tif_clientdata, module,
4057793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            "Cannot handle zero scanline size");
4058793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return (0);
4059793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4060793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4061793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (isTiled(tif)) {
4062793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tif->tif_tilesize = TIFFTileSize(tif);
4063793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!tif->tif_tilesize) {
4064793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFErrorExt(tif->tif_clientdata, module,
4065793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                 "Cannot handle zero tile size");
4066793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return (0);
4067793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4068793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else {
4069793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!TIFFStripSize(tif)) {
4070793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFErrorExt(tif->tif_clientdata, module,
4071793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "Cannot handle zero strip size");
4072793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return (0);
4073793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4074793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4075793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return (1);
4076793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerbad:
4077793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (dir)
4078793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(dir);
4079793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return (0);
4080793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
4081793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4082793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void
4083793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirectoryCheckOrder(TIFF* tif, TIFFDirEntry* dir, uint16 dircount)
4084793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
4085793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static const char module[] = "TIFFReadDirectoryCheckOrder";
4086793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16 m;
4087793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16 n;
4088793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFDirEntry* o;
4089793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    m=0;
4090793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for (n=0, o=dir; n<dircount; n++, o++)
4091793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
4092793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (o->tdir_tag<m)
4093793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
4094793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFWarningExt(tif->tif_clientdata,module,
4095793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "Invalid TIFF directory; tags are not sorted in ascending order");
4096793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4097793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4098793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        m=o->tdir_tag+1;
4099793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
4101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic TIFFDirEntry*
4103793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirectoryFindEntry(TIFF* tif, TIFFDirEntry* dir, uint16 dircount, uint16 tagid)
4104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
4105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFDirEntry* m;
4106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16 n;
4107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (void) tif;
4108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for (m=dir, n=0; n<dircount; m++, n++)
4109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
4110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (m->tdir_tag==tagid)
4111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(m);
4112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(0);
4114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
4115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void
4117793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadDirectoryFindFieldInfo(TIFF* tif, uint16 tagid, uint32* fii)
4118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
4119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int32 ma,mb,mc;
4120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ma=-1;
4121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    mc=(int32)tif->tif_nfields;
4122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    while (1)
4123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
4124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (ma+1==mc)
4125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
4126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *fii = FAILED_FII;
4127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return;
4128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        mb=(ma+mc)/2;
4130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (tif->tif_fields[mb]->field_tag==(uint32)tagid)
4131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (tif->tif_fields[mb]->field_tag<(uint32)tagid)
4133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            ma=mb;
4134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else
4135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            mc=mb;
4136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    while (1)
4138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
4139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (mb==0)
4140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (tif->tif_fields[mb-1]->field_tag!=(uint32)tagid)
4142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        mb--;
4144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *fii=mb;
4146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
4147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
4149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Read custom directory from the arbitarry offset.
4150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * The code is very similar to TIFFReadDirectory().
4151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
4152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint
4153793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadCustomDirectory(TIFF* tif, toff_t diroff,
4154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            const TIFFFieldArray* infoarray)
4155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
4156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static const char module[] = "TIFFReadCustomDirectory";
4157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFDirEntry* dir;
4158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16 dircount;
4159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFDirEntry* dp;
4160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16 di;
4161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const TIFFField* fip;
4162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 fii;
4163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFSetupFields(tif, infoarray);
4164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    dircount=TIFFFetchDirectory(tif,diroff,&dir,NULL);
4165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!dircount)
4166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
4167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFErrorExt(tif->tif_clientdata,module,
4168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            "Failed to read custom directory at offset " TIFF_UINT64_FORMAT,diroff);
4169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return 0;
4170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFFreeDirectory(tif);
4172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFmemset(&tif->tif_dir, 0, sizeof(TIFFDirectory));
4173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFReadDirectoryCheckOrder(tif,dir,dircount);
4174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for (di=0, dp=dir; di<dircount; di++, dp++)
4175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
4176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
4177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (fii == FAILED_FII)
4178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
4179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFWarningExt(tif->tif_clientdata, module,
4180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "Unknown field with tag %d (0x%x) encountered",
4181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                dp->tdir_tag, dp->tdir_tag);
4182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (!_TIFFMergeFields(tif, _TIFFCreateAnonField(tif,
4183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        dp->tdir_tag,
4184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        (TIFFDataType) dp->tdir_type),
4185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         1)) {
4186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFWarningExt(tif->tif_clientdata, module,
4187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "Registering anonymous field with tag %d (0x%x) failed",
4188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    dp->tdir_tag, dp->tdir_tag);
4189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                dp->tdir_tag=IGNORE;
4190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            } else {
4191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
4192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert( fii != FAILED_FII );
4193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (dp->tdir_tag!=IGNORE)
4196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
4197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            fip=tif->tif_fields[fii];
4198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (fip->field_bit==FIELD_IGNORE)
4199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                dp->tdir_tag=IGNORE;
4200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            else
4201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                /* check data type */
4203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                while ((fip->field_type!=TIFF_ANY)&&(fip->field_type!=dp->tdir_type))
4204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    fii++;
4206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if ((fii==tif->tif_nfields)||
4207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        (tif->tif_fields[fii]->field_tag!=(uint32)dp->tdir_tag))
4208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
4209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        fii=0xFFFF;
4210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
4211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
4212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    fip=tif->tif_fields[fii];
4213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (fii==0xFFFF)
4215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    TIFFWarningExt(tif->tif_clientdata, module,
4217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        "Wrong data type %d for \"%s\"; tag ignored",
4218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        dp->tdir_type,fip->field_name);
4219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    dp->tdir_tag=IGNORE;
4220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                else
4222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    /* check count if known in advance */
4224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if ((fip->field_readcount!=TIFF_VARIABLE)&&
4225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        (fip->field_readcount!=TIFF_VARIABLE2))
4226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
4227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        uint32 expected;
4228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (fip->field_readcount==TIFF_SPP)
4229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            expected=(uint32)tif->tif_dir.td_samplesperpixel;
4230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        else
4231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            expected=(uint32)fip->field_readcount;
4232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (!CheckDirCount(tif,dp,expected))
4233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            dp->tdir_tag=IGNORE;
4234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
4235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            switch (dp->tdir_tag)
4238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                case IGNORE:
4240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    break;
4241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                case EXIFTAG_SUBJECTDISTANCE:
4242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    (void) TIFFFetchSubjectDistance(tif,dp);
4243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    break;
4244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                default:
4245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    (void) TIFFFetchNormalTag(tif, dp, TRUE);
4246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    break;
4247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (dir)
4251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(dir);
4252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return 1;
4253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
4254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
4256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * EXIF is important special case of custom IFD, so we have a special
4257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * function to read it.
4258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
4259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint
4260793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFReadEXIFDirectory(TIFF* tif, toff_t diroff)
4261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
4262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const TIFFFieldArray* exifFieldArray;
4263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    exifFieldArray = _TIFFGetExifFields();
4264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return TIFFReadCustomDirectory(tif, diroff, exifFieldArray);
4265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
4266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic int
4268793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerEstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount)
4269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
4270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static const char module[] = "EstimateStripByteCounts";
4271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFDirEntry *dp;
4273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFDirectory *td = &tif->tif_dir;
4274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 strip;
4275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFFillStriles( tif );
4277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (td->td_stripbytecount)
4279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(td->td_stripbytecount);
4280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    td->td_stripbytecount = (uint64*)
4281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFCheckMalloc(tif, td->td_nstrips, sizeof (uint64),
4282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        "for \"StripByteCounts\" array");
4283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( td->td_stripbytecount == NULL )
4284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return -1;
4285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (td->td_compression != COMPRESSION_NONE) {
4287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint64 space;
4288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint64 filesize;
4289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint16 n;
4290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        filesize = TIFFGetFileSize(tif);
4291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!(tif->tif_flags&TIFF_BIGTIFF))
4292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            space=sizeof(TIFFHeaderClassic)+2+dircount*12+4;
4293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else
4294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            space=sizeof(TIFFHeaderBig)+8+dircount*20+8;
4295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /* calculate amount of space used by indirect values */
4296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for (dp = dir, n = dircount; n > 0; n--, dp++)
4297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
4298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            uint32 typewidth = TIFFDataWidth((TIFFDataType) dp->tdir_type);
4299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            uint64 datasize;
4300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            typewidth = TIFFDataWidth((TIFFDataType) dp->tdir_type);
4301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (typewidth == 0) {
4302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
4303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "Cannot determine size of unknown tag type %d",
4304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    dp->tdir_type);
4305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return -1;
4306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            datasize=(uint64)typewidth*dp->tdir_count;
4308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (!(tif->tif_flags&TIFF_BIGTIFF))
4309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (datasize<=4)
4311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    datasize=0;
4312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            else
4314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (datasize<=8)
4316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    datasize=0;
4317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            space+=datasize;
4319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        space = filesize - space;
4321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
4322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            space /= td->td_samplesperpixel;
4323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for (strip = 0; strip < td->td_nstrips; strip++)
4324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            td->td_stripbytecount[strip] = space;
4325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /*
4326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * This gross hack handles the case were the offset to
4327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * the last strip is past the place where we think the strip
4328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * should begin.  Since a strip of data must be contiguous,
4329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * it's safe to assume that we've overestimated the amount
4330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * of data in the strip and trim this number back accordingly.
4331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         */
4332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        strip--;
4333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (td->td_stripoffset[strip]+td->td_stripbytecount[strip] > filesize)
4334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            td->td_stripbytecount[strip] = filesize - td->td_stripoffset[strip];
4335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else if (isTiled(tif)) {
4336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint64 bytespertile = TIFFTileSize64(tif);
4337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for (strip = 0; strip < td->td_nstrips; strip++)
4339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            td->td_stripbytecount[strip] = bytespertile;
4340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else {
4341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint64 rowbytes = TIFFScanlineSize64(tif);
4342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint32 rowsperstrip = td->td_imagelength/td->td_stripsperimage;
4343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for (strip = 0; strip < td->td_nstrips; strip++)
4344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            td->td_stripbytecount[strip] = rowbytes * rowsperstrip;
4345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
4347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!TIFFFieldSet(tif, FIELD_ROWSPERSTRIP))
4348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        td->td_rowsperstrip = td->td_imagelength;
4349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return 1;
4350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
4351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void
4353793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerMissingRequired(TIFF* tif, const char* tagname)
4354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
4355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static const char module[] = "MissingRequired";
4356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFErrorExt(tif->tif_clientdata, module,
4358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        "TIFF directory is missing required \"%s\" field",
4359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tagname);
4360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
4361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
4363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Check the directory offset against the list of already seen directory
4364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * offsets. This is a trick to prevent IFD looping. The one can create TIFF
4365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * file with looped directory pointers. We will maintain a list of already
4366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * seen directories and check every IFD offset against that list.
4367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
4368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic int
4369793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFCheckDirOffset(TIFF* tif, uint64 diroff)
4370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
4371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16 n;
4372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (diroff == 0)			/* no more directories */
4374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return 0;
4375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for (n = 0; n < tif->tif_dirnumber && tif->tif_dirlist; n++) {
4377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (tif->tif_dirlist[n] == diroff)
4378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return 0;
4379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_dirnumber++;
4382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_dirnumber > tif->tif_dirlistsize) {
4384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint64* new_dirlist;
4385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /*
4387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * XXX: Reduce memory allocation granularity of the dirlist
4388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * array.
4389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         */
4390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        new_dirlist = (uint64*)_TIFFCheckRealloc(tif, tif->tif_dirlist,
4391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            tif->tif_dirnumber, 2 * sizeof(uint64), "for IFD list");
4392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!new_dirlist)
4393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return 0;
4394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tif->tif_dirlistsize = 2 * tif->tif_dirnumber;
4395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tif->tif_dirlist = new_dirlist;
4396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_dirlist[tif->tif_dirnumber - 1] = diroff;
4399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return 1;
4401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
4402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
4404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Check the count field of a directory entry against a known value.  The
4405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * caller is expected to skip/ignore the tag if there is a mismatch.
4406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
4407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic int
4408793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCheckDirCount(TIFF* tif, TIFFDirEntry* dir, uint32 count)
4409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
4410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((uint64)count > dir->tdir_count) {
4411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        const TIFFField* fip = TIFFFieldWithTag(tif, dir->tdir_tag);
4412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
4413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    "incorrect count for field \"%s\" (" TIFF_UINT64_FORMAT ", expecting %u); tag ignored",
4414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            fip ? fip->field_name : "unknown tagname",
4415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            dir->tdir_count, count);
4416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return (0);
4417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else if ((uint64)count < dir->tdir_count) {
4418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        const TIFFField* fip = TIFFFieldWithTag(tif, dir->tdir_tag);
4419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
4420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    "incorrect count for field \"%s\" (" TIFF_UINT64_FORMAT ", expecting %u); tag trimmed",
4421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            fip ? fip->field_name : "unknown tagname",
4422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            dir->tdir_count, count);
4423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        dir->tdir_count = count;
4424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return (1);
4425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return (1);
4427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
4428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
4430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Read IFD structure from the specified offset. If the pointer to
4431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * nextdiroff variable has been specified, read it too. Function returns a
4432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * number of fields in the directory or 0 if failed.
4433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
4434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic uint16
4435793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFFetchDirectory(TIFF* tif, uint64 diroff, TIFFDirEntry** pdir,
4436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                   uint64 *nextdiroff)
4437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
4438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static const char module[] = "TIFFFetchDirectory";
4439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* origdir;
4441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16 dircount16;
4442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 dirsize;
4443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFDirEntry* dir;
4444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint8* ma;
4445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFDirEntry* mb;
4446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint16 n;
4447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(pdir);
4449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tif->tif_diroff = diroff;
4451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (nextdiroff)
4452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *nextdiroff = 0;
4453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!isMapped(tif)) {
4454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!SeekOK(tif, tif->tif_diroff)) {
4455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFErrorExt(tif->tif_clientdata, module,
4456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "%s: Seek error accessing TIFF directory",
4457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                tif->tif_name);
4458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return 0;
4459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!(tif->tif_flags&TIFF_BIGTIFF))
4461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
4462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (!ReadOK(tif, &dircount16, sizeof (uint16))) {
4463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
4464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "%s: Can not read TIFF directory count",
4465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    tif->tif_name);
4466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return 0;
4467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags & TIFF_SWAB)
4469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabShort(&dircount16);
4470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (dircount16>4096)
4471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
4473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "Sanity check on directory count failed, this is probably not a valid IFD offset");
4474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return 0;
4475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            dirsize = 12;
4477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        } else {
4478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            uint64 dircount64;
4479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (!ReadOK(tif, &dircount64, sizeof (uint64))) {
4480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
4481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "%s: Can not read TIFF directory count",
4482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    tif->tif_name);
4483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return 0;
4484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags & TIFF_SWAB)
4486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabLong8(&dircount64);
4487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (dircount64>4096)
4488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
4490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "Sanity check on directory count failed, this is probably not a valid IFD offset");
4491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return 0;
4492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            dircount16 = (uint16)dircount64;
4494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            dirsize = 20;
4495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        origdir = _TIFFCheckMalloc(tif, dircount16,
4497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            dirsize, "to read TIFF directory");
4498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (origdir == NULL)
4499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return 0;
4500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!ReadOK(tif, origdir, (tmsize_t)(dircount16*dirsize))) {
4501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFErrorExt(tif->tif_clientdata, module,
4502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "%.100s: Can not read TIFF directory",
4503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                tif->tif_name);
4504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            _TIFFfree(origdir);
4505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return 0;
4506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /*
4508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * Read offset to next directory for sequential scans if
4509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * needed.
4510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         */
4511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (nextdiroff)
4512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
4513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (!(tif->tif_flags&TIFF_BIGTIFF))
4514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 nextdiroff32;
4516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (!ReadOK(tif, &nextdiroff32, sizeof(uint32)))
4517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    nextdiroff32 = 0;
4518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (tif->tif_flags&TIFF_SWAB)
4519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    TIFFSwabLong(&nextdiroff32);
4520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *nextdiroff=nextdiroff32;
4521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            } else {
4522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (!ReadOK(tif, nextdiroff, sizeof(uint64)))
4523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *nextdiroff = 0;
4524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (tif->tif_flags&TIFF_SWAB)
4525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    TIFFSwabLong8(nextdiroff);
4526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else {
4529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tmsize_t m;
4530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tmsize_t off = (tmsize_t) tif->tif_diroff;
4531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if ((uint64)off!=tif->tif_diroff)
4532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
4533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFErrorExt(tif->tif_clientdata,module,"Can not read TIFF directory count");
4534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(0);
4535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /*
4538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * Check for integer overflow when validating the dir_off,
4539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * otherwise a very high offset may cause an OOB read and
4540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * crash the client. Make two comparisons instead of
4541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         *
4542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         *  off + sizeof(uint16) > tif->tif_size
4543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         *
4544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * to avoid overflow.
4545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         */
4546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!(tif->tif_flags&TIFF_BIGTIFF))
4547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
4548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            m=off+sizeof(uint16);
4549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if ((m<off)||(m<(tmsize_t)sizeof(uint16))||(m>tif->tif_size)) {
4550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
4551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "Can not read TIFF directory count");
4552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return 0;
4553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            } else {
4554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                _TIFFmemcpy(&dircount16, tif->tif_base + off,
4555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        sizeof(uint16));
4556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            off += sizeof (uint16);
4558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags & TIFF_SWAB)
4559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabShort(&dircount16);
4560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (dircount16>4096)
4561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
4563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "Sanity check on directory count failed, this is probably not a valid IFD offset");
4564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return 0;
4565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            dirsize = 12;
4567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else
4569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
4570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            tmsize_t m;
4571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            uint64 dircount64;
4572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            m=off+sizeof(uint64);
4573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if ((m<off)||(m<(tmsize_t)sizeof(uint64))||(m>tif->tif_size)) {
4574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
4575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "Can not read TIFF directory count");
4576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return 0;
4577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            } else {
4578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                _TIFFmemcpy(&dircount64, tif->tif_base + off,
4579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        sizeof(uint64));
4580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            off += sizeof (uint64);
4582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags & TIFF_SWAB)
4583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabLong8(&dircount64);
4584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (dircount64>4096)
4585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFErrorExt(tif->tif_clientdata, module,
4587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    "Sanity check on directory count failed, this is probably not a valid IFD offset");
4588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return 0;
4589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            dircount16 = (uint16)dircount64;
4591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            dirsize = 20;
4592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (dircount16 == 0 )
4594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
4595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFErrorExt(tif->tif_clientdata, module,
4596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         "Sanity check on directory count failed, zero tag directories not supported");
4597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return 0;
4598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        origdir = _TIFFCheckMalloc(tif, dircount16,
4600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        dirsize,
4601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        "to read TIFF directory");
4602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (origdir == NULL)
4603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return 0;
4604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        m=off+dircount16*dirsize;
4605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if ((m<off)||(m<(tmsize_t)(dircount16*dirsize))||(m>tif->tif_size)) {
4606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFErrorExt(tif->tif_clientdata, module,
4607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                     "Can not read TIFF directory");
4608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            _TIFFfree(origdir);
4609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return 0;
4610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        } else {
4611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            _TIFFmemcpy(origdir, tif->tif_base + off,
4612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    dircount16 * dirsize);
4613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (nextdiroff) {
4615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            off += dircount16 * dirsize;
4616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (!(tif->tif_flags&TIFF_BIGTIFF))
4617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 nextdiroff32;
4619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                m=off+sizeof(uint32);
4620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if ((m<off)||(m<(tmsize_t)sizeof(uint32))||(m>tif->tif_size))
4621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    nextdiroff32 = 0;
4622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                else
4623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    _TIFFmemcpy(&nextdiroff32, tif->tif_base + off,
4624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            sizeof (uint32));
4625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (tif->tif_flags&TIFF_SWAB)
4626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    TIFFSwabLong(&nextdiroff32);
4627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                *nextdiroff = nextdiroff32;
4628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            else
4630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                m=off+sizeof(uint64);
4632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if ((m<off)||(m<(tmsize_t)sizeof(uint64))||(m>tif->tif_size))
4633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *nextdiroff = 0;
4634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                else
4635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    _TIFFmemcpy(nextdiroff, tif->tif_base + off,
4636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            sizeof (uint64));
4637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (tif->tif_flags&TIFF_SWAB)
4638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    TIFFSwabLong8(nextdiroff);
4639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    dir = (TIFFDirEntry*)_TIFFCheckMalloc(tif, dircount16,
4643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        sizeof(TIFFDirEntry),
4644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        "to read TIFF directory");
4645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (dir==0)
4646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
4647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(origdir);
4648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return 0;
4649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ma=(uint8*)origdir;
4651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    mb=dir;
4652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for (n=0; n<dircount16; n++)
4653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
4654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (tif->tif_flags&TIFF_SWAB)
4655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFSwabShort((uint16*)ma);
4656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        mb->tdir_tag=*(uint16*)ma;
4657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ma+=sizeof(uint16);
4658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (tif->tif_flags&TIFF_SWAB)
4659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFSwabShort((uint16*)ma);
4660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        mb->tdir_type=*(uint16*)ma;
4661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ma+=sizeof(uint16);
4662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!(tif->tif_flags&TIFF_BIGTIFF))
4663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
4664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags&TIFF_SWAB)
4665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabLong((uint32*)ma);
4666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            mb->tdir_count=(uint64)(*(uint32*)ma);
4667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            ma+=sizeof(uint32);
4668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *(uint32*)(&mb->tdir_offset)=*(uint32*)ma;
4669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            ma+=sizeof(uint32);
4670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else
4672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
4673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags&TIFF_SWAB)
4674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabLong8((uint64*)ma);
4675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        mb->tdir_count=TIFFReadUInt64(ma);
4676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            ma+=sizeof(uint64);
4677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            mb->tdir_offset.toff_long8=TIFFReadUInt64(ma);
4678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            ma+=sizeof(uint64);
4679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        mb++;
4681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
4682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(origdir);
4683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *pdir = dir;
4684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return dircount16;
4685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
4686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
4688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Fetch a tag that is not handled by special case code.
4689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
4690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic int
4691793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFFetchNormalTag(TIFF* tif, TIFFDirEntry* dp, int recover)
4692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
4693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static const char module[] = "TIFFFetchNormalTag";
4694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
4695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 fii;
4696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const TIFFField* fip = NULL;
4697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
4698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( fii == FAILED_FII )
4699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
4700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFErrorExt(tif->tif_clientdata, "TIFFFetchNormalTag",
4701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         "No definition found for tag %d",
4702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                         dp->tdir_tag);
4703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return 0;
4704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
4705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fip=tif->tif_fields[fii];
4706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(fip->set_field_type!=TIFF_SETGET_OTHER);  /* if so, we shouldn't arrive here but deal with this in specialized code */
4707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(fip->set_field_type!=TIFF_SETGET_INT);    /* if so, we shouldn't arrive here as this is only the case for pseudo-tags */
4708793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    err=TIFFReadDirEntryErrOk;
4709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch (fip->set_field_type)
4710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
4711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_UNDEFINED:
4712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_ASCII:
4714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* data;
4716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==0);
4717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryByteArray(tif,dp,&data);
4718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
4719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    uint8* ma;
4721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    uint32 mb;
4722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    int n;
4723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    ma=data;
4724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    mb=0;
4725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    while (mb<(uint32)dp->tdir_count)
4726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
4727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (*ma==0)
4728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            break;
4729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        ma++;
4730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        mb++;
4731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
4732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (mb+1<(uint32)dp->tdir_count)
4733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        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);
4734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    else if (mb+1>(uint32)dp->tdir_count)
4735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
4736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        uint8* o;
4737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        TIFFWarningExt(tif->tif_clientdata,module,"ASCII value for tag \"%s\" does not end in null byte",fip->field_name);
4738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if ((uint32)dp->tdir_count+1!=dp->tdir_count+1)
4739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            o=NULL;
4740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        else
4741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            o=_TIFFmalloc((uint32)dp->tdir_count+1);
4742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (o==NULL)
4743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        {
4744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            if (data!=NULL)
4745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                _TIFFfree(data);
4746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            return(0);
4747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        }
4748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFmemcpy(o,data,(uint32)dp->tdir_count);
4749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        o[(uint32)dp->tdir_count]=0;
4750793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (data!=0)
4751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            _TIFFfree(data);
4752793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        data=o;
4753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
4754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    n=TIFFSetField(tif,dp->tdir_tag,data);
4755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (data!=0)
4756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(data);
4757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!n)
4758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
4759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_UINT8:
4763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8 data;
4765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==1);
4766793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==0);
4767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryByte(tif,dp,&data);
4768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
4769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!TIFFSetField(tif,dp->tdir_tag,data))
4771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
4772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4773793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_UINT16:
4776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16 data;
4778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==1);
4779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==0);
4780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryShort(tif,dp,&data);
4781793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
4782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4783793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!TIFFSetField(tif,dp->tdir_tag,data))
4784793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
4785793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4786793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4787793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4788793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_UINT32:
4789793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4790793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32 data;
4791793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==1);
4792793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==0);
4793793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryLong(tif,dp,&data);
4794793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
4795793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4796793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!TIFFSetField(tif,dp->tdir_tag,data))
4797793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
4798793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4799793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4800793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4801793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_UINT64:
4802793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4803793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64 data;
4804793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==1);
4805793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==0);
4806793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryLong8(tif,dp,&data);
4807793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
4808793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4809793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!TIFFSetField(tif,dp->tdir_tag,data))
4810793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
4811793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4812793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4813793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4814793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_FLOAT:
4815793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4816793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float data;
4817793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==1);
4818793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==0);
4819793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryFloat(tif,dp,&data);
4820793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
4821793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4822793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!TIFFSetField(tif,dp->tdir_tag,data))
4823793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
4824793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4825793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4826793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4827793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_DOUBLE:
4828793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4829793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double data;
4830793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==1);
4831793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==0);
4832793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryDouble(tif,dp,&data);
4833793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
4834793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4835793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!TIFFSetField(tif,dp->tdir_tag,data))
4836793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
4837793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4838793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4839793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4840793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_IFD8:
4841793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4842793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64 data;
4843793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==1);
4844793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==0);
4845793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryIfd8(tif,dp,&data);
4846793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
4847793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4848793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!TIFFSetField(tif,dp->tdir_tag,data))
4849793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
4850793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4851793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4852793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4853793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_UINT16_PAIR:
4854793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4855793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* data;
4856793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==2);
4857793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==0);
4858793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (dp->tdir_count!=2)
4859793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return(0);
4860793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryShortArray(tif,dp,&data);
4861793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
4862793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4863793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    int m;
4864793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m=TIFFSetField(tif,dp->tdir_tag,data[0],data[1]);
4865793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    _TIFFfree(data);
4866793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!m)
4867793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
4868793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4869793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4870793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4871793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C0_UINT8:
4872793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4873793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* data;
4874793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount>=1);
4875793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==0);
4876793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (dp->tdir_count!=(uint64)fip->field_readcount)
4877793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                    /* corrupt file */;
4878793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                else
4879793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4880793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryByteArray(tif,dp,&data);
4881793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err==TIFFReadDirEntryErrOk)
4882793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
4883793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        int m;
4884793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        m=TIFFSetField(tif,dp->tdir_tag,data);
4885793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (data!=0)
4886793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            _TIFFfree(data);
4887793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (!m)
4888793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            return(0);
4889793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
4890793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4891793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4892793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4893793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C0_UINT16:
4894793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4895793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* data;
4896793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount>=1);
4897793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==0);
4898793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (dp->tdir_count!=(uint64)fip->field_readcount)
4899793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                    /* corrupt file */;
4900793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                else
4901793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4902793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryShortArray(tif,dp,&data);
4903793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err==TIFFReadDirEntryErrOk)
4904793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
4905793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        int m;
4906793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        m=TIFFSetField(tif,dp->tdir_tag,data);
4907793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (data!=0)
4908793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            _TIFFfree(data);
4909793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (!m)
4910793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            return(0);
4911793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
4912793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4913793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4914793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4915793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C0_UINT32:
4916793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4917793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* data;
4918793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount>=1);
4919793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==0);
4920793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (dp->tdir_count!=(uint64)fip->field_readcount)
4921793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                    /* corrupt file */;
4922793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                else
4923793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4924793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryLongArray(tif,dp,&data);
4925793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err==TIFFReadDirEntryErrOk)
4926793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
4927793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        int m;
4928793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        m=TIFFSetField(tif,dp->tdir_tag,data);
4929793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (data!=0)
4930793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            _TIFFfree(data);
4931793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (!m)
4932793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            return(0);
4933793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
4934793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4935793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4936793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4937793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C0_FLOAT:
4938793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4939793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float* data;
4940793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount>=1);
4941793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==0);
4942793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (dp->tdir_count!=(uint64)fip->field_readcount)
4943793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                    /* corrupt file */;
4944793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                else
4945793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4946793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryFloatArray(tif,dp,&data);
4947793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err==TIFFReadDirEntryErrOk)
4948793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
4949793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        int m;
4950793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        m=TIFFSetField(tif,dp->tdir_tag,data);
4951793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (data!=0)
4952793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            _TIFFfree(data);
4953793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (!m)
4954793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            return(0);
4955793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
4956793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4957793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4958793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4959793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C16_ASCII:
4960793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4961793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* data;
4962793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE);
4963793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
4964793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (dp->tdir_count>0xFFFF)
4965793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryErrCount;
4966793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                else
4967793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4968793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryByteArray(tif,dp,&data);
4969793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err==TIFFReadDirEntryErrOk)
4970793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
4971793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        int m;
4972793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
4973793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (data!=0)
4974793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            _TIFFfree(data);
4975793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (!m)
4976793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            return(0);
4977793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
4978793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
4979793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
4980793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
4981793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C16_UINT8:
4982793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
4983793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* data;
4984793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE);
4985793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
4986793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (dp->tdir_count>0xFFFF)
4987793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryErrCount;
4988793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                else
4989793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
4990793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryByteArray(tif,dp,&data);
4991793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err==TIFFReadDirEntryErrOk)
4992793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
4993793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        int m;
4994793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
4995793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (data!=0)
4996793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            _TIFFfree(data);
4997793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (!m)
4998793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            return(0);
4999793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
5000793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5001793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5002793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5003793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C16_UINT16:
5004793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5005793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* data;
5006793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE);
5007793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5008793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (dp->tdir_count>0xFFFF)
5009793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryErrCount;
5010793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                else
5011793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5012793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryShortArray(tif,dp,&data);
5013793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err==TIFFReadDirEntryErrOk)
5014793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
5015793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        int m;
5016793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5017793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (data!=0)
5018793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            _TIFFfree(data);
5019793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (!m)
5020793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            return(0);
5021793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
5022793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5023793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5024793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5025793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C16_UINT32:
5026793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5027793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* data;
5028793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE);
5029793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5030793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (dp->tdir_count>0xFFFF)
5031793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryErrCount;
5032793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                else
5033793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5034793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryLongArray(tif,dp,&data);
5035793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err==TIFFReadDirEntryErrOk)
5036793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
5037793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        int m;
5038793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5039793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (data!=0)
5040793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            _TIFFfree(data);
5041793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (!m)
5042793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            return(0);
5043793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
5044793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5045793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5046793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5047793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C16_UINT64:
5048793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5049793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* data;
5050793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE);
5051793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5052793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (dp->tdir_count>0xFFFF)
5053793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryErrCount;
5054793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                else
5055793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5056793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryLong8Array(tif,dp,&data);
5057793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err==TIFFReadDirEntryErrOk)
5058793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
5059793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        int m;
5060793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5061793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (data!=0)
5062793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            _TIFFfree(data);
5063793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (!m)
5064793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            return(0);
5065793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
5066793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5067793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5068793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5069793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C16_FLOAT:
5070793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5071793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float* data;
5072793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE);
5073793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5074793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (dp->tdir_count>0xFFFF)
5075793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryErrCount;
5076793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                else
5077793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5078793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryFloatArray(tif,dp,&data);
5079793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err==TIFFReadDirEntryErrOk)
5080793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
5081793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        int m;
5082793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5083793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (data!=0)
5084793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            _TIFFfree(data);
5085793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (!m)
5086793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            return(0);
5087793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
5088793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5089793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5090793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5091793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C16_DOUBLE:
5092793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5093793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double* data;
5094793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE);
5095793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5096793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (dp->tdir_count>0xFFFF)
5097793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryErrCount;
5098793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                else
5099793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryDoubleArray(tif,dp,&data);
5101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err==TIFFReadDirEntryErrOk)
5102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
5103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        int m;
5104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (data!=0)
5106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            _TIFFfree(data);
5107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (!m)
5108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            return(0);
5109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
5110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C16_IFD8:
5114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* data;
5116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE);
5117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (dp->tdir_count>0xFFFF)
5119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryErrCount;
5120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                else
5121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    err=TIFFReadDirEntryIfd8Array(tif,dp,&data);
5123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (err==TIFFReadDirEntryErrOk)
5124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
5125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        int m;
5126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
5127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (data!=0)
5128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            _TIFFfree(data);
5129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        if (!m)
5130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            return(0);
5131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
5132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C32_ASCII:
5136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* data;
5138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE2);
5139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryByteArray(tif,dp,&data);
5141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
5142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    int m;
5144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (data!=0)
5146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(data);
5147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!m)
5148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
5149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C32_UINT8:
5153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint8* data;
5155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE2);
5156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryByteArray(tif,dp,&data);
5158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
5159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    int m;
5161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (data!=0)
5163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(data);
5164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!m)
5165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
5166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C32_SINT8:
5170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int8* data = NULL;
5172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE2);
5173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntrySbyteArray(tif,dp,&data);
5175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
5176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    int m;
5178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (data!=0)
5180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(data);
5181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!m)
5182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
5183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C32_UINT16:
5187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint16* data;
5189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE2);
5190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryShortArray(tif,dp,&data);
5192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
5193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    int m;
5195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (data!=0)
5197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(data);
5198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!m)
5199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
5200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C32_SINT16:
5204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int16* data = NULL;
5206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE2);
5207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntrySshortArray(tif,dp,&data);
5209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
5210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    int m;
5212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (data!=0)
5214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(data);
5215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!m)
5216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
5217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C32_UINT32:
5221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint32* data;
5223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE2);
5224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryLongArray(tif,dp,&data);
5226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
5227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    int m;
5229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (data!=0)
5231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(data);
5232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!m)
5233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
5234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C32_SINT32:
5238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int32* data = NULL;
5240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE2);
5241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntrySlongArray(tif,dp,&data);
5243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
5244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    int m;
5246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (data!=0)
5248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(data);
5249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!m)
5250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
5251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C32_UINT64:
5255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* data;
5257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE2);
5258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryLong8Array(tif,dp,&data);
5260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
5261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    int m;
5263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (data!=0)
5265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(data);
5266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!m)
5267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
5268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C32_SINT64:
5272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int64* data = NULL;
5274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE2);
5275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntrySlong8Array(tif,dp,&data);
5277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
5278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    int m;
5280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (data!=0)
5282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(data);
5283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!m)
5284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
5285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C32_FLOAT:
5289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                float* data;
5291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE2);
5292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryFloatArray(tif,dp,&data);
5294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
5295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    int m;
5297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (data!=0)
5299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(data);
5300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!m)
5301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
5302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C32_DOUBLE:
5306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                double* data;
5308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE2);
5309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryDoubleArray(tif,dp,&data);
5311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
5312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    int m;
5314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (data!=0)
5316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(data);
5317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!m)
5318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
5319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        case TIFF_SETGET_C32_IFD8:
5323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
5324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                uint64* data;
5325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_readcount==TIFF_VARIABLE2);
5326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                assert(fip->field_passcount==1);
5327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                err=TIFFReadDirEntryIfd8Array(tif,dp,&data);
5328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (err==TIFFReadDirEntryErrOk)
5329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
5330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    int m;
5331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
5332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (data!=0)
5333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        _TIFFfree(data);
5334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!m)
5335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return(0);
5336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
5337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        default:
5340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            assert(0);    /* we should never get here */
5341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
5342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
5343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err!=TIFFReadDirEntryErrOk)
5344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
5345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",recover);
5346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(0);
5347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
5348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(1);
5349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
5350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
5352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Fetch a set of offsets or lengths.
5353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * While this routine says "strips", in fact it's also used for tiles.
5354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
5355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic int
5356793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, uint32 nstrips, uint64** lpp)
5357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
5358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static const char module[] = "TIFFFetchStripThing";
5359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
5360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint64* data;
5361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    err=TIFFReadDirEntryLong8Array(tif,dir,&data);
5362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err!=TIFFReadDirEntryErrOk)
5363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
5364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        const TIFFField* fip = TIFFFieldWithTag(tif,dir->tdir_tag);
5365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0);
5366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(0);
5367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
5368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (dir->tdir_count!=(uint64)nstrips)
5369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
5370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint64* resizeddata;
5371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        resizeddata=(uint64*)_TIFFCheckMalloc(tif,nstrips,sizeof(uint64),"for strip array");
5372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (resizeddata==0) {
5373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            _TIFFfree(data);
5374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return(0);
5375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
5376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (dir->tdir_count<(uint64)nstrips)
5377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
5378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            _TIFFmemcpy(resizeddata,data,(uint32)dir->tdir_count*sizeof(uint64));
5379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            _TIFFmemset(resizeddata+(uint32)dir->tdir_count,0,(nstrips-(uint32)dir->tdir_count)*sizeof(uint64));
5380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
5381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else
5382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            _TIFFmemcpy(resizeddata,data,nstrips*sizeof(uint64));
5383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFfree(data);
5384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        data=resizeddata;
5385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
5386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    *lpp=data;
5387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return(1);
5388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
5389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
5391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Fetch and set the SubjectDistance EXIF tag.
5392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
5393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic int
5394793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerTIFFFetchSubjectDistance(TIFF* tif, TIFFDirEntry* dir)
5395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
5396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static const char module[] = "TIFFFetchSubjectDistance";
5397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum TIFFReadDirEntryErr err;
5398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    UInt64Aligned_t m;
5399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    m.l=0;
5400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(double)==8);
5401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(uint64)==8);
5402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(sizeof(uint32)==4);
5403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (dir->tdir_count!=1)
5404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        err=TIFFReadDirEntryErrCount;
5405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else if (dir->tdir_type!=TIFF_RATIONAL)
5406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        err=TIFFReadDirEntryErrType;
5407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
5408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
5409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!(tif->tif_flags&TIFF_BIGTIFF))
5410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
5411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            uint32 offset;
5412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            offset=*(uint32*)(&dir->tdir_offset);
5413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_flags&TIFF_SWAB)
5414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                TIFFSwabLong(&offset);
5415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            err=TIFFReadDirEntryData(tif,offset,8,m.i);
5416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
5417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else
5418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
5419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            m.l=dir->tdir_offset.toff_long8;
5420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            err=TIFFReadDirEntryErrOk;
5421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
5422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
5423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (err==TIFFReadDirEntryErrOk)
5424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
5425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        double n;
5426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (tif->tif_flags&TIFF_SWAB)
5427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TIFFSwabArrayOfLong(m.i,2);
5428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (m.i[0]==0)
5429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            n=0.0;
5430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else if (m.i[0]==0xFFFFFFFF)
5431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            /*
5432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * XXX: Numerator 0xFFFFFFFF means that we have infinite
5433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * distance. Indicate that with a negative floating point
5434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * SubjectDistance value.
5435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             */
5436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            n=-1.0;
5437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else
5438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            n=(double)m.i[0]/(double)m.i[1];
5439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(TIFFSetField(tif,dir->tdir_tag,n));
5440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
5441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
5442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
5443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TIFFReadDirEntryOutputErr(tif,err,module,"SubjectDistance",TRUE);
5444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return(0);
5445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
5446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
5447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
5449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Replace a single strip (tile) of uncompressed data by multiple strips
5450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * (tiles), each approximately STRIP_SIZE_DEFAULT bytes. This is useful for
5451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * dealing with large images or for dealing with machines with a limited
5452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * amount memory.
5453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
5454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void
5455793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerChopUpSingleUncompressedStrip(TIFF* tif)
5456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
5457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    register TIFFDirectory *td = &tif->tif_dir;
5458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint64 bytecount;
5459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint64 offset;
5460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 rowblock;
5461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint64 rowblockbytes;
5462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint64 stripbytes;
5463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 strip;
5464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint64 nstrips64;
5465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 nstrips32;
5466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint32 rowsperstrip;
5467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint64* newcounts;
5468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    uint64* newoffsets;
5469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bytecount = td->td_stripbytecount[0];
5471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    offset = td->td_stripoffset[0];
5472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(td->td_planarconfig == PLANARCONFIG_CONTIG);
5473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((td->td_photometric == PHOTOMETRIC_YCBCR)&&
5474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        (!isUpSampled(tif)))
5475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        rowblock = td->td_ycbcrsubsampling[1];
5476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
5477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        rowblock = 1;
5478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    rowblockbytes = TIFFVTileSize64(tif, rowblock);
5479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
5480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * Make the rows hold at least one scanline, but fill specified amount
5481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * of data if possible.
5482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
5483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (rowblockbytes > STRIP_SIZE_DEFAULT) {
5484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        stripbytes = rowblockbytes;
5485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        rowsperstrip = rowblock;
5486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else if (rowblockbytes > 0 ) {
5487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint32 rowblocksperstrip;
5488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        rowblocksperstrip = (uint32) (STRIP_SIZE_DEFAULT / rowblockbytes);
5489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        rowsperstrip = rowblocksperstrip * rowblock;
5490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        stripbytes = rowblocksperstrip * rowblockbytes;
5491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
5492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
5493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return;
5494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
5496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * never increase the number of strips in an image
5497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
5498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (rowsperstrip >= td->td_rowsperstrip)
5499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return;
5500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    nstrips64 = TIFFhowmany_64(bytecount, stripbytes);
5501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((nstrips64==0)||(nstrips64>0xFFFFFFFF)) /* something is wonky, do nothing. */
5502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return;
5503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    nstrips32 = (uint32)nstrips64;
5504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    newcounts = (uint64*) _TIFFCheckMalloc(tif, nstrips32, sizeof (uint64),
5506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "for chopped \"StripByteCounts\" array");
5507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    newoffsets = (uint64*) _TIFFCheckMalloc(tif, nstrips32, sizeof (uint64),
5508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                "for chopped \"StripOffsets\" array");
5509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (newcounts == NULL || newoffsets == NULL) {
5510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /*
5511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * Unable to allocate new strip information, give up and use
5512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         * the original one strip information.
5513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler         */
5514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (newcounts != NULL)
5515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            _TIFFfree(newcounts);
5516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (newoffsets != NULL)
5517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            _TIFFfree(newoffsets);
5518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return;
5519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
5520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
5521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * Fill the strip information arrays with new bytecounts and offsets
5522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * that reflect the broken-up format.
5523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
5524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for (strip = 0; strip < nstrips32; strip++) {
5525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (stripbytes > bytecount)
5526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            stripbytes = bytecount;
5527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        newcounts[strip] = stripbytes;
5528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        newoffsets[strip] = offset;
5529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        offset += stripbytes;
5530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        bytecount -= stripbytes;
5531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
5532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /*
5533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * Replace old single strip info with multi-strip info.
5534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
5535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    td->td_stripsperimage = td->td_nstrips = nstrips32;
5536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
5537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(td->td_stripbytecount);
5539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _TIFFfree(td->td_stripoffset);
5540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    td->td_stripbytecount = newcounts;
5541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    td->td_stripoffset = newoffsets;
5542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    td->td_stripbytecountsorted = 1;
5543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
5544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint _TIFFFillStriles( TIFF *tif )
5546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
5547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined(DEFER_STRILE_LOAD)
5548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        register TIFFDirectory *td = &tif->tif_dir;
5549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        int return_value = 1;
5550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( td->td_stripoffset != NULL )
5552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return 1;
5553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( td->td_stripoffset_entry.tdir_count == 0 )
5555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return 0;
5556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!TIFFFetchStripThing(tif,&(td->td_stripoffset_entry),
5558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                 td->td_nstrips,&td->td_stripoffset))
5559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
5560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return_value = 0;
5561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
5562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!TIFFFetchStripThing(tif,&(td->td_stripbytecount_entry),
5564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                 td->td_nstrips,&td->td_stripbytecount))
5565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
5566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return_value = 0;
5567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
5568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFmemset( &(td->td_stripoffset_entry), 0, sizeof(TIFFDirEntry));
5570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _TIFFmemset( &(td->td_stripbytecount_entry), 0, sizeof(TIFFDirEntry));
5571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (tif->tif_dir.td_nstrips > 1 && return_value == 1 ) {
5573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uint32 strip;
5574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tif->tif_dir.td_stripbytecountsorted = 1;
5576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for (strip = 1; strip < tif->tif_dir.td_nstrips; strip++) {
5577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (tif->tif_dir.td_stripoffset[strip - 1] >
5578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                tif->tif_dir.td_stripoffset[strip]) {
5579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                tif->tif_dir.td_stripbytecountsorted = 0;
5580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
5581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
5582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
5583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
5584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return return_value;
5586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else /* !defined(DEFER_STRILE_LOAD) */
5587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        (void) tif;
5588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return 1;
5589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
5590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
5591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
5593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* vim: set ts=8 sts=8 sw=8 noet: */
5594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
5595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Local Variables:
5596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * mode: c
5597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * c-basic-offset: 8
5598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * fill-column: 78
5599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * End:
5600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
5601