~ubuntu-branches/debian/squeeze/tiff/squeeze

« back to all changes in this revision

Viewing changes to .pc/CVE-2013-1961.patch/libtiff/tif_dirinfo.c

  • Committer: Package Import Robot
  • Author(s): Jay Berkenbilt
  • Date: 2013-08-24 11:23:03 UTC
  • Revision ID: package-import@ubuntu.com-20130824112303-uyia62ezsq1yy06f
Tags: 3.9.4-5+squeeze10
* Incorporated fixes to security issues CVE-2013-4231, CVE-2013-4232.
  (Closes: #719303)
* Incorporated fix to CVE-2013-4244.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Id: tif_dirinfo.c,v 1.65.2.9 2010-06-09 21:15:27 bfriesen Exp $ */
 
2
 
 
3
/*
 
4
 * Copyright (c) 1988-1997 Sam Leffler
 
5
 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
 
6
 *
 
7
 * Permission to use, copy, modify, distribute, and sell this software and 
 
8
 * its documentation for any purpose is hereby granted without fee, provided
 
9
 * that (i) the above copyright notices and this permission notice appear in
 
10
 * all copies of the software and related documentation, and (ii) the names of
 
11
 * Sam Leffler and Silicon Graphics may not be used in any advertising or
 
12
 * publicity relating to the software without the specific, prior written
 
13
 * permission of Sam Leffler and Silicon Graphics.
 
14
 * 
 
15
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
 
16
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
 
17
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
 
18
 * 
 
19
 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
 
20
 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
 
21
 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
 
22
 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
 
23
 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
 
24
 * OF THIS SOFTWARE.
 
25
 */
 
26
 
 
27
/*
 
28
 * TIFF Library.
 
29
 *
 
30
 * Core Directory Tag Support.
 
31
 */
 
32
#include "tiffiop.h"
 
33
#include <stdlib.h>
 
34
#include <string.h>
 
35
 
 
36
/*
 
37
 * NB: NB: THIS ARRAY IS ASSUMED TO BE SORTED BY TAG.
 
38
 *       If a tag can have both LONG and SHORT types then the LONG must be
 
39
 *       placed before the SHORT for writing to work properly.
 
40
 *
 
41
 * NOTE: The second field (field_readcount) and third field (field_writecount)
 
42
 *       sometimes use the values TIFF_VARIABLE (-1), TIFF_VARIABLE2 (-3)
 
43
 *       and TIFFTAG_SPP (-2). The macros should be used but would throw off 
 
44
 *       the formatting of the code, so please interprete the -1, -2 and -3 
 
45
 *       values accordingly.
 
46
 */
 
47
static const TIFFFieldInfo
 
48
tiffFieldInfo[] = {
 
49
    { TIFFTAG_SUBFILETYPE,       1, 1,  TIFF_LONG,      FIELD_SUBFILETYPE,
 
50
      1,        0,      "SubfileType" },
 
51
/* XXX SHORT for compatibility w/ old versions of the library */
 
52
    { TIFFTAG_SUBFILETYPE,       1, 1,  TIFF_SHORT,     FIELD_SUBFILETYPE,
 
53
      1,        0,      "SubfileType" },
 
54
    { TIFFTAG_OSUBFILETYPE,      1, 1,  TIFF_SHORT,     FIELD_SUBFILETYPE,
 
55
      1,        0,      "OldSubfileType" },
 
56
    { TIFFTAG_IMAGEWIDTH,        1, 1,  TIFF_LONG,      FIELD_IMAGEDIMENSIONS,
 
57
      0,        0,      "ImageWidth" },
 
58
    { TIFFTAG_IMAGEWIDTH,        1, 1,  TIFF_SHORT,     FIELD_IMAGEDIMENSIONS,
 
59
      0,        0,      "ImageWidth" },
 
60
    { TIFFTAG_IMAGELENGTH,       1, 1,  TIFF_LONG,      FIELD_IMAGEDIMENSIONS,
 
61
      1,        0,      "ImageLength" },
 
62
    { TIFFTAG_IMAGELENGTH,       1, 1,  TIFF_SHORT,     FIELD_IMAGEDIMENSIONS,
 
63
      1,        0,      "ImageLength" },
 
64
    { TIFFTAG_BITSPERSAMPLE,    -1,-1,  TIFF_SHORT,     FIELD_BITSPERSAMPLE,
 
65
      0,        0,      "BitsPerSample" },
 
66
/* XXX LONG for compatibility with some broken TIFF writers */
 
67
    { TIFFTAG_BITSPERSAMPLE,    -1,-1,  TIFF_LONG,      FIELD_BITSPERSAMPLE,
 
68
      0,        0,      "BitsPerSample" },
 
69
    { TIFFTAG_COMPRESSION,      -1, 1,  TIFF_SHORT,     FIELD_COMPRESSION,
 
70
      0,        0,      "Compression" },
 
71
/* XXX LONG for compatibility with some broken TIFF writers */
 
72
    { TIFFTAG_COMPRESSION,      -1, 1,  TIFF_LONG,      FIELD_COMPRESSION,
 
73
      0,        0,      "Compression" },
 
74
    { TIFFTAG_PHOTOMETRIC,       1, 1,  TIFF_SHORT,     FIELD_PHOTOMETRIC,
 
75
      0,        0,      "PhotometricInterpretation" },
 
76
/* XXX LONG for compatibility with some broken TIFF writers */
 
77
    { TIFFTAG_PHOTOMETRIC,       1, 1,  TIFF_LONG,      FIELD_PHOTOMETRIC,
 
78
      0,        0,      "PhotometricInterpretation" },
 
79
    { TIFFTAG_THRESHHOLDING,     1, 1,  TIFF_SHORT,     FIELD_THRESHHOLDING,
 
80
      1,        0,      "Threshholding" },
 
81
    { TIFFTAG_CELLWIDTH,         1, 1,  TIFF_SHORT,     FIELD_IGNORE,
 
82
      1,        0,      "CellWidth" },
 
83
    { TIFFTAG_CELLLENGTH,        1, 1,  TIFF_SHORT,     FIELD_IGNORE,
 
84
      1,        0,      "CellLength" },
 
85
    { TIFFTAG_FILLORDER,         1, 1,  TIFF_SHORT,     FIELD_FILLORDER,
 
86
      0,        0,      "FillOrder" },
 
87
    { TIFFTAG_DOCUMENTNAME,     -1,-1,  TIFF_ASCII,     FIELD_CUSTOM,
 
88
      1,        0,      "DocumentName" },
 
89
    { TIFFTAG_IMAGEDESCRIPTION, -1,-1,  TIFF_ASCII,     FIELD_CUSTOM,
 
90
      1,        0,      "ImageDescription" },
 
91
    { TIFFTAG_MAKE,             -1,-1,  TIFF_ASCII,     FIELD_CUSTOM,
 
92
      1,        0,      "Make" },
 
93
    { TIFFTAG_MODEL,            -1,-1,  TIFF_ASCII,     FIELD_CUSTOM,
 
94
      1,        0,      "Model" },
 
95
    { TIFFTAG_STRIPOFFSETS,     -1,-1,  TIFF_LONG,      FIELD_STRIPOFFSETS,
 
96
      0,        0,      "StripOffsets" },
 
97
    { TIFFTAG_STRIPOFFSETS,     -1,-1,  TIFF_SHORT,     FIELD_STRIPOFFSETS,
 
98
      0,        0,      "StripOffsets" },
 
99
    { TIFFTAG_ORIENTATION,       1, 1,  TIFF_SHORT,     FIELD_ORIENTATION,
 
100
      0,        0,      "Orientation" },
 
101
    { TIFFTAG_SAMPLESPERPIXEL,   1, 1,  TIFF_SHORT,     FIELD_SAMPLESPERPIXEL,
 
102
      0,        0,      "SamplesPerPixel" },
 
103
    { TIFFTAG_ROWSPERSTRIP,      1, 1,  TIFF_LONG,      FIELD_ROWSPERSTRIP,
 
104
      0,        0,      "RowsPerStrip" },
 
105
    { TIFFTAG_ROWSPERSTRIP,      1, 1,  TIFF_SHORT,     FIELD_ROWSPERSTRIP,
 
106
      0,        0,      "RowsPerStrip" },
 
107
    { TIFFTAG_STRIPBYTECOUNTS,  -1,-1,  TIFF_LONG,      FIELD_STRIPBYTECOUNTS,
 
108
      0,        0,      "StripByteCounts" },
 
109
    { TIFFTAG_STRIPBYTECOUNTS,  -1,-1,  TIFF_SHORT,     FIELD_STRIPBYTECOUNTS,
 
110
      0,        0,      "StripByteCounts" },
 
111
    { TIFFTAG_MINSAMPLEVALUE,   -2,-1,  TIFF_SHORT,     FIELD_MINSAMPLEVALUE,
 
112
      1,        0,      "MinSampleValue" },
 
113
    { TIFFTAG_MAXSAMPLEVALUE,   -2,-1,  TIFF_SHORT,     FIELD_MAXSAMPLEVALUE,
 
114
      1,        0,      "MaxSampleValue" },
 
115
    { TIFFTAG_XRESOLUTION,       1, 1,  TIFF_RATIONAL,  FIELD_RESOLUTION,
 
116
      1,        0,      "XResolution" },
 
117
    { TIFFTAG_YRESOLUTION,       1, 1,  TIFF_RATIONAL,  FIELD_RESOLUTION,
 
118
      1,        0,      "YResolution" },
 
119
    { TIFFTAG_PLANARCONFIG,      1, 1,  TIFF_SHORT,     FIELD_PLANARCONFIG,
 
120
      0,        0,      "PlanarConfiguration" },
 
121
    { TIFFTAG_PAGENAME,         -1,-1,  TIFF_ASCII,     FIELD_CUSTOM,
 
122
      1,        0,      "PageName" },
 
123
    { TIFFTAG_XPOSITION,         1, 1,  TIFF_RATIONAL,  FIELD_POSITION,
 
124
      1,        0,      "XPosition" },
 
125
    { TIFFTAG_YPOSITION,         1, 1,  TIFF_RATIONAL,  FIELD_POSITION,
 
126
      1,        0,      "YPosition" },
 
127
    { TIFFTAG_FREEOFFSETS,      -1,-1,  TIFF_LONG,      FIELD_IGNORE,
 
128
      0,        0,      "FreeOffsets" },
 
129
    { TIFFTAG_FREEBYTECOUNTS,   -1,-1,  TIFF_LONG,      FIELD_IGNORE,
 
130
      0,        0,      "FreeByteCounts" },
 
131
    { TIFFTAG_GRAYRESPONSEUNIT,  1, 1,  TIFF_SHORT,     FIELD_IGNORE,
 
132
      1,        0,      "GrayResponseUnit" },
 
133
    { TIFFTAG_GRAYRESPONSECURVE,-1,-1,  TIFF_SHORT,     FIELD_IGNORE,
 
134
      1,        0,      "GrayResponseCurve" },
 
135
    { TIFFTAG_RESOLUTIONUNIT,    1, 1,  TIFF_SHORT,     FIELD_RESOLUTIONUNIT,
 
136
      1,        0,      "ResolutionUnit" },
 
137
    { TIFFTAG_PAGENUMBER,        2, 2,  TIFF_SHORT,     FIELD_PAGENUMBER,
 
138
      1,        0,      "PageNumber" },
 
139
    { TIFFTAG_COLORRESPONSEUNIT, 1, 1,  TIFF_SHORT,     FIELD_IGNORE,
 
140
      1,        0,      "ColorResponseUnit" },
 
141
    { TIFFTAG_TRANSFERFUNCTION, -1,-1,  TIFF_SHORT,     FIELD_TRANSFERFUNCTION,
 
142
      1,        0,      "TransferFunction" },
 
143
    { TIFFTAG_SOFTWARE,         -1,-1,  TIFF_ASCII,     FIELD_CUSTOM,
 
144
      1,        0,      "Software" },
 
145
    { TIFFTAG_DATETIME,         20,20,  TIFF_ASCII,     FIELD_CUSTOM,
 
146
      1,        0,      "DateTime" },
 
147
    { TIFFTAG_ARTIST,           -1,-1,  TIFF_ASCII,     FIELD_CUSTOM,
 
148
      1,        0,      "Artist" },
 
149
    { TIFFTAG_HOSTCOMPUTER,     -1,-1,  TIFF_ASCII,     FIELD_CUSTOM,
 
150
      1,        0,      "HostComputer" },
 
151
    { TIFFTAG_WHITEPOINT,        2, 2,  TIFF_RATIONAL,  FIELD_CUSTOM,
 
152
      1,        0,      "WhitePoint" },
 
153
    { TIFFTAG_PRIMARYCHROMATICITIES,6,6,TIFF_RATIONAL,  FIELD_CUSTOM,
 
154
      1,        0,      "PrimaryChromaticities" },
 
155
    { TIFFTAG_COLORMAP,         -1,-1,  TIFF_SHORT,     FIELD_COLORMAP,
 
156
      1,        0,      "ColorMap" },
 
157
    { TIFFTAG_HALFTONEHINTS,     2, 2,  TIFF_SHORT,     FIELD_HALFTONEHINTS,
 
158
      1,        0,      "HalftoneHints" },
 
159
    { TIFFTAG_TILEWIDTH,         1, 1,  TIFF_LONG,      FIELD_TILEDIMENSIONS,
 
160
      0,        0,      "TileWidth" },
 
161
    { TIFFTAG_TILEWIDTH,         1, 1,  TIFF_SHORT,     FIELD_TILEDIMENSIONS,
 
162
      0,        0,      "TileWidth" },
 
163
    { TIFFTAG_TILELENGTH,        1, 1,  TIFF_LONG,      FIELD_TILEDIMENSIONS,
 
164
      0,        0,      "TileLength" },
 
165
    { TIFFTAG_TILELENGTH,        1, 1,  TIFF_SHORT,     FIELD_TILEDIMENSIONS,
 
166
      0,        0,      "TileLength" },
 
167
    { TIFFTAG_TILEOFFSETS,      -1, 1,  TIFF_LONG,      FIELD_STRIPOFFSETS,
 
168
      0,        0,      "TileOffsets" },
 
169
    { TIFFTAG_TILEBYTECOUNTS,   -1, 1,  TIFF_LONG,      FIELD_STRIPBYTECOUNTS,
 
170
      0,        0,      "TileByteCounts" },
 
171
    { TIFFTAG_TILEBYTECOUNTS,   -1, 1,  TIFF_SHORT,     FIELD_STRIPBYTECOUNTS,
 
172
      0,        0,      "TileByteCounts" },
 
173
    { TIFFTAG_SUBIFD,           -1,-1,  TIFF_IFD,       FIELD_SUBIFD,
 
174
      1,        1,      "SubIFD" },
 
175
    { TIFFTAG_SUBIFD,           -1,-1,  TIFF_LONG,      FIELD_SUBIFD,
 
176
      1,        1,      "SubIFD" },
 
177
    { TIFFTAG_INKSET,            1, 1,  TIFF_SHORT,     FIELD_CUSTOM,
 
178
      0,        0,      "InkSet" },
 
179
    { TIFFTAG_INKNAMES,         -1,-1,  TIFF_ASCII,     FIELD_INKNAMES,
 
180
      1,        1,      "InkNames" },
 
181
    { TIFFTAG_NUMBEROFINKS,      1, 1,  TIFF_SHORT,     FIELD_CUSTOM,
 
182
      1,        0,      "NumberOfInks" },
 
183
    { TIFFTAG_DOTRANGE,          2, 2,  TIFF_SHORT,     FIELD_CUSTOM,
 
184
      0,        0,      "DotRange" },
 
185
    { TIFFTAG_DOTRANGE,          2, 2,  TIFF_BYTE,      FIELD_CUSTOM,
 
186
      0,        0,      "DotRange" },
 
187
    { TIFFTAG_TARGETPRINTER,    -1,-1,  TIFF_ASCII,     FIELD_CUSTOM,
 
188
      1,        0,      "TargetPrinter" },
 
189
    { TIFFTAG_EXTRASAMPLES,     -1,-1,  TIFF_SHORT,     FIELD_EXTRASAMPLES,
 
190
      0,        1,      "ExtraSamples" },
 
191
/* XXX for bogus Adobe Photoshop v2.5 files */
 
192
    { TIFFTAG_EXTRASAMPLES,     -1,-1,  TIFF_BYTE,      FIELD_EXTRASAMPLES,
 
193
      0,        1,      "ExtraSamples" },
 
194
    { TIFFTAG_SAMPLEFORMAT,     -1,-1,  TIFF_SHORT,     FIELD_SAMPLEFORMAT,
 
195
      0,        0,      "SampleFormat" },
 
196
    { TIFFTAG_SMINSAMPLEVALUE,  -2,-1,  TIFF_ANY,       FIELD_SMINSAMPLEVALUE,
 
197
      1,        0,      "SMinSampleValue" },
 
198
    { TIFFTAG_SMAXSAMPLEVALUE,  -2,-1,  TIFF_ANY,       FIELD_SMAXSAMPLEVALUE,
 
199
      1,        0,      "SMaxSampleValue" },
 
200
    { TIFFTAG_CLIPPATH,         -1, -3, TIFF_BYTE,      FIELD_CUSTOM,
 
201
      0,        1,      "ClipPath" },
 
202
    { TIFFTAG_XCLIPPATHUNITS,    1, 1,  TIFF_SLONG,     FIELD_CUSTOM,
 
203
      0,        0,      "XClipPathUnits" },
 
204
    { TIFFTAG_XCLIPPATHUNITS,    1, 1,  TIFF_SSHORT,    FIELD_CUSTOM,
 
205
      0,        0,      "XClipPathUnits" },
 
206
    { TIFFTAG_XCLIPPATHUNITS,    1, 1,  TIFF_SBYTE,     FIELD_CUSTOM,
 
207
      0,        0,      "XClipPathUnits" },
 
208
    { TIFFTAG_YCLIPPATHUNITS,    1, 1,  TIFF_SLONG,     FIELD_CUSTOM,
 
209
      0,        0,      "YClipPathUnits" },
 
210
    { TIFFTAG_YCLIPPATHUNITS,    1, 1,  TIFF_SSHORT,    FIELD_CUSTOM,
 
211
      0,        0,      "YClipPathUnits" },
 
212
    { TIFFTAG_YCLIPPATHUNITS,    1, 1,  TIFF_SBYTE,     FIELD_CUSTOM,
 
213
      0,        0,      "YClipPathUnits" },
 
214
    { TIFFTAG_YCBCRCOEFFICIENTS, 3, 3,  TIFF_RATIONAL,  FIELD_CUSTOM,
 
215
      0,        0,      "YCbCrCoefficients" },
 
216
    { TIFFTAG_YCBCRSUBSAMPLING,  2, 2,  TIFF_SHORT,     FIELD_YCBCRSUBSAMPLING,
 
217
      0,        0,      "YCbCrSubsampling" },
 
218
    { TIFFTAG_YCBCRPOSITIONING,  1, 1,  TIFF_SHORT,     FIELD_YCBCRPOSITIONING,
 
219
      0,        0,      "YCbCrPositioning" },
 
220
    { TIFFTAG_REFERENCEBLACKWHITE, 6, 6, TIFF_RATIONAL, FIELD_REFBLACKWHITE,
 
221
      1,        0,      "ReferenceBlackWhite" },
 
222
/* XXX temporarily accept LONG for backwards compatibility */
 
223
    { TIFFTAG_REFERENCEBLACKWHITE, 6, 6, TIFF_LONG,     FIELD_REFBLACKWHITE,
 
224
      1,        0,      "ReferenceBlackWhite" },
 
225
    { TIFFTAG_XMLPACKET,        -3,-3,  TIFF_BYTE,      FIELD_CUSTOM,
 
226
      0,        1,      "XMLPacket" },
 
227
/* begin SGI tags */
 
228
    { TIFFTAG_MATTEING,          1, 1,  TIFF_SHORT,     FIELD_EXTRASAMPLES,
 
229
      0,        0,      "Matteing" },
 
230
    { TIFFTAG_DATATYPE,         -2,-1,  TIFF_SHORT,     FIELD_SAMPLEFORMAT,
 
231
      0,        0,      "DataType" },
 
232
    { TIFFTAG_IMAGEDEPTH,        1, 1,  TIFF_LONG,      FIELD_IMAGEDEPTH,
 
233
      0,        0,      "ImageDepth" },
 
234
    { TIFFTAG_IMAGEDEPTH,        1, 1,  TIFF_SHORT,     FIELD_IMAGEDEPTH,
 
235
      0,        0,      "ImageDepth" },
 
236
    { TIFFTAG_TILEDEPTH,         1, 1,  TIFF_LONG,      FIELD_TILEDEPTH,
 
237
      0,        0,      "TileDepth" },
 
238
    { TIFFTAG_TILEDEPTH,         1, 1,  TIFF_SHORT,     FIELD_TILEDEPTH,
 
239
      0,        0,      "TileDepth" },
 
240
/* end SGI tags */
 
241
/* begin Pixar tags */
 
242
    { TIFFTAG_PIXAR_IMAGEFULLWIDTH,  1, 1, TIFF_LONG,   FIELD_CUSTOM,
 
243
      1,        0,      "ImageFullWidth" },
 
244
    { TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG,   FIELD_CUSTOM,
 
245
      1,        0,      "ImageFullLength" },
 
246
    { TIFFTAG_PIXAR_TEXTUREFORMAT,  -1, -1, TIFF_ASCII, FIELD_CUSTOM,
 
247
      1,        0,      "TextureFormat" },
 
248
    { TIFFTAG_PIXAR_WRAPMODES,      -1, -1, TIFF_ASCII, FIELD_CUSTOM,
 
249
      1,        0,      "TextureWrapModes" },
 
250
    { TIFFTAG_PIXAR_FOVCOT,          1, 1, TIFF_FLOAT,  FIELD_CUSTOM,
 
251
      1,        0,      "FieldOfViewCotangent" },
 
252
    { TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN,       16,16,  TIFF_FLOAT,
 
253
      FIELD_CUSTOM,     1,      0,      "MatrixWorldToScreen" },
 
254
    { TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA,       16,16,  TIFF_FLOAT,
 
255
       FIELD_CUSTOM,    1,      0,      "MatrixWorldToCamera" },
 
256
    { TIFFTAG_COPYRIGHT,        -1, -1, TIFF_ASCII,     FIELD_CUSTOM,
 
257
      1,        0,      "Copyright" },
 
258
/* end Pixar tags */
 
259
    { TIFFTAG_RICHTIFFIPTC, -3, -3,     TIFF_LONG,      FIELD_CUSTOM, 
 
260
      0,    1,   "RichTIFFIPTC" },
 
261
    { TIFFTAG_PHOTOSHOP,    -3, -3,     TIFF_BYTE,      FIELD_CUSTOM, 
 
262
      0,    1,   "Photoshop" },
 
263
    { TIFFTAG_EXIFIFD,          1, 1,   TIFF_LONG,      FIELD_CUSTOM,
 
264
      0,        0,      "EXIFIFDOffset" },
 
265
    { TIFFTAG_ICCPROFILE,       -3, -3, TIFF_UNDEFINED, FIELD_CUSTOM,
 
266
      0,        1,      "ICC Profile" },
 
267
    { TIFFTAG_GPSIFD,           1, 1,   TIFF_LONG,      FIELD_CUSTOM,
 
268
      0,        0,      "GPSIFDOffset" },
 
269
    { TIFFTAG_STONITS,           1, 1,  TIFF_DOUBLE,    FIELD_CUSTOM,
 
270
      0,        0,      "StoNits" },
 
271
    { TIFFTAG_INTEROPERABILITYIFD, 1, 1, TIFF_LONG,     FIELD_CUSTOM,
 
272
      0,        0,      "InteroperabilityIFDOffset" },
 
273
/* begin DNG tags */
 
274
    { TIFFTAG_DNGVERSION,       4, 4,   TIFF_BYTE,      FIELD_CUSTOM, 
 
275
      0,        0,      "DNGVersion" },
 
276
    { TIFFTAG_DNGBACKWARDVERSION, 4, 4, TIFF_BYTE,      FIELD_CUSTOM, 
 
277
      0,        0,      "DNGBackwardVersion" },
 
278
    { TIFFTAG_UNIQUECAMERAMODEL,    -1, -1, TIFF_ASCII, FIELD_CUSTOM,
 
279
      1,        0,      "UniqueCameraModel" },
 
280
    { TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
 
281
      1,        0,      "LocalizedCameraModel" },
 
282
    { TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_BYTE,  FIELD_CUSTOM,
 
283
      1,        1,      "LocalizedCameraModel" },
 
284
    { TIFFTAG_CFAPLANECOLOR,    -1, -1, TIFF_BYTE,      FIELD_CUSTOM, 
 
285
      0,        1,      "CFAPlaneColor" },
 
286
    { TIFFTAG_CFALAYOUT,        1, 1,   TIFF_SHORT,     FIELD_CUSTOM, 
 
287
      0,        0,      "CFALayout" },
 
288
    { TIFFTAG_LINEARIZATIONTABLE, -1, -1, TIFF_SHORT,   FIELD_CUSTOM, 
 
289
      0,        1,      "LinearizationTable" },
 
290
    { TIFFTAG_BLACKLEVELREPEATDIM, 2, 2, TIFF_SHORT,    FIELD_CUSTOM, 
 
291
      0,        0,      "BlackLevelRepeatDim" },
 
292
    { TIFFTAG_BLACKLEVEL,       -1, -1, TIFF_LONG,      FIELD_CUSTOM, 
 
293
      0,        1,      "BlackLevel" },
 
294
    { TIFFTAG_BLACKLEVEL,       -1, -1, TIFF_SHORT,     FIELD_CUSTOM, 
 
295
      0,        1,      "BlackLevel" },
 
296
    { TIFFTAG_BLACKLEVEL,       -1, -1, TIFF_RATIONAL,  FIELD_CUSTOM, 
 
297
      0,        1,      "BlackLevel" },
 
298
    { TIFFTAG_BLACKLEVELDELTAH, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
 
299
      0,        1,      "BlackLevelDeltaH" },
 
300
    { TIFFTAG_BLACKLEVELDELTAV, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
 
301
      0,        1,      "BlackLevelDeltaV" },
 
302
    { TIFFTAG_WHITELEVEL,       -2, -2, TIFF_LONG,      FIELD_CUSTOM, 
 
303
      0,        0,      "WhiteLevel" },
 
304
    { TIFFTAG_WHITELEVEL,       -2, -2, TIFF_SHORT,     FIELD_CUSTOM, 
 
305
      0,        0,      "WhiteLevel" },
 
306
    { TIFFTAG_DEFAULTSCALE,     2, 2,   TIFF_RATIONAL,  FIELD_CUSTOM, 
 
307
      0,        0,      "DefaultScale" },
 
308
    { TIFFTAG_BESTQUALITYSCALE, 1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
 
309
      0,        0,      "BestQualityScale" },
 
310
    { TIFFTAG_DEFAULTCROPORIGIN,        2, 2,   TIFF_LONG,      FIELD_CUSTOM, 
 
311
      0,        0,      "DefaultCropOrigin" },
 
312
    { TIFFTAG_DEFAULTCROPORIGIN,        2, 2,   TIFF_SHORT,     FIELD_CUSTOM, 
 
313
      0,        0,      "DefaultCropOrigin" },
 
314
    { TIFFTAG_DEFAULTCROPORIGIN,        2, 2,   TIFF_RATIONAL,  FIELD_CUSTOM, 
 
315
      0,        0,      "DefaultCropOrigin" },
 
316
    { TIFFTAG_DEFAULTCROPSIZE,  2, 2,   TIFF_LONG,      FIELD_CUSTOM, 
 
317
      0,        0,      "DefaultCropSize" },
 
318
    { TIFFTAG_DEFAULTCROPSIZE,  2, 2,   TIFF_SHORT,     FIELD_CUSTOM, 
 
319
      0,        0,      "DefaultCropSize" },
 
320
    { TIFFTAG_DEFAULTCROPSIZE,  2, 2,   TIFF_RATIONAL,  FIELD_CUSTOM, 
 
321
      0,        0,      "DefaultCropSize" },
 
322
    { TIFFTAG_COLORMATRIX1,     -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
 
323
      0,        1,      "ColorMatrix1" },
 
324
    { TIFFTAG_COLORMATRIX2,     -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
 
325
      0,        1,      "ColorMatrix2" },
 
326
    { TIFFTAG_CAMERACALIBRATION1,       -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
 
327
      0,        1,      "CameraCalibration1" },
 
328
    { TIFFTAG_CAMERACALIBRATION2,       -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
 
329
      0,        1,      "CameraCalibration2" },
 
330
    { TIFFTAG_REDUCTIONMATRIX1, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
 
331
      0,        1,      "ReductionMatrix1" },
 
332
    { TIFFTAG_REDUCTIONMATRIX2, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
 
333
      0,        1,      "ReductionMatrix2" },
 
334
    { TIFFTAG_ANALOGBALANCE,    -1, -1, TIFF_RATIONAL,  FIELD_CUSTOM, 
 
335
      0,        1,      "AnalogBalance" },
 
336
    { TIFFTAG_ASSHOTNEUTRAL,    -1, -1, TIFF_SHORT,     FIELD_CUSTOM, 
 
337
      0,        1,      "AsShotNeutral" },
 
338
    { TIFFTAG_ASSHOTNEUTRAL,    -1, -1, TIFF_RATIONAL,  FIELD_CUSTOM, 
 
339
      0,        1,      "AsShotNeutral" },
 
340
    { TIFFTAG_ASSHOTWHITEXY,    2, 2,   TIFF_RATIONAL,  FIELD_CUSTOM, 
 
341
      0,        0,      "AsShotWhiteXY" },
 
342
    { TIFFTAG_BASELINEEXPOSURE, 1, 1,   TIFF_SRATIONAL, FIELD_CUSTOM, 
 
343
      0,        0,      "BaselineExposure" },
 
344
    { TIFFTAG_BASELINENOISE,    1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
 
345
      0,        0,      "BaselineNoise" },
 
346
    { TIFFTAG_BASELINESHARPNESS,        1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
 
347
      0,        0,      "BaselineSharpness" },
 
348
    { TIFFTAG_BAYERGREENSPLIT,  1, 1,   TIFF_LONG,      FIELD_CUSTOM, 
 
349
      0,        0,      "BayerGreenSplit" },
 
350
    { TIFFTAG_LINEARRESPONSELIMIT,      1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
 
351
      0,        0,      "LinearResponseLimit" },
 
352
    { TIFFTAG_CAMERASERIALNUMBER,    -1, -1, TIFF_ASCII,        FIELD_CUSTOM,
 
353
      1,        0,      "CameraSerialNumber" },
 
354
    { TIFFTAG_LENSINFO, 4, 4,   TIFF_RATIONAL,  FIELD_CUSTOM, 
 
355
      0,        0,      "LensInfo" },
 
356
    { TIFFTAG_CHROMABLURRADIUS, 1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
 
357
      0,        0,      "ChromaBlurRadius" },
 
358
    { TIFFTAG_ANTIALIASSTRENGTH,        1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
 
359
      0,        0,      "AntiAliasStrength" },
 
360
    { TIFFTAG_SHADOWSCALE,      1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
 
361
      0,        0,      "ShadowScale" },
 
362
    { TIFFTAG_DNGPRIVATEDATA,    -1, -1, TIFF_BYTE,     FIELD_CUSTOM,
 
363
      0,        1,      "DNGPrivateData" },
 
364
    { TIFFTAG_MAKERNOTESAFETY,  1, 1,   TIFF_SHORT,     FIELD_CUSTOM, 
 
365
      0,        0,      "MakerNoteSafety" },
 
366
    { TIFFTAG_CALIBRATIONILLUMINANT1,   1, 1,   TIFF_SHORT,     FIELD_CUSTOM, 
 
367
      0,        0,      "CalibrationIlluminant1" },
 
368
    { TIFFTAG_CALIBRATIONILLUMINANT2,   1, 1,   TIFF_SHORT,     FIELD_CUSTOM, 
 
369
      0,        0,      "CalibrationIlluminant2" },
 
370
    { TIFFTAG_RAWDATAUNIQUEID,  16, 16, TIFF_BYTE,      FIELD_CUSTOM, 
 
371
      0,        0,      "RawDataUniqueID" },
 
372
    { TIFFTAG_ORIGINALRAWFILENAME,    -1, -1, TIFF_ASCII,       FIELD_CUSTOM,
 
373
      1,        0,      "OriginalRawFileName" },
 
374
    { TIFFTAG_ORIGINALRAWFILENAME,    -1, -1, TIFF_BYTE,        FIELD_CUSTOM,
 
375
      1,        1,      "OriginalRawFileName" },
 
376
    { TIFFTAG_ORIGINALRAWFILEDATA,    -1, -1, TIFF_UNDEFINED,   FIELD_CUSTOM,
 
377
      0,        1,      "OriginalRawFileData" },
 
378
    { TIFFTAG_ACTIVEAREA,       4, 4,   TIFF_LONG,      FIELD_CUSTOM, 
 
379
      0,        0,      "ActiveArea" },
 
380
    { TIFFTAG_ACTIVEAREA,       4, 4,   TIFF_SHORT,     FIELD_CUSTOM, 
 
381
      0,        0,      "ActiveArea" },
 
382
    { TIFFTAG_MASKEDAREAS,      -1, -1, TIFF_LONG,      FIELD_CUSTOM, 
 
383
      0,        1,      "MaskedAreas" },
 
384
    { TIFFTAG_ASSHOTICCPROFILE,    -1, -1, TIFF_UNDEFINED,      FIELD_CUSTOM,
 
385
      0,        1,      "AsShotICCProfile" },
 
386
    { TIFFTAG_ASSHOTPREPROFILEMATRIX,   -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
 
387
      0,        1,      "AsShotPreProfileMatrix" },
 
388
    { TIFFTAG_CURRENTICCPROFILE,    -1, -1, TIFF_UNDEFINED,     FIELD_CUSTOM,
 
389
      0,        1,      "CurrentICCProfile" },
 
390
    { TIFFTAG_CURRENTPREPROFILEMATRIX,  -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
 
391
      0,        1,      "CurrentPreProfileMatrix" },
 
392
/* end DNG tags */
 
393
};
 
394
 
 
395
static const TIFFFieldInfo
 
396
exifFieldInfo[] = {
 
397
    { EXIFTAG_EXPOSURETIME,     1, 1,           TIFF_RATIONAL,  FIELD_CUSTOM, 
 
398
      1,        0,      "ExposureTime" },
 
399
    { EXIFTAG_FNUMBER,          1, 1,           TIFF_RATIONAL,  FIELD_CUSTOM, 
 
400
      1,        0,      "FNumber" },
 
401
    { EXIFTAG_EXPOSUREPROGRAM,  1, 1,           TIFF_SHORT,     FIELD_CUSTOM,
 
402
      1,        0,      "ExposureProgram" },
 
403
    { EXIFTAG_SPECTRALSENSITIVITY,    -1, -1,   TIFF_ASCII,     FIELD_CUSTOM,
 
404
      1,        0,      "SpectralSensitivity" },
 
405
    { EXIFTAG_ISOSPEEDRATINGS,  -1, -1,         TIFF_SHORT,     FIELD_CUSTOM,
 
406
      1,        1,      "ISOSpeedRatings" },
 
407
    { EXIFTAG_OECF,     -1, -1,                 TIFF_UNDEFINED, FIELD_CUSTOM,
 
408
      1,        1,      "OptoelectricConversionFactor" },
 
409
    { EXIFTAG_EXIFVERSION,      4, 4,           TIFF_UNDEFINED, FIELD_CUSTOM,
 
410
      1,        0,      "ExifVersion" },
 
411
    { EXIFTAG_DATETIMEORIGINAL, 20, 20,         TIFF_ASCII,     FIELD_CUSTOM,
 
412
      1,        0,      "DateTimeOriginal" },
 
413
    { EXIFTAG_DATETIMEDIGITIZED, 20, 20,        TIFF_ASCII,     FIELD_CUSTOM,
 
414
      1,        0,      "DateTimeDigitized" },
 
415
    { EXIFTAG_COMPONENTSCONFIGURATION,   4, 4,  TIFF_UNDEFINED, FIELD_CUSTOM,
 
416
      1,        0,      "ComponentsConfiguration" },
 
417
    { EXIFTAG_COMPRESSEDBITSPERPIXEL,    1, 1,  TIFF_RATIONAL,  FIELD_CUSTOM,
 
418
      1,        0,      "CompressedBitsPerPixel" },
 
419
    { EXIFTAG_SHUTTERSPEEDVALUE,        1, 1,   TIFF_SRATIONAL, FIELD_CUSTOM, 
 
420
      1,        0,      "ShutterSpeedValue" },
 
421
    { EXIFTAG_APERTUREVALUE,    1, 1,           TIFF_RATIONAL,  FIELD_CUSTOM, 
 
422
      1,        0,      "ApertureValue" },
 
423
    { EXIFTAG_BRIGHTNESSVALUE,  1, 1,           TIFF_SRATIONAL, FIELD_CUSTOM, 
 
424
      1,        0,      "BrightnessValue" },
 
425
    { EXIFTAG_EXPOSUREBIASVALUE,        1, 1,   TIFF_SRATIONAL, FIELD_CUSTOM, 
 
426
      1,        0,      "ExposureBiasValue" },
 
427
    { EXIFTAG_MAXAPERTUREVALUE, 1, 1,           TIFF_RATIONAL,  FIELD_CUSTOM, 
 
428
      1,        0,      "MaxApertureValue" },
 
429
    { EXIFTAG_SUBJECTDISTANCE,  1, 1,           TIFF_RATIONAL,  FIELD_CUSTOM, 
 
430
      1,        0,      "SubjectDistance" },
 
431
    { EXIFTAG_METERINGMODE,     1, 1,           TIFF_SHORT,     FIELD_CUSTOM,
 
432
      1,        0,      "MeteringMode" },
 
433
    { EXIFTAG_LIGHTSOURCE,      1, 1,           TIFF_SHORT,     FIELD_CUSTOM,
 
434
      1,        0,      "LightSource" },
 
435
    { EXIFTAG_FLASH,    1, 1,                   TIFF_SHORT,     FIELD_CUSTOM,
 
436
      1,        0,      "Flash" },
 
437
    { EXIFTAG_FOCALLENGTH,      1, 1,           TIFF_RATIONAL,  FIELD_CUSTOM, 
 
438
      1,        0,      "FocalLength" },
 
439
    { EXIFTAG_SUBJECTAREA,      -1, -1,         TIFF_SHORT,     FIELD_CUSTOM,
 
440
      1,        1,      "SubjectArea" },
 
441
    { EXIFTAG_MAKERNOTE,        -1, -1,         TIFF_UNDEFINED, FIELD_CUSTOM,
 
442
      1,        1,      "MakerNote" },
 
443
    { EXIFTAG_USERCOMMENT,      -1, -1,         TIFF_UNDEFINED, FIELD_CUSTOM,
 
444
      1,        1,      "UserComment" },
 
445
    { EXIFTAG_SUBSECTIME,    -1, -1,            TIFF_ASCII,     FIELD_CUSTOM,
 
446
      1,        0,      "SubSecTime" },
 
447
    { EXIFTAG_SUBSECTIMEORIGINAL, -1, -1,       TIFF_ASCII,     FIELD_CUSTOM,
 
448
      1,        0,      "SubSecTimeOriginal" },
 
449
    { EXIFTAG_SUBSECTIMEDIGITIZED,-1, -1,       TIFF_ASCII,     FIELD_CUSTOM,
 
450
      1,        0,      "SubSecTimeDigitized" },
 
451
    { EXIFTAG_FLASHPIXVERSION,  4, 4,           TIFF_UNDEFINED, FIELD_CUSTOM,
 
452
      1,        0,      "FlashpixVersion" },
 
453
    { EXIFTAG_COLORSPACE,       1, 1,           TIFF_SHORT,     FIELD_CUSTOM,
 
454
      1,        0,      "ColorSpace" },
 
455
    { EXIFTAG_PIXELXDIMENSION,  1, 1,           TIFF_LONG,      FIELD_CUSTOM,
 
456
      1,        0,      "PixelXDimension" },
 
457
    { EXIFTAG_PIXELXDIMENSION,  1, 1,           TIFF_SHORT,     FIELD_CUSTOM,
 
458
      1,        0,      "PixelXDimension" },
 
459
    { EXIFTAG_PIXELYDIMENSION,  1, 1,           TIFF_LONG,      FIELD_CUSTOM,
 
460
      1,        0,      "PixelYDimension" },
 
461
    { EXIFTAG_PIXELYDIMENSION,  1, 1,           TIFF_SHORT,     FIELD_CUSTOM,
 
462
      1,        0,      "PixelYDimension" },
 
463
    { EXIFTAG_RELATEDSOUNDFILE, 13, 13,         TIFF_ASCII,     FIELD_CUSTOM,
 
464
      1,        0,      "RelatedSoundFile" },
 
465
    { EXIFTAG_FLASHENERGY,      1, 1,           TIFF_RATIONAL,  FIELD_CUSTOM, 
 
466
      1,        0,      "FlashEnergy" },
 
467
    { EXIFTAG_SPATIALFREQUENCYRESPONSE, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
 
468
      1,        1,      "SpatialFrequencyResponse" },
 
469
    { EXIFTAG_FOCALPLANEXRESOLUTION,    1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
 
470
      1,        0,      "FocalPlaneXResolution" },
 
471
    { EXIFTAG_FOCALPLANEYRESOLUTION,    1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
 
472
      1,        0,      "FocalPlaneYResolution" },
 
473
    { EXIFTAG_FOCALPLANERESOLUTIONUNIT, 1, 1,   TIFF_SHORT,     FIELD_CUSTOM,
 
474
      1,        0,      "FocalPlaneResolutionUnit" },
 
475
    { EXIFTAG_SUBJECTLOCATION,  2, 2,           TIFF_SHORT,     FIELD_CUSTOM,
 
476
      1,        0,      "SubjectLocation" },
 
477
    { EXIFTAG_EXPOSUREINDEX,    1, 1,           TIFF_RATIONAL,  FIELD_CUSTOM, 
 
478
      1,        0,      "ExposureIndex" },
 
479
    { EXIFTAG_SENSINGMETHOD,    1, 1,           TIFF_SHORT,     FIELD_CUSTOM,
 
480
      1,        0,      "SensingMethod" },
 
481
    { EXIFTAG_FILESOURCE,       1, 1,           TIFF_UNDEFINED, FIELD_CUSTOM,
 
482
      1,        0,      "FileSource" },
 
483
    { EXIFTAG_SCENETYPE,        1, 1,           TIFF_UNDEFINED, FIELD_CUSTOM,
 
484
      1,        0,      "SceneType" },
 
485
    { EXIFTAG_CFAPATTERN,       -1, -1,         TIFF_UNDEFINED, FIELD_CUSTOM,
 
486
      1,        1,      "CFAPattern" },
 
487
    { EXIFTAG_CUSTOMRENDERED,   1, 1,           TIFF_SHORT,     FIELD_CUSTOM,
 
488
      1,        0,      "CustomRendered" },
 
489
    { EXIFTAG_EXPOSUREMODE,     1, 1,           TIFF_SHORT,     FIELD_CUSTOM,
 
490
      1,        0,      "ExposureMode" },
 
491
    { EXIFTAG_WHITEBALANCE,     1, 1,           TIFF_SHORT,     FIELD_CUSTOM,
 
492
      1,        0,      "WhiteBalance" },
 
493
    { EXIFTAG_DIGITALZOOMRATIO, 1, 1,           TIFF_RATIONAL,  FIELD_CUSTOM, 
 
494
      1,        0,      "DigitalZoomRatio" },
 
495
    { EXIFTAG_FOCALLENGTHIN35MMFILM, 1, 1,      TIFF_SHORT,     FIELD_CUSTOM,
 
496
      1,        0,      "FocalLengthIn35mmFilm" },
 
497
    { EXIFTAG_SCENECAPTURETYPE, 1, 1,           TIFF_SHORT,     FIELD_CUSTOM,
 
498
      1,        0,      "SceneCaptureType" },
 
499
    { EXIFTAG_GAINCONTROL,      1, 1,           TIFF_RATIONAL,  FIELD_CUSTOM, 
 
500
      1,        0,      "GainControl" },
 
501
    { EXIFTAG_CONTRAST,         1, 1,           TIFF_SHORT,     FIELD_CUSTOM,
 
502
      1,        0,      "Contrast" },
 
503
    { EXIFTAG_SATURATION,       1, 1,           TIFF_SHORT,     FIELD_CUSTOM,
 
504
      1,        0,      "Saturation" },
 
505
    { EXIFTAG_SHARPNESS,        1, 1,           TIFF_SHORT,     FIELD_CUSTOM,
 
506
      1,        0,      "Sharpness" },
 
507
    { EXIFTAG_DEVICESETTINGDESCRIPTION, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
 
508
      1,        1,      "DeviceSettingDescription" },
 
509
    { EXIFTAG_SUBJECTDISTANCERANGE, 1, 1,       TIFF_SHORT,     FIELD_CUSTOM,
 
510
      1,        0,      "SubjectDistanceRange" },
 
511
    { EXIFTAG_IMAGEUNIQUEID,    33, 33,         TIFF_ASCII,     FIELD_CUSTOM,
 
512
      1,        0,      "ImageUniqueID" }
 
513
};
 
514
 
 
515
const TIFFFieldInfo *
 
516
_TIFFGetFieldInfo(size_t *size)
 
517
{
 
518
        *size = TIFFArrayCount(tiffFieldInfo);
 
519
        return tiffFieldInfo;
 
520
}
 
521
 
 
522
const TIFFFieldInfo *
 
523
_TIFFGetExifFieldInfo(size_t *size)
 
524
{
 
525
        *size = TIFFArrayCount(exifFieldInfo);
 
526
        return exifFieldInfo;
 
527
}
 
528
 
 
529
void
 
530
_TIFFSetupFieldInfo(TIFF* tif, const TIFFFieldInfo info[], size_t n)
 
531
{
 
532
        if (tif->tif_fieldinfo) {
 
533
                size_t  i;
 
534
 
 
535
                for (i = 0; i < tif->tif_nfields; i++) 
 
536
                {
 
537
                        TIFFFieldInfo *fld = tif->tif_fieldinfo[i];
 
538
                        if (fld->field_bit == FIELD_CUSTOM && 
 
539
                                strncmp("Tag ", fld->field_name, 4) == 0) {
 
540
                                        _TIFFfree(fld->field_name);
 
541
                                        _TIFFfree(fld);
 
542
                                }
 
543
                }   
 
544
      
 
545
                _TIFFfree(tif->tif_fieldinfo);
 
546
                tif->tif_nfields = 0;
 
547
        }
 
548
        if (!_TIFFMergeFieldInfo(tif, info, n))
 
549
        {
 
550
                TIFFErrorExt(tif->tif_clientdata, "_TIFFSetupFieldInfo",
 
551
                             "Setting up field info failed");
 
552
        }
 
553
}
 
554
 
 
555
static int
 
556
tagCompare(const void* a, const void* b)
 
557
{
 
558
        const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a;
 
559
        const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b;
 
560
        /* NB: be careful of return values for 16-bit platforms */
 
561
        if (ta->field_tag != tb->field_tag)
 
562
                return (int)ta->field_tag - (int)tb->field_tag;
 
563
        else
 
564
                return (ta->field_type == TIFF_ANY) ?
 
565
                        0 : ((int)tb->field_type - (int)ta->field_type);
 
566
}
 
567
 
 
568
static int
 
569
tagNameCompare(const void* a, const void* b)
 
570
{
 
571
        const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a;
 
572
        const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b;
 
573
        int ret = strcmp(ta->field_name, tb->field_name);
 
574
 
 
575
        if (ret)
 
576
                return ret;
 
577
        else
 
578
                return (ta->field_type == TIFF_ANY) ?
 
579
                        0 : ((int)tb->field_type - (int)ta->field_type);
 
580
}
 
581
 
 
582
void
 
583
TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n)
 
584
{
 
585
        if (_TIFFMergeFieldInfo(tif, info, n) < 0)
 
586
        {
 
587
                TIFFErrorExt(tif->tif_clientdata, "TIFFMergeFieldInfo",
 
588
                             "Merging block of %d fields failed", n);
 
589
        }
 
590
}
 
591
 
 
592
int
 
593
_TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n)
 
594
{
 
595
        static const char module[] = "_TIFFMergeFieldInfo";
 
596
        static const char reason[] = "for field info array";
 
597
        TIFFFieldInfo** tp;
 
598
        int i;
 
599
 
 
600
        tif->tif_foundfield = NULL;
 
601
 
 
602
        if (tif->tif_nfields > 0) {
 
603
                tif->tif_fieldinfo = (TIFFFieldInfo**)
 
604
                        _TIFFCheckRealloc(tif, tif->tif_fieldinfo,
 
605
                                          (tif->tif_nfields + n),
 
606
                                          sizeof (TIFFFieldInfo*), reason);
 
607
        } else {
 
608
                tif->tif_fieldinfo = (TIFFFieldInfo**)
 
609
                        _TIFFCheckMalloc(tif, n, sizeof (TIFFFieldInfo*),
 
610
                                         reason);
 
611
        }
 
612
        if (!tif->tif_fieldinfo) {
 
613
                TIFFErrorExt(tif->tif_clientdata, module,
 
614
                             "Failed to allocate field info array");
 
615
                return 0;
 
616
        }
 
617
        tp = tif->tif_fieldinfo + tif->tif_nfields;
 
618
        for (i = 0; i < n; i++)
 
619
        {
 
620
            const TIFFFieldInfo *fip =
 
621
                _TIFFFindFieldInfo(tif, info[i].field_tag, info[i].field_type);
 
622
 
 
623
            /* only add definitions that aren't already present */
 
624
            if (!fip) {
 
625
                *tp++ = (TIFFFieldInfo*) (info + i);
 
626
                tif->tif_nfields++;
 
627
            }
 
628
        }
 
629
 
 
630
        /* Sort the field info by tag number */
 
631
        qsort(tif->tif_fieldinfo, tif->tif_nfields,
 
632
              sizeof (TIFFFieldInfo*), tagCompare);
 
633
 
 
634
        return n;
 
635
}
 
636
 
 
637
void
 
638
_TIFFPrintFieldInfo(TIFF* tif, FILE* fd)
 
639
{
 
640
        size_t i;
 
641
 
 
642
        fprintf(fd, "%s: \n", tif->tif_name);
 
643
        for (i = 0; i < tif->tif_nfields; i++) {
 
644
                const TIFFFieldInfo* fip = tif->tif_fieldinfo[i];
 
645
                fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n"
 
646
                        , (int)i
 
647
                        , (unsigned long) fip->field_tag
 
648
                        , fip->field_readcount, fip->field_writecount
 
649
                        , fip->field_type
 
650
                        , fip->field_bit
 
651
                        , fip->field_oktochange ? "TRUE" : "FALSE"
 
652
                        , fip->field_passcount ? "TRUE" : "FALSE"
 
653
                        , fip->field_name
 
654
                );
 
655
        }
 
656
}
 
657
 
 
658
/*
 
659
 * Return size of TIFFDataType in bytes
 
660
 */
 
661
int
 
662
TIFFDataWidth(TIFFDataType type)
 
663
{
 
664
        switch(type)
 
665
        {
 
666
        case 0:  /* nothing */
 
667
        case 1:  /* TIFF_BYTE */
 
668
        case 2:  /* TIFF_ASCII */
 
669
        case 6:  /* TIFF_SBYTE */
 
670
        case 7:  /* TIFF_UNDEFINED */
 
671
                return 1;
 
672
        case 3:  /* TIFF_SHORT */
 
673
        case 8:  /* TIFF_SSHORT */
 
674
                return 2;
 
675
        case 4:  /* TIFF_LONG */
 
676
        case 9:  /* TIFF_SLONG */
 
677
        case 11: /* TIFF_FLOAT */
 
678
        case 13: /* TIFF_IFD */
 
679
                return 4;
 
680
        case 5:  /* TIFF_RATIONAL */
 
681
        case 10: /* TIFF_SRATIONAL */
 
682
        case 12: /* TIFF_DOUBLE */
 
683
                return 8;
 
684
        default:
 
685
                return 0; /* will return 0 for unknown types */
 
686
        }
 
687
}
 
688
 
 
689
/*
 
690
 * Return size of TIFFDataType in bytes.
 
691
 *
 
692
 * XXX: We need a separate function to determine the space needed
 
693
 * to store the value. For TIFF_RATIONAL values TIFFDataWidth() returns 8,
 
694
 * but we use 4-byte float to represent rationals.
 
695
 */
 
696
int
 
697
_TIFFDataSize(TIFFDataType type)
 
698
{
 
699
        switch (type) {
 
700
                case TIFF_BYTE:
 
701
                case TIFF_SBYTE:
 
702
                case TIFF_ASCII:
 
703
                case TIFF_UNDEFINED:
 
704
                    return 1;
 
705
                case TIFF_SHORT:
 
706
                case TIFF_SSHORT:
 
707
                    return 2;
 
708
                case TIFF_LONG:
 
709
                case TIFF_SLONG:
 
710
                case TIFF_FLOAT:
 
711
                case TIFF_IFD:
 
712
                case TIFF_RATIONAL:
 
713
                case TIFF_SRATIONAL:
 
714
                    return 4;
 
715
                case TIFF_DOUBLE:
 
716
                    return 8;
 
717
                default:
 
718
                    return 0;
 
719
        }
 
720
}
 
721
 
 
722
/*
 
723
 * Return nearest TIFFDataType to the sample type of an image.
 
724
 */
 
725
TIFFDataType
 
726
_TIFFSampleToTagType(TIFF* tif)
 
727
{
 
728
        uint32 bps = TIFFhowmany8(tif->tif_dir.td_bitspersample);
 
729
 
 
730
        switch (tif->tif_dir.td_sampleformat) {
 
731
        case SAMPLEFORMAT_IEEEFP:
 
732
                return (bps == 4 ? TIFF_FLOAT : TIFF_DOUBLE);
 
733
        case SAMPLEFORMAT_INT:
 
734
                return (bps <= 1 ? TIFF_SBYTE :
 
735
                    bps <= 2 ? TIFF_SSHORT : TIFF_SLONG);
 
736
        case SAMPLEFORMAT_UINT:
 
737
                return (bps <= 1 ? TIFF_BYTE :
 
738
                    bps <= 2 ? TIFF_SHORT : TIFF_LONG);
 
739
        case SAMPLEFORMAT_VOID:
 
740
                return (TIFF_UNDEFINED);
 
741
        }
 
742
        /*NOTREACHED*/
 
743
        return (TIFF_UNDEFINED);
 
744
}
 
745
 
 
746
const TIFFFieldInfo*
 
747
_TIFFFindFieldInfo(TIFF* tif, ttag_t tag, TIFFDataType dt)
 
748
{
 
749
        TIFFFieldInfo key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0};
 
750
        TIFFFieldInfo* pkey = &key;
 
751
        const TIFFFieldInfo **ret;
 
752
 
 
753
        if (tif->tif_foundfield && tif->tif_foundfield->field_tag == tag &&
 
754
            (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
 
755
                return tif->tif_foundfield;
 
756
 
 
757
        /* If we are invoked with no field information, then just return. */
 
758
        if ( !tif->tif_fieldinfo ) {
 
759
                return NULL;
 
760
        }
 
761
 
 
762
        /* NB: use sorted search (e.g. binary search) */
 
763
        key.field_tag = tag;
 
764
        key.field_type = dt;
 
765
 
 
766
        ret = (const TIFFFieldInfo **) bsearch(&pkey,
 
767
                                               tif->tif_fieldinfo, 
 
768
                                               tif->tif_nfields,
 
769
                                               sizeof(TIFFFieldInfo *), 
 
770
                                               tagCompare);
 
771
        return tif->tif_foundfield = (ret ? *ret : NULL);
 
772
}
 
773
 
 
774
const TIFFFieldInfo*
 
775
_TIFFFindFieldInfoByName(TIFF* tif, const char *field_name, TIFFDataType dt)
 
776
{
 
777
        TIFFFieldInfo key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0};
 
778
        TIFFFieldInfo* pkey = &key;
 
779
        const TIFFFieldInfo **ret;
 
780
 
 
781
        if (tif->tif_foundfield
 
782
            && streq(tif->tif_foundfield->field_name, field_name)
 
783
            && (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
 
784
                return (tif->tif_foundfield);
 
785
 
 
786
        /* If we are invoked with no field information, then just return. */
 
787
        if ( !tif->tif_fieldinfo ) {
 
788
                return NULL;
 
789
        }
 
790
 
 
791
        /* NB: use sorted search (e.g. binary search) */
 
792
        key.field_name = (char *)field_name;
 
793
        key.field_type = dt;
 
794
 
 
795
        ret = (const TIFFFieldInfo **) lfind(&pkey,
 
796
                                             tif->tif_fieldinfo, 
 
797
                                             &tif->tif_nfields,
 
798
                                             sizeof(TIFFFieldInfo *),
 
799
                                             tagNameCompare);
 
800
        return tif->tif_foundfield = (ret ? *ret : NULL);
 
801
}
 
802
 
 
803
const TIFFFieldInfo*
 
804
_TIFFFieldWithTag(TIFF* tif, ttag_t tag)
 
805
{
 
806
        const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY);
 
807
        if (!fip) {
 
808
                TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithTag",
 
809
                             "Internal error, unknown tag 0x%x",
 
810
                             (unsigned int) tag);
 
811
                assert(fip != NULL);
 
812
                /*NOTREACHED*/
 
813
        }
 
814
        return (fip);
 
815
}
 
816
 
 
817
const TIFFFieldInfo*
 
818
_TIFFFieldWithName(TIFF* tif, const char *field_name)
 
819
{
 
820
        const TIFFFieldInfo* fip =
 
821
                _TIFFFindFieldInfoByName(tif, field_name, TIFF_ANY);
 
822
        if (!fip) {
 
823
                TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithName",
 
824
                             "Internal error, unknown tag %s", field_name);
 
825
                assert(fip != NULL);
 
826
                /*NOTREACHED*/
 
827
        }
 
828
        return (fip);
 
829
}
 
830
 
 
831
const TIFFFieldInfo*
 
832
_TIFFFindOrRegisterFieldInfo( TIFF *tif, ttag_t tag, TIFFDataType dt )
 
833
 
 
834
{
 
835
    const TIFFFieldInfo *fld;
 
836
 
 
837
    fld = _TIFFFindFieldInfo( tif, tag, dt );
 
838
    if( fld == NULL )
 
839
    {
 
840
        fld = _TIFFCreateAnonFieldInfo( tif, tag, dt );
 
841
        if (!_TIFFMergeFieldInfo(tif, fld, 1))
 
842
                return NULL;
 
843
    }
 
844
 
 
845
    return fld;
 
846
}
 
847
 
 
848
TIFFFieldInfo*
 
849
_TIFFCreateAnonFieldInfo(TIFF *tif, ttag_t tag, TIFFDataType field_type)
 
850
{
 
851
        TIFFFieldInfo *fld;
 
852
        (void) tif;
 
853
 
 
854
        fld = (TIFFFieldInfo *) _TIFFmalloc(sizeof (TIFFFieldInfo));
 
855
        if (fld == NULL)
 
856
            return NULL;
 
857
        _TIFFmemset( fld, 0, sizeof(TIFFFieldInfo) );
 
858
 
 
859
        fld->field_tag = tag;
 
860
        fld->field_readcount = TIFF_VARIABLE2;
 
861
        fld->field_writecount = TIFF_VARIABLE2;
 
862
        fld->field_type = field_type;
 
863
        fld->field_bit = FIELD_CUSTOM;
 
864
        fld->field_oktochange = TRUE;
 
865
        fld->field_passcount = TRUE;
 
866
        fld->field_name = (char *) _TIFFmalloc(32);
 
867
        if (fld->field_name == NULL) {
 
868
            _TIFFfree(fld);
 
869
            return NULL;
 
870
        }
 
871
 
 
872
        /* 
 
873
         * note that this name is a special sign to TIFFClose() and
 
874
         * _TIFFSetupFieldInfo() to free the field
 
875
         */
 
876
        sprintf(fld->field_name, "Tag %d", (int) tag);
 
877
 
 
878
        return fld;    
 
879
}
 
880
 
 
881
/* vim: set ts=8 sts=8 sw=8 noet: */
 
882
/*
 
883
 * Local Variables:
 
884
 * mode: c
 
885
 * c-basic-offset: 8
 
886
 * fill-column: 78
 
887
 * End:
 
888
 */