summaryrefslogtreecommitdiff
path: root/libtiff/tiffio.h
diff options
context:
space:
mode:
Diffstat (limited to 'libtiff/tiffio.h')
-rw-r--r--libtiff/tiffio.h1350
1 files changed, 1160 insertions, 190 deletions
diff --git a/libtiff/tiffio.h b/libtiff/tiffio.h
index 18dfd11e..a9c7b7ac 100644
--- a/libtiff/tiffio.h
+++ b/libtiff/tiffio.h
@@ -25,15 +25,16 @@
#ifndef _TIFFIO_
#define _TIFFIO_
-/*
- * TIFF I/O Library Definitions.
+/**
+ * @file tiffio.h
+ * @brief TIFF I/O Library Definitions.
*/
#include "tiff.h"
#include "tiffvers.h"
-/*
- * TIFF is defined as an incomplete type to hide the
- * library's internal data structures from clients.
+/**
+ * @brief A TIFF image file.
+ * @details The internal details of this structure are private.
*/
typedef struct tiff TIFF;
@@ -44,38 +45,65 @@ typedef struct tiff TIFF;
* in tiff.h. Note also that the varargs interface used
* to pass tag types and values uses the types defined in
* tiff.h directly.
- *
- * NB: ttag_t is unsigned int and not unsigned short because
- * ANSI C requires that the type before the ellipsis be a
- * promoted type (i.e. one of int, unsigned int, pointer,
- * or double) and because we defined pseudo-tags that are
- * outside the range of legal Aldus-assigned tags.
- * NB: tsize_t is signed and not unsigned because some functions
- * return -1.
- * NB: toff_t is not off_t for many reasons; TIFFs max out at
- * 32-bit file offsets, and BigTIFF maxes out at 64-bit
- * offsets being the most important, and to ensure use of
- * a consistently unsigned type across architectures.
- * Prior to libtiff 4.0, this was an unsigned 32 bit type.
*/
-/*
- * this is the machine addressing size type, only it's signed, so make it
- * int32_t on 32bit machines, int64_t on 64bit machines
+
+/**
+ * @brief Signed machine addressing size type.
+ * @details This type int32_t on 32bit machines, int64_t on 64bit machines.
*/
typedef TIFF_SSIZE_T tmsize_t;
+
+/**
+ * @brief Maximum size of tmsize_t.
+ */
#define TIFF_TMSIZE_T_MAX (tmsize_t)(SIZE_MAX >> 1)
-typedef uint64_t toff_t; /* file offset */
+/**
+ * @brief File offset
+ * @note toff_t is not off_t for many reasons; TIFFs max out at
+ * 32-bit file offsets, and BigTIFF maxes out at 64-bit
+ * offsets being the most important, and to ensure use of
+ * a consistently unsigned type across architectures.
+ * Prior to libtiff 4.0, this was an unsigned 32-bit type.
+ */
+typedef uint64_t toff_t;
+
/* the following are deprecated and should be replaced by their defining
counterparts */
-typedef uint32_t ttag_t; /* directory tag */
-typedef uint16_t tdir_t; /* directory index */
-typedef uint16_t tsample_t; /* sample number */
-typedef uint32_t tstrile_t; /* strip or tile number */
-typedef tstrile_t tstrip_t; /* strip number */
-typedef tstrile_t ttile_t; /* tile number */
-typedef tmsize_t tsize_t; /* i/o size in bytes */
-typedef void* tdata_t; /* image data ref */
+
+/**
+ * @brief Directory tag.
+ * @note ttag_t is unsigned int and not unsigned short because
+ * ANSI C requires that the type before the ellipsis be a
+ * promoted type (i.e. one of int, unsigned int, pointer,
+ * or double) and because we defined pseudo-tags that are
+ * outside the range of legal Aldus-assigned tags.
+ */
+typedef uint32_t ttag_t;
+
+/** Directory index */
+typedef uint16_t tdir_t;
+
+/** Sample number */
+typedef uint16_t tsample_t;
+
+/** Strip or tile number */
+typedef uint32_t tstrile_t;
+
+/** Strip number */
+typedef tstrile_t tstrip_t;
+
+/** Tile number */
+typedef tstrile_t ttile_t;
+
+/** I/O size in bytes
+ * @note tsize_t is signed and not unsigned because some functions
+ * return -1.
+ */
+typedef tmsize_t tsize_t;
+
+/** Image data reference */
+typedef void* tdata_t;
#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32))
#define __WIN32__
@@ -98,12 +126,15 @@ typedef void* tdata_t; /* image data ref */
# define VC_EXTRALEAN
# include <windows.h>
# ifdef __WIN32__
-DECLARE_HANDLE(thandle_t); /* Win32 file handle */
+/** Client data handle */
+DECLARE_HANDLE(thandle_t);
# else
-typedef HFILE thandle_t; /* client data handle */
+/** Client data handle */
+typedef HFILE thandle_t;
# endif /* __WIN32__ */
#else
-typedef void* thandle_t; /* client data handle */
+/** Client data handle */
+typedef void* thandle_t;
#endif /* USE_WIN32_FILEIO */
/*
@@ -112,49 +143,65 @@ typedef void* thandle_t; /* client data handle */
* very large. Bit-or these flags to enable printing
* multiple items.
*/
-#define TIFFPRINT_NONE 0x0 /* no extra info */
-#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */
-#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */
-#define TIFFPRINT_COLORMAP 0x4 /* colormap */
-#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */
-#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */
-#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */
+
+/** Print no extra information */
+#define TIFFPRINT_NONE 0x0
+/** Print strips or tiles information */
+#define TIFFPRINT_STRIPS 0x1
+/** Print color or gray response curves */
+#define TIFFPRINT_CURVES 0x2
+/** Print colormap */
+#define TIFFPRINT_COLORMAP 0x4
+
+/** Print JPEG Q matrices */
+#define TIFFPRINT_JPEGQTABLES 0x100
+/** Print JPEG AC tables */
+#define TIFFPRINT_JPEGACTABLES 0x200
+/** Print JPEG DC tables */
+#define TIFFPRINT_JPEGDCTABLES 0x200
/*
- * Colour conversion stuff
+ * Colour conversion macros.
*/
-/* reference white */
+/** Reference white (D65 X) */
#define D65_X0 (95.0470F)
+/** Reference white (D65 Y) */
#define D65_Y0 (100.0F)
+/** Reference white (D65 Z) */
#define D65_Z0 (108.8827F)
+/** Reference white (D50 X) */
#define D50_X0 (96.4250F)
+/** Reference white (D50 Y) */
#define D50_Y0 (100.0F)
+/** Reference white (D50 Z) */
#define D50_Z0 (82.4680F)
-/* Structure for holding information about a display device. */
-typedef unsigned char TIFFRGBValue; /* 8-bit samples */
+/** 8-bit R, G or B sample */
+typedef unsigned char TIFFRGBValue;
+/** Display device description. */
typedef struct {
- float d_mat[3][3]; /* XYZ -> luminance matrix */
- float d_YCR; /* Light o/p for reference white */
- float d_YCG;
- float d_YCB;
- uint32_t d_Vrwr; /* Pixel values for ref. white */
- uint32_t d_Vrwg;
- uint32_t d_Vrwb;
- float d_Y0R; /* Residual light for black pixel */
- float d_Y0G;
- float d_Y0B;
- float d_gammaR; /* Gamma values for the three guns */
- float d_gammaG;
- float d_gammaB;
+ float d_mat[3][3]; /**< XYZ -> luminance matrix */
+ float d_YCR; /**< Light o/p for reference white (R) */
+ float d_YCG; /**< Light o/p for reference white (G) */
+ float d_YCB; /**< Light o/p for reference white (B) */
+ uint32_t d_Vrwr; /**< Pixel values for reference white (R) */
+ uint32_t d_Vrwg; /**< Pixel values for reference white (G) */
+ uint32_t d_Vrwb; /**< Pixel values for reference white (B) */
+ float d_Y0R; /**< Residual light for black pixel (R) */
+ float d_Y0G; /**< Residual light for black pixel (G) */
+ float d_Y0B; /**< Residual light for black pixel (B) */
+ float d_gammaR; /**< Gamma values for the three guns (R) */
+ float d_gammaG; /**< Gamma values for the three guns (G) */
+ float d_gammaB; /**< Gamma values for the three guns (B) */
} TIFFDisplay;
-typedef struct { /* YCbCr->RGB support */
- TIFFRGBValue* clamptab; /* range clamping table */
+/** YCbCr conversion to RGB */
+typedef struct {
+ TIFFRGBValue* clamptab; /** Range clamping table */
int* Cr_r_tab;
int* Cb_b_tab;
int32_t* Cr_g_tab;
@@ -162,24 +209,26 @@ typedef struct { /* YCbCr->RGB support */
int32_t* Y_tab;
} TIFFYCbCrToRGB;
-typedef struct { /* CIE Lab 1976->RGB support */
- int range; /* Size of conversion table */
+/** CIE Lab 1976 conversion to RGB */
+typedef struct {
+ int range; /**< Size of conversion table */
#define CIELABTORGB_TABLE_RANGE 1500
float rstep, gstep, bstep;
- float X0, Y0, Z0; /* Reference white point */
+ float X0, Y0, Z0; /**< Reference white point */
TIFFDisplay display;
- float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */
- float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */
- float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */
+ float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /**< Conversion of Yr to r */
+ float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /**< Conversion of Yg to g */
+ float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /**< Conversion of Yb to b */
} TIFFCIELabToRGB;
-/*
- * RGBA-style image support.
+/**
+ * RGBA-style image.
*/
typedef struct _TIFFRGBAImage TIFFRGBAImage;
+
/*
* The image reading and conversion routines invoke
- * ``put routines'' to copy/image/whatever tiles of
+ * "put routines" to copy/image/whatever tiles of
* raw image data. A default set of routines are
* provided to convert/copy raw image data to 8-bit
* packed ABGR format rasters. Applications can supply
@@ -193,40 +242,41 @@ typedef void (*tileContigRoutine)
typedef void (*tileSeparateRoutine)
(TIFFRGBAImage*, uint32_t*, uint32_t, uint32_t, uint32_t, uint32_t, int32_t, int32_t,
unsigned char*, unsigned char*, unsigned char*, unsigned char*);
+
/*
* RGBA-reader state.
*/
struct _TIFFRGBAImage {
- TIFF* tif; /* image handle */
- int stoponerr; /* stop on read error */
- int isContig; /* data is packed/separate */
- int alpha; /* type of alpha data present */
- uint32_t width; /* image width */
- uint32_t height; /* image height */
- uint16_t bitspersample; /* image bits/sample */
- uint16_t samplesperpixel; /* image samples/pixel */
- uint16_t orientation; /* image orientation */
- uint16_t req_orientation; /* requested orientation */
- uint16_t photometric; /* image photometric interp */
- uint16_t* redcmap; /* colormap palette */
+ TIFF* tif; /**< image handle */
+ int stoponerr; /**< stop on read error */
+ int isContig; /**< data is packed/separate */
+ int alpha; /**< type of alpha data present */
+ uint32_t width; /**< image width */
+ uint32_t height; /**< image height */
+ uint16_t bitspersample; /**< image bits/sample */
+ uint16_t samplesperpixel; /**< image samples/pixel */
+ uint16_t orientation; /**< image orientation */
+ uint16_t req_orientation; /**< requested orientation */
+ uint16_t photometric; /**< image photometric interp */
+ uint16_t* redcmap; /**< colormap palette */
uint16_t* greencmap;
uint16_t* bluecmap;
- /* get image data routine */
+ /** get image data routine */
int (*get)(TIFFRGBAImage*, uint32_t*, uint32_t, uint32_t);
- /* put decoded strip/tile */
+ /** put decoded strip/tile */
union {
void (*any)(TIFFRGBAImage*);
tileContigRoutine contig;
tileSeparateRoutine separate;
} put;
- TIFFRGBValue* Map; /* sample mapping array */
- uint32_t** BWmap; /* black&white map */
- uint32_t** PALmap; /* palette image map */
- TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */
- TIFFCIELabToRGB* cielab; /* CIE L*a*b conversion state */
+ TIFFRGBValue* Map; /**< sample mapping array */
+ uint32_t** BWmap; /**< black&white map */
+ uint32_t** PALmap; /**< palette image map */
+ TIFFYCbCrToRGB* ycbcr; /**< YCbCr conversion state */
+ TIFFCIELabToRGB* cielab; /**< CIE L*a*b conversion state */
- uint8_t* UaToAa; /* Unassociated alpha to associated alpha conversion LUT */
- uint8_t* Bitdepth16To8; /* LUT for conversion from 16bit to 8bit values */
+ uint8_t* UaToAa; /**< Unassociated alpha to associated alpha conversion LUT */
+ uint8_t* Bitdepth16To8; /**< LUT for conversion from 16bit to 8bit values */
int row_offset;
int col_offset;
@@ -248,7 +298,11 @@ struct _TIFFRGBAImage {
* More codecs may be registered through calls to the library
* and/or the builtin implementations may be overridden.
*/
+
+/** Codec initialisation method. */
typedef int (*TIFFInitMethod)(TIFF*, int);
+
+/** Codec definition */
typedef struct {
char* name;
uint16_t scheme;
@@ -272,157 +326,1049 @@ typedef struct {
#if defined(c_plusplus) || defined(__cplusplus)
extern "C" {
#endif
-typedef void (*TIFFErrorHandler)(const char*, const char*, va_list);
-typedef void (*TIFFErrorHandlerExt)(thandle_t, const char*, const char*, va_list);
-typedef tmsize_t (*TIFFReadWriteProc)(thandle_t, void*, tmsize_t);
-typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
-typedef int (*TIFFCloseProc)(thandle_t);
-typedef toff_t (*TIFFSizeProc)(thandle_t);
-typedef int (*TIFFMapFileProc)(thandle_t, void** base, toff_t* size);
-typedef void (*TIFFUnmapFileProc)(thandle_t, void* base, toff_t size);
-typedef void (*TIFFExtendProc)(TIFF*);
+/**
+ * @brief Pointer to error handling function.
+ * @param module Module name
+ * @param fmt Message format string
+ * @param ap Message format arguments
+ */
+typedef void (*TIFFErrorHandler)(const char* module, const char* fmt, va_list ap);
+
+/**
+ * @brief Pointer to extended error handling function.
+ * @param handle Client handle
+ * @param module Module name
+ * @param fmt Message format string
+ * @param ap Message format arguments
+ */
+typedef void (*TIFFErrorHandlerExt)(thandle_t handle, const char* module, const char* fmt, va_list ap);
+
+/**
+ * @brief Pointer to read or write function.
+ * @param handle Client handle
+ * @param buf Pointer to data buffer for reading into or writing from
+ * @param size Size of data buffer
+ * @returns Number of bytes read or written
+ */
+typedef tmsize_t (*TIFFReadWriteProc)(thandle_t handle, void* buf, tmsize_t size);
+
+/**
+ * @brief Pointer to seek function.
+ * @param handle Client handle
+ * @param offset Offset value
+ * @param whence Seek directive
+ * @returns New file offset
+ */
+typedef toff_t (*TIFFSeekProc)(thandle_t handle, toff_t offset, int whence);
+
+/**
+ * @brief Pointer to close function.
+ * @param handle Client handle
+ * @returns Status value
+ */
+typedef int (*TIFFCloseProc)(thandle_t handle);
+
+/**
+ * @brief Pointer to size function.
+ * @param handle Client handle
+ * @returns Client handle filesize in bytes
+ */
+typedef toff_t (*TIFFSizeProc)(thandle_t handle);
+
+/**
+ * @brief Pointer to memory map function.
+ * @param handle Client handle
+ * @param[out] base Pointer to the address of the mapped region
+ * @param[out] size Pointer to the size of the mapped region
+ * @returns Status value
+ */
+typedef int (*TIFFMapFileProc)(thandle_t handle, void** base, toff_t* size);
+
+/**
+ * @brief Pointer to memory unmap function.
+ * @param handle Client handle
+ * @param[out] base Address of the mapped region
+ * @param[out] size Size of the mapped region
+ * @returns Status value
+ */
+typedef void (*TIFFUnmapFileProc)(thandle_t handle, void* base, toff_t size);
+
+/**
+ * @brief Pointer to tag extender function.
+ * @param tif TIFF file
+ */
+typedef void (*TIFFExtendProc)(TIFF* tif);
+
+/**
+ * @brief Get LibTIFF release version number as a string.
+ * @return Version string
+ */
extern const char* TIFFGetVersion(void);
-extern const TIFFCodec* TIFFFindCODEC(uint16_t);
-extern TIFFCodec* TIFFRegisterCODEC(uint16_t, const char*, TIFFInitMethod);
-extern void TIFFUnRegisterCODEC(TIFFCodec*);
-extern int TIFFIsCODECConfigured(uint16_t);
+/**
+ * @brief Find a compression codec by number.
+ * @details Search registered codecs, then built-in codecs.
+ * @param scheme Compression codec scheme number
+ * @return Pointer to compression codec, or NULL if the codec was not found
+ */
+extern const TIFFCodec* TIFFFindCODEC(uint16_t scheme);
+
+/**
+ * @brief Register a compression codec.
+ * @param scheme Compression codec scheme number
+ * @param name Compression codec name
+ * @param init Initialisation function
+ * @return Pointer to compression codec, or NULL if the codec could not be registered
+ */
+extern TIFFCodec* TIFFRegisterCODEC(uint16_t scheme, const char* name, TIFFInitMethod init);
+
+/**
+ * @brief Unregister a compression codec.
+ * @param codec Codec to unregister
+ */
+extern void TIFFUnRegisterCODEC(TIFFCodec* codec);
+
+/**
+ * @brief Check if codec is functional.
+ * @param scheme Compression codec scheme number
+ * @return 1 if the codec is configured and working, otherwise 0.
+ */
+extern int TIFFIsCODECConfigured(uint16_t scheme);
+
+/**
+ * @brief Get list of configured codecs
+ * @details The list includes both built-in codecs and codecs registered by the user.
+ * @note The caller is responsible for freeing the returned structure, which
+ * is a contiguous allocation containing all of the TIFFCodec records. Free
+ * with _TIFFfree.
+ *
+ * @return An array of TIFFCodec records (the last record is NULL)
+ * or NULL if function failed.
+ */
extern TIFFCodec* TIFFGetConfiguredCODECs(void);
/*
- * Auxiliary functions.
+ * Memory functions.
*/
+/**
+ * Allocate memory.
+ * @param s Size to allocate
+ * @return Pointer to allocated memory, or NULL if allocation failed or s was 0.
+ */
extern void* _TIFFmalloc(tmsize_t s);
+
+/**
+ * Allocate cleared memory.
+ * @param nmemb Number of members
+ * @param siz Size of each member
+ * @return Pointer to allocated memory, or NULL if allocation failed or s was 0.
+ */
extern void* _TIFFcalloc(tmsize_t nmemb, tmsize_t siz);
+
+/**
+ * Resize allocated memory.
+ * @param p Pointer to existing allocation
+ * @param s Size to reallocate; must be nonzero
+ * @return Pointer to reallocated memory, or NULL if allocation failed.
+ */
extern void* _TIFFrealloc(void* p, tmsize_t s);
+
+/**
+ * Set memory to value
+ * @param p Pointer to object to fill
+ * @param v Value to set
+ * @param c Object size
+ */
extern void _TIFFmemset(void* p, int v, tmsize_t c);
+
+/**
+ * Copy memory
+ * @param d Destination object
+ * @param s Source object
+ * @param c Object size
+ */
extern void _TIFFmemcpy(void* d, const void* s, tmsize_t c);
+
+/**
+ * @brief Compare memory
+ * @details Lexicographical comparison of memory values
+ * @param p1 First object
+ * @param p2 Second object
+ * @param c Object size
+ * @return <0 if p1 sorts before p2, >0 if p1 sorts after p2, 0 if p1 and p2 are identical
+ */
extern int _TIFFmemcmp(const void* p1, const void* p2, tmsize_t c);
+
+/**
+ * Free allocated memory
+ * @param p Pointer to allocated memory
+ */
extern void _TIFFfree(void* p);
-/*
-** Stuff, related to tag handling and creating custom tags.
-*/
-extern int TIFFGetTagListCount( TIFF * );
-extern uint32_t TIFFGetTagListEntry(TIFF *, int tag_index );
-
-#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */
-#define TIFF_VARIABLE -1 /* marker for variable length tags */
-#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */
-#define TIFF_VARIABLE2 -3 /* marker for uint32_t var-length tags */
+/**
+ * @brief Get number of "custom" tags in the current directory.
+ * @param tif TIFF file
+ * @return Number of tags
+ */
+extern int TIFFGetTagListCount( TIFF * tif);
+
+/**
+ * @brief Get the TIFF tag number for a "custom" tag by index
+ * @param tif TIFF file
+ * @param tag_index "custom" tag index number
+ * @return TIFF tag number, or -1 if the index was invalid
+ */
+extern uint32_t TIFFGetTagListEntry(TIFF * tif, int tag_index );
+/** TIFF tag length is determined by field descriptor searching */
+#define TIFF_ANY TIFF_NOTYPE
+/* TIFF tag length is variable length, stored as uint16_t */
+#define TIFF_VARIABLE -1
+/* TIFF tag length is variable length, defined by SamplesPerPixel tag */
+#define TIFF_SPP -2
+/* TIFF tag length is variable length, stored as uint32_t */
+#define TIFF_VARIABLE2 -3
+
+/** TIFFField custom bit */
#define FIELD_CUSTOM 65
+/**
+ * @brief TIFF Field structure.
+ * @details This private structure defines the content of a TIFF field,
+ * including the tag number, tag name, field type, read and write counts.
+ */
typedef struct _TIFFField TIFFField;
+
+/**
+ * @brief Array of TIFF Field structures.
+ * @details This private structure defines a collection of TIFF fields.
+ */
typedef struct _TIFFFieldArray TIFFFieldArray;
-extern const TIFFField* TIFFFindField(TIFF *, uint32_t, TIFFDataType);
-extern const TIFFField* TIFFFieldWithTag(TIFF*, uint32_t);
-extern const TIFFField* TIFFFieldWithName(TIFF*, const char *);
+/**
+ * @brief Find field by tag number and datatype
+ * @param tif TIFF file
+ * @param tag Field tag number
+ * @param dt Field data type
+ * @return Field, or NULL if not found
+ */
+extern const TIFFField* TIFFFindField(TIFF *tif, uint32_t tag, TIFFDataType dt);
+
+/**
+ * @brief Find field by tag number
+ * @details Will find any datatype and is equivalent to
+ * TIFFFindField with TAG_ANY as the datatype.
+ * @param tif TIFF file
+ * @return Field, or NULL if not found
+ */
+extern const TIFFField* TIFFFieldWithTag(TIFF* tif, uint32_t tag);
+
+/**
+ * @brief Find field by tag name
+ * @details Will find any datatype and is equivalent to
+ * _TIFFFindFieldByName with TAG_ANY as the datatype.
+ * @param tif TIFF file
+ * @param field_name Field name to find
+ * @return Field, or NULL if not found
+ */
+extern const TIFFField* TIFFFieldWithName(TIFF* tif, const char * field_name);
+
+/**
+ * @brief Get field tag number
+ * @param fip Field information pointer
+ * @return Field tag number
+ */
+extern uint32_t TIFFFieldTag(const TIFFField* fip);
+
+/**
+ * @brief Get field tag name
+ * @param fip Field information pointer
+ * @return Field tag name
+ */
+extern const char* TIFFFieldName(const TIFFField* fip);
+
+/**
+ * @brief Get field data type
+ * @param fip Field information pointer
+ * @return Field data type
+ */
+extern TIFFDataType TIFFFieldDataType(const TIFFField* fip);
+
+/**
+ * @brief Get field pass count
+ * @param fip Field information pointer
+ * @return Field pass count
+ */
+extern int TIFFFieldPassCount(const TIFFField* fip);
+
+/**
+ * @brief Get field read count
+ * @param fip Field information pointer
+ * @return Field read count
+ */
+extern int TIFFFieldReadCount(const TIFFField* fip);
+
+/**
+ * @brief Get field write count
+ * @param fip Field information pointer
+ * @return Field write count
+ */
+extern int TIFFFieldWriteCount(const TIFFField* fip);
+
+/**
+ * @brief Get field data type size
+ * @details Internal storage size of field data type in bytes.
+ * @param fip Field information pointer
+ * @return Field data type size
+ */
+
+extern int TIFFFieldSetGetSize(const TIFFField* fip);
-extern uint32_t TIFFFieldTag(const TIFFField*);
-extern const char* TIFFFieldName(const TIFFField*);
-extern TIFFDataType TIFFFieldDataType(const TIFFField*);
-extern int TIFFFieldPassCount(const TIFFField*);
-extern int TIFFFieldReadCount(const TIFFField*);
-extern int TIFFFieldWriteCount(const TIFFField*);
-extern int TIFFFieldSetGetSize(const TIFFField*); /* returns internal storage size of TIFFSetGetFieldType in bytes. */
-extern int TIFFFieldSetGetCountSize(const TIFFField*); /* returns size of count parameter 0=none, 2=uint16_t, 4=uint32_t */
-extern int TIFFFieldIsAnonymous(const TIFFField *);
+/**
+ * @brief Get field data type count size
+ * @details Size of count parameter 0=none, 2=uint16_t, 4=uint32_t
+ * @param fip Field information pointer
+ * @return Field data type count size
+ */
+extern int TIFFFieldSetGetCountSize(const TIFFField* fip);
+
+/**
+ * @brief Get field anonymous status
+ * @param fip Field information pointer
+ * @return Field anonymous status
+ */
+extern int TIFFFieldIsAnonymous(const TIFFField * fip);
+
+/**
+ * @brief Pointer to value setting function.
+ * @param tif TIFF file
+ * @param tag Field tag number
+ * @param ap Value-setting arguments
+ */
+typedef int (*TIFFVSetMethod)(TIFF* tif, uint32_t tag, va_list ap);
+
+/**
+ * @brief Pointer to value getting function.
+ * @param tif TIFF file
+ * @param tag Field tag number
+ * @param ap Value-getting arguments
+ */
+typedef int (*TIFFVGetMethod)(TIFF* tif, uint32_t tag, va_list ap);
-typedef int (*TIFFVSetMethod)(TIFF*, uint32_t, va_list);
-typedef int (*TIFFVGetMethod)(TIFF*, uint32_t, va_list);
-typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long);
+/**
+ * @brief Pointer to directory printing function.
+ * @param tif TIFF file
+ * @param file File handle to send formatted output to
+ * @param flags Printing flags; @see TIFFPrintDirectory for details
+ */
+typedef void (*TIFFPrintMethod)(TIFF* tif, FILE* fd, long flags);
+/**
+ * @brief TIFF tag functions.
+ */
typedef struct {
- TIFFVSetMethod vsetfield; /* tag set routine */
- TIFFVGetMethod vgetfield; /* tag get routine */
- TIFFPrintMethod printdir; /* directory print routine */
+ TIFFVSetMethod vsetfield; /**< Tag set routine */
+ TIFFVGetMethod vgetfield; /**< Tag get routine */
+ TIFFPrintMethod printdir; /**< Directory print routine */
} TIFFTagMethods;
-extern TIFFTagMethods *TIFFAccessTagMethods(TIFF *);
-extern void *TIFFGetClientInfo(TIFF *, const char *);
-extern void TIFFSetClientInfo(TIFF *, void *, const char *);
+/**
+ * @brief Get tag methods for TIFF file
+ * @note The tag methods are not overridable by the user,
+ * so there is no corresponding function to modify the
+ * methods.
+ * @param tif TIFF file
+ * @return Pointer to the tag methods
+ */
+extern TIFFTagMethods *TIFFAccessTagMethods(TIFF *tif);
+
+/**
+ * @brief Get client information
+ * @details Retrieve a previously-stored item by name.
+ * @param tif TIFF file
+ * @param name Client information name
+ * @return Pointer to client data, or NULL if name not found
+ */
+extern void *TIFFGetClientInfo(TIFF *tif, const char *name);
+
+/**
+ * @brief Set client information
+ * @details The name must be unique; if data has already been
+ * stored with this name, it will be updated to use the new
+ * data value.
+ * @param tif TIFF file
+ * @param name Client information name
+ * @param data Client data
+ */
+extern void TIFFSetClientInfo(TIFF *tif, void *name, const char *data);
+/**
+ * @brief Free the TIFF structure
+ * @details The given structure will be completely freed, so ensure
+ * the opened file handle and pointer to the close procedure are
+ * saved in external variables before callingTIFFCleanup(), if you
+ * will need this information to properly close the file.
+ *
+ * @param tif TIFF file
+ */
extern void TIFFCleanup(TIFF* tif);
+
+/**
+ * @brief Close a previously opened TIFF file.
+ * @details Close a file that was previously opened with TIFFOpen().
+ * Any buffered data are flushed to the file, including the contents of
+ * the current directory (if modified), and all resources are reclaimed.
+ *
+ * @param tif TIFF file
+ */
extern void TIFFClose(TIFF* tif);
+
+/**
+ * @brief Flush pending changes to TIFF file.
+ * @details This function will flush buffered data, update the strip
+ * or tile arrays and rewrite the current directory.
+ * @param tif TIFF file
+ * @return 0 on error, 1 on success
+ */
extern int TIFFFlush(TIFF* tif);
+
+/**
+ * @brief Flush pending image data writes to TIFF file.
+ * @details Buffered data will be flushed to the TIFF file.
+ * @note Frank Warmerdam'2000: I modified this to return 1 if
+ * TIFF_BEENWRITING is not set, so that TIFFFlush() will proceed to
+ * write out the directory. The documentation says returning 1 is an
+ * error indicator, but not having been writing isn't exactly a an
+ * error. Hopefully this doesn't cause problems for other people.
+ *
+ * @param tif TIFF file
+ * @return 0 on error, 1 on success
+ */
extern int TIFFFlushData(TIFF* tif);
+
+/**
+ * @brief Get field value
+ * @details Get the value of a field in the internal directory structure.
+ * The arguments required are tag-specific and may also depend upon
+ * other field values, such as SamplesPerPixel.
+ * @param tif TIFF file
+ * @param tag Field tag number
+ * @param ... Get arguments
+ * @return 0 on error, 1 on success
+ */
extern int TIFFGetField(TIFF* tif, uint32_t tag, ...);
+
+/**
+ * @brief Get field value (variable arguments)
+ * @details Get the value of a field in the internal directory structure.
+ * The arguments required are tag-specific and may also depend upon
+ * other field values, such as SamplesPerPixel.
+ * Like TIFFGetField, but taking a varargs
+ * parameter list. This routine is useful
+ * for building higher-level interfaces on
+ * top of the library.
+ * @param tif TIFF file
+ * @param tag Field tag number
+ * @param va_list Get variable arguments
+ * @return 0 on error, 1 on success
+ */
extern int TIFFVGetField(TIFF* tif, uint32_t tag, va_list ap);
+
+/**
+ * @brief Get field value with default if unset
+ * @details Get the value of a field in the internal directory structure.
+ * The arguments required are tag-specific and may also depend upon
+ * other field values, such as SamplesPerPixel. If unset, the default
+ * value for the field will be returned.
+ * @param tif TIFF file
+ * @param tag Field tag number
+ * @param ... Get arguments
+ * @return 0 on error, 1 on success
+ */
extern int TIFFGetFieldDefaulted(TIFF* tif, uint32_t tag, ...);
+
+/**
+ * @brief Get field value with default if unset (variable arguments)
+ * @details Get the value of a field in the internal directory structure.
+ * The arguments required are tag-specific and may also depend upon
+ * other field values, such as SamplesPerPixel. If unset, the default
+ * value for the field will be returned.
+ * Like TIFFGetField, but taking a varargs
+ * parameter list. This routine is useful
+ * for building higher-level interfaces on
+ * top of the library.
+ * @param tif TIFF file
+ * @param tag Field tag number
+ * @param va_list Get variable arguments
+ * @return 0 on error, 1 on success
+ */
extern int TIFFVGetFieldDefaulted(TIFF* tif, uint32_t tag, va_list ap);
+
+/**
+ * @brief Read the next TIFF directory
+ * @details Read the next TIFF directory from a file and convert it to
+ * the internal format. Directories are read sequentially.
+ * @param tif TIFF file
+ * @return 0 on error, 1 on success
+ */
extern int TIFFReadDirectory(TIFF* tif);
+
+/**
+ * @brief Read TIFF directory (with custom fields)
+ * @details Read custom TIFF directory from an arbitrary offset
+ * and convert it into the internal format using custom fields.
+ * Similar to TIFFReadDirectory().
+ * @param tif TIFF file
+ * @param diroff Offset into TIFF file
+ * @return 0 on error, 1 on success
+ */
extern int TIFFReadCustomDirectory(TIFF* tif, toff_t diroff, const TIFFFieldArray* infoarray);
+
+/**
+ * @brief Read EXIF directory
+ * @details Read EXIF directory from an arbitrary offset
+ * and convert it into the internal format.
+ * @note EXIF is an important special case of a custom directory.
+ * @param tif TIFF file
+ * @param diroff Offset into TIFF file
+ * @return 0 on error, 1 on success
+ */
extern int TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff);
+
+/**
+ * @brief Read EXIF-GPS directory
+ * @details Read EXIF-GPS directory from an arbitrary offset
+ * and convert it into the internal format.
+ * @note EXIF-GPS is an important special case of a custom directory.
+ * @param tif TIFF file
+ * @param diroff Offset into TIFF file
+ * @return 0 on error, 1 on success
+ */
extern int TIFFReadGPSDirectory(TIFF* tif, toff_t diroff);
+
+/**
+ * @brief Get size of scanline (unsigned 64-bit)
+ * @details Get the number of bytes to read/write in a call to
+ * one of the scanline-oriented I/O routines. Note that
+ * this number may be 1/SamplesPerPixel if the data is
+ * stored as separate planes.
+ * The ScanlineSize in case of YCbCrSubsampling is defined as the
+ * strip size divided by the strip height, i.e. the size of a pack
+ * of vertical subsampling lines divided by vertical subsampling.
+ * It should thus make sense when multiplied by a multiple of
+ * vertical subsampling.
+ * @param tif TIFF file
+ * @return Scanline size in bytes, or 0 on error
+ */
extern uint64_t TIFFScanlineSize64(TIFF* tif);
+
+/**
+ * @brief Get size of scanline (signed integer)
+ * @details Get the number of bytes to read/write in a call to
+ * one of the scanline-oriented I/O routines. Note that
+ * this number may be 1/SamplesPerPixel if the data is
+ * stored as separate planes.
+ * The ScanlineSize in case of YCbCrSubsampling is defined as the
+ * strip size divided by the strip height, i.e. the size of a pack
+ * of vertical subsampling lines divided by vertical subsampling.
+ * It should thus make sense when multiplied by a multiple of
+ * vertical subsampling.
+ * @param tif TIFF file
+ * @return Scanline size in bytes, or 0 on error
+ */
extern tmsize_t TIFFScanlineSize(TIFF* tif);
+
+/**
+ * @brief Get size of raster scanline (unsigned 64-bit)
+ * @details Return the number of bytes required to store a complete
+ * decoded and packed raster scanline (as opposed to the
+ * I/O size returned by TIFFScanlineSize which may be less
+ * if data is store as separate planes).
+ * @param tif TIFF file
+ * @return Raster scanline size in bytes, or 0 on error
+ */
extern uint64_t TIFFRasterScanlineSize64(TIFF* tif);
+
+/**
+ * @brief Get size of raster scanline (signed integer)
+ * @details Return the number of bytes required to store a complete
+ * decoded and packed raster scanline (as opposed to the
+ * I/O size returned by TIFFScanlineSize which may be less
+ * if data is store as separate planes).
+ * @param tif TIFF file
+ * @return Raster scanline size in bytes, or 0 on error
+ */
extern tmsize_t TIFFRasterScanlineSize(TIFF* tif);
+
+
+/**
+ * @brief Get size of a strip (unsigned 64-bit)
+ * @details Get the number of bytes in a row-aligned strip.
+ * @note If RowsPerStrip is larger than the
+ * recorded ImageLength, then the strip size is
+ * truncated to reflect the actual space required
+ * to hold the strip.
+ * @param tif TIFF file
+ * @return Strip size in bytes, or 0 on error
+ */
extern uint64_t TIFFStripSize64(TIFF* tif);
+
+/**
+ * @brief Get size of a strip (signed integer)
+ * @details Get the number of bytes in a row-aligned strip.
+ * @note If RowsPerStrip is larger than the
+ * recorded ImageLength, then the strip size is
+ * truncated to reflect the actual space required
+ * to hold the strip.
+ * @param tif TIFF file
+ * @return Strip size in bytes, or 0 on error
+ */
extern tmsize_t TIFFStripSize(TIFF* tif);
+
+/**
+ * @brief Get "raw" size of a strip (unsigned 64-bit)
+ * @details Get the number of bytes in a row-aligned strip.
+ * @note "Raw" means the size of a strip which has not been
+ * decoded.
+ * @param tif TIFF file
+ * @return Strip size in bytes, or 0 on error
+ */
extern uint64_t TIFFRawStripSize64(TIFF* tif, uint32_t strip);
+
+/**
+ * @brief Get "raw" size of a strip (signed integer)
+ * @details Get the number of bytes in a row-aligned strip.
+ * @note "Raw" means the size of a strip which has not been
+ * decoded.
+ * @param tif TIFF file
+ * @return Strip size in bytes, or 0 on error
+ */
extern tmsize_t TIFFRawStripSize(TIFF* tif, uint32_t strip);
+
+/**
+ * @brief Get size of a strip with variable row count (unsigned 64-bit)
+ * @details Get the number of bytes in a row-aligned strip with the
+ * specified row count.
+ * @note If RowsPerStrip is larger than the
+ * recorded ImageLength, then the strip size is
+ * truncated to reflect the actual space required
+ * to hold the strip.
+ * @param tif TIFF file
+ * @param nrows Row count
+ * @return Strip size in bytes, or 0 on error
+ */
extern uint64_t TIFFVStripSize64(TIFF* tif, uint32_t nrows);
+
+/**
+ * @brief Get size of a strip with variable row count (signed integer)
+ * @details Get the number of bytes in a row-aligned strip with the
+ * specified row count.
+ * @note If RowsPerStrip is larger than the
+ * recorded ImageLength, then the strip size is
+ * truncated to reflect the actual space required
+ * to hold the strip.
+ * @param tif TIFF file
+ * @param nrows Row count
+ * @return Strip size in bytes, or 0 on error
+ */
extern tmsize_t TIFFVStripSize(TIFF* tif, uint32_t nrows);
+
+/**
+ * @brief Get size of each row of a tile (unsigned 64-bit)
+ * @details Get the number of bytes in each row of a tile.
+ * @param tif TIFF file
+ * @return Row size in bytes, or 0 on error
+ */
extern uint64_t TIFFTileRowSize64(TIFF* tif);
+
+/**
+ * @brief Get size of each row of a tile (signed integer)
+ * @details Get the number of bytes in each row of a tile.
+ * @param tif TIFF file
+ * @return Row size in bytes, or 0 on error
+ */
extern tmsize_t TIFFTileRowSize(TIFF* tif);
+
+/**
+ * @brief Get size of a tile (unsigned 64-bit)
+ * @details Get the number of bytes in a row-aligned tile.
+ * @param tif TIFF file
+ * @return Row size in bytes, or 0 on error
+ */
extern uint64_t TIFFTileSize64(TIFF* tif);
+
+/**
+ * @brief Get size of a tile (signed integer)
+ * @details Get the number of bytes in a row-aligned tile.
+ * @param tif TIFF file
+ * @return Row size in bytes, or 0 on error
+ */
extern tmsize_t TIFFTileSize(TIFF* tif);
+
+/**
+ * @brief Get size of a tile with variable row count (unsigned 64-bit)
+ * @details Get the number of bytes in a row-aligned tile
+ * with the specified row count.
+ * @param tif TIFF file
+ * @param nrows Row count
+ * @return Row size in bytes, or 0 on error
+ */
extern uint64_t TIFFVTileSize64(TIFF* tif, uint32_t nrows);
+
+/**
+ * @brief Get size of a tile with variable row count (signed integer)
+ * @details Get the number of bytes in a row-aligned tile
+ * with the specified row count.
+ * @param tif TIFF file
+ * @param nrows Row count
+ * @return Row size in bytes, or 0 on error
+ */
extern tmsize_t TIFFVTileSize(TIFF* tif, uint32_t nrows);
+
+/**
+ * @brief Get default strip size for current directory
+ * @details Get the default strip size based upon the image
+ * characteristics and a requested value. If the
+ * request is <1, choose a strip size according
+ * to certain heuristics.
+ * @param tif TIFF file
+ * @param request Requested size. Set to <1 to compute default size.
+ * @return Computed strip size if request value was <1, or else request value.
+ */
extern uint32_t TIFFDefaultStripSize(TIFF* tif, uint32_t request);
-extern void TIFFDefaultTileSize(TIFF*, uint32_t*, uint32_t*);
-extern int TIFFFileno(TIFF*);
-extern int TIFFSetFileno(TIFF*, int);
-extern thandle_t TIFFClientdata(TIFF*);
-extern thandle_t TIFFSetClientdata(TIFF*, thandle_t);
-extern int TIFFGetMode(TIFF*);
-extern int TIFFSetMode(TIFF*, int);
-extern int TIFFIsTiled(TIFF*);
-extern int TIFFIsByteSwapped(TIFF*);
-extern int TIFFIsUpSampled(TIFF*);
-extern int TIFFIsMSB2LSB(TIFF*);
-extern int TIFFIsBigEndian(TIFF*);
-extern int TIFFIsBigTIFF(TIFF*);
-extern TIFFReadWriteProc TIFFGetReadProc(TIFF*);
-extern TIFFReadWriteProc TIFFGetWriteProc(TIFF*);
-extern TIFFSeekProc TIFFGetSeekProc(TIFF*);
-extern TIFFCloseProc TIFFGetCloseProc(TIFF*);
-extern TIFFSizeProc TIFFGetSizeProc(TIFF*);
-extern TIFFMapFileProc TIFFGetMapFileProc(TIFF*);
-extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF*);
-extern uint32_t TIFFCurrentRow(TIFF*);
-extern uint16_t TIFFCurrentDirectory(TIFF*);
-extern uint16_t TIFFNumberOfDirectories(TIFF*);
-extern uint64_t TIFFCurrentDirOffset(TIFF*);
-extern uint32_t TIFFCurrentStrip(TIFF*);
+
+/**
+ * @brief Get default tile size for current directory
+ * @details Get the default tile size based on the image
+ * characteristics. If the tw or th requests are <1,
+ * choose a size according to certain heuristics.
+ * @param tif TIFF file
+ * @param[inout] tw Tile width; must be desired width or <1 to compute
+ * @param[inout] th Tile height; must be desired width or <1 to compute
+ */
+extern void TIFFDefaultTileSize(TIFF* tif, uint32_t* tw, uint32_t* th);
+
+/**
+ * @brief Get file descriptor for open TIFF file.
+ * @param tif TIFF file
+ * @return file descriptor number
+ */
+extern int TIFFFileno(TIFF* tif);
+
+/**
+ * @brief Change file descriptor for open TIFF file.
+ * @param tif TIFF file
+ * @param fd File descriptor number
+ * @return Previous file descriptor value
+ */
+extern int TIFFSetFileno(TIFF* tif, int fd);
+
+/**
+ * @brief Get client data for open TIFF file.
+ * @param tif TIFF file
+ * @return Client data
+ */
+extern thandle_t TIFFClientdata(TIFF* tif);
+
+/**
+ * @brief Set client data for open TIFF file.
+ * @param tif TIFF file
+ * @param newvalue New client data value
+ * @return Old client data
+ */
+extern thandle_t TIFFSetClientdata(TIFF* tif, thandle_t newvalue);
+
+/**
+ * @brief Get read/write mode for open TIFF file.
+ * @param tif TIFF file
+ * @return Read/write mode
+ */
+extern int TIFFGetMode(TIFF* tif);
+
+/**
+ * @brief Set read/write mode for open TIFF file.
+ * @param tif TIFF file
+ * @param mode New read/write mode
+ * @return Old read/write mode
+ */
+extern int TIFFSetMode(TIFF* tif, int mode);
+
+/**
+ * @brief Check if current TIFF directory is tiled.
+ * @param tif TIFF file.
+ * @return 0 if strips; nonzero if tiles
+ */
+extern int TIFFIsTiled(TIFF* tif);
+
+/**
+ * @brief Check if current TIFF file is byte-swapped.
+ * @param tif TIFF file.
+ * @return 0 not byte-swapped; nonzero if byte-swapped
+ */
+extern int TIFFIsByteSwapped(TIFF* tif);
+
+/**
+ * @brief Check if current TIFF directory is up-sampled.
+ * @param tif TIFF file.
+ * @return 0 if not upsampled; nonzero if up-sampled.
+ */
+extern int TIFFIsUpSampled(TIFF* tif);
+
+/**
+ * @brief Check if current TIFF directory is MSB-to-LSB bit order.
+ * @param tif TIFF file.
+ * @return 0 if LSB-to-MSB; nonzero if MSB-to-LSB.
+ */
+extern int TIFFIsMSB2LSB(TIFF* tif);
+
+/**
+ * @brief Check if current TIFF file is big-endian.
+ * @param tif TIFF file.
+ * @return 0 if little-endian; nonzero if big-endian.
+ */
+extern int TIFFIsBigEndian(TIFF* tif);
+
+/**
+ * @brief Check if current TIFF file is a BigTIFF format TIFF.
+ * @param tif TIFF file.
+ * @return 0 if standard TIFF; nonzero if BigTIFF..
+ */
+extern int TIFFIsBigTIFF(TIFF* tif);
+
+/**
+ * Get file read method for TIFF file.
+ * @param tif TIFF file.
+ * @return File read method
+ */
+extern TIFFReadWriteProc TIFFGetReadProc(TIFF* tif);
+
+/**
+ * Get file write method for TIFF file.
+ * @param tif TIFF file.
+ * @return File write method
+ */
+extern TIFFReadWriteProc TIFFGetWriteProc(TIFF* tif);
+
+/**
+ * Get file seek method for TIFF file.
+ * @param tif TIFF file.
+ * @return File seek method
+ */
+extern TIFFSeekProc TIFFGetSeekProc(TIFF* tif);
+
+/**
+ * Get file close method for TIFF file.
+ * @param tif TIFF file.
+ * @return File close method
+ */
+extern TIFFCloseProc TIFFGetCloseProc(TIFF* tif);
+
+/**
+ * Get file size method for TIFF file.
+ * @param tif TIFF file.
+ * @return File size method
+ */
+extern TIFFSizeProc TIFFGetSizeProc(TIFF* tif);
+
+/**
+ * Get file memory map method for TIFF file.
+ * @param tif TIFF file.
+ * @return File memory map method
+ */
+extern TIFFMapFileProc TIFFGetMapFileProc(TIFF* tif);
+
+/**
+ * Get file memory unmap method for TIFF file.
+ * @param tif TIFF file.
+ * @return File memory unmap method
+ */
+extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF* tif);
+
+/**
+ * Get current row index being written
+ * @param tif TIFF file.
+ * @return Current row index.
+ */
+extern uint32_t TIFFCurrentRow(TIFF* tif);
+
+/**
+ * Get current directory index
+ * @param tif TIFF file.
+ * @return Current directory index
+ */
+extern uint16_t TIFFCurrentDirectory(TIFF* tif);
+
+/**
+ * Get the total number of directories in a file
+ * @param tif TIFF file.
+ * @return Directory count
+ */
+extern uint16_t TIFFNumberOfDirectories(TIFF* tif);
+
+/**
+ * Get file offset of the current directory.
+ * @param tif TIFF file.
+ * @return File offset
+ */
+extern uint64_t TIFFCurrentDirOffset(TIFF* tif);
+
+/**
+ * Get current strip index.
+ * @param tif
+ * @return Strip index
+ */
+extern uint32_t TIFFCurrentStrip(TIFF* tif);
+
+/**
+ * Get current tile index.
+ * @param tif
+ * @return tile index
+ */
extern uint32_t TIFFCurrentTile(TIFF* tif);
+
+/**
+ * @brief Set up raw read buffer.
+ * @details Set up the raw data buffer in preparation for
+ * reading a strip of raw data. If the buffer
+ * is specified as NULL, then a buffer of appropriate
+ * size is allocated by the library. Otherwise,
+ * the client must guarantee that the buffer is
+ * large enough to hold any individual strip of
+ * raw data.
+ * @param tif TIFF file
+ * @param bp Pointer to buffer; NULL to allocate automatically
+ * @param size Size of buffer; only used if bp is not NULL
+ * @return 0 on error, 1 on success
+ */
extern int TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size);
-extern int TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size);
-extern int TIFFSetupStrips(TIFF *);
-extern int TIFFWriteCheck(TIFF*, int, const char *);
-extern void TIFFFreeDirectory(TIFF*);
-extern int TIFFCreateDirectory(TIFF*);
-extern int TIFFCreateCustomDirectory(TIFF*,const TIFFFieldArray*);
-extern int TIFFCreateEXIFDirectory(TIFF*);
-extern int TIFFCreateGPSDirectory(TIFF*);
-extern int TIFFLastDirectory(TIFF*);
-extern int TIFFSetDirectory(TIFF*, uint16_t);
-extern int TIFFSetSubDirectory(TIFF*, uint64_t);
-extern int TIFFUnlinkDirectory(TIFF*, uint16_t);
-extern int TIFFSetField(TIFF*, uint32_t, ...);
-extern int TIFFVSetField(TIFF*, uint32_t, va_list);
-extern int TIFFUnsetField(TIFF*, uint32_t);
-extern int TIFFWriteDirectory(TIFF *);
-extern int TIFFWriteCustomDirectory(TIFF *, uint64_t *);
-extern int TIFFCheckpointDirectory(TIFF *);
-extern int TIFFRewriteDirectory(TIFF *);
-extern int TIFFDeferStrileArrayWriting(TIFF *);
-extern int TIFFForceStrileArrayWriting(TIFF* );
+
+/**
+ * @brief Set up raw write buffer.
+ * @details Set up the raw data buffer in preparation for
+ * writing a strip of raw data. If the size is specified as -1,
+ * then a buffer of appropriate size is allocated by the library
+ * (bp is ignored).
+ * If bp is NULL, a buffer of the specified size will be allocated.
+ * Otherwise, bp and size will be used as specified;
+ * the client must guarantee that the buffer is
+ * large enough to hold any individual strip of
+ * raw data.
+ * @param tif TIFF file
+ * @param bp Pointer to buffer; NULL to allocate automatically
+ * @param size Size of buffer; only used if bp is not -1 and not NULL
+ * @return 0 on error, 1 on success
+ */
+extern int TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size);
+
+/**
+ * @brief Set up directory for strip or tile reading and writing
+ * @details Compute number of strips or tiles, and allocate space
+ * for storing the per-strip or per-tile offsets and byte counts.
+ * @param tif TIFF file
+ * @return 0 on error, 1 on success
+ */
+extern int TIFFSetupStrips(TIFF* tif);
+
+/**
+ * @brief Check if set up properly for writing
+ * @details Verify file is writable and that the directory
+ * information is setup properly. In doing the latter
+ * we also "freeze" the state of the directory so
+ * that important information is not changed.
+ * @param tif TIFF file
+ * @param tiles 1 to check if writing tiles, 0 to check if writing strips
+ * @param module Module name (for error reporting)
+ * @return 0 on error, 1 on success
+ */
+extern int TIFFWriteCheck(TIFF* tif, int tiles, const char * module);
+
+/**
+ * @brief Release storage associated with a directory.
+ * @param tif TIFF file
+ */
+extern void TIFFFreeDirectory(TIFF* tif);
+
+/**
+ * @brief Create new directory
+ * @details Set up for a new directory.
+ * The newly created directory will not exist in the file until
+ * one of TIFFWriteDirectory(), TIFFFlush() or TIFFClose() is called.
+ *
+ * @todo Should we automatically call
+ * TIFFWriteDirectory() if the current one is dirty? Or fail?
+ *
+ * @param tif TIFF file
+ * @return 0 on error, 1 on success
+ */
+extern int TIFFCreateDirectory(TIFF* tif);
+
+/**
+ * @brief Create new custom directory
+ * @details In addition to the default setup performed by
+ * TIFFCreateDirectory, additionally set up the custom fields
+ * specified in the provided field array.
+ * @param tif TIFF file
+ * @param infoarray Field array
+ * @return 0 on error, 1 on success
+ */
+extern int TIFFCreateCustomDirectory(TIFF* tif,const TIFFFieldArray* infoarray);
+
+/**
+ * Create a new EXIF directory
+ * @param tif TIFF file
+ * @return 0 on error, 1 on success
+ */
+extern int TIFFCreateEXIFDirectory(TIFF* tif);
+
+/**
+ * Create a new EXIF-GPS directory
+ * @param tif TIFF file
+ * @return 0 on error, 1 on success
+ */
+extern int TIFFCreateGPSDirectory(TIFF* tif);
+
+/**
+ * @brief Check if current directory is the last directory
+ * @param tif TIFF file
+ * @return 1 if the last directory, otherwise 0
+ */
+extern int TIFFLastDirectory(TIFF* tif);
+
+/**
+ * @brief Set current directory by directory index
+ * @details Set current directory to be the n-th directory
+ * in the file.
+ * @note Directories are numbered starting at 0.
+ * @param tif TIFF file
+ * @param dirn Directory index
+ * @return 0 on error, 1 on success
+ */
+extern int TIFFSetDirectory(TIFF* tif, uint16_t dirn);
+
+/**
+ * @brief Set current directory by directory offset in file
+ * @details Set the current directory to be the directory
+ * located at the specified file offset. This interface
+ * is used mainly to access directories linked with
+ * the SubIFD tag (e.g. thumbnail images).
+ * @param tif TIFF file
+ * @param diroff Directory offset
+ * @return 0 on error, 1 on success
+ */
+extern int TIFFSetSubDirectory(TIFF* tif, uint64_t diroff);
+
+extern int TIFFUnlinkDirectory(TIFF* tif, uint16_t);
+extern int TIFFSetField(TIFF* tif, uint32_t, ...);
+extern int TIFFVSetField(TIFF* tif, uint32_t, va_list);
+extern int TIFFUnsetField(TIFF* tif, uint32_t);
+extern int TIFFWriteDirectory(TIFF * tif);
+extern int TIFFWriteCustomDirectory(TIFF * tif, uint64_t *);
+extern int TIFFCheckpointDirectory(TIFF * tif);
+extern int TIFFRewriteDirectory(TIFF * tif);
+extern int TIFFDeferStrileArrayWriting(TIFF* tif);
+extern int TIFFForceStrileArrayWriting(TIFF* tif);
#if defined(c_plusplus) || defined(__cplusplus)
extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0);
@@ -447,7 +1393,15 @@ extern int TIFFRGBAImageOK(TIFF*, char [1024]);
extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]);
extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32_t*, uint32_t, uint32_t);
extern void TIFFRGBAImageEnd(TIFFRGBAImage*);
-extern TIFF* TIFFOpen(const char*, const char*);
+
+/**
+ * @brief Open a TIFF file for reading or writing.
+ * @param name The filename of the file to open
+ * @param mode THe open mode of the file
+ * @return The opened TIFF file, or NULL if opening failed
+ */
+extern TIFF* TIFFOpen(const char* name, const char* mode);
+
# ifdef __WIN32__
extern TIFF* TIFFOpenW(const wchar_t*, const char*);
# endif /* __WIN32__ */
@@ -549,18 +1503,34 @@ extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32_t, int32_t, int32_t,
* Don't use this stuff in your applications, it may be removed in the future
* libtiff versions.
****************************************************************************/
+
+/**
+ * @brief TIFF field description (obsolete)
+ * @see TIFField
+ * @deprecated Use TIFFField and associated functions instead.
+ */
typedef struct {
- ttag_t field_tag; /* field's tag */
- short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
- short field_writecount; /* write count/TIFF_VARIABLE */
- TIFFDataType field_type; /* type of associated data */
- unsigned short field_bit; /* bit in fieldsset bit vector */
- unsigned char field_oktochange; /* if true, can change while writing */
- unsigned char field_passcount; /* if true, pass dir count on set */
- char *field_name; /* ASCII name */
+ ttag_t field_tag; /**< field's tag */
+ short field_readcount; /**< read count/TIFF_VARIABLE/TIFF_SPP */
+ short field_writecount; /**< write count/TIFF_VARIABLE */
+ TIFFDataType field_type; /**< type of associated data */
+ unsigned short field_bit; /**< bit in field's set bit vector */
+ unsigned char field_oktochange; /**< if true, can change while writing */
+ unsigned char field_passcount; /**< if true, pass dir count on set */
+ char *field_name; /**< ASCII name */
} TIFFFieldInfo;
-extern int TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], uint32_t);
+/**
+ * Merge custom TIFF field definitions for use with current TIFF file
+ * @see TIFField
+ * @deprecated Use TIFFField and associated functions instead.
+ * @todo Add example and references for replacement functionality.
+ * @param tif TIFF file
+ * @param info Array of field definitions
+ * @param n Number of field definitions in array
+ * @return 0 on success, -1 on failure
+ */
+extern int TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], uint32_t n);
#if defined(c_plusplus) || defined(__cplusplus)
}