xref: /aosp_15_r20/external/pdfium/third_party/libtiff/tif_dirinfo.c (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker /*
2*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 1988-1997 Sam Leffler
3*3ac0a46fSAndroid Build Coastguard Worker  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
4*3ac0a46fSAndroid Build Coastguard Worker  *
5*3ac0a46fSAndroid Build Coastguard Worker  * Permission to use, copy, modify, distribute, and sell this software and
6*3ac0a46fSAndroid Build Coastguard Worker  * its documentation for any purpose is hereby granted without fee, provided
7*3ac0a46fSAndroid Build Coastguard Worker  * that (i) the above copyright notices and this permission notice appear in
8*3ac0a46fSAndroid Build Coastguard Worker  * all copies of the software and related documentation, and (ii) the names of
9*3ac0a46fSAndroid Build Coastguard Worker  * Sam Leffler and Silicon Graphics may not be used in any advertising or
10*3ac0a46fSAndroid Build Coastguard Worker  * publicity relating to the software without the specific, prior written
11*3ac0a46fSAndroid Build Coastguard Worker  * permission of Sam Leffler and Silicon Graphics.
12*3ac0a46fSAndroid Build Coastguard Worker  *
13*3ac0a46fSAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
14*3ac0a46fSAndroid Build Coastguard Worker  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
15*3ac0a46fSAndroid Build Coastguard Worker  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
16*3ac0a46fSAndroid Build Coastguard Worker  *
17*3ac0a46fSAndroid Build Coastguard Worker  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
18*3ac0a46fSAndroid Build Coastguard Worker  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19*3ac0a46fSAndroid Build Coastguard Worker  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20*3ac0a46fSAndroid Build Coastguard Worker  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
21*3ac0a46fSAndroid Build Coastguard Worker  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22*3ac0a46fSAndroid Build Coastguard Worker  * OF THIS SOFTWARE.
23*3ac0a46fSAndroid Build Coastguard Worker  */
24*3ac0a46fSAndroid Build Coastguard Worker 
25*3ac0a46fSAndroid Build Coastguard Worker /*
26*3ac0a46fSAndroid Build Coastguard Worker  * TIFF Library.
27*3ac0a46fSAndroid Build Coastguard Worker  *
28*3ac0a46fSAndroid Build Coastguard Worker  * Core Directory Tag Support.
29*3ac0a46fSAndroid Build Coastguard Worker  */
30*3ac0a46fSAndroid Build Coastguard Worker #include "tiffiop.h"
31*3ac0a46fSAndroid Build Coastguard Worker #include <stdlib.h>
32*3ac0a46fSAndroid Build Coastguard Worker 
33*3ac0a46fSAndroid Build Coastguard Worker /*
34*3ac0a46fSAndroid Build Coastguard Worker  * NOTE: THIS ARRAY IS ASSUMED TO BE SORTED BY TAG.
35*3ac0a46fSAndroid Build Coastguard Worker  *
36*3ac0a46fSAndroid Build Coastguard Worker  * NOTE: The second field (field_readcount) and third field (field_writecount)
37*3ac0a46fSAndroid Build Coastguard Worker  *       sometimes use the values TIFF_VARIABLE (-1), TIFF_VARIABLE2 (-3)
38*3ac0a46fSAndroid Build Coastguard Worker  *       and TIFF_SPP (-2). The macros should be used but would throw off
39*3ac0a46fSAndroid Build Coastguard Worker  *       the formatting of the code, so please interpret the -1, -2 and -3
40*3ac0a46fSAndroid Build Coastguard Worker  *       values accordingly.
41*3ac0a46fSAndroid Build Coastguard Worker  */
42*3ac0a46fSAndroid Build Coastguard Worker 
43*3ac0a46fSAndroid Build Coastguard Worker /* const object should be initialized */
44*3ac0a46fSAndroid Build Coastguard Worker #ifdef _MSC_VER
45*3ac0a46fSAndroid Build Coastguard Worker #pragma warning(push)
46*3ac0a46fSAndroid Build Coastguard Worker #pragma warning(disable : 4132)
47*3ac0a46fSAndroid Build Coastguard Worker #endif
48*3ac0a46fSAndroid Build Coastguard Worker static const TIFFFieldArray tiffFieldArray;
49*3ac0a46fSAndroid Build Coastguard Worker static const TIFFFieldArray exifFieldArray;
50*3ac0a46fSAndroid Build Coastguard Worker static const TIFFFieldArray gpsFieldArray;
51*3ac0a46fSAndroid Build Coastguard Worker #ifdef _MSC_VER
52*3ac0a46fSAndroid Build Coastguard Worker #pragma warning(pop)
53*3ac0a46fSAndroid Build Coastguard Worker #endif
54*3ac0a46fSAndroid Build Coastguard Worker /*--: Rational2Double: --
55*3ac0a46fSAndroid Build Coastguard Worker  * The Rational2Double upgraded libtiff functionality allows the definition and
56*3ac0a46fSAndroid Build Coastguard Worker  * achievement of true double-precision accuracy for TIFF tags of RATIONAL type
57*3ac0a46fSAndroid Build Coastguard Worker  * and field_bit=FIELD_CUSTOM using the set_field_type = TIFF_SETGET_DOUBLE.
58*3ac0a46fSAndroid Build Coastguard Worker  * Unfortunately, that changes the old implemented interface for TIFFGetField().
59*3ac0a46fSAndroid Build Coastguard Worker  * In order to keep the old TIFFGetField() interface behavior those tags have to
60*3ac0a46fSAndroid Build Coastguard Worker  * be redefined with set_field_type = TIFF_SETGET_FLOAT!
61*3ac0a46fSAndroid Build Coastguard Worker  *
62*3ac0a46fSAndroid Build Coastguard Worker  *  Rational custom arrays are already defined as _Cxx_FLOAT, thus can stay.
63*3ac0a46fSAndroid Build Coastguard Worker  *
64*3ac0a46fSAndroid Build Coastguard Worker  */
65*3ac0a46fSAndroid Build Coastguard Worker 
66*3ac0a46fSAndroid Build Coastguard Worker /* clang-format off */ /* for better readability of tag comments */
67*3ac0a46fSAndroid Build Coastguard Worker static const TIFFField tiffFields[] = {
68*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_SUBFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_SUBFILETYPE, 1, 0, "SubfileType", NULL},
69*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_OSUBFILETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "OldSubfileType", NULL},
70*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_IMAGEDIMENSIONS, 0, 0, "ImageWidth", NULL},
71*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_IMAGELENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_IMAGEDIMENSIONS, 1, 0, "ImageLength", NULL},
72*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_BITSPERSAMPLE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_BITSPERSAMPLE, 0, 0, "BitsPerSample", NULL},
73*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_COMPRESSION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_COMPRESSION, 0, 0, "Compression", NULL},
74*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PHOTOMETRIC, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_PHOTOMETRIC, 0, 0, "PhotometricInterpretation", NULL},
75*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_THRESHHOLDING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_THRESHHOLDING, 1, 0, "Threshholding", NULL},
76*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CELLWIDTH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CellWidth", NULL},
77*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CELLLENGTH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CellLength", NULL},
78*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_FILLORDER, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_FILLORDER, 0, 0, "FillOrder", NULL},
79*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DOCUMENTNAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DocumentName", NULL},
80*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_IMAGEDESCRIPTION, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageDescription", NULL},
81*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_MAKE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Make", NULL},
82*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_MODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Model", NULL},
83*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_STRIPOFFSETS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPOFFSETS, 0, 0, "StripOffsets", NULL},
84*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ORIENTATION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_ORIENTATION, 0, 0, "Orientation", NULL},
85*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_SAMPLESPERPIXEL, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_SAMPLESPERPIXEL, 0, 0, "SamplesPerPixel", NULL},
86*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_ROWSPERSTRIP, 0, 0, "RowsPerStrip", NULL},
87*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_STRIPBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPBYTECOUNTS, 0, 0, "StripByteCounts", NULL},
88*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_MINSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_MINSAMPLEVALUE, 1, 0, "MinSampleValue", NULL},
89*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_MAXSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_MAXSAMPLEVALUE, 1, 0, "MaxSampleValue", NULL},
90*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_XRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTION, 1, 0, "XResolution", NULL},
91*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_YRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTION, 1, 0, "YResolution", NULL},
92*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PLANARCONFIG, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_PLANARCONFIG, 0, 0, "PlanarConfiguration", NULL},
93*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PAGENAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PageName", NULL},
94*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_XPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_POSITION, 1, 0, "XPosition", NULL},
95*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_YPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_POSITION, 1, 0, "YPosition", NULL},
96*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_FREEOFFSETS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeOffsets", NULL},
97*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_FREEBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeByteCounts", NULL},
98*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_GRAYRESPONSEUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "GrayResponseUnit", NULL},
99*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_GRAYRESPONSECURVE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "GrayResponseCurve", NULL},
100*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_RESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTIONUNIT, 1, 0, "ResolutionUnit", NULL},
101*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PAGENUMBER, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_PAGENUMBER, 1, 0, "PageNumber", NULL},
102*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_COLORRESPONSEUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "ColorResponseUnit", NULL},
103*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_TRANSFERFUNCTION, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_OTHER, TIFF_SETGET_UNDEFINED, FIELD_TRANSFERFUNCTION, 1, 0, "TransferFunction", NULL},
104*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_SOFTWARE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Software", NULL},
105*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DATETIME, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTime", NULL},
106*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ARTIST, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Artist", NULL},
107*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_HOSTCOMPUTER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "HostComputer", NULL},
108*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_WHITEPOINT, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WhitePoint", NULL},
109*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PRIMARYCHROMATICITIES, 6, 6, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PrimaryChromaticities", NULL},
110*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_COLORMAP, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_OTHER, TIFF_SETGET_UNDEFINED, FIELD_COLORMAP, 1, 0, "ColorMap", NULL},
111*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_HALFTONEHINTS, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_HALFTONEHINTS, 1, 0, "HalftoneHints", NULL},
112*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_TILEWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_TILEDIMENSIONS, 0, 0, "TileWidth", NULL},
113*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_TILELENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_TILEDIMENSIONS, 0, 0, "TileLength", NULL},
114*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_TILEOFFSETS, -1, 1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPOFFSETS, 0, 0, "TileOffsets", NULL},
115*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPBYTECOUNTS, 0, 0, "TileByteCounts", NULL},
116*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_SUBIFD, -1, -1, TIFF_IFD8, 0, TIFF_SETGET_C16_IFD8, TIFF_SETGET_UNDEFINED, FIELD_SUBIFD, 1, 1, "SubIFD", (TIFFFieldArray *)&tiffFieldArray},
117*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_INKSET, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "InkSet", NULL},
118*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_INKNAMES, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_C16_ASCII, TIFF_SETGET_UNDEFINED, FIELD_INKNAMES, 1, 1, "InkNames", NULL},
119*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_NUMBEROFINKS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_NUMBEROFINKS, 1, 0, "NumberOfInks", NULL},
120*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DOTRANGE, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DotRange", NULL},
121*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_TARGETPRINTER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TargetPrinter", NULL},
122*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EXTRASAMPLES, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_EXTRASAMPLES, 0, 1, "ExtraSamples", NULL},
123*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_SAMPLEFORMAT, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_SAMPLEFORMAT, 0, 0, "SampleFormat", NULL},
124*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_SMINSAMPLEVALUE, -2, -1, TIFF_ANY, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_SMINSAMPLEVALUE, 1, 0, "SMinSampleValue", NULL},
125*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_SMAXSAMPLEVALUE, -2, -1, TIFF_ANY, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_SMAXSAMPLEVALUE, 1, 0, "SMaxSampleValue", NULL},
126*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CLIPPATH, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ClipPath", NULL},
127*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "XClipPathUnits", NULL},
128*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "YClipPathUnits", NULL},
129*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_YCBCRCOEFFICIENTS, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "YCbCrCoefficients", NULL},
130*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_YCBCRSUBSAMPLING, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_YCBCRSUBSAMPLING, 0, 0, "YCbCrSubsampling", NULL},
131*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_YCBCRPOSITIONING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_YCBCRPOSITIONING, 0, 0, "YCbCrPositioning", NULL},
132*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_REFERENCEBLACKWHITE, 6, 6, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_REFBLACKWHITE, 1, 0, "ReferenceBlackWhite", NULL},
133*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_XMLPACKET, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "XMLPacket", NULL},
134*3ac0a46fSAndroid Build Coastguard Worker     /* begin SGI tags */
135*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_MATTEING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_EXTRASAMPLES, 0, 0, "Matteing", NULL},
136*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DATATYPE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_SAMPLEFORMAT, 0, 0, "DataType", NULL},
137*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_IMAGEDEPTH, 0, 0, "ImageDepth", NULL},
138*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_TILEDEPTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_TILEDEPTH, 0, 0, "TileDepth", NULL},
139*3ac0a46fSAndroid Build Coastguard Worker     /* end SGI tags */
140*3ac0a46fSAndroid Build Coastguard Worker     /* begin Pixar tags */
141*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PIXAR_IMAGEFULLWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageFullWidth", NULL},
142*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageFullLength", NULL},
143*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PIXAR_TEXTUREFORMAT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TextureFormat", NULL},
144*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PIXAR_WRAPMODES, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TextureWrapModes", NULL},
145*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PIXAR_FOVCOT, 1, 1, TIFF_FLOAT, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FieldOfViewCotangent", NULL},
146*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MatrixWorldToScreen", NULL},
147*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MatrixWorldToCamera", NULL},
148*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_COPYRIGHT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Copyright", NULL},
149*3ac0a46fSAndroid Build Coastguard Worker     /* end Pixar tags */
150*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_RICHTIFFIPTC, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "RichTIFFIPTC", NULL},
151*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PHOTOSHOP, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "Photoshop", NULL},
152*3ac0a46fSAndroid Build Coastguard Worker     /*--: EXIFIFD and GPSIFD specified as TIFF_LONG by Aware-Systems and not TIFF_IFD8 as in original LibTiff. However, for IFD-like tags,
153*3ac0a46fSAndroid Build Coastguard Worker      * libtiff uses the data type TIFF_IFD8 in tiffFields[]-tag definition combined with a special handling procedure in order to write either
154*3ac0a46fSAndroid Build Coastguard Worker      * a 32-bit value and the TIFF_IFD type-id into ClassicTIFF files or a 64-bit value and the TIFF_IFD8 type-id into BigTIFF files. */
155*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EXIFIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EXIFIFDOffset", (TIFFFieldArray *)&exifFieldArray},
156*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ICCPROFILE, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ICC Profile", NULL},
157*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_GPSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "GPSIFDOffset", (TIFFFieldArray *)&gpsFieldArray},
158*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvParams", NULL},
159*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_FAXSUBADDRESS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxSubAddress", NULL},
160*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvTime", NULL},
161*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_FAXDCS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxDcs", NULL},
162*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_STONITS, 1, 1, TIFF_DOUBLE, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "StoNits", NULL},
163*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_IMAGESOURCEDATA, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "Adobe Photoshop Document Data Block", NULL},
164*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_INTEROPERABILITYIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "InteroperabilityIFDOffset", NULL},
165*3ac0a46fSAndroid Build Coastguard Worker     /* begin DNG tags */
166*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DNGVERSION, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DNGVersion", NULL},
167*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DNGBACKWARDVERSION, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DNGBackwardVersion", NULL},
168*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_UNIQUECAMERAMODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "UniqueCameraModel", NULL},
169*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "LocalizedCameraModel", NULL},
170*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CFAPLANECOLOR, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CFAPlaneColor", NULL},
171*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CFALAYOUT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CFALayout", NULL},
172*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_LINEARIZATIONTABLE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "LinearizationTable", NULL},
173*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_BLACKLEVELREPEATDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BlackLevelRepeatDim", NULL},
174*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_BLACKLEVEL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "BlackLevel", NULL},
175*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_BLACKLEVELDELTAH, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "BlackLevelDeltaH", NULL},
176*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_BLACKLEVELDELTAV, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "BlackLevelDeltaV", NULL},
177*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_WHITELEVEL, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "WhiteLevel", NULL},
178*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DEFAULTSCALE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DefaultScale", NULL},
179*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_BESTQUALITYSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BestQualityScale", NULL},
180*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DefaultCropOrigin", NULL},
181*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DefaultCropSize", NULL},
182*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_COLORMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ColorMatrix1", NULL},
183*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_COLORMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ColorMatrix2", NULL},
184*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CAMERACALIBRATION1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CameraCalibration1", NULL},
185*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CAMERACALIBRATION2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CameraCalibration2", NULL},
186*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_REDUCTIONMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ReductionMatrix1", NULL},
187*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_REDUCTIONMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ReductionMatrix2", NULL},
188*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ANALOGBALANCE, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "AnalogBalance", NULL},
189*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "AsShotNeutral", NULL},
190*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ASSHOTWHITEXY, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "AsShotWhiteXY", NULL},
191*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_BASELINEEXPOSURE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BaselineExposure", NULL},
192*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_BASELINENOISE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BaselineNoise", NULL},
193*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_BASELINESHARPNESS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BaselineSharpness", NULL},
194*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_BAYERGREENSPLIT, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BayerGreenSplit", NULL},
195*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_LINEARRESPONSELIMIT, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LinearResponseLimit", NULL},
196*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CAMERASERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CameraSerialNumber", NULL},
197*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_LENSINFO, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LensInfo", NULL},
198*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CHROMABLURRADIUS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ChromaBlurRadius", NULL},
199*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ANTIALIASSTRENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "AntiAliasStrength", NULL},
200*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_SHADOWSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ShadowScale", NULL},
201*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DNGPRIVATEDATA, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "DNGPrivateData", NULL},
202*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_MAKERNOTESAFETY, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MakerNoteSafety", NULL},
203*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CALIBRATIONILLUMINANT1, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CalibrationIlluminant1", NULL},
204*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CALIBRATIONILLUMINANT2, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CalibrationIlluminant2", NULL},
205*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_RAWDATAUNIQUEID, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RawDataUniqueID", NULL},
206*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ORIGINALRAWFILENAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OriginalRawFileName", NULL},
207*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ORIGINALRAWFILEDATA, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OriginalRawFileData", NULL},
208*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ACTIVEAREA, 4, 4, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ActiveArea", NULL},
209*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_MASKEDAREAS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "MaskedAreas", NULL},
210*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ASSHOTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "AsShotICCProfile", NULL},
211*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ASSHOTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "AsShotPreProfileMatrix", NULL},
212*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CURRENTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CurrentICCProfile", NULL},
213*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CURRENTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CurrentPreProfileMatrix", NULL},
214*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PERSAMPLE, 0, 0, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "PerSample", NULL},
215*3ac0a46fSAndroid Build Coastguard Worker #if 0
216*3ac0a46fSAndroid Build Coastguard Worker     /* TODO: revert above #if 0 for TIFF 4.6.0 */
217*3ac0a46fSAndroid Build Coastguard Worker 
218*3ac0a46fSAndroid Build Coastguard Worker     /* begin DNG 1.2.0.0 tags */
219*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_COLORIMETRICREFERENCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ColorimetricReference", NULL},
220*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CAMERACALIBRATIONSIGNATURE, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CameraCalibrationSignature", NULL},
221*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PROFILECALIBRATIONSIGNATURE, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileCalibrationSignature", NULL},
222*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EXTRACAMERAPROFILES, -1, -1, TIFF_IFD8, 0, TIFF_SETGET_C16_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ExtraCameraProfiles", NULL},
223*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ASSHOTPROFILENAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "AsShotProfileName", NULL},
224*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_NOISEREDUCTIONAPPLIED, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "NoiseReductionApplied", NULL},
225*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PROFILENAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileName", NULL},
226*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PROFILEHUESATMAPDIMS, 3, 3, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ProfileHueSatMapDims", NULL},
227*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PROFILEHUESATMAPDATA1, -1, -1, TIFF_FLOAT, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileHueSatMapData1", NULL},
228*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PROFILEHUESATMAPDATA2, -1, -1, TIFF_FLOAT, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileHueSatMapData2", NULL},
229*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PROFILETONECURVE, -1, -1, TIFF_FLOAT, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileToneCurve", NULL},
230*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PROFILEEMBEDPOLICY, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ProfileEmbedPolicy", NULL},
231*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PROFILECOPYRIGHT, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileCopyright", NULL},
232*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_FORWARDMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ForwardMatrix1", NULL},
233*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_FORWARDMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ForwardMatrix2", NULL},
234*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PREVIEWAPPLICATIONNAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "PreviewApplicationName", NULL},
235*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PREVIEWAPPLICATIONVERSION, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "PreviewApplicationVersion", NULL},
236*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PREVIEWSETTINGSNAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "PreviewSettingsName", NULL},
237*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PREVIEWSETTINGSDIGEST, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PreviewSettingsDigest", NULL},
238*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PREVIEWCOLORSPACE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PreviewColorSpace", NULL},
239*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PREVIEWDATETIME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PreviewDateTime", NULL},
240*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_RAWIMAGEDIGEST, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RawImageDigest", NULL},
241*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ORIGINALRAWFILEDIGEST, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OriginalRawFileDigest", NULL},
242*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_SUBTILEBLOCKSIZE, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubTileBlockSize", NULL},
243*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ROWINTERLEAVEFACTOR, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RowInterleaveFactor", NULL},
244*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PROFILELOOKTABLEDIMS, 3, 3, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ProfileLookTableDims", NULL},
245*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PROFILELOOKTABLEDATA, -1, -1, TIFF_FLOAT, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileLookTableData", NULL},
246*3ac0a46fSAndroid Build Coastguard Worker     /* begin DNG 1.3.0.0 tags */
247*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_OPCODELIST1, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OpcodeList1", NULL},
248*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_OPCODELIST2, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OpcodeList2", NULL},
249*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_OPCODELIST3, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OpcodeList3", NULL},
250*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_NOISEPROFILE, -1, -1, TIFF_DOUBLE, 0, TIFF_SETGET_C16_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "NoiseProfile", NULL},
251*3ac0a46fSAndroid Build Coastguard Worker     /* begin DNG 1.4.0.0 tags */
252*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DEFAULTUSERCROP, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DefaultUserCrop", NULL},
253*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DEFAULTBLACKRENDER, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DefaultBlackRender", NULL},
254*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_BASELINEEXPOSUREOFFSET, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BaselineExposureOffset", NULL},
255*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PROFILELOOKTABLEENCODING, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ProfileLookTableEncoding", NULL},
256*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PROFILEHUESATMAPENCODING, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ProfileHueSatMapEncoding", NULL},
257*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ORIGINALDEFAULTFINALSIZE, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OriginalDefaultFinalSize", NULL},
258*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ORIGINALBESTQUALITYFINALSIZE, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OriginalBestQualityFinalSize", NULL},
259*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ORIGINALDEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OriginalDefaultCropSize", NULL}, /* could also be rational */
260*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_NEWRAWIMAGEDIGEST, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "NewRawImageDigest", NULL},
261*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_RAWTOPREVIEWGAIN, 1, 1, TIFF_DOUBLE, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RawToPreviewGain", NULL},
262*3ac0a46fSAndroid Build Coastguard Worker     /* begin DNG 1.5.0.0 tags */
263*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DEPTHFORMAT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DepthFormat", NULL},
264*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DEPTHNEAR, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DepthNear", NULL},
265*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DEPTHFAR, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DepthFar", NULL},
266*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DEPTHUNITS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DepthUnits", NULL},
267*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DEPTHMEASURETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DepthMeasureType", NULL},
268*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ENHANCEPARAMS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EnhanceParams", NULL},
269*3ac0a46fSAndroid Build Coastguard Worker     /* begin DNG 1.6.0.0 tags */
270*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PROFILEGAINTABLEMAP, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileGainTableMap", NULL},
271*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_SEMANTICNAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SemanticName", NULL},
272*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_SEMANTICINSTANCEID, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SemanticInstanceID", NULL},
273*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_MASKSUBAREA, 4, 4, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MaskSubArea", NULL},
274*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_RGBTABLES, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "RGBTables", NULL},
275*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CALIBRATIONILLUMINANT3, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CalibrationIlluminant3", NULL},
276*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_COLORMATRIX3, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ColorMatrix3", NULL},
277*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CAMERACALIBRATION3, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CameraCalibration3", NULL},
278*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_REDUCTIONMATRIX3, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ReductionMatrix3", NULL},
279*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PROFILEHUESATMAPDATA3, -1, -1, TIFF_FLOAT, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileHueSatMapData3", NULL},
280*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_FORWARDMATRIX3, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ForwardMatrix3", NULL},
281*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ILLUMINANTDATA1, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "IlluminantData1", NULL},
282*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ILLUMINANTDATA2, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "IlluminantData2", NULL},
283*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_ILLUMINANTDATA3, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "IlluminantData3", NULL},
284*3ac0a46fSAndroid Build Coastguard Worker     /* end DNG tags */
285*3ac0a46fSAndroid Build Coastguard Worker     /* begin TIFF/EP tags */
286*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_CFAREPEATPATTERNDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP CFARepeatPatternDim", NULL},
287*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_CFAPATTERN, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP CFAPattern", NULL},
288*3ac0a46fSAndroid Build Coastguard Worker     /* TIFFTAG_EP_BATTERYLEVEL can be RATIONAL or ASCII.
289*3ac0a46fSAndroid Build Coastguard Worker      * LibTiff defines it as ASCII and converts RATIONAL to an ASCII string. */
290*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_BATTERYLEVEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP BatteryLevel", NULL},
291*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_INTERLACE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP Interlace", NULL},
292*3ac0a46fSAndroid Build Coastguard Worker     /* TIFFTAG_EP_IPTC_NAA and TIFFTAG_RICHTIFFIPTC share the same tag number (33723)
293*3ac0a46fSAndroid Build Coastguard Worker      *   LibTIFF type is UNDEFINED or BYTE, but often times incorrectly specified as LONG, because TIFF/EP (ISO/DIS 12234-2) specifies type LONG or ASCII. */
294*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_TIMEZONEOFFSET, -1, -1, TIFF_SSHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP TimeZoneOffset", NULL},
295*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_SELFTIMERMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP SelfTimerMode", NULL},
296*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_FLASHENERGY, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP FlashEnergy", NULL},
297*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_SPATIALFREQUENCYRESPONSE, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP SpatialFrequencyResponse", NULL},
298*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_NOISE, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP Noise", NULL},
299*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_FOCALPLANEXRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP FocalPlaneXResolution", NULL},
300*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_FOCALPLANEYRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP FocalPlaneYResolution", NULL},
301*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_FOCALPLANERESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP FocalPlaneResolutionUnit", NULL},
302*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_IMAGENUMBER, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP ImageNumber", NULL}, /* or SHORT */
303*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_SECURITYCLASSIFICATION, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP SecurityClassification", NULL},
304*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_IMAGEHISTORY, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP ImageHistory", NULL},
305*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_EXPOSUREINDEX, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP ExposureIndex", NULL},
306*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_STANDARDID, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP StandardId", NULL},
307*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_SENSINGMETHOD, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP SensingMethod", NULL},
308*3ac0a46fSAndroid Build Coastguard Worker     /* TIFF/EP tags equivalent to EXIF tags, sometimes defined differently. */
309*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_EXPOSURETIME, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP ExposureTime", NULL}, /*N=1 or 2 */
310*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_FNUMBER, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP FNumber", NULL},
311*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_EXPOSUREPROGRAM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP ExposureProgram", NULL},
312*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_SPECTRALSENSITIVITY, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP SpectralSensitivity", NULL},
313*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_ISOSPEEDRATINGS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP ISOSpeedRatings", NULL},
314*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_OECF, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP OptoelectricConversionFactor", NULL},
315*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_DATETIMEORIGINAL, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP DateTimeOriginal", NULL},
316*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_COMPRESSEDBITSPERPIXEL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP CompressedBitsPerPixel", NULL},
317*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_SHUTTERSPEEDVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP ShutterSpeedValue", NULL},
318*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_APERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP ApertureValue", NULL},
319*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_BRIGHTNESSVALUE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP BrightnessValue", NULL},
320*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_EXPOSUREBIASVALUE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP ExposureBiasValue", NULL}, /*N=1 or 2 */
321*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_MAXAPERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP MaxApertureValue", NULL},
322*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_SUBJECTDISTANCE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP SubjectDistance", NULL},
323*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_METERINGMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP MeteringMode", NULL},
324*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_LIGHTSOURCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP LightSource", NULL},
325*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_FLASH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP Flash", NULL},
326*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_FOCALLENGTH, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP FocalLength", NULL},
327*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_EP_SUBJECTLOCATION, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP SubjectLocation", NULL},
328*3ac0a46fSAndroid Build Coastguard Worker     /* end TIFF/EP tags */
329*3ac0a46fSAndroid Build Coastguard Worker #endif
330*3ac0a46fSAndroid Build Coastguard Worker     /* begin TIFF/FX tags */
331*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_INDEXED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Indexed", NULL},
332*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_GLOBALPARAMETERSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "GlobalParametersIFD", NULL},
333*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_PROFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ProfileType", NULL},
334*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_FAXPROFILE, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FaxProfile", NULL},
335*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_CODINGMETHODS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CodingMethods", NULL},
336*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_VERSIONYEAR, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "VersionYear", NULL},
337*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_MODENUMBER, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ModeNumber", NULL},
338*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_DECODE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "Decode", NULL},
339*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_IMAGEBASECOLOR, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ImageBaseColor", NULL},
340*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_T82OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "T82Options", NULL},
341*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_STRIPROWCOUNTS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "StripRowCounts", NULL},
342*3ac0a46fSAndroid Build Coastguard Worker     {TIFFTAG_IMAGELAYER, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageLayer", NULL},
343*3ac0a46fSAndroid Build Coastguard Worker     /* end TIFF/FX tags */
344*3ac0a46fSAndroid Build Coastguard Worker     /* begin pseudo tags */
345*3ac0a46fSAndroid Build Coastguard Worker };
346*3ac0a46fSAndroid Build Coastguard Worker 
347*3ac0a46fSAndroid Build Coastguard Worker /*
348*3ac0a46fSAndroid Build Coastguard Worker  * EXIF tags  (Version 2.31, July 2016 plus version 2.32 May 2019)
349*3ac0a46fSAndroid Build Coastguard Worker  */
350*3ac0a46fSAndroid Build Coastguard Worker static const TIFFField exifFields[] = {
351*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_EXPOSURETIME, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureTime", NULL},
352*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_FNUMBER, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FNumber", NULL},
353*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_EXPOSUREPROGRAM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureProgram", NULL},
354*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SPECTRALSENSITIVITY, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SpectralSensitivity", NULL},
355*3ac0a46fSAndroid Build Coastguard Worker     /* After EXIF 2.2.1 ISOSpeedRatings is named PhotographicSensitivity. In addition, while "Count=Any", only 1 count should be used. */
356*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_ISOSPEEDRATINGS, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ISOSpeedRatings", NULL},
357*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_OECF, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OptoelectricConversionFactor", NULL},
358*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SENSITIVITYTYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SensitivityType", NULL},
359*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_STANDARDOUTPUTSENSITIVITY, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "StandardOutputSensitivity", NULL},
360*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_RECOMMENDEDEXPOSUREINDEX, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RecommendedExposureIndex", NULL},
361*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_ISOSPEED, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ISOSpeed", NULL},
362*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_ISOSPEEDLATITUDEYYY, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ISOSpeedLatitudeyyy", NULL},
363*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_ISOSPEEDLATITUDEZZZ, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ISOSpeedLatitudezzz", NULL},
364*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_EXIFVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExifVersion", NULL},
365*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_DATETIMEORIGINAL, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeOriginal", NULL},
366*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_DATETIMEDIGITIZED, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeDigitized", NULL},
367*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_OFFSETTIME, 7, 7, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OffsetTime", NULL},
368*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_OFFSETTIMEORIGINAL, 7, 7, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OffsetTimeOriginal", NULL},
369*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_OFFSETTIMEDIGITIZED, 7, 7, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OffsetTimeDigitized", NULL},
370*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_COMPONENTSCONFIGURATION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ComponentsConfiguration", NULL},
371*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_COMPRESSEDBITSPERPIXEL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CompressedBitsPerPixel", NULL},
372*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SHUTTERSPEEDVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ShutterSpeedValue", NULL},
373*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_APERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ApertureValue", NULL},
374*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_BRIGHTNESSVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BrightnessValue", NULL},
375*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_EXPOSUREBIASVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureBiasValue", NULL},
376*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_MAXAPERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MaxApertureValue", NULL},
377*3ac0a46fSAndroid Build Coastguard Worker     /*--: EXIFTAG_SUBJECTDISTANCE: LibTiff returns value of "-1" if numerator equals 4294967295 (0xFFFFFFFF) to indicate infinite distance!
378*3ac0a46fSAndroid Build Coastguard Worker      *    However, there are two other EXIF tags where numerator indicates a special value and six other cases where the denominator indicates special values,
379*3ac0a46fSAndroid Build Coastguard Worker      *    which are not treated within LibTiff!! */
380*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SUBJECTDISTANCE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistance", NULL},
381*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_METERINGMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MeteringMode", NULL},
382*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_LIGHTSOURCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LightSource", NULL},
383*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_FLASH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Flash", NULL},
384*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_FOCALLENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLength", NULL},
385*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SUBJECTAREA, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SubjectArea", NULL},
386*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_MAKERNOTE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "MakerNote", NULL},
387*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_USERCOMMENT, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "UserComment", NULL},
388*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SUBSECTIME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTime", NULL},
389*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SUBSECTIMEORIGINAL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeOriginal", NULL},
390*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SUBSECTIMEDIGITIZED, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeDigitized", NULL},
391*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_TEMPERATURE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Temperature", NULL},
392*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_HUMIDITY, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Humidity", NULL},
393*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_PRESSURE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Pressure", NULL},
394*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_WATERDEPTH, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WaterDepth", NULL},
395*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_ACCELERATION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Acceleration", NULL},
396*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_CAMERAELEVATIONANGLE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CameraElevationAngle", NULL},
397*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_FLASHPIXVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashpixVersion", NULL},
398*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_COLORSPACE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ColorSpace", NULL},
399*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_PIXELXDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelXDimension", NULL},
400*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_PIXELYDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelYDimension", NULL},
401*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_RELATEDSOUNDFILE, 13, 13, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RelatedSoundFile", NULL},
402*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_FLASHENERGY, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashEnergy", NULL},
403*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SPATIALFREQUENCYRESPONSE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SpatialFrequencyResponse", NULL},
404*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_FOCALPLANEXRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneXResolution", NULL},
405*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_FOCALPLANEYRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneYResolution", NULL},
406*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_FOCALPLANERESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneResolutionUnit", NULL},
407*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SUBJECTLOCATION, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectLocation", NULL},
408*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_EXPOSUREINDEX, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureIndex", NULL},
409*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SENSINGMETHOD, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SensingMethod", NULL},
410*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_FILESOURCE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FileSource", NULL},
411*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SCENETYPE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneType", NULL},
412*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_CFAPATTERN, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CFAPattern", NULL},
413*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_CUSTOMRENDERED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CustomRendered", NULL},
414*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_EXPOSUREMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureMode", NULL},
415*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_WHITEBALANCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WhiteBalance", NULL},
416*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_DIGITALZOOMRATIO, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DigitalZoomRatio", NULL},
417*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_FOCALLENGTHIN35MMFILM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLengthIn35mmFilm", NULL},
418*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SCENECAPTURETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneCaptureType", NULL},
419*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_GAINCONTROL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "GainControl", NULL},
420*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_CONTRAST, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Contrast", NULL},
421*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SATURATION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Saturation", NULL},
422*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SHARPNESS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Sharpness", NULL},
423*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_DEVICESETTINGDESCRIPTION, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "DeviceSettingDescription", NULL},
424*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SUBJECTDISTANCERANGE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistanceRange", NULL},
425*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_IMAGEUNIQUEID, 33, 33, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageUniqueID", NULL},
426*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_CAMERAOWNERNAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CameraOwnerName", NULL},
427*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_BODYSERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BodySerialNumber", NULL},
428*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_LENSSPECIFICATION, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LensSpecification", NULL},
429*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_LENSMAKE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LensMake", NULL},
430*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_LENSMODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LensModel", NULL},
431*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_LENSSERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LensSerialNumber", NULL},
432*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_GAMMA, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Gamma", NULL},
433*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_COMPOSITEIMAGE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CompositeImage", NULL},
434*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SOURCEIMAGENUMBEROFCOMPOSITEIMAGE, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SourceImageNumberOfCompositeImage", NULL},
435*3ac0a46fSAndroid Build Coastguard Worker     {EXIFTAG_SOURCEEXPOSURETIMESOFCOMPOSITEIMAGE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1,
436*3ac0a46fSAndroid Build Coastguard Worker      "SourceExposureTimesOfCompositeImage", NULL}};
437*3ac0a46fSAndroid Build Coastguard Worker /*
438*3ac0a46fSAndroid Build Coastguard Worker  * EXIF-GPS tags  (Version 2.31, July 2016; nothing changed for version 2.32 May
439*3ac0a46fSAndroid Build Coastguard Worker  * 2019)
440*3ac0a46fSAndroid Build Coastguard Worker  */
441*3ac0a46fSAndroid Build Coastguard Worker 
442*3ac0a46fSAndroid Build Coastguard Worker static const TIFFField gpsFields[] = {
443*3ac0a46fSAndroid Build Coastguard Worker     /*  For the GPS tag definitions in gpsFields[] the standard definition for Rationals is TIFF_SETGET_DOUBLE and TIFF_SETGET_C0_FLOAT.
444*3ac0a46fSAndroid Build Coastguard Worker      *-- ATTENTION: After the upgrade with Rational2Double, the GPSTAG values can now be written and also read in double precision!
445*3ac0a46fSAndroid Build Coastguard Worker      *              In order to achieve double precision for GPS tags: Standard definitions for GPSTAG is kept to TIFF_SETGET_DOUBLE
446*3ac0a46fSAndroid Build Coastguard Worker      *              and TIFF_SETGET_C0_FLOAT is changed to TIFF_SETGET_C0_DOUBLE.
447*3ac0a46fSAndroid Build Coastguard Worker      */
448*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_VERSIONID, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UINT8, FIELD_CUSTOM, 1, 0, "VersionID", NULL},
449*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_LATITUDEREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LatitudeRef", NULL},
450*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_LATITUDE, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Latitude", NULL},
451*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_LONGITUDEREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LongitudeRef", NULL},
452*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_LONGITUDE, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Longitude", NULL},
453*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_ALTITUDEREF, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "AltitudeRef", NULL},
454*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_ALTITUDE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Altitude", NULL},
455*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_TIMESTAMP, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TimeStamp", NULL},
456*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_SATELLITES, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Satellites", NULL},
457*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_STATUS, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Status", NULL},
458*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_MEASUREMODE, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MeasureMode", NULL},
459*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_DOP, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DOP", NULL},
460*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_SPEEDREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SpeedRef", NULL},
461*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_SPEED, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Speed", NULL},
462*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_TRACKREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TrackRef", NULL},
463*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_TRACK, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Track", NULL},
464*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_IMGDIRECTIONREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImgDirectionRef", NULL},
465*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_IMGDIRECTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImgDirection", NULL},
466*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_MAPDATUM, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MapDatum", NULL},
467*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_DESTLATITUDEREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestLatitudeRef", NULL},
468*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_DESTLATITUDE, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestLatitude", NULL},
469*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_DESTLONGITUDEREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestLongitudeRef", NULL},
470*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_DESTLONGITUDE, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestLongitude", NULL},
471*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_DESTBEARINGREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestBearingRef", NULL},
472*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_DESTBEARING, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestBearing", NULL},
473*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_DESTDISTANCEREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestDistanceRef", NULL},
474*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_DESTDISTANCE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestDistance", NULL},
475*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_PROCESSINGMETHOD, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProcessingMethod", NULL},
476*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_AREAINFORMATION, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "AreaInformation", NULL},
477*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_DATESTAMP, 11, 11, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateStamp", NULL},
478*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_DIFFERENTIAL, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Differential", NULL},
479*3ac0a46fSAndroid Build Coastguard Worker     {GPSTAG_GPSHPOSITIONINGERROR, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "HorizontalPositioningError", NULL}};
480*3ac0a46fSAndroid Build Coastguard Worker /* clang-format on */ /* was off for better readability of tag comments */
481*3ac0a46fSAndroid Build Coastguard Worker 
482*3ac0a46fSAndroid Build Coastguard Worker static const TIFFFieldArray tiffFieldArray = {
483*3ac0a46fSAndroid Build Coastguard Worker     tfiatImage, 0, TIFFArrayCount(tiffFields), (TIFFField *)tiffFields};
484*3ac0a46fSAndroid Build Coastguard Worker static const TIFFFieldArray exifFieldArray = {
485*3ac0a46fSAndroid Build Coastguard Worker     tfiatExif, 0, TIFFArrayCount(exifFields), (TIFFField *)exifFields};
486*3ac0a46fSAndroid Build Coastguard Worker static const TIFFFieldArray gpsFieldArray = {
487*3ac0a46fSAndroid Build Coastguard Worker     tfiatGps, 0, TIFFArrayCount(gpsFields), (TIFFField *)gpsFields};
488*3ac0a46fSAndroid Build Coastguard Worker 
489*3ac0a46fSAndroid Build Coastguard Worker /*
490*3ac0a46fSAndroid Build Coastguard Worker  *  We have our own local lfind() equivalent to avoid subtle differences
491*3ac0a46fSAndroid Build Coastguard Worker  *  in types passed to lfind() on different systems.
492*3ac0a46fSAndroid Build Coastguard Worker  */
493*3ac0a46fSAndroid Build Coastguard Worker 
td_lfind(const void * key,const void * base,size_t * nmemb,size_t size,int (* compar)(const void *,const void *))494*3ac0a46fSAndroid Build Coastguard Worker static void *td_lfind(const void *key, const void *base, size_t *nmemb,
495*3ac0a46fSAndroid Build Coastguard Worker                       size_t size, int (*compar)(const void *, const void *))
496*3ac0a46fSAndroid Build Coastguard Worker {
497*3ac0a46fSAndroid Build Coastguard Worker     char *element, *end;
498*3ac0a46fSAndroid Build Coastguard Worker 
499*3ac0a46fSAndroid Build Coastguard Worker     end = (char *)base + *nmemb * size;
500*3ac0a46fSAndroid Build Coastguard Worker     for (element = (char *)base; element < end; element += size)
501*3ac0a46fSAndroid Build Coastguard Worker         if (!compar(key, element)) /* key found */
502*3ac0a46fSAndroid Build Coastguard Worker             return element;
503*3ac0a46fSAndroid Build Coastguard Worker 
504*3ac0a46fSAndroid Build Coastguard Worker     return NULL;
505*3ac0a46fSAndroid Build Coastguard Worker }
506*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFGetFields(void)507*3ac0a46fSAndroid Build Coastguard Worker const TIFFFieldArray *_TIFFGetFields(void) { return (&tiffFieldArray); }
508*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFGetExifFields(void)509*3ac0a46fSAndroid Build Coastguard Worker const TIFFFieldArray *_TIFFGetExifFields(void) { return (&exifFieldArray); }
510*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFGetGpsFields(void)511*3ac0a46fSAndroid Build Coastguard Worker const TIFFFieldArray *_TIFFGetGpsFields(void) { return (&gpsFieldArray); }
512*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFSetupFields(TIFF * tif,const TIFFFieldArray * fieldarray)513*3ac0a46fSAndroid Build Coastguard Worker void _TIFFSetupFields(TIFF *tif, const TIFFFieldArray *fieldarray)
514*3ac0a46fSAndroid Build Coastguard Worker {
515*3ac0a46fSAndroid Build Coastguard Worker     if (tif->tif_fields && tif->tif_nfields > 0)
516*3ac0a46fSAndroid Build Coastguard Worker     {
517*3ac0a46fSAndroid Build Coastguard Worker         uint32_t i;
518*3ac0a46fSAndroid Build Coastguard Worker 
519*3ac0a46fSAndroid Build Coastguard Worker         for (i = 0; i < tif->tif_nfields; i++)
520*3ac0a46fSAndroid Build Coastguard Worker         {
521*3ac0a46fSAndroid Build Coastguard Worker             TIFFField *fld = tif->tif_fields[i];
522*3ac0a46fSAndroid Build Coastguard Worker             if (fld->field_name != NULL)
523*3ac0a46fSAndroid Build Coastguard Worker             {
524*3ac0a46fSAndroid Build Coastguard Worker                 if (fld->field_bit == FIELD_CUSTOM && TIFFFieldIsAnonymous(fld))
525*3ac0a46fSAndroid Build Coastguard Worker                 {
526*3ac0a46fSAndroid Build Coastguard Worker                     _TIFFfreeExt(tif, fld->field_name);
527*3ac0a46fSAndroid Build Coastguard Worker                     /* caution: tif_fields[i] must not be the beginning of a
528*3ac0a46fSAndroid Build Coastguard Worker                      * fields-array. Otherwise the following tags are also freed
529*3ac0a46fSAndroid Build Coastguard Worker                      * with the first free().
530*3ac0a46fSAndroid Build Coastguard Worker                      */
531*3ac0a46fSAndroid Build Coastguard Worker                     _TIFFfreeExt(tif, fld);
532*3ac0a46fSAndroid Build Coastguard Worker                 }
533*3ac0a46fSAndroid Build Coastguard Worker             }
534*3ac0a46fSAndroid Build Coastguard Worker         }
535*3ac0a46fSAndroid Build Coastguard Worker 
536*3ac0a46fSAndroid Build Coastguard Worker         _TIFFfreeExt(tif, tif->tif_fields);
537*3ac0a46fSAndroid Build Coastguard Worker         tif->tif_fields = NULL;
538*3ac0a46fSAndroid Build Coastguard Worker         tif->tif_nfields = 0;
539*3ac0a46fSAndroid Build Coastguard Worker     }
540*3ac0a46fSAndroid Build Coastguard Worker     if (!_TIFFMergeFields(tif, fieldarray->fields, fieldarray->count))
541*3ac0a46fSAndroid Build Coastguard Worker     {
542*3ac0a46fSAndroid Build Coastguard Worker         TIFFErrorExtR(tif, "_TIFFSetupFields", "Setting up field info failed");
543*3ac0a46fSAndroid Build Coastguard Worker     }
544*3ac0a46fSAndroid Build Coastguard Worker }
545*3ac0a46fSAndroid Build Coastguard Worker 
tagCompare(const void * a,const void * b)546*3ac0a46fSAndroid Build Coastguard Worker static int tagCompare(const void *a, const void *b)
547*3ac0a46fSAndroid Build Coastguard Worker {
548*3ac0a46fSAndroid Build Coastguard Worker     const TIFFField *ta = *(const TIFFField **)a;
549*3ac0a46fSAndroid Build Coastguard Worker     const TIFFField *tb = *(const TIFFField **)b;
550*3ac0a46fSAndroid Build Coastguard Worker     /* NB: be careful of return values for 16-bit platforms */
551*3ac0a46fSAndroid Build Coastguard Worker     if (ta->field_tag != tb->field_tag)
552*3ac0a46fSAndroid Build Coastguard Worker         return (int)ta->field_tag - (int)tb->field_tag;
553*3ac0a46fSAndroid Build Coastguard Worker     else
554*3ac0a46fSAndroid Build Coastguard Worker         return (ta->field_type == TIFF_ANY)
555*3ac0a46fSAndroid Build Coastguard Worker                    ? 0
556*3ac0a46fSAndroid Build Coastguard Worker                    : ((int)tb->field_type - (int)ta->field_type);
557*3ac0a46fSAndroid Build Coastguard Worker }
558*3ac0a46fSAndroid Build Coastguard Worker 
tagNameCompare(const void * a,const void * b)559*3ac0a46fSAndroid Build Coastguard Worker static int tagNameCompare(const void *a, const void *b)
560*3ac0a46fSAndroid Build Coastguard Worker {
561*3ac0a46fSAndroid Build Coastguard Worker     const TIFFField *ta = *(const TIFFField **)a;
562*3ac0a46fSAndroid Build Coastguard Worker     const TIFFField *tb = *(const TIFFField **)b;
563*3ac0a46fSAndroid Build Coastguard Worker     int ret = strcmp(ta->field_name, tb->field_name);
564*3ac0a46fSAndroid Build Coastguard Worker 
565*3ac0a46fSAndroid Build Coastguard Worker     if (ret)
566*3ac0a46fSAndroid Build Coastguard Worker         return ret;
567*3ac0a46fSAndroid Build Coastguard Worker     else
568*3ac0a46fSAndroid Build Coastguard Worker         return (ta->field_type == TIFF_ANY)
569*3ac0a46fSAndroid Build Coastguard Worker                    ? 0
570*3ac0a46fSAndroid Build Coastguard Worker                    : ((int)tb->field_type - (int)ta->field_type);
571*3ac0a46fSAndroid Build Coastguard Worker }
572*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFMergeFields(TIFF * tif,const TIFFField info[],uint32_t n)573*3ac0a46fSAndroid Build Coastguard Worker int _TIFFMergeFields(TIFF *tif, const TIFFField info[], uint32_t n)
574*3ac0a46fSAndroid Build Coastguard Worker {
575*3ac0a46fSAndroid Build Coastguard Worker     static const char module[] = "_TIFFMergeFields";
576*3ac0a46fSAndroid Build Coastguard Worker     static const char reason[] = "for fields array";
577*3ac0a46fSAndroid Build Coastguard Worker     /* TIFFField** tp; */
578*3ac0a46fSAndroid Build Coastguard Worker     uint32_t i;
579*3ac0a46fSAndroid Build Coastguard Worker 
580*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_foundfield = NULL;
581*3ac0a46fSAndroid Build Coastguard Worker 
582*3ac0a46fSAndroid Build Coastguard Worker     if (tif->tif_fields && tif->tif_nfields > 0)
583*3ac0a46fSAndroid Build Coastguard Worker     {
584*3ac0a46fSAndroid Build Coastguard Worker         tif->tif_fields = (TIFFField **)_TIFFCheckRealloc(
585*3ac0a46fSAndroid Build Coastguard Worker             tif, tif->tif_fields, (tif->tif_nfields + n), sizeof(TIFFField *),
586*3ac0a46fSAndroid Build Coastguard Worker             reason);
587*3ac0a46fSAndroid Build Coastguard Worker     }
588*3ac0a46fSAndroid Build Coastguard Worker     else
589*3ac0a46fSAndroid Build Coastguard Worker     {
590*3ac0a46fSAndroid Build Coastguard Worker         tif->tif_fields =
591*3ac0a46fSAndroid Build Coastguard Worker             (TIFFField **)_TIFFCheckMalloc(tif, n, sizeof(TIFFField *), reason);
592*3ac0a46fSAndroid Build Coastguard Worker     }
593*3ac0a46fSAndroid Build Coastguard Worker     if (!tif->tif_fields)
594*3ac0a46fSAndroid Build Coastguard Worker     {
595*3ac0a46fSAndroid Build Coastguard Worker         TIFFErrorExtR(tif, module, "Failed to allocate fields array");
596*3ac0a46fSAndroid Build Coastguard Worker         return 0;
597*3ac0a46fSAndroid Build Coastguard Worker     }
598*3ac0a46fSAndroid Build Coastguard Worker 
599*3ac0a46fSAndroid Build Coastguard Worker     /* tp = tif->tif_fields + tif->tif_nfields; */
600*3ac0a46fSAndroid Build Coastguard Worker     for (i = 0; i < n; i++)
601*3ac0a46fSAndroid Build Coastguard Worker     {
602*3ac0a46fSAndroid Build Coastguard Worker         const TIFFField *fip = TIFFFindField(tif, info[i].field_tag, TIFF_ANY);
603*3ac0a46fSAndroid Build Coastguard Worker 
604*3ac0a46fSAndroid Build Coastguard Worker         /* only add definitions that aren't already present */
605*3ac0a46fSAndroid Build Coastguard Worker         if (!fip)
606*3ac0a46fSAndroid Build Coastguard Worker         {
607*3ac0a46fSAndroid Build Coastguard Worker             tif->tif_fields[tif->tif_nfields] = (TIFFField *)(info + i);
608*3ac0a46fSAndroid Build Coastguard Worker             tif->tif_nfields++;
609*3ac0a46fSAndroid Build Coastguard Worker         }
610*3ac0a46fSAndroid Build Coastguard Worker     }
611*3ac0a46fSAndroid Build Coastguard Worker 
612*3ac0a46fSAndroid Build Coastguard Worker     /* Sort the field info by tag number */
613*3ac0a46fSAndroid Build Coastguard Worker     qsort(tif->tif_fields, tif->tif_nfields, sizeof(TIFFField *), tagCompare);
614*3ac0a46fSAndroid Build Coastguard Worker 
615*3ac0a46fSAndroid Build Coastguard Worker     return n;
616*3ac0a46fSAndroid Build Coastguard Worker }
617*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFPrintFieldInfo(TIFF * tif,FILE * fd)618*3ac0a46fSAndroid Build Coastguard Worker void _TIFFPrintFieldInfo(TIFF *tif, FILE *fd)
619*3ac0a46fSAndroid Build Coastguard Worker {
620*3ac0a46fSAndroid Build Coastguard Worker     uint32_t i;
621*3ac0a46fSAndroid Build Coastguard Worker 
622*3ac0a46fSAndroid Build Coastguard Worker     fprintf(fd, "%s: \n", tif->tif_name);
623*3ac0a46fSAndroid Build Coastguard Worker     for (i = 0; i < tif->tif_nfields; i++)
624*3ac0a46fSAndroid Build Coastguard Worker     {
625*3ac0a46fSAndroid Build Coastguard Worker         const TIFFField *fip = tif->tif_fields[i];
626*3ac0a46fSAndroid Build Coastguard Worker         fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n",
627*3ac0a46fSAndroid Build Coastguard Worker                 (int)i, (unsigned long)fip->field_tag, fip->field_readcount,
628*3ac0a46fSAndroid Build Coastguard Worker                 fip->field_writecount, fip->field_type, fip->field_bit,
629*3ac0a46fSAndroid Build Coastguard Worker                 fip->field_oktochange ? "TRUE" : "FALSE",
630*3ac0a46fSAndroid Build Coastguard Worker                 fip->field_passcount ? "TRUE" : "FALSE", fip->field_name);
631*3ac0a46fSAndroid Build Coastguard Worker     }
632*3ac0a46fSAndroid Build Coastguard Worker }
633*3ac0a46fSAndroid Build Coastguard Worker 
634*3ac0a46fSAndroid Build Coastguard Worker /*
635*3ac0a46fSAndroid Build Coastguard Worker  * Return size of TIFFDataType within TIFF-file in bytes
636*3ac0a46fSAndroid Build Coastguard Worker  */
TIFFDataWidth(TIFFDataType type)637*3ac0a46fSAndroid Build Coastguard Worker int TIFFDataWidth(TIFFDataType type)
638*3ac0a46fSAndroid Build Coastguard Worker {
639*3ac0a46fSAndroid Build Coastguard Worker     switch (type)
640*3ac0a46fSAndroid Build Coastguard Worker     {
641*3ac0a46fSAndroid Build Coastguard Worker         case 0: /* nothing */
642*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_BYTE:
643*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_ASCII:
644*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SBYTE:
645*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_UNDEFINED:
646*3ac0a46fSAndroid Build Coastguard Worker             return 1;
647*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SHORT:
648*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SSHORT:
649*3ac0a46fSAndroid Build Coastguard Worker             return 2;
650*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_LONG:
651*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SLONG:
652*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_FLOAT:
653*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_IFD:
654*3ac0a46fSAndroid Build Coastguard Worker             return 4;
655*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_RATIONAL:
656*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SRATIONAL:
657*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_DOUBLE:
658*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_LONG8:
659*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SLONG8:
660*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_IFD8:
661*3ac0a46fSAndroid Build Coastguard Worker             return 8;
662*3ac0a46fSAndroid Build Coastguard Worker         default:
663*3ac0a46fSAndroid Build Coastguard Worker             return 0; /* will return 0 for unknown types */
664*3ac0a46fSAndroid Build Coastguard Worker     }
665*3ac0a46fSAndroid Build Coastguard Worker }
666*3ac0a46fSAndroid Build Coastguard Worker 
667*3ac0a46fSAndroid Build Coastguard Worker /*
668*3ac0a46fSAndroid Build Coastguard Worker  * Return internal storage size of TIFFSetGetFieldType in bytes.
669*3ac0a46fSAndroid Build Coastguard Worker  * TIFFSetField() and TIFFGetField() have to provide the parameter accordingly.
670*3ac0a46fSAndroid Build Coastguard Worker  * Replaces internal functions _TIFFDataSize() and _TIFFSetGetFieldSize()
671*3ac0a46fSAndroid Build Coastguard Worker  * with now extern available function TIFFFieldSetGetSize().
672*3ac0a46fSAndroid Build Coastguard Worker  */
TIFFFieldSetGetSize(const TIFFField * fip)673*3ac0a46fSAndroid Build Coastguard Worker int TIFFFieldSetGetSize(const TIFFField *fip)
674*3ac0a46fSAndroid Build Coastguard Worker {
675*3ac0a46fSAndroid Build Coastguard Worker     /*
676*3ac0a46fSAndroid Build Coastguard Worker      * TIFFSetField() and TIFFGetField() must provide the parameter accordingly
677*3ac0a46fSAndroid Build Coastguard Worker      * to the definition of "set_field_type" of the tag definition in
678*3ac0a46fSAndroid Build Coastguard Worker      * dir_info.c. This function returns the data size for that purpose.
679*3ac0a46fSAndroid Build Coastguard Worker      *
680*3ac0a46fSAndroid Build Coastguard Worker      * Furthermore, this data size is also used for the internal storage,
681*3ac0a46fSAndroid Build Coastguard Worker      * even for TIFF_RATIONAL values for FIELD_CUSTOM, which are stored
682*3ac0a46fSAndroid Build Coastguard Worker      * internally as 4-byte float, but some of them should be stored internally
683*3ac0a46fSAndroid Build Coastguard Worker      * as 8-byte double, depending on the "set_field_type" _FLOAT_ or _DOUBLE_.
684*3ac0a46fSAndroid Build Coastguard Worker      */
685*3ac0a46fSAndroid Build Coastguard Worker     if (fip == NULL)
686*3ac0a46fSAndroid Build Coastguard Worker         return 0;
687*3ac0a46fSAndroid Build Coastguard Worker 
688*3ac0a46fSAndroid Build Coastguard Worker     switch (fip->set_field_type)
689*3ac0a46fSAndroid Build Coastguard Worker     {
690*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_UNDEFINED:
691*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_ASCII:
692*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C0_ASCII:
693*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_ASCII:
694*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_ASCII:
695*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_OTHER:
696*3ac0a46fSAndroid Build Coastguard Worker             return 1;
697*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_UINT8:
698*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_SINT8:
699*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C0_UINT8:
700*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C0_SINT8:
701*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_UINT8:
702*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_SINT8:
703*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_UINT8:
704*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_SINT8:
705*3ac0a46fSAndroid Build Coastguard Worker             return 1;
706*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_UINT16:
707*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_SINT16:
708*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C0_UINT16:
709*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C0_SINT16:
710*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_UINT16:
711*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_SINT16:
712*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_UINT16:
713*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_SINT16:
714*3ac0a46fSAndroid Build Coastguard Worker             return 2;
715*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_INT:
716*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_UINT32:
717*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_SINT32:
718*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_FLOAT:
719*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_UINT16_PAIR:
720*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C0_UINT32:
721*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C0_SINT32:
722*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C0_FLOAT:
723*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_UINT32:
724*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_SINT32:
725*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_FLOAT:
726*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_UINT32:
727*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_SINT32:
728*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_FLOAT:
729*3ac0a46fSAndroid Build Coastguard Worker             return 4;
730*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_UINT64:
731*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_SINT64:
732*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_DOUBLE:
733*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_IFD8:
734*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C0_UINT64:
735*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C0_SINT64:
736*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C0_DOUBLE:
737*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C0_IFD8:
738*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_UINT64:
739*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_SINT64:
740*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_DOUBLE:
741*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_IFD8:
742*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_UINT64:
743*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_SINT64:
744*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_DOUBLE:
745*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_IFD8:
746*3ac0a46fSAndroid Build Coastguard Worker             return 8;
747*3ac0a46fSAndroid Build Coastguard Worker         default:
748*3ac0a46fSAndroid Build Coastguard Worker             return 0;
749*3ac0a46fSAndroid Build Coastguard Worker     }
750*3ac0a46fSAndroid Build Coastguard Worker } /*-- TIFFFieldSetGetSize() --- */
751*3ac0a46fSAndroid Build Coastguard Worker 
752*3ac0a46fSAndroid Build Coastguard Worker /*
753*3ac0a46fSAndroid Build Coastguard Worker  * Return size of count parameter of TIFFSetField() and TIFFGetField()
754*3ac0a46fSAndroid Build Coastguard Worker  * and also if it is required:  0=none, 2=uint16_t, 4=uint32_t
755*3ac0a46fSAndroid Build Coastguard Worker  */
TIFFFieldSetGetCountSize(const TIFFField * fip)756*3ac0a46fSAndroid Build Coastguard Worker int TIFFFieldSetGetCountSize(const TIFFField *fip)
757*3ac0a46fSAndroid Build Coastguard Worker {
758*3ac0a46fSAndroid Build Coastguard Worker     if (fip == NULL)
759*3ac0a46fSAndroid Build Coastguard Worker         return 0;
760*3ac0a46fSAndroid Build Coastguard Worker 
761*3ac0a46fSAndroid Build Coastguard Worker     switch (fip->set_field_type)
762*3ac0a46fSAndroid Build Coastguard Worker     {
763*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_ASCII:
764*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_UINT8:
765*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_SINT8:
766*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_UINT16:
767*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_SINT16:
768*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_UINT32:
769*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_SINT32:
770*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_FLOAT:
771*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_UINT64:
772*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_SINT64:
773*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_DOUBLE:
774*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C16_IFD8:
775*3ac0a46fSAndroid Build Coastguard Worker             return 2;
776*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_ASCII:
777*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_UINT8:
778*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_SINT8:
779*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_UINT16:
780*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_SINT16:
781*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_UINT32:
782*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_SINT32:
783*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_FLOAT:
784*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_UINT64:
785*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_SINT64:
786*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_DOUBLE:
787*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SETGET_C32_IFD8:
788*3ac0a46fSAndroid Build Coastguard Worker             return 4;
789*3ac0a46fSAndroid Build Coastguard Worker         default:
790*3ac0a46fSAndroid Build Coastguard Worker             return 0;
791*3ac0a46fSAndroid Build Coastguard Worker     }
792*3ac0a46fSAndroid Build Coastguard Worker } /*-- TIFFFieldSetGetCountSize() --- */
793*3ac0a46fSAndroid Build Coastguard Worker 
TIFFFindField(TIFF * tif,uint32_t tag,TIFFDataType dt)794*3ac0a46fSAndroid Build Coastguard Worker const TIFFField *TIFFFindField(TIFF *tif, uint32_t tag, TIFFDataType dt)
795*3ac0a46fSAndroid Build Coastguard Worker {
796*3ac0a46fSAndroid Build Coastguard Worker     TIFFField key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0, 0, 0, NULL, NULL};
797*3ac0a46fSAndroid Build Coastguard Worker     TIFFField *pkey = &key;
798*3ac0a46fSAndroid Build Coastguard Worker     const TIFFField **ret;
799*3ac0a46fSAndroid Build Coastguard Worker     if (tif->tif_foundfield && tif->tif_foundfield->field_tag == tag &&
800*3ac0a46fSAndroid Build Coastguard Worker         (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
801*3ac0a46fSAndroid Build Coastguard Worker         return tif->tif_foundfield;
802*3ac0a46fSAndroid Build Coastguard Worker 
803*3ac0a46fSAndroid Build Coastguard Worker     /* If we are invoked with no field information, then just return. */
804*3ac0a46fSAndroid Build Coastguard Worker     if (!tif->tif_fields)
805*3ac0a46fSAndroid Build Coastguard Worker         return NULL;
806*3ac0a46fSAndroid Build Coastguard Worker 
807*3ac0a46fSAndroid Build Coastguard Worker     /* NB: use sorted search (e.g. binary search) */
808*3ac0a46fSAndroid Build Coastguard Worker 
809*3ac0a46fSAndroid Build Coastguard Worker     key.field_tag = tag;
810*3ac0a46fSAndroid Build Coastguard Worker     key.field_type = dt;
811*3ac0a46fSAndroid Build Coastguard Worker 
812*3ac0a46fSAndroid Build Coastguard Worker     ret = (const TIFFField **)bsearch(&pkey, tif->tif_fields, tif->tif_nfields,
813*3ac0a46fSAndroid Build Coastguard Worker                                       sizeof(TIFFField *), tagCompare);
814*3ac0a46fSAndroid Build Coastguard Worker     return tif->tif_foundfield = (ret ? *ret : NULL);
815*3ac0a46fSAndroid Build Coastguard Worker }
816*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFFindFieldByName(TIFF * tif,const char * field_name,TIFFDataType dt)817*3ac0a46fSAndroid Build Coastguard Worker static const TIFFField *_TIFFFindFieldByName(TIFF *tif, const char *field_name,
818*3ac0a46fSAndroid Build Coastguard Worker                                              TIFFDataType dt)
819*3ac0a46fSAndroid Build Coastguard Worker {
820*3ac0a46fSAndroid Build Coastguard Worker     TIFFField key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0, 0, 0, NULL, NULL};
821*3ac0a46fSAndroid Build Coastguard Worker     TIFFField *pkey = &key;
822*3ac0a46fSAndroid Build Coastguard Worker     const TIFFField **ret;
823*3ac0a46fSAndroid Build Coastguard Worker     if (tif->tif_foundfield &&
824*3ac0a46fSAndroid Build Coastguard Worker         streq(tif->tif_foundfield->field_name, field_name) &&
825*3ac0a46fSAndroid Build Coastguard Worker         (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
826*3ac0a46fSAndroid Build Coastguard Worker         return (tif->tif_foundfield);
827*3ac0a46fSAndroid Build Coastguard Worker 
828*3ac0a46fSAndroid Build Coastguard Worker     /* If we are invoked with no field information, then just return. */
829*3ac0a46fSAndroid Build Coastguard Worker     if (!tif->tif_fields)
830*3ac0a46fSAndroid Build Coastguard Worker         return NULL;
831*3ac0a46fSAndroid Build Coastguard Worker 
832*3ac0a46fSAndroid Build Coastguard Worker     /* NB: use linear search since list is sorted by key#, not name */
833*3ac0a46fSAndroid Build Coastguard Worker 
834*3ac0a46fSAndroid Build Coastguard Worker     key.field_name = (char *)field_name;
835*3ac0a46fSAndroid Build Coastguard Worker     key.field_type = dt;
836*3ac0a46fSAndroid Build Coastguard Worker 
837*3ac0a46fSAndroid Build Coastguard Worker     ret =
838*3ac0a46fSAndroid Build Coastguard Worker         (const TIFFField **)td_lfind(&pkey, tif->tif_fields, &tif->tif_nfields,
839*3ac0a46fSAndroid Build Coastguard Worker                                      sizeof(TIFFField *), tagNameCompare);
840*3ac0a46fSAndroid Build Coastguard Worker 
841*3ac0a46fSAndroid Build Coastguard Worker     return tif->tif_foundfield = (ret ? *ret : NULL);
842*3ac0a46fSAndroid Build Coastguard Worker }
843*3ac0a46fSAndroid Build Coastguard Worker 
TIFFFieldWithTag(TIFF * tif,uint32_t tag)844*3ac0a46fSAndroid Build Coastguard Worker const TIFFField *TIFFFieldWithTag(TIFF *tif, uint32_t tag)
845*3ac0a46fSAndroid Build Coastguard Worker {
846*3ac0a46fSAndroid Build Coastguard Worker     const TIFFField *fip = TIFFFindField(tif, tag, TIFF_ANY);
847*3ac0a46fSAndroid Build Coastguard Worker     if (!fip)
848*3ac0a46fSAndroid Build Coastguard Worker     {
849*3ac0a46fSAndroid Build Coastguard Worker         TIFFWarningExtR(tif, "TIFFFieldWithTag", "Warning, unknown tag 0x%x",
850*3ac0a46fSAndroid Build Coastguard Worker                         (unsigned int)tag);
851*3ac0a46fSAndroid Build Coastguard Worker     }
852*3ac0a46fSAndroid Build Coastguard Worker     return (fip);
853*3ac0a46fSAndroid Build Coastguard Worker }
854*3ac0a46fSAndroid Build Coastguard Worker 
TIFFFieldWithName(TIFF * tif,const char * field_name)855*3ac0a46fSAndroid Build Coastguard Worker const TIFFField *TIFFFieldWithName(TIFF *tif, const char *field_name)
856*3ac0a46fSAndroid Build Coastguard Worker {
857*3ac0a46fSAndroid Build Coastguard Worker     const TIFFField *fip = _TIFFFindFieldByName(tif, field_name, TIFF_ANY);
858*3ac0a46fSAndroid Build Coastguard Worker     if (!fip)
859*3ac0a46fSAndroid Build Coastguard Worker     {
860*3ac0a46fSAndroid Build Coastguard Worker         TIFFWarningExtR(tif, "TIFFFieldWithName", "Warning, unknown tag %s",
861*3ac0a46fSAndroid Build Coastguard Worker                         field_name);
862*3ac0a46fSAndroid Build Coastguard Worker     }
863*3ac0a46fSAndroid Build Coastguard Worker     return (fip);
864*3ac0a46fSAndroid Build Coastguard Worker }
865*3ac0a46fSAndroid Build Coastguard Worker 
TIFFFieldTag(const TIFFField * fip)866*3ac0a46fSAndroid Build Coastguard Worker uint32_t TIFFFieldTag(const TIFFField *fip) { return fip->field_tag; }
867*3ac0a46fSAndroid Build Coastguard Worker 
TIFFFieldName(const TIFFField * fip)868*3ac0a46fSAndroid Build Coastguard Worker const char *TIFFFieldName(const TIFFField *fip) { return fip->field_name; }
869*3ac0a46fSAndroid Build Coastguard Worker 
TIFFFieldDataType(const TIFFField * fip)870*3ac0a46fSAndroid Build Coastguard Worker TIFFDataType TIFFFieldDataType(const TIFFField *fip) { return fip->field_type; }
871*3ac0a46fSAndroid Build Coastguard Worker 
TIFFFieldPassCount(const TIFFField * fip)872*3ac0a46fSAndroid Build Coastguard Worker int TIFFFieldPassCount(const TIFFField *fip) { return fip->field_passcount; }
873*3ac0a46fSAndroid Build Coastguard Worker 
TIFFFieldReadCount(const TIFFField * fip)874*3ac0a46fSAndroid Build Coastguard Worker int TIFFFieldReadCount(const TIFFField *fip) { return fip->field_readcount; }
875*3ac0a46fSAndroid Build Coastguard Worker 
TIFFFieldWriteCount(const TIFFField * fip)876*3ac0a46fSAndroid Build Coastguard Worker int TIFFFieldWriteCount(const TIFFField *fip) { return fip->field_writecount; }
877*3ac0a46fSAndroid Build Coastguard Worker 
TIFFFieldIsAnonymous(const TIFFField * fip)878*3ac0a46fSAndroid Build Coastguard Worker int TIFFFieldIsAnonymous(const TIFFField *fip) { return fip->field_anonymous; }
879*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFFindOrRegisterField(TIFF * tif,uint32_t tag,TIFFDataType dt)880*3ac0a46fSAndroid Build Coastguard Worker const TIFFField *_TIFFFindOrRegisterField(TIFF *tif, uint32_t tag,
881*3ac0a46fSAndroid Build Coastguard Worker                                           TIFFDataType dt)
882*3ac0a46fSAndroid Build Coastguard Worker 
883*3ac0a46fSAndroid Build Coastguard Worker {
884*3ac0a46fSAndroid Build Coastguard Worker     const TIFFField *fld;
885*3ac0a46fSAndroid Build Coastguard Worker 
886*3ac0a46fSAndroid Build Coastguard Worker     fld = TIFFFindField(tif, tag, dt);
887*3ac0a46fSAndroid Build Coastguard Worker     if (fld == NULL)
888*3ac0a46fSAndroid Build Coastguard Worker     {
889*3ac0a46fSAndroid Build Coastguard Worker         fld = _TIFFCreateAnonField(tif, tag, dt);
890*3ac0a46fSAndroid Build Coastguard Worker         if (!_TIFFMergeFields(tif, fld, 1))
891*3ac0a46fSAndroid Build Coastguard Worker             return NULL;
892*3ac0a46fSAndroid Build Coastguard Worker     }
893*3ac0a46fSAndroid Build Coastguard Worker 
894*3ac0a46fSAndroid Build Coastguard Worker     return fld;
895*3ac0a46fSAndroid Build Coastguard Worker }
896*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFCreateAnonField(TIFF * tif,uint32_t tag,TIFFDataType field_type)897*3ac0a46fSAndroid Build Coastguard Worker TIFFField *_TIFFCreateAnonField(TIFF *tif, uint32_t tag,
898*3ac0a46fSAndroid Build Coastguard Worker                                 TIFFDataType field_type)
899*3ac0a46fSAndroid Build Coastguard Worker {
900*3ac0a46fSAndroid Build Coastguard Worker     TIFFField *fld;
901*3ac0a46fSAndroid Build Coastguard Worker     (void)tif;
902*3ac0a46fSAndroid Build Coastguard Worker 
903*3ac0a46fSAndroid Build Coastguard Worker     fld = (TIFFField *)_TIFFmallocExt(tif, sizeof(TIFFField));
904*3ac0a46fSAndroid Build Coastguard Worker     if (fld == NULL)
905*3ac0a46fSAndroid Build Coastguard Worker         return NULL;
906*3ac0a46fSAndroid Build Coastguard Worker     _TIFFmemset(fld, 0, sizeof(TIFFField));
907*3ac0a46fSAndroid Build Coastguard Worker 
908*3ac0a46fSAndroid Build Coastguard Worker     fld->field_tag = tag;
909*3ac0a46fSAndroid Build Coastguard Worker     fld->field_readcount = TIFF_VARIABLE2;
910*3ac0a46fSAndroid Build Coastguard Worker     fld->field_writecount = TIFF_VARIABLE2;
911*3ac0a46fSAndroid Build Coastguard Worker     fld->field_type = field_type;
912*3ac0a46fSAndroid Build Coastguard Worker     fld->field_anonymous =
913*3ac0a46fSAndroid Build Coastguard Worker         1; /* indicate that this is an anonymous / unknown tag */
914*3ac0a46fSAndroid Build Coastguard Worker     switch (field_type)
915*3ac0a46fSAndroid Build Coastguard Worker     {
916*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_BYTE:
917*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_UNDEFINED:
918*3ac0a46fSAndroid Build Coastguard Worker             fld->set_field_type = TIFF_SETGET_C32_UINT8;
919*3ac0a46fSAndroid Build Coastguard Worker             fld->get_field_type = TIFF_SETGET_C32_UINT8;
920*3ac0a46fSAndroid Build Coastguard Worker             break;
921*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_ASCII:
922*3ac0a46fSAndroid Build Coastguard Worker             fld->set_field_type = TIFF_SETGET_C32_ASCII;
923*3ac0a46fSAndroid Build Coastguard Worker             fld->get_field_type = TIFF_SETGET_C32_ASCII;
924*3ac0a46fSAndroid Build Coastguard Worker             break;
925*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SHORT:
926*3ac0a46fSAndroid Build Coastguard Worker             fld->set_field_type = TIFF_SETGET_C32_UINT16;
927*3ac0a46fSAndroid Build Coastguard Worker             fld->get_field_type = TIFF_SETGET_C32_UINT16;
928*3ac0a46fSAndroid Build Coastguard Worker             break;
929*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_LONG:
930*3ac0a46fSAndroid Build Coastguard Worker             fld->set_field_type = TIFF_SETGET_C32_UINT32;
931*3ac0a46fSAndroid Build Coastguard Worker             fld->get_field_type = TIFF_SETGET_C32_UINT32;
932*3ac0a46fSAndroid Build Coastguard Worker             break;
933*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_RATIONAL:
934*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SRATIONAL:
935*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_FLOAT:
936*3ac0a46fSAndroid Build Coastguard Worker             fld->set_field_type = TIFF_SETGET_C32_FLOAT;
937*3ac0a46fSAndroid Build Coastguard Worker             fld->get_field_type = TIFF_SETGET_C32_FLOAT;
938*3ac0a46fSAndroid Build Coastguard Worker             break;
939*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SBYTE:
940*3ac0a46fSAndroid Build Coastguard Worker             fld->set_field_type = TIFF_SETGET_C32_SINT8;
941*3ac0a46fSAndroid Build Coastguard Worker             fld->get_field_type = TIFF_SETGET_C32_SINT8;
942*3ac0a46fSAndroid Build Coastguard Worker             break;
943*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SSHORT:
944*3ac0a46fSAndroid Build Coastguard Worker             fld->set_field_type = TIFF_SETGET_C32_SINT16;
945*3ac0a46fSAndroid Build Coastguard Worker             fld->get_field_type = TIFF_SETGET_C32_SINT16;
946*3ac0a46fSAndroid Build Coastguard Worker             break;
947*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SLONG:
948*3ac0a46fSAndroid Build Coastguard Worker             fld->set_field_type = TIFF_SETGET_C32_SINT32;
949*3ac0a46fSAndroid Build Coastguard Worker             fld->get_field_type = TIFF_SETGET_C32_SINT32;
950*3ac0a46fSAndroid Build Coastguard Worker             break;
951*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_DOUBLE:
952*3ac0a46fSAndroid Build Coastguard Worker             fld->set_field_type = TIFF_SETGET_C32_DOUBLE;
953*3ac0a46fSAndroid Build Coastguard Worker             fld->get_field_type = TIFF_SETGET_C32_DOUBLE;
954*3ac0a46fSAndroid Build Coastguard Worker             break;
955*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_IFD:
956*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_IFD8:
957*3ac0a46fSAndroid Build Coastguard Worker             fld->set_field_type = TIFF_SETGET_C32_IFD8;
958*3ac0a46fSAndroid Build Coastguard Worker             fld->get_field_type = TIFF_SETGET_C32_IFD8;
959*3ac0a46fSAndroid Build Coastguard Worker             break;
960*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_LONG8:
961*3ac0a46fSAndroid Build Coastguard Worker             fld->set_field_type = TIFF_SETGET_C32_UINT64;
962*3ac0a46fSAndroid Build Coastguard Worker             fld->get_field_type = TIFF_SETGET_C32_UINT64;
963*3ac0a46fSAndroid Build Coastguard Worker             break;
964*3ac0a46fSAndroid Build Coastguard Worker         case TIFF_SLONG8:
965*3ac0a46fSAndroid Build Coastguard Worker             fld->set_field_type = TIFF_SETGET_C32_SINT64;
966*3ac0a46fSAndroid Build Coastguard Worker             fld->get_field_type = TIFF_SETGET_C32_SINT64;
967*3ac0a46fSAndroid Build Coastguard Worker             break;
968*3ac0a46fSAndroid Build Coastguard Worker         default:
969*3ac0a46fSAndroid Build Coastguard Worker             fld->set_field_type = TIFF_SETGET_UNDEFINED;
970*3ac0a46fSAndroid Build Coastguard Worker             fld->get_field_type = TIFF_SETGET_UNDEFINED;
971*3ac0a46fSAndroid Build Coastguard Worker             break;
972*3ac0a46fSAndroid Build Coastguard Worker     }
973*3ac0a46fSAndroid Build Coastguard Worker     fld->field_bit = FIELD_CUSTOM;
974*3ac0a46fSAndroid Build Coastguard Worker     fld->field_oktochange = TRUE;
975*3ac0a46fSAndroid Build Coastguard Worker     fld->field_passcount = TRUE;
976*3ac0a46fSAndroid Build Coastguard Worker     fld->field_name = (char *)_TIFFmallocExt(tif, 32);
977*3ac0a46fSAndroid Build Coastguard Worker     if (fld->field_name == NULL)
978*3ac0a46fSAndroid Build Coastguard Worker     {
979*3ac0a46fSAndroid Build Coastguard Worker         _TIFFfreeExt(tif, fld);
980*3ac0a46fSAndroid Build Coastguard Worker         return NULL;
981*3ac0a46fSAndroid Build Coastguard Worker     }
982*3ac0a46fSAndroid Build Coastguard Worker     fld->field_subfields = NULL;
983*3ac0a46fSAndroid Build Coastguard Worker 
984*3ac0a46fSAndroid Build Coastguard Worker     /*
985*3ac0a46fSAndroid Build Coastguard Worker      * note that this name is a special sign to TIFFClose() and
986*3ac0a46fSAndroid Build Coastguard Worker      * _TIFFSetupFields() to free the field
987*3ac0a46fSAndroid Build Coastguard Worker      * Update:
988*3ac0a46fSAndroid Build Coastguard Worker      *   This special sign is replaced by fld->field_anonymous  flag.
989*3ac0a46fSAndroid Build Coastguard Worker      */
990*3ac0a46fSAndroid Build Coastguard Worker     (void)snprintf(fld->field_name, 32, "Tag %d", (int)tag);
991*3ac0a46fSAndroid Build Coastguard Worker 
992*3ac0a46fSAndroid Build Coastguard Worker     return fld;
993*3ac0a46fSAndroid Build Coastguard Worker }
994*3ac0a46fSAndroid Build Coastguard Worker 
995*3ac0a46fSAndroid Build Coastguard Worker /****************************************************************************
996*3ac0a46fSAndroid Build Coastguard Worker  *               O B S O L E T E D    I N T E R F A C E S
997*3ac0a46fSAndroid Build Coastguard Worker  *
998*3ac0a46fSAndroid Build Coastguard Worker  * Don't use this stuff in your applications, it may be removed in the future
999*3ac0a46fSAndroid Build Coastguard Worker  * libtiff versions.
1000*3ac0a46fSAndroid Build Coastguard Worker  ****************************************************************************/
1001*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFSetGetType(TIFFDataType type,short count,unsigned char passcount)1002*3ac0a46fSAndroid Build Coastguard Worker static TIFFSetGetFieldType _TIFFSetGetType(TIFFDataType type, short count,
1003*3ac0a46fSAndroid Build Coastguard Worker                                            unsigned char passcount)
1004*3ac0a46fSAndroid Build Coastguard Worker {
1005*3ac0a46fSAndroid Build Coastguard Worker     if (type == TIFF_ASCII && count == TIFF_VARIABLE && passcount == 0)
1006*3ac0a46fSAndroid Build Coastguard Worker         return TIFF_SETGET_ASCII;
1007*3ac0a46fSAndroid Build Coastguard Worker 
1008*3ac0a46fSAndroid Build Coastguard Worker     else if (count == 1 && passcount == 0)
1009*3ac0a46fSAndroid Build Coastguard Worker     {
1010*3ac0a46fSAndroid Build Coastguard Worker         switch (type)
1011*3ac0a46fSAndroid Build Coastguard Worker         {
1012*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_BYTE:
1013*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_UNDEFINED:
1014*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_UINT8;
1015*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_ASCII:
1016*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_ASCII;
1017*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SHORT:
1018*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_UINT16;
1019*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_LONG:
1020*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_UINT32;
1021*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_RATIONAL:
1022*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SRATIONAL:
1023*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_FLOAT:
1024*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_FLOAT;
1025*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SBYTE:
1026*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_SINT8;
1027*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SSHORT:
1028*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_SINT16;
1029*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SLONG:
1030*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_SINT32;
1031*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_DOUBLE:
1032*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_DOUBLE;
1033*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_IFD:
1034*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_IFD8:
1035*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_IFD8;
1036*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_LONG8:
1037*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_UINT64;
1038*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SLONG8:
1039*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_SINT64;
1040*3ac0a46fSAndroid Build Coastguard Worker             default:
1041*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_UNDEFINED;
1042*3ac0a46fSAndroid Build Coastguard Worker         }
1043*3ac0a46fSAndroid Build Coastguard Worker     }
1044*3ac0a46fSAndroid Build Coastguard Worker 
1045*3ac0a46fSAndroid Build Coastguard Worker     else if (count >= 1 && passcount == 0)
1046*3ac0a46fSAndroid Build Coastguard Worker     {
1047*3ac0a46fSAndroid Build Coastguard Worker         switch (type)
1048*3ac0a46fSAndroid Build Coastguard Worker         {
1049*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_BYTE:
1050*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_UNDEFINED:
1051*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C0_UINT8;
1052*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_ASCII:
1053*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C0_ASCII;
1054*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SHORT:
1055*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C0_UINT16;
1056*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_LONG:
1057*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C0_UINT32;
1058*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_RATIONAL:
1059*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SRATIONAL:
1060*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_FLOAT:
1061*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C0_FLOAT;
1062*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SBYTE:
1063*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C0_SINT8;
1064*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SSHORT:
1065*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C0_SINT16;
1066*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SLONG:
1067*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C0_SINT32;
1068*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_DOUBLE:
1069*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C0_DOUBLE;
1070*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_IFD:
1071*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_IFD8:
1072*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C0_IFD8;
1073*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_LONG8:
1074*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C0_UINT64;
1075*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SLONG8:
1076*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C0_SINT64;
1077*3ac0a46fSAndroid Build Coastguard Worker             default:
1078*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_UNDEFINED;
1079*3ac0a46fSAndroid Build Coastguard Worker         }
1080*3ac0a46fSAndroid Build Coastguard Worker     }
1081*3ac0a46fSAndroid Build Coastguard Worker 
1082*3ac0a46fSAndroid Build Coastguard Worker     else if (count == TIFF_VARIABLE && passcount == 1)
1083*3ac0a46fSAndroid Build Coastguard Worker     {
1084*3ac0a46fSAndroid Build Coastguard Worker         switch (type)
1085*3ac0a46fSAndroid Build Coastguard Worker         {
1086*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_BYTE:
1087*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_UNDEFINED:
1088*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C16_UINT8;
1089*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_ASCII:
1090*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C16_ASCII;
1091*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SHORT:
1092*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C16_UINT16;
1093*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_LONG:
1094*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C16_UINT32;
1095*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_RATIONAL:
1096*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SRATIONAL:
1097*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_FLOAT:
1098*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C16_FLOAT;
1099*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SBYTE:
1100*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C16_SINT8;
1101*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SSHORT:
1102*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C16_SINT16;
1103*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SLONG:
1104*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C16_SINT32;
1105*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_DOUBLE:
1106*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C16_DOUBLE;
1107*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_IFD:
1108*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_IFD8:
1109*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C16_IFD8;
1110*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_LONG8:
1111*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C16_UINT64;
1112*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SLONG8:
1113*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C16_SINT64;
1114*3ac0a46fSAndroid Build Coastguard Worker             default:
1115*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_UNDEFINED;
1116*3ac0a46fSAndroid Build Coastguard Worker         }
1117*3ac0a46fSAndroid Build Coastguard Worker     }
1118*3ac0a46fSAndroid Build Coastguard Worker 
1119*3ac0a46fSAndroid Build Coastguard Worker     else if (count == TIFF_VARIABLE2 && passcount == 1)
1120*3ac0a46fSAndroid Build Coastguard Worker     {
1121*3ac0a46fSAndroid Build Coastguard Worker         switch (type)
1122*3ac0a46fSAndroid Build Coastguard Worker         {
1123*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_BYTE:
1124*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_UNDEFINED:
1125*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C32_UINT8;
1126*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_ASCII:
1127*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C32_ASCII;
1128*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SHORT:
1129*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C32_UINT16;
1130*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_LONG:
1131*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C32_UINT32;
1132*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_RATIONAL:
1133*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SRATIONAL:
1134*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_FLOAT:
1135*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C32_FLOAT;
1136*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SBYTE:
1137*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C32_SINT8;
1138*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SSHORT:
1139*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C32_SINT16;
1140*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SLONG:
1141*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C32_SINT32;
1142*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_DOUBLE:
1143*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C32_DOUBLE;
1144*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_IFD:
1145*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_IFD8:
1146*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C32_IFD8;
1147*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_LONG8:
1148*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C32_UINT64;
1149*3ac0a46fSAndroid Build Coastguard Worker             case TIFF_SLONG8:
1150*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_C32_SINT64;
1151*3ac0a46fSAndroid Build Coastguard Worker             default:
1152*3ac0a46fSAndroid Build Coastguard Worker                 return TIFF_SETGET_UNDEFINED;
1153*3ac0a46fSAndroid Build Coastguard Worker         }
1154*3ac0a46fSAndroid Build Coastguard Worker     }
1155*3ac0a46fSAndroid Build Coastguard Worker 
1156*3ac0a46fSAndroid Build Coastguard Worker     return TIFF_SETGET_UNDEFINED;
1157*3ac0a46fSAndroid Build Coastguard Worker }
1158*3ac0a46fSAndroid Build Coastguard Worker 
TIFFMergeFieldInfo(TIFF * tif,const TIFFFieldInfo info[],uint32_t n)1159*3ac0a46fSAndroid Build Coastguard Worker int TIFFMergeFieldInfo(TIFF *tif, const TIFFFieldInfo info[], uint32_t n)
1160*3ac0a46fSAndroid Build Coastguard Worker {
1161*3ac0a46fSAndroid Build Coastguard Worker     static const char module[] = "TIFFMergeFieldInfo";
1162*3ac0a46fSAndroid Build Coastguard Worker     static const char reason[] = "for fields array";
1163*3ac0a46fSAndroid Build Coastguard Worker     TIFFField *tp;
1164*3ac0a46fSAndroid Build Coastguard Worker     size_t nfields;
1165*3ac0a46fSAndroid Build Coastguard Worker     uint32_t i;
1166*3ac0a46fSAndroid Build Coastguard Worker 
1167*3ac0a46fSAndroid Build Coastguard Worker     if (tif->tif_nfieldscompat > 0)
1168*3ac0a46fSAndroid Build Coastguard Worker     {
1169*3ac0a46fSAndroid Build Coastguard Worker         tif->tif_fieldscompat = (TIFFFieldArray *)_TIFFCheckRealloc(
1170*3ac0a46fSAndroid Build Coastguard Worker             tif, tif->tif_fieldscompat, tif->tif_nfieldscompat + 1,
1171*3ac0a46fSAndroid Build Coastguard Worker             sizeof(TIFFFieldArray), reason);
1172*3ac0a46fSAndroid Build Coastguard Worker     }
1173*3ac0a46fSAndroid Build Coastguard Worker     else
1174*3ac0a46fSAndroid Build Coastguard Worker     {
1175*3ac0a46fSAndroid Build Coastguard Worker         tif->tif_fieldscompat = (TIFFFieldArray *)_TIFFCheckMalloc(
1176*3ac0a46fSAndroid Build Coastguard Worker             tif, 1, sizeof(TIFFFieldArray), reason);
1177*3ac0a46fSAndroid Build Coastguard Worker     }
1178*3ac0a46fSAndroid Build Coastguard Worker     if (!tif->tif_fieldscompat)
1179*3ac0a46fSAndroid Build Coastguard Worker     {
1180*3ac0a46fSAndroid Build Coastguard Worker         TIFFErrorExtR(tif, module, "Failed to allocate fields array");
1181*3ac0a46fSAndroid Build Coastguard Worker         return -1;
1182*3ac0a46fSAndroid Build Coastguard Worker     }
1183*3ac0a46fSAndroid Build Coastguard Worker     nfields = tif->tif_nfieldscompat++;
1184*3ac0a46fSAndroid Build Coastguard Worker 
1185*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_fieldscompat[nfields].type = tfiatOther;
1186*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_fieldscompat[nfields].allocated_size = n;
1187*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_fieldscompat[nfields].count = n;
1188*3ac0a46fSAndroid Build Coastguard Worker     tif->tif_fieldscompat[nfields].fields =
1189*3ac0a46fSAndroid Build Coastguard Worker         (TIFFField *)_TIFFCheckMalloc(tif, n, sizeof(TIFFField), reason);
1190*3ac0a46fSAndroid Build Coastguard Worker     if (!tif->tif_fieldscompat[nfields].fields)
1191*3ac0a46fSAndroid Build Coastguard Worker     {
1192*3ac0a46fSAndroid Build Coastguard Worker         TIFFErrorExtR(tif, module, "Failed to allocate fields array");
1193*3ac0a46fSAndroid Build Coastguard Worker         return -1;
1194*3ac0a46fSAndroid Build Coastguard Worker     }
1195*3ac0a46fSAndroid Build Coastguard Worker 
1196*3ac0a46fSAndroid Build Coastguard Worker     tp = tif->tif_fieldscompat[nfields].fields;
1197*3ac0a46fSAndroid Build Coastguard Worker     for (i = 0; i < n; i++)
1198*3ac0a46fSAndroid Build Coastguard Worker     {
1199*3ac0a46fSAndroid Build Coastguard Worker         tp->field_tag = info[i].field_tag;
1200*3ac0a46fSAndroid Build Coastguard Worker         tp->field_readcount = info[i].field_readcount;
1201*3ac0a46fSAndroid Build Coastguard Worker         tp->field_writecount = info[i].field_writecount;
1202*3ac0a46fSAndroid Build Coastguard Worker         tp->field_type = info[i].field_type;
1203*3ac0a46fSAndroid Build Coastguard Worker         tp->field_anonymous = 0;
1204*3ac0a46fSAndroid Build Coastguard Worker         tp->set_field_type =
1205*3ac0a46fSAndroid Build Coastguard Worker             _TIFFSetGetType(info[i].field_type, info[i].field_readcount,
1206*3ac0a46fSAndroid Build Coastguard Worker                             info[i].field_passcount);
1207*3ac0a46fSAndroid Build Coastguard Worker         tp->get_field_type =
1208*3ac0a46fSAndroid Build Coastguard Worker             _TIFFSetGetType(info[i].field_type, info[i].field_readcount,
1209*3ac0a46fSAndroid Build Coastguard Worker                             info[i].field_passcount);
1210*3ac0a46fSAndroid Build Coastguard Worker         tp->field_bit = info[i].field_bit;
1211*3ac0a46fSAndroid Build Coastguard Worker         tp->field_oktochange = info[i].field_oktochange;
1212*3ac0a46fSAndroid Build Coastguard Worker         tp->field_passcount = info[i].field_passcount;
1213*3ac0a46fSAndroid Build Coastguard Worker         if (info[i].field_name == NULL)
1214*3ac0a46fSAndroid Build Coastguard Worker         {
1215*3ac0a46fSAndroid Build Coastguard Worker             TIFFErrorExtR(tif, module,
1216*3ac0a46fSAndroid Build Coastguard Worker                           "Field_name of %d.th allocation tag %d is NULL", i,
1217*3ac0a46fSAndroid Build Coastguard Worker                           info[i].field_tag);
1218*3ac0a46fSAndroid Build Coastguard Worker             return -1;
1219*3ac0a46fSAndroid Build Coastguard Worker         }
1220*3ac0a46fSAndroid Build Coastguard Worker         tp->field_name = info[i].field_name;
1221*3ac0a46fSAndroid Build Coastguard Worker         tp->field_subfields = NULL;
1222*3ac0a46fSAndroid Build Coastguard Worker         tp++;
1223*3ac0a46fSAndroid Build Coastguard Worker     }
1224*3ac0a46fSAndroid Build Coastguard Worker 
1225*3ac0a46fSAndroid Build Coastguard Worker     if (!_TIFFMergeFields(tif, tif->tif_fieldscompat[nfields].fields, n))
1226*3ac0a46fSAndroid Build Coastguard Worker     {
1227*3ac0a46fSAndroid Build Coastguard Worker         TIFFErrorExtR(tif, module, "Setting up field info failed");
1228*3ac0a46fSAndroid Build Coastguard Worker         return -1;
1229*3ac0a46fSAndroid Build Coastguard Worker     }
1230*3ac0a46fSAndroid Build Coastguard Worker 
1231*3ac0a46fSAndroid Build Coastguard Worker     return 0;
1232*3ac0a46fSAndroid Build Coastguard Worker }
1233*3ac0a46fSAndroid Build Coastguard Worker 
_TIFFCheckFieldIsValidForCodec(TIFF * tif,ttag_t tag)1234*3ac0a46fSAndroid Build Coastguard Worker int _TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag)
1235*3ac0a46fSAndroid Build Coastguard Worker {
1236*3ac0a46fSAndroid Build Coastguard Worker     /* Filter out non-codec specific tags */
1237*3ac0a46fSAndroid Build Coastguard Worker     switch (tag)
1238*3ac0a46fSAndroid Build Coastguard Worker     {
1239*3ac0a46fSAndroid Build Coastguard Worker         /* Shared tags */
1240*3ac0a46fSAndroid Build Coastguard Worker         case TIFFTAG_PREDICTOR:
1241*3ac0a46fSAndroid Build Coastguard Worker         /* JPEG tags */
1242*3ac0a46fSAndroid Build Coastguard Worker         case TIFFTAG_JPEGTABLES:
1243*3ac0a46fSAndroid Build Coastguard Worker         /* OJPEG tags */
1244*3ac0a46fSAndroid Build Coastguard Worker         case TIFFTAG_JPEGIFOFFSET:
1245*3ac0a46fSAndroid Build Coastguard Worker         case TIFFTAG_JPEGIFBYTECOUNT:
1246*3ac0a46fSAndroid Build Coastguard Worker         case TIFFTAG_JPEGQTABLES:
1247*3ac0a46fSAndroid Build Coastguard Worker         case TIFFTAG_JPEGDCTABLES:
1248*3ac0a46fSAndroid Build Coastguard Worker         case TIFFTAG_JPEGACTABLES:
1249*3ac0a46fSAndroid Build Coastguard Worker         case TIFFTAG_JPEGPROC:
1250*3ac0a46fSAndroid Build Coastguard Worker         case TIFFTAG_JPEGRESTARTINTERVAL:
1251*3ac0a46fSAndroid Build Coastguard Worker         /* CCITT* */
1252*3ac0a46fSAndroid Build Coastguard Worker         case TIFFTAG_BADFAXLINES:
1253*3ac0a46fSAndroid Build Coastguard Worker         case TIFFTAG_CLEANFAXDATA:
1254*3ac0a46fSAndroid Build Coastguard Worker         case TIFFTAG_CONSECUTIVEBADFAXLINES:
1255*3ac0a46fSAndroid Build Coastguard Worker         case TIFFTAG_GROUP3OPTIONS:
1256*3ac0a46fSAndroid Build Coastguard Worker         case TIFFTAG_GROUP4OPTIONS:
1257*3ac0a46fSAndroid Build Coastguard Worker         /* LERC */
1258*3ac0a46fSAndroid Build Coastguard Worker         case TIFFTAG_LERC_PARAMETERS:
1259*3ac0a46fSAndroid Build Coastguard Worker             break;
1260*3ac0a46fSAndroid Build Coastguard Worker         default:
1261*3ac0a46fSAndroid Build Coastguard Worker             return 1;
1262*3ac0a46fSAndroid Build Coastguard Worker     }
1263*3ac0a46fSAndroid Build Coastguard Worker     if (!TIFFIsCODECConfigured(tif->tif_dir.td_compression))
1264*3ac0a46fSAndroid Build Coastguard Worker     {
1265*3ac0a46fSAndroid Build Coastguard Worker         return 0;
1266*3ac0a46fSAndroid Build Coastguard Worker     }
1267*3ac0a46fSAndroid Build Coastguard Worker     /* Check if codec specific tags are allowed for the current
1268*3ac0a46fSAndroid Build Coastguard Worker      * compression scheme (codec) */
1269*3ac0a46fSAndroid Build Coastguard Worker     switch (tif->tif_dir.td_compression)
1270*3ac0a46fSAndroid Build Coastguard Worker     {
1271*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_LZW:
1272*3ac0a46fSAndroid Build Coastguard Worker             if (tag == TIFFTAG_PREDICTOR)
1273*3ac0a46fSAndroid Build Coastguard Worker                 return 1;
1274*3ac0a46fSAndroid Build Coastguard Worker             break;
1275*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_PACKBITS:
1276*3ac0a46fSAndroid Build Coastguard Worker             /* No codec-specific tags */
1277*3ac0a46fSAndroid Build Coastguard Worker             break;
1278*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_THUNDERSCAN:
1279*3ac0a46fSAndroid Build Coastguard Worker             /* No codec-specific tags */
1280*3ac0a46fSAndroid Build Coastguard Worker             break;
1281*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_NEXT:
1282*3ac0a46fSAndroid Build Coastguard Worker             /* No codec-specific tags */
1283*3ac0a46fSAndroid Build Coastguard Worker             break;
1284*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_JPEG:
1285*3ac0a46fSAndroid Build Coastguard Worker             if (tag == TIFFTAG_JPEGTABLES)
1286*3ac0a46fSAndroid Build Coastguard Worker                 return 1;
1287*3ac0a46fSAndroid Build Coastguard Worker             break;
1288*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_OJPEG:
1289*3ac0a46fSAndroid Build Coastguard Worker             switch (tag)
1290*3ac0a46fSAndroid Build Coastguard Worker             {
1291*3ac0a46fSAndroid Build Coastguard Worker                 case TIFFTAG_JPEGIFOFFSET:
1292*3ac0a46fSAndroid Build Coastguard Worker                 case TIFFTAG_JPEGIFBYTECOUNT:
1293*3ac0a46fSAndroid Build Coastguard Worker                 case TIFFTAG_JPEGQTABLES:
1294*3ac0a46fSAndroid Build Coastguard Worker                 case TIFFTAG_JPEGDCTABLES:
1295*3ac0a46fSAndroid Build Coastguard Worker                 case TIFFTAG_JPEGACTABLES:
1296*3ac0a46fSAndroid Build Coastguard Worker                 case TIFFTAG_JPEGPROC:
1297*3ac0a46fSAndroid Build Coastguard Worker                 case TIFFTAG_JPEGRESTARTINTERVAL:
1298*3ac0a46fSAndroid Build Coastguard Worker                     return 1;
1299*3ac0a46fSAndroid Build Coastguard Worker             }
1300*3ac0a46fSAndroid Build Coastguard Worker             break;
1301*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_CCITTRLE:
1302*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_CCITTRLEW:
1303*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_CCITTFAX3:
1304*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_CCITTFAX4:
1305*3ac0a46fSAndroid Build Coastguard Worker             switch (tag)
1306*3ac0a46fSAndroid Build Coastguard Worker             {
1307*3ac0a46fSAndroid Build Coastguard Worker                 case TIFFTAG_BADFAXLINES:
1308*3ac0a46fSAndroid Build Coastguard Worker                 case TIFFTAG_CLEANFAXDATA:
1309*3ac0a46fSAndroid Build Coastguard Worker                 case TIFFTAG_CONSECUTIVEBADFAXLINES:
1310*3ac0a46fSAndroid Build Coastguard Worker                     return 1;
1311*3ac0a46fSAndroid Build Coastguard Worker                 case TIFFTAG_GROUP3OPTIONS:
1312*3ac0a46fSAndroid Build Coastguard Worker                     if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX3)
1313*3ac0a46fSAndroid Build Coastguard Worker                         return 1;
1314*3ac0a46fSAndroid Build Coastguard Worker                     break;
1315*3ac0a46fSAndroid Build Coastguard Worker                 case TIFFTAG_GROUP4OPTIONS:
1316*3ac0a46fSAndroid Build Coastguard Worker                     if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4)
1317*3ac0a46fSAndroid Build Coastguard Worker                         return 1;
1318*3ac0a46fSAndroid Build Coastguard Worker                     break;
1319*3ac0a46fSAndroid Build Coastguard Worker             }
1320*3ac0a46fSAndroid Build Coastguard Worker             break;
1321*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_JBIG:
1322*3ac0a46fSAndroid Build Coastguard Worker             /* No codec-specific tags */
1323*3ac0a46fSAndroid Build Coastguard Worker             break;
1324*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_DEFLATE:
1325*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_ADOBE_DEFLATE:
1326*3ac0a46fSAndroid Build Coastguard Worker             if (tag == TIFFTAG_PREDICTOR)
1327*3ac0a46fSAndroid Build Coastguard Worker                 return 1;
1328*3ac0a46fSAndroid Build Coastguard Worker             break;
1329*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_PIXARLOG:
1330*3ac0a46fSAndroid Build Coastguard Worker             if (tag == TIFFTAG_PREDICTOR)
1331*3ac0a46fSAndroid Build Coastguard Worker                 return 1;
1332*3ac0a46fSAndroid Build Coastguard Worker             break;
1333*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_SGILOG:
1334*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_SGILOG24:
1335*3ac0a46fSAndroid Build Coastguard Worker             /* No codec-specific tags */
1336*3ac0a46fSAndroid Build Coastguard Worker             break;
1337*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_LZMA:
1338*3ac0a46fSAndroid Build Coastguard Worker             if (tag == TIFFTAG_PREDICTOR)
1339*3ac0a46fSAndroid Build Coastguard Worker                 return 1;
1340*3ac0a46fSAndroid Build Coastguard Worker             break;
1341*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_ZSTD:
1342*3ac0a46fSAndroid Build Coastguard Worker             if (tag == TIFFTAG_PREDICTOR)
1343*3ac0a46fSAndroid Build Coastguard Worker                 return 1;
1344*3ac0a46fSAndroid Build Coastguard Worker             break;
1345*3ac0a46fSAndroid Build Coastguard Worker         case COMPRESSION_LERC:
1346*3ac0a46fSAndroid Build Coastguard Worker             if (tag == TIFFTAG_LERC_PARAMETERS)
1347*3ac0a46fSAndroid Build Coastguard Worker                 return 1;
1348*3ac0a46fSAndroid Build Coastguard Worker             break;
1349*3ac0a46fSAndroid Build Coastguard Worker     }
1350*3ac0a46fSAndroid Build Coastguard Worker     return 0;
1351*3ac0a46fSAndroid Build Coastguard Worker }
1352