Coverage Report

Created: 2022-10-31 07:00

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