#ifndef _TIFFIOP_
#define _TIFFIOP_
#include "tif_config.h"
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#include <string.h>
#ifdef HAVE_ASSERT_H
#include <assert.h>
#else
#define assert(x)
#endif
#include "tif_hash_set.h"
#include "tiffio.h"
#include "tif_dir.h"
#include <limits.h>
#ifndef STRIP_SIZE_DEFAULT
#define STRIP_SIZE_DEFAULT 8192
#endif
#ifndef TIFF_MAX_DIR_COUNT
#define TIFF_MAX_DIR_COUNT 1048576
#endif
#define TIFF_NON_EXISTENT_DIR_NUMBER UINT_MAX
#define streq(a, b) (strcmp(a, b) == 0)
#define strneq(a, b, n) (strncmp(a, b, n) == 0)
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
typedef struct client_info
{
struct client_info *next;
void *data;
char *name;
} TIFFClientInfoLink;
typedef unsigned char tidataval_t;
typedef tidataval_t *tidata_t;
typedef void (*TIFFVoidMethod)(TIFF *);
typedef int (*TIFFBoolMethod)(TIFF *);
typedef int (*TIFFPreMethod)(TIFF *, uint16_t);
typedef int (*TIFFCodeMethod)(TIFF *tif, uint8_t *buf, tmsize_t size,
uint16_t sample);
typedef int (*TIFFSeekMethod)(TIFF *, uint32_t);
typedef void (*TIFFPostMethod)(TIFF *tif, uint8_t *buf, tmsize_t size);
typedef uint32_t (*TIFFStripMethod)(TIFF *, uint32_t);
typedef void (*TIFFTileMethod)(TIFF *, uint32_t *, uint32_t *);
struct TIFFOffsetAndDirNumber
{
uint64_t offset;
tdir_t dirNumber;
};
typedef struct TIFFOffsetAndDirNumber TIFFOffsetAndDirNumber;
typedef union
{
TIFFHeaderCommon common;
TIFFHeaderClassic classic;
TIFFHeaderBig big;
} TIFFHeaderUnion;
struct tiff
{
char *tif_name;
int tif_fd;
int tif_mode;
uint32_t tif_flags;
#define TIFF_FILLORDER 0x00003U
#define TIFF_DIRTYHEADER 0x00004U
#define TIFF_DIRTYDIRECT 0x00008U
#define TIFF_BUFFERSETUP 0x00010U
#define TIFF_CODERSETUP 0x00020U
#define TIFF_BEENWRITING 0x00040U
#define TIFF_SWAB 0x00080U
#define TIFF_NOBITREV 0x00100U
#define TIFF_MYBUFFER 0x00200U
#define TIFF_ISTILED 0x00400U
#define TIFF_MAPPED 0x00800U
#define TIFF_POSTENCODE 0x01000U
#define TIFF_INSUBIFD 0x02000U
#define TIFF_UPSAMPLED 0x04000U
#define TIFF_STRIPCHOP 0x08000U
#define TIFF_HEADERONLY \
0x10000U
#define TIFF_NOREADRAW \
0x20000U
#define TIFF_INCUSTOMIFD 0x40000U
#define TIFF_BIGTIFF 0x80000U
#define TIFF_BUF4WRITE 0x100000U
#define TIFF_DIRTYSTRIP 0x200000U
#define TIFF_PERSAMPLE 0x400000U
#define TIFF_BUFFERMMAP \
0x800000U
#define TIFF_DEFERSTRILELOAD \
0x1000000U
#define TIFF_LAZYSTRILELOAD \
0x2000000U
#define TIFF_CHOPPEDUPARRAYS \
0x4000000U
uint64_t tif_diroff;
uint64_t tif_nextdiroff;
uint64_t tif_lastdiroff;
TIFFHashSet *tif_map_dir_offset_to_number;
TIFFHashSet *tif_map_dir_number_to_offset;
int tif_setdirectory_force_absolute;
TIFFDirectory tif_dir;
TIFFDirectory
tif_customdir;
TIFFHeaderUnion tif_header;
uint16_t tif_header_size;
uint32_t tif_row;
tdir_t tif_curdir;
tdir_t tif_curdircount;
uint32_t tif_curstrip;
uint64_t tif_curoff;
uint64_t tif_lastvalidoff;
uint64_t tif_dataoff;
uint16_t tif_nsubifd;
uint64_t tif_subifdoff;
uint32_t tif_col;
uint32_t tif_curtile;
tmsize_t tif_tilesize;
int tif_decodestatus;
TIFFBoolMethod tif_fixuptags;
TIFFBoolMethod tif_setupdecode;
TIFFPreMethod tif_predecode;
TIFFBoolMethod tif_setupencode;
int tif_encodestatus;
TIFFPreMethod tif_preencode;
TIFFBoolMethod tif_postencode;
TIFFCodeMethod tif_decoderow;
TIFFCodeMethod tif_encoderow;
TIFFCodeMethod tif_decodestrip;
TIFFCodeMethod tif_encodestrip;
TIFFCodeMethod tif_decodetile;
TIFFCodeMethod tif_encodetile;
TIFFVoidMethod tif_close;
TIFFSeekMethod tif_seek;
TIFFVoidMethod tif_cleanup;
TIFFStripMethod tif_defstripsize;
TIFFTileMethod tif_deftilesize;
uint8_t *tif_data;
tmsize_t tif_scanlinesize;
tmsize_t tif_scanlineskew;
uint8_t *tif_rawdata;
tmsize_t tif_rawdatasize;
tmsize_t tif_rawdataoff;
tmsize_t tif_rawdataloaded;
uint8_t *tif_rawcp;
tmsize_t tif_rawcc;
uint8_t *tif_base;
tmsize_t tif_size;
TIFFMapFileProc tif_mapproc;
TIFFUnmapFileProc tif_unmapproc;
thandle_t tif_clientdata;
TIFFReadWriteProc tif_readproc;
TIFFReadWriteProc tif_writeproc;
TIFFSeekProc tif_seekproc;
TIFFCloseProc tif_closeproc;
TIFFSizeProc tif_sizeproc;
TIFFPostMethod tif_postdecode;
TIFFField **tif_fields;
size_t tif_nfields;
const TIFFField *tif_foundfield;
TIFFTagMethods tif_tagmethods;
TIFFClientInfoLink *tif_clientinfo;
TIFFFieldArray *tif_fieldscompat;
size_t tif_nfieldscompat;
TIFFErrorHandlerExtR tif_errorhandler;
void *tif_errorhandler_user_data;
TIFFErrorHandlerExtR tif_warnhandler;
void *tif_warnhandler_user_data;
tmsize_t tif_max_single_mem_alloc;
tmsize_t tif_max_cumulated_mem_alloc;
tmsize_t tif_cur_cumulated_mem_alloc;
};
struct TIFFOpenOptions
{
TIFFErrorHandlerExtR errorhandler;
void *errorhandler_user_data;
TIFFErrorHandlerExtR warnhandler;
void *warnhandler_user_data;
tmsize_t max_single_mem_alloc;
tmsize_t max_cumulated_mem_alloc;
};
#define isPseudoTag(t) (t > 0xffff)
#define isTiled(tif) (((tif)->tif_flags & TIFF_ISTILED) != 0)
#define isMapped(tif) (((tif)->tif_flags & TIFF_MAPPED) != 0)
#define isFillOrder(tif, o) (((tif)->tif_flags & (o)) != 0)
#define isUpSampled(tif) (((tif)->tif_flags & TIFF_UPSAMPLED) != 0)
#define TIFFReadFile(tif, buf, size) \
((*(tif)->tif_readproc)((tif)->tif_clientdata, (buf), (size)))
#define TIFFWriteFile(tif, buf, size) \
((*(tif)->tif_writeproc)((tif)->tif_clientdata, (buf), (size)))
#define TIFFSeekFile(tif, off, whence) \
((*(tif)->tif_seekproc)((tif)->tif_clientdata, (off), (whence)))
#define TIFFCloseFile(tif) ((*(tif)->tif_closeproc)((tif)->tif_clientdata))
#define TIFFGetFileSize(tif) ((*(tif)->tif_sizeproc)((tif)->tif_clientdata))
#define TIFFMapFileContents(tif, paddr, psize) \
((*(tif)->tif_mapproc)((tif)->tif_clientdata, (paddr), (psize)))
#define TIFFUnmapFileContents(tif, addr, size) \
((*(tif)->tif_unmapproc)((tif)->tif_clientdata, (addr), (size)))
#ifndef ReadOK
#define ReadOK(tif, buf, size) (TIFFReadFile((tif), (buf), (size)) == (size))
#endif
#ifndef SeekOK
#define SeekOK(tif, off) _TIFFSeekOK(tif, off)
#endif
#ifndef WriteOK
#define WriteOK(tif, buf, size) (TIFFWriteFile((tif), (buf), (size)) == (size))
#endif
#define TIFFhowmany_32(x, y) \
(((uint32_t)x < (0xffffffff - (uint32_t)(y - 1))) \
? ((((uint32_t)(x)) + (((uint32_t)(y)) - 1)) / ((uint32_t)(y))) \
: 0U)
#define TIFFhowmany_32_maxuint_compat(x, y) \
(((uint32_t)(x) / (uint32_t)(y)) + \
((((uint32_t)(x) % (uint32_t)(y)) != 0) ? 1 : 0))
#define TIFFhowmany8_32(x) \
(((x)&0x07) ? ((uint32_t)(x) >> 3) + 1 : (uint32_t)(x) >> 3)
#define TIFFroundup_32(x, y) (TIFFhowmany_32(x, y) * (y))
#define TIFFhowmany_64(x, y) \
((((uint64_t)(x)) + (((uint64_t)(y)) - 1)) / ((uint64_t)(y)))
#define TIFFhowmany8_64(x) \
(((x)&0x07) ? ((uint64_t)(x) >> 3) + 1 : (uint64_t)(x) >> 3)
#define TIFFroundup_64(x, y) (TIFFhowmany_64(x, y) * (y))
#define TIFFSafeMultiply(t, v, m) \
((((t)(m) != (t)0) && (((t)(((v) * (m)) / (m))) == (t)(v))) \
? (t)((v) * (m)) \
: (t)0)
#define TIFFmax(A, B) ((A) > (B) ? (A) : (B))
#define TIFFmin(A, B) ((A) < (B) ? (A) : (B))
#define TIFFArrayCount(a) (sizeof(a) / sizeof((a)[0]))
#if defined(HAVE_FSEEKO)
#if defined(HAVE_FSEEKO)
#define fseek(stream, offset, whence) fseeko(stream, offset, whence)
#define ftell(stream, offset, whence) ftello(stream, offset, whence)
#endif
#endif
#if defined(_WIN32) && \
!(defined(__MSVCRT_VERSION__) && __MSVCRT_VERSION__ < 0x800)
typedef unsigned int TIFFIOSize_t;
#define _TIFF_lseek_f(fildes, offset, whence) \
_lseeki64(fildes, offset, whence)
#define _TIFF_fseek_f(stream, offset, whence) \
_fseeki64(stream, offset, whence)
#define _TIFF_fstat_f(fildes, stat_buff) \
_fstati64(fildes, stat_buff)
#define _TIFF_stat_s struct _stati64
#define _TIFF_off_t __int64
#else
typedef size_t TIFFIOSize_t;
#define _TIFF_lseek_f(fildes, offset, whence) lseek(fildes, offset, whence)
#define _TIFF_fseek_f(stream, offset, whence) fseek(stream, offset, whence)
#define _TIFF_fstat_f(fildes, stat_buff) fstat(fildes, stat_buff)
#define _TIFF_stat_s struct stat
#define _TIFF_off_t off_t
#endif
#if defined(__has_attribute) && defined(__clang__)
#if __has_attribute(no_sanitize)
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW \
__attribute__((no_sanitize("unsigned-integer-overflow")))
#else
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
#endif
#else
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
#endif
#if defined(__cplusplus)
extern "C"
{
#endif
extern int _TIFFgetMode(TIFFOpenOptions *opts, thandle_t clientdata,
const char *mode, const char *module);
extern int _TIFFNoRowEncode(TIFF *tif, uint8_t *pp, tmsize_t cc,
uint16_t s);
extern int _TIFFNoStripEncode(TIFF *tif, uint8_t *pp, tmsize_t cc,
uint16_t s);
extern int _TIFFNoTileEncode(TIFF *, uint8_t *pp, tmsize_t cc, uint16_t s);
extern int _TIFFNoRowDecode(TIFF *tif, uint8_t *pp, tmsize_t cc,
uint16_t s);
extern int _TIFFNoStripDecode(TIFF *tif, uint8_t *pp, tmsize_t cc,
uint16_t s);
extern int _TIFFNoTileDecode(TIFF *, uint8_t *pp, tmsize_t cc, uint16_t s);
extern void _TIFFNoPostDecode(TIFF *tif, uint8_t *buf, tmsize_t cc);
extern int _TIFFNoPreCode(TIFF *tif, uint16_t s);
extern int _TIFFNoSeek(TIFF *tif, uint32_t off);
extern void _TIFFSwab16BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
extern void _TIFFSwab24BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
extern void _TIFFSwab32BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
extern void _TIFFSwab64BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
extern int TIFFFlushData1(TIFF *tif);
extern int TIFFDefaultDirectory(TIFF *tif);
extern void _TIFFSetDefaultCompressionState(TIFF *tif);
extern int _TIFFRewriteField(TIFF *, uint16_t, TIFFDataType, tmsize_t,
void *);
extern int TIFFSetCompressionScheme(TIFF *tif, int scheme);
extern int TIFFSetDefaultCompressionState(TIFF *tif);
extern uint32_t _TIFFDefaultStripSize(TIFF *tif, uint32_t s);
extern void _TIFFDefaultTileSize(TIFF *tif, uint32_t *tw, uint32_t *th);
extern void _TIFFsetByteArray(void **, const void *, uint32_t);
extern void _TIFFsetByteArrayExt(TIFF *, void **, const void *, uint32_t);
extern void _TIFFsetShortArray(uint16_t **, const uint16_t *, uint32_t);
extern void _TIFFsetShortArrayExt(TIFF *, uint16_t **, const uint16_t *,
uint32_t);
extern void _TIFFsetLongArray(uint32_t **, const uint32_t *, uint32_t);
extern void _TIFFsetLongArrayExt(TIFF *, uint32_t **, const uint32_t *,
uint32_t);
extern void _TIFFsetFloatArray(float **, const float *, uint32_t);
extern void _TIFFsetFloatArrayExt(TIFF *, float **, const float *,
uint32_t);
extern void _TIFFsetDoubleArray(double **, const double *, uint32_t);
extern void _TIFFsetDoubleArrayExt(TIFF *, double **, const double *,
uint32_t);
extern void _TIFFprintAscii(FILE *, const char *);
extern void _TIFFprintAsciiTag(FILE *, const char *, const char *);
extern TIFFErrorHandler _TIFFwarningHandler;
extern TIFFErrorHandler _TIFFerrorHandler;
extern TIFFErrorHandlerExt _TIFFwarningHandlerExt;
extern TIFFErrorHandlerExt _TIFFerrorHandlerExt;
void _TIFFErrorEarly(TIFFOpenOptions *opts, thandle_t clientdata,
const char *module, const char *fmt, ...)
TIFF_ATTRIBUTE((__format__(__printf__, 4, 5)));
extern uint32_t _TIFFMultiply32(TIFF *, uint32_t, uint32_t, const char *);
extern uint64_t _TIFFMultiply64(TIFF *, uint64_t, uint64_t, const char *);
extern tmsize_t _TIFFMultiplySSize(TIFF *, tmsize_t, tmsize_t,
const char *);
extern tmsize_t _TIFFCastUInt64ToSSize(TIFF *, uint64_t, const char *);
extern void *_TIFFCheckMalloc(TIFF *, tmsize_t, tmsize_t, const char *);
extern void *_TIFFCheckRealloc(TIFF *, void *, tmsize_t, tmsize_t,
const char *);
extern float _TIFFClampDoubleToFloat(double);
extern uint32_t _TIFFClampDoubleToUInt32(double);
extern void _TIFFCleanupIFDOffsetAndNumberMaps(TIFF *tif);
extern tmsize_t _TIFFReadEncodedStripAndAllocBuffer(TIFF *tif,
uint32_t strip,
void **buf,
tmsize_t bufsizetoalloc,
tmsize_t size_to_read);
extern tmsize_t _TIFFReadEncodedTileAndAllocBuffer(TIFF *tif, uint32_t tile,
void **buf,
tmsize_t bufsizetoalloc,
tmsize_t size_to_read);
extern tmsize_t _TIFFReadTileAndAllocBuffer(TIFF *tif, void **buf,
tmsize_t bufsizetoalloc,
uint32_t x, uint32_t y,
uint32_t z, uint16_t s);
extern int _TIFFSeekOK(TIFF *tif, toff_t off);
extern int TIFFInitDumpMode(TIFF *, int);
#ifdef PACKBITS_SUPPORT
extern int TIFFInitPackBits(TIFF *, int);
#endif
#ifdef CCITT_SUPPORT
extern int TIFFInitCCITTRLE(TIFF *, int), TIFFInitCCITTRLEW(TIFF *, int);
extern int TIFFInitCCITTFax3(TIFF *, int), TIFFInitCCITTFax4(TIFF *, int);
#endif
#ifdef THUNDER_SUPPORT
extern int TIFFInitThunderScan(TIFF *, int);
#endif
#ifdef NEXT_SUPPORT
extern int TIFFInitNeXT(TIFF *, int);
#endif
#ifdef LZW_SUPPORT
extern int TIFFInitLZW(TIFF *, int);
#endif
#ifdef OJPEG_SUPPORT
extern int TIFFInitOJPEG(TIFF *, int);
#endif
#ifdef JPEG_SUPPORT
extern int TIFFInitJPEG(TIFF *, int);
extern int TIFFJPEGIsFullStripRequired(TIFF *);
#endif
#ifdef JBIG_SUPPORT
extern int TIFFInitJBIG(TIFF *, int);
#endif
#ifdef ZIP_SUPPORT
extern int TIFFInitZIP(TIFF *, int);
#endif
#ifdef PIXARLOG_SUPPORT
extern int TIFFInitPixarLog(TIFF *, int);
#endif
#ifdef LOGLUV_SUPPORT
extern int TIFFInitSGILog(TIFF *, int);
#endif
#ifdef LERC_SUPPORT
extern int TIFFInitLERC(TIFF *tif, int);
#endif
#ifdef LZMA_SUPPORT
extern int TIFFInitLZMA(TIFF *, int);
#endif
#ifdef ZSTD_SUPPORT
extern int TIFFInitZSTD(TIFF *, int);
#endif
#ifdef WEBP_SUPPORT
extern int TIFFInitWebP(TIFF *, int);
#endif
extern const TIFFCodec _TIFFBuiltinCODECS[];
extern void TIFFCIELab16ToXYZ(TIFFCIELabToRGB *, uint32_t l, int32_t a,
int32_t b, float *, float *, float *);
extern void *_TIFFmallocExt(TIFF *tif, tmsize_t s);
extern void *_TIFFcallocExt(TIFF *tif, tmsize_t nmemb, tmsize_t siz);
extern void *_TIFFreallocExt(TIFF *tif, void *p, tmsize_t s);
extern void _TIFFfreeExt(TIFF *tif, void *p);
#if defined(__cplusplus)
}
#endif
#endif