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