2010-05-12 01:44:00 +08:00
/*
* Copyright ( c ) 1988 - 1997 Sam Leffler
* Copyright ( c ) 1991 - 1997 Silicon Graphics , Inc .
*
2017-12-08 20:47:54 +08:00
* Permission to use , copy , modify , distribute , and sell this software and
2010-05-12 01:44:00 +08:00
* its documentation for any purpose is hereby granted without fee , provided
* that ( i ) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation , and ( ii ) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific , prior written
* permission of Sam Leffler and Silicon Graphics .
2017-12-08 20:47:54 +08:00
*
* THE SOFTWARE IS PROVIDED " AS-IS " AND WITHOUT WARRANTY OF ANY KIND ,
* EXPRESS , IMPLIED OR OTHERWISE , INCLUDING WITHOUT LIMITATION , ANY
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE .
*
2010-05-12 01:44:00 +08:00
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL , INCIDENTAL , INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND ,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE , DATA OR PROFITS ,
2017-12-08 20:47:54 +08:00
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE , AND ON ANY THEORY OF
* LIABILITY , ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
2010-05-12 01:44:00 +08:00
* OF THIS SOFTWARE .
*/
# ifndef _TIFFDIR_
# define _TIFFDIR_
2019-02-12 21:43:58 +08:00
# include "tiff.h"
# include "tiffio.h"
2010-05-12 01:44:00 +08:00
/*
* ` ` Library - private ' ' Directory - related Definitions .
*/
2012-02-29 23:01:28 +08:00
typedef struct {
2017-12-08 20:47:54 +08:00
const TIFFField * info ;
int count ;
void * value ;
2012-02-29 23:01:28 +08:00
} TIFFTagValue ;
/*
* TIFF Image File Directories are comprised of a table of field
* descriptors of the form shown below . The table is sorted in
* ascending order by tag . The values associated with each entry are
* disjoint and may appear anywhere in the file ( so long as they are
* placed on a word boundary ) .
*
* If the value is 4 bytes or less , in ClassicTIFF , or 8 bytes or less in
* BigTIFF , then it is placed in the offset field to save space . If so ,
* it is left - justified in the offset field .
*/
typedef struct {
2017-12-08 20:47:54 +08:00
uint16 tdir_tag ; /* see below */
uint16 tdir_type ; /* data type; see below */
uint64 tdir_count ; /* number of items; length in spec */
union {
uint16 toff_short ;
uint32 toff_long ;
uint64 toff_long8 ;
} tdir_offset ; /* either offset or the data itself if fits */
2021-03-02 07:17:30 +08:00
uint8 tdir_ignore ; /* flag status to ignore tag when parsing tags in tif_dirread.c */
2012-02-29 23:01:28 +08:00
} TIFFDirEntry ;
2010-05-12 01:44:00 +08:00
/*
* Internal format of a TIFF directory entry .
*/
2012-02-29 23:01:28 +08:00
typedef struct {
# define FIELD_SETLONGS 4
2017-12-08 20:47:54 +08:00
/* bit vector of fields that are set */
unsigned long td_fieldsset [ FIELD_SETLONGS ] ;
2010-05-12 01:44:00 +08:00
2017-12-08 20:47:54 +08:00
uint32 td_imagewidth , td_imagelength , td_imagedepth ;
uint32 td_tilewidth , td_tilelength , td_tiledepth ;
uint32 td_subfiletype ;
uint16 td_bitspersample ;
uint16 td_sampleformat ;
uint16 td_compression ;
uint16 td_photometric ;
uint16 td_threshholding ;
uint16 td_fillorder ;
uint16 td_orientation ;
uint16 td_samplesperpixel ;
uint32 td_rowsperstrip ;
uint16 td_minsamplevalue , td_maxsamplevalue ;
double * td_sminsamplevalue ;
double * td_smaxsamplevalue ;
float td_xresolution , td_yresolution ;
uint16 td_resolutionunit ;
uint16 td_planarconfig ;
float td_xposition , td_yposition ;
uint16 td_pagenumber [ 2 ] ;
uint16 * td_colormap [ 3 ] ;
uint16 td_halftonehints [ 2 ] ;
uint16 td_extrasamples ;
uint16 * td_sampleinfo ;
/* even though the name is misleading, td_stripsperimage is the number
* of striles ( = strips or tiles ) per plane , and td_nstrips the total
* number of striles */
uint32 td_stripsperimage ;
uint32 td_nstrips ; /* size of offset & bytecount arrays */
2021-03-02 07:17:30 +08:00
uint64 * td_stripoffset_p ; /* should be accessed with TIFFGetStrileOffset */
uint64 * td_stripbytecount_p ; /* should be accessed with TIFFGetStrileByteCount */
uint32 td_stripoffsetbyteallocsize ; /* number of elements currently allocated for td_stripoffset/td_stripbytecount. Only used if TIFF_LAZYSTRILELOAD is set */
# ifdef STRIPBYTECOUNTSORTED_UNUSED
2017-12-08 20:47:54 +08:00
int td_stripbytecountsorted ; /* is the bytecount array sorted ascending? */
2021-03-02 07:17:30 +08:00
# endif
2012-02-29 23:01:28 +08:00
TIFFDirEntry td_stripoffset_entry ; /* for deferred loading */
TIFFDirEntry td_stripbytecount_entry ; /* for deferred loading */
2017-12-08 20:47:54 +08:00
uint16 td_nsubifd ;
uint64 * td_subifd ;
/* YCbCr parameters */
uint16 td_ycbcrsubsampling [ 2 ] ;
uint16 td_ycbcrpositioning ;
/* Colorimetry parameters */
uint16 * td_transferfunction [ 3 ] ;
float * td_refblackwhite ;
/* CMYK parameters */
int td_inknameslen ;
char * td_inknames ;
2010-07-16 20:54:53 +08:00
2017-12-08 20:47:54 +08:00
int td_customValueCount ;
2010-05-12 01:44:00 +08:00
TIFFTagValue * td_customValues ;
2021-03-02 07:17:30 +08:00
unsigned char td_deferstrilearraywriting ; /* see TIFFDeferStrileArrayWriting() */
2010-05-12 01:44:00 +08:00
} TIFFDirectory ;
/*
2012-02-29 23:01:28 +08:00
* Field flags used to indicate fields that have been set in a directory , and
* to reference fields when manipulating a directory .
2010-05-12 01:44:00 +08:00
*/
/*
2012-02-29 23:01:28 +08:00
* FIELD_IGNORE is used to signify tags that are to be processed but otherwise
* ignored . This permits antiquated tags to be quietly read and discarded .
* Note that a bit * is * allocated for ignored tags ; this is understood by the
* directory reading logic which uses this fact to avoid special - case handling
*/
# define FIELD_IGNORE 0
2010-05-12 01:44:00 +08:00
/* multi-item fields */
2012-02-29 23:01:28 +08:00
# define FIELD_IMAGEDIMENSIONS 1
# define FIELD_TILEDIMENSIONS 2
# define FIELD_RESOLUTION 3
# define FIELD_POSITION 4
2010-05-12 01:44:00 +08:00
/* single-item fields */
2012-02-29 23:01:28 +08:00
# define FIELD_SUBFILETYPE 5
# define FIELD_BITSPERSAMPLE 6
# define FIELD_COMPRESSION 7
# define FIELD_PHOTOMETRIC 8
# define FIELD_THRESHHOLDING 9
# define FIELD_FILLORDER 10
# define FIELD_ORIENTATION 15
# define FIELD_SAMPLESPERPIXEL 16
# define FIELD_ROWSPERSTRIP 17
# define FIELD_MINSAMPLEVALUE 18
# define FIELD_MAXSAMPLEVALUE 19
# define FIELD_PLANARCONFIG 20
# define FIELD_RESOLUTIONUNIT 22
# define FIELD_PAGENUMBER 23
# define FIELD_STRIPBYTECOUNTS 24
# define FIELD_STRIPOFFSETS 25
# define FIELD_COLORMAP 26
# define FIELD_EXTRASAMPLES 31
# define FIELD_SAMPLEFORMAT 32
# define FIELD_SMINSAMPLEVALUE 33
# define FIELD_SMAXSAMPLEVALUE 34
# define FIELD_IMAGEDEPTH 35
# define FIELD_TILEDEPTH 36
# define FIELD_HALFTONEHINTS 37
# define FIELD_YCBCRSUBSAMPLING 39
# define FIELD_YCBCRPOSITIONING 40
# define FIELD_REFBLACKWHITE 41
# define FIELD_TRANSFERFUNCTION 44
# define FIELD_INKNAMES 46
# define FIELD_SUBIFD 49
/* FIELD_CUSTOM (see tiffio.h) 65 */
2010-05-12 01:44:00 +08:00
/* end of support for well-known tags; codec-private tags follow */
2012-02-29 23:01:28 +08:00
# define FIELD_CODEC 66 /* base of codec-private tags */
2010-05-12 01:44:00 +08:00
/*
2012-02-29 23:01:28 +08:00
* Pseudo - tags don ' t normally need field bits since they are not written to an
* output file ( by definition ) . The library also has express logic to always
* query a codec for a pseudo - tag so allocating a field bit for one is a
* waste . If codec wants to promote the notion of a pseudo - tag being ` ` set ' '
* or ` ` unset ' ' then it can do using internal state flags without polluting
* the field bit space defined for real tags .
2010-05-12 01:44:00 +08:00
*/
2012-02-29 23:01:28 +08:00
# define FIELD_PSEUDO 0
2010-05-12 01:44:00 +08:00
2012-02-29 23:01:28 +08:00
# define FIELD_LAST (32*FIELD_SETLONGS-1)
2010-05-12 01:44:00 +08:00
2012-02-29 23:01:28 +08:00
# define BITn(n) (((unsigned long)1L)<<((n)&0x1f))
# define BITFIELDn(tif, n) ((tif)->tif_dir.td_fieldsset[(n) / 32])
# define TIFFFieldSet(tif, field) (BITFIELDn(tif, field) & BITn(field))
2010-05-12 01:44:00 +08:00
# define TIFFSetFieldBit(tif, field) (BITFIELDn(tif, field) |= BITn(field))
# define TIFFClrFieldBit(tif, field) (BITFIELDn(tif, field) &= ~BITn(field))
2012-02-29 23:01:28 +08:00
# define FieldSet(fields, f) (fields[(f) / 32] & BITn(f))
# define ResetFieldBit(fields, f) (fields[(f) / 32] &= ~BITn(f))
typedef enum {
2017-12-08 20:47:54 +08:00
TIFF_SETGET_UNDEFINED = 0 ,
TIFF_SETGET_ASCII = 1 ,
TIFF_SETGET_UINT8 = 2 ,
TIFF_SETGET_SINT8 = 3 ,
TIFF_SETGET_UINT16 = 4 ,
TIFF_SETGET_SINT16 = 5 ,
TIFF_SETGET_UINT32 = 6 ,
TIFF_SETGET_SINT32 = 7 ,
TIFF_SETGET_UINT64 = 8 ,
TIFF_SETGET_SINT64 = 9 ,
TIFF_SETGET_FLOAT = 10 ,
TIFF_SETGET_DOUBLE = 11 ,
TIFF_SETGET_IFD8 = 12 ,
TIFF_SETGET_INT = 13 ,
TIFF_SETGET_UINT16_PAIR = 14 ,
TIFF_SETGET_C0_ASCII = 15 ,
TIFF_SETGET_C0_UINT8 = 16 ,
TIFF_SETGET_C0_SINT8 = 17 ,
TIFF_SETGET_C0_UINT16 = 18 ,
TIFF_SETGET_C0_SINT16 = 19 ,
TIFF_SETGET_C0_UINT32 = 20 ,
TIFF_SETGET_C0_SINT32 = 21 ,
TIFF_SETGET_C0_UINT64 = 22 ,
TIFF_SETGET_C0_SINT64 = 23 ,
TIFF_SETGET_C0_FLOAT = 24 ,
TIFF_SETGET_C0_DOUBLE = 25 ,
TIFF_SETGET_C0_IFD8 = 26 ,
TIFF_SETGET_C16_ASCII = 27 ,
TIFF_SETGET_C16_UINT8 = 28 ,
TIFF_SETGET_C16_SINT8 = 29 ,
TIFF_SETGET_C16_UINT16 = 30 ,
TIFF_SETGET_C16_SINT16 = 31 ,
TIFF_SETGET_C16_UINT32 = 32 ,
TIFF_SETGET_C16_SINT32 = 33 ,
TIFF_SETGET_C16_UINT64 = 34 ,
TIFF_SETGET_C16_SINT64 = 35 ,
TIFF_SETGET_C16_FLOAT = 36 ,
TIFF_SETGET_C16_DOUBLE = 37 ,
TIFF_SETGET_C16_IFD8 = 38 ,
TIFF_SETGET_C32_ASCII = 39 ,
TIFF_SETGET_C32_UINT8 = 40 ,
TIFF_SETGET_C32_SINT8 = 41 ,
TIFF_SETGET_C32_UINT16 = 42 ,
TIFF_SETGET_C32_SINT16 = 43 ,
TIFF_SETGET_C32_UINT32 = 44 ,
TIFF_SETGET_C32_SINT32 = 45 ,
TIFF_SETGET_C32_UINT64 = 46 ,
TIFF_SETGET_C32_SINT64 = 47 ,
TIFF_SETGET_C32_FLOAT = 48 ,
TIFF_SETGET_C32_DOUBLE = 49 ,
TIFF_SETGET_C32_IFD8 = 50 ,
TIFF_SETGET_OTHER = 51
2012-02-29 23:01:28 +08:00
} TIFFSetGetFieldType ;
2010-05-12 01:44:00 +08:00
# if defined(__cplusplus)
extern " C " {
# endif
2012-02-29 23:01:28 +08:00
extern const TIFFFieldArray * _TIFFGetFields ( void ) ;
extern const TIFFFieldArray * _TIFFGetExifFields ( void ) ;
2021-03-02 07:17:30 +08:00
extern const TIFFFieldArray * _TIFFGetGpsFields ( void ) ;
2012-02-29 23:01:28 +08:00
extern void _TIFFSetupFields ( TIFF * tif , const TIFFFieldArray * infoarray ) ;
extern void _TIFFPrintFieldInfo ( TIFF * , FILE * ) ;
2017-12-08 20:47:54 +08:00
extern int _TIFFFillStriles ( TIFF * ) ;
2012-02-29 23:01:28 +08:00
typedef enum {
2017-12-08 20:47:54 +08:00
tfiatImage ,
tfiatExif ,
2021-03-02 07:17:30 +08:00
tfiatGps , /* EXIF-GPS fields array type */
2017-12-08 20:47:54 +08:00
tfiatOther
2012-02-29 23:01:28 +08:00
} TIFFFieldArrayType ;
struct _TIFFFieldArray {
2017-12-08 20:47:54 +08:00
TIFFFieldArrayType type ; /* array type, will be used to determine if IFD is image and such */
uint32 allocated_size ; /* 0 if array is constant, other if modified by future definition extension support */
uint32 count ; /* number of elements in fields array */
TIFFField * fields ; /* actual field info */
2012-02-29 23:01:28 +08:00
} ;
struct _TIFFField {
2017-12-08 20:47:54 +08:00
uint32 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 */
uint32 reserved ; /* reserved for future extension */
TIFFSetGetFieldType set_field_type ; /* type to be passed to TIFFSetField */
TIFFSetGetFieldType get_field_type ; /* type to be passed to TIFFGetField */
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 */
TIFFFieldArray * field_subfields ; /* if field points to child ifds, child ifd field definition array */
2012-02-29 23:01:28 +08:00
} ;
extern int _TIFFMergeFields ( TIFF * , const TIFFField [ ] , uint32 ) ;
extern const TIFFField * _TIFFFindOrRegisterField ( TIFF * , uint32 , TIFFDataType ) ;
extern TIFFField * _TIFFCreateAnonField ( TIFF * , uint32 , TIFFDataType ) ;
2017-12-08 20:47:54 +08:00
extern int _TIFFCheckFieldIsValidForCodec ( TIFF * tif , ttag_t tag ) ;
2010-05-12 01:44:00 +08:00
# if defined(__cplusplus)
}
# endif
# endif /* _TIFFDIR_ */
/* vim: set ts=8 sts=8 sw=8 noet: */
2012-02-29 23:01:28 +08:00
2010-07-16 20:54:53 +08:00
/*
* Local Variables :
* mode : c
* c - basic - offset : 8
* fill - column : 78
* End :
*/