aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/libtiff/tif_dir.h
blob: 9eaf22f8e62d56eafc3e504f2872138366856f2a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
/*
 * Copyright (c) 1988-1997 Sam Leffler
 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
 *
 * Permission to use, copy, modify, distribute, and sell this software and
 * 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.
 *
 * 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.
 *
 * 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,
 * 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
 * OF THIS SOFTWARE.
 */

#ifndef _TIFFDIR_
#define _TIFFDIR_

#include "tiff.h"
#include "tiffio.h"

/*
 * ``Library-private'' Directory-related Definitions.
 */

typedef struct
{
    const TIFFField *info;
    int count;
    void *value;
} 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
{
    uint16_t tdir_tag;   /* see below */
    uint16_t tdir_type;  /* data type; see below */
    uint64_t tdir_count; /* number of items; length in spec */
    union
    {
        uint16_t toff_short;
        uint32_t toff_long;
        uint64_t toff_long8;
    } tdir_offset;       /* either offset or the data itself if fits */
    uint8_t tdir_ignore; /* flag status to ignore tag when parsing tags in
                            tif_dirread.c */
} TIFFDirEntry;

/*
 * Internal format of a TIFF directory entry.
 */
typedef struct
{
#define FIELDSET_ITEMS 4
    /* bit vector of fields that are set */
    uint32_t td_fieldsset[FIELDSET_ITEMS];

    uint32_t td_imagewidth, td_imagelength, td_imagedepth;
    uint32_t td_tilewidth, td_tilelength, td_tiledepth;
    uint32_t td_subfiletype;
    uint16_t td_bitspersample;
    uint16_t td_sampleformat;
    uint16_t td_compression;
    uint16_t td_photometric;
    uint16_t td_threshholding;
    uint16_t td_fillorder;
    uint16_t td_orientation;
    uint16_t td_samplesperpixel;
    uint32_t td_rowsperstrip;
    uint16_t td_minsamplevalue, td_maxsamplevalue;
    double *td_sminsamplevalue;
    double *td_smaxsamplevalue;
    float td_xresolution, td_yresolution;
    uint16_t td_resolutionunit;
    uint16_t td_planarconfig;
    float td_xposition, td_yposition;
    uint16_t td_pagenumber[2];
    uint16_t *td_colormap[3];
    uint16_t td_halftonehints[2];
    uint16_t td_extrasamples;
    uint16_t *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_t td_stripsperimage;
    uint32_t td_nstrips; /* size of offset & bytecount arrays */
    uint64_t
        *td_stripoffset_p; /* should be accessed with TIFFGetStrileOffset */
    uint64_t *td_stripbytecount_p; /* should be accessed with
                                      TIFFGetStrileByteCount */
    uint32_t
        td_stripoffsetbyteallocsize; /* number of elements currently allocated
                                        for td_stripoffset/td_stripbytecount.
                                        Only used if TIFF_LAZYSTRILELOAD is set
                                      */
#ifdef STRIPBYTECOUNTSORTED_UNUSED
    int td_stripbytecountsorted; /* is the bytecount array sorted ascending? */
#endif
    TIFFDirEntry td_stripoffset_entry;    /* for deferred loading */
    TIFFDirEntry td_stripbytecount_entry; /* for deferred loading */
    uint16_t td_nsubifd;
    uint64_t *td_subifd;
    /* YCbCr parameters */
    uint16_t td_ycbcrsubsampling[2];
    uint16_t td_ycbcrpositioning;
    /* Colorimetry parameters */
    uint16_t *td_transferfunction[3];
    float *td_refblackwhite;
    /* CMYK parameters */
    int td_inknameslen;
    char *td_inknames;
    uint16_t td_numberofinks; /* number of inks in InkNames string */

    int td_customValueCount;
    TIFFTagValue *td_customValues;

    unsigned char
        td_deferstrilearraywriting; /* see TIFFDeferStrileArrayWriting() */
} TIFFDirectory;

/*
 * Field flags used to indicate fields that have been set in a directory, and
 * to reference fields when manipulating a directory.
 */

/*
 * 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

/* multi-item fields */
#define FIELD_IMAGEDIMENSIONS 1
#define FIELD_TILEDIMENSIONS 2
#define FIELD_RESOLUTION 3
#define FIELD_POSITION 4

/* single-item fields */
#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
#define FIELD_NUMBEROFINKS 50
/*      FIELD_CUSTOM (see tiffio.h)    65 */
/* end of support for well-known tags; codec-private tags follow */
#define FIELD_CODEC 66 /* base of codec-private tags */

/*
 * 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.
 */
#define FIELD_PSEUDO 0

#define FIELD_LAST (32 * FIELDSET_ITEMS - 1)

#define BITn(n) (((uint32_t)1L) << ((n)&0x1f))
#define BITFIELDn(tif, n) ((tif)->tif_dir.td_fieldsset[(n) / 32])
#define TIFFFieldSet(tif, field) (BITFIELDn(tif, field) & BITn(field))
#define TIFFSetFieldBit(tif, field) (BITFIELDn(tif, field) |= BITn(field))
#define TIFFClrFieldBit(tif, field) (BITFIELDn(tif, field) &= ~BITn(field))

#define FieldSet(fields, f) (fields[(f) / 32] & BITn(f))
#define ResetFieldBit(fields, f) (fields[(f) / 32] &= ~BITn(f))

typedef enum
{
    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
} TIFFSetGetFieldType;

#if defined(__cplusplus)
extern "C"
{
#endif

    extern const TIFFFieldArray *_TIFFGetFields(void);
    extern const TIFFFieldArray *_TIFFGetExifFields(void);
    extern const TIFFFieldArray *_TIFFGetGpsFields(void);
    extern void _TIFFSetupFields(TIFF *tif, const TIFFFieldArray *infoarray);
    extern void _TIFFPrintFieldInfo(TIFF *, FILE *);

    extern int _TIFFFillStriles(TIFF *);

    typedef enum
    {
        tfiatImage,
        tfiatExif,
        tfiatGps, /* EXIF-GPS fields array type */
        tfiatOther
    } TIFFFieldArrayType;

    struct _TIFFFieldArray
    {
        TIFFFieldArrayType type; /* array type, will be used to determine if IFD
                                    is image and such */
        uint32_t allocated_size; /* 0 if array is constant, other if modified by
                                    future definition extension support */
        uint32_t count;          /* number of elements in fields array */
        TIFFField *fields;       /* actual field info */
    };

    struct _TIFFField
    {
        uint32_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 */
        uint32_t
            field_anonymous; /* if true, this is a unknown / anonymous tag */
        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 */
    };

    extern int _TIFFMergeFields(TIFF *, const TIFFField[], uint32_t);
    extern const TIFFField *_TIFFFindOrRegisterField(TIFF *, uint32_t,
                                                     TIFFDataType);
    extern TIFFField *_TIFFCreateAnonField(TIFF *, uint32_t, TIFFDataType);
    extern int _TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag);
    extern int _TIFFCheckDirNumberAndOffset(TIFF *tif, tdir_t dirn,
                                            uint64_t diroff);
    extern int _TIFFGetDirNumberFromOffset(TIFF *tif, uint64_t diroff,
                                           tdir_t *dirn);
    extern int _TIFFGetOffsetFromDirNumber(TIFF *tif, tdir_t dirn,
                                           uint64_t *diroff);
    extern int _TIFFRemoveEntryFromDirectoryListByOffset(TIFF *tif,
                                                         uint64_t diroff);

#if defined(__cplusplus)
}
#endif
#endif /* _TIFFDIR_ */