1 /* PDFlib GmbH cvsid:
2 * $Id: tif_dirinfo.c,v 1.23.2.1 2006/12/27 15:03:32 rjs Exp $ */
3
4 /*
5 * Copyright (c) 1988-1997 Sam Leffler
6 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
7 *
8 * Permission to use, copy, modify, distribute, and sell this software and
9 * its documentation for any purpose is hereby granted without fee, provided
10 * that (i) the above copyright notices and this permission notice appear in
11 * all copies of the software and related documentation, and (ii) the names of
12 * Sam Leffler and Silicon Graphics may not be used in any advertising or
13 * publicity relating to the software without the specific, prior written
14 * permission of Sam Leffler and Silicon Graphics.
15 *
16 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
17 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
18 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
19 *
20 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
21 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
22 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
23 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
24 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
25 * OF THIS SOFTWARE.
26 */
27
28 /*
29 * TIFF Library.
30 *
31 * Core Directory Tag Support.
32 */
33 #include "tiffiop.h"
34 #include <stdlib.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 #ifndef VMS
48 static
49 #endif
50 const TIFFFieldInfo tiffFieldInfo[] = {
51 { TIFFTAG_SUBFILETYPE, 1, 1, TIFF_LONG, FIELD_SUBFILETYPE,
52 TRUE, FALSE, "SubfileType" },
53 /* XXX SHORT for compatibility w/ old versions of the library */
54 { TIFFTAG_SUBFILETYPE, 1, 1, TIFF_SHORT, FIELD_SUBFILETYPE,
55 TRUE, FALSE, "SubfileType" },
56 { TIFFTAG_OSUBFILETYPE, 1, 1, TIFF_SHORT, FIELD_SUBFILETYPE,
57 TRUE, FALSE, "OldSubfileType" },
58 { TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_LONG, FIELD_IMAGEDIMENSIONS,
59 FALSE, FALSE, "ImageWidth" },
60 { TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_SHORT, FIELD_IMAGEDIMENSIONS,
61 FALSE, FALSE, "ImageWidth" },
62 { TIFFTAG_IMAGELENGTH, 1, 1, TIFF_LONG, FIELD_IMAGEDIMENSIONS,
63 TRUE, FALSE, "ImageLength" },
64 { TIFFTAG_IMAGELENGTH, 1, 1, TIFF_SHORT, FIELD_IMAGEDIMENSIONS,
65 TRUE, FALSE, "ImageLength" },
66 { TIFFTAG_BITSPERSAMPLE, -1,-1, TIFF_SHORT, FIELD_BITSPERSAMPLE,
67 FALSE, FALSE, "BitsPerSample" },
68 /* XXX LONG for compatibility with some broken TIFF writers */
69 { TIFFTAG_BITSPERSAMPLE, -1,-1, TIFF_LONG, FIELD_BITSPERSAMPLE,
70 FALSE, FALSE, "BitsPerSample" },
71 { TIFFTAG_COMPRESSION, -1, 1, TIFF_SHORT, FIELD_COMPRESSION,
72 FALSE, FALSE, "Compression" },
73 /* XXX LONG for compatibility with some broken TIFF writers */
74 { TIFFTAG_COMPRESSION, -1, 1, TIFF_LONG, FIELD_COMPRESSION,
75 FALSE, FALSE, "Compression" },
76 { TIFFTAG_PHOTOMETRIC, 1, 1, TIFF_SHORT, FIELD_PHOTOMETRIC,
77 FALSE, FALSE, "PhotometricInterpretation" },
78 /* XXX LONG for compatibility with some broken TIFF writers */
79 { TIFFTAG_PHOTOMETRIC, 1, 1, TIFF_LONG, FIELD_PHOTOMETRIC,
80 FALSE, FALSE, "PhotometricInterpretation" },
81 { TIFFTAG_THRESHHOLDING, 1, 1, TIFF_SHORT, FIELD_THRESHHOLDING,
82 TRUE, FALSE, "Threshholding" },
83 { TIFFTAG_CELLWIDTH, 1, 1, TIFF_SHORT, FIELD_IGNORE,
84 TRUE, FALSE, "CellWidth" },
85 { TIFFTAG_CELLLENGTH, 1, 1, TIFF_SHORT, FIELD_IGNORE,
86 TRUE, FALSE, "CellLength" },
87 { TIFFTAG_FILLORDER, 1, 1, TIFF_SHORT, FIELD_FILLORDER,
88 FALSE, FALSE, "FillOrder" },
89 { TIFFTAG_DOCUMENTNAME, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
90 TRUE, FALSE, "DocumentName" },
91 { TIFFTAG_IMAGEDESCRIPTION, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
92 TRUE, FALSE, "ImageDescription" },
93 { TIFFTAG_MAKE, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
94 TRUE, FALSE, "Make" },
95 { TIFFTAG_MODEL, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
96 TRUE, FALSE, "Model" },
97 { TIFFTAG_STRIPOFFSETS, -1,-1, TIFF_LONG, FIELD_STRIPOFFSETS,
98 FALSE, FALSE, "StripOffsets" },
99 { TIFFTAG_STRIPOFFSETS, -1,-1, TIFF_SHORT, FIELD_STRIPOFFSETS,
100 FALSE, FALSE, "StripOffsets" },
101 { TIFFTAG_ORIENTATION, 1, 1, TIFF_SHORT, FIELD_ORIENTATION,
102 FALSE, FALSE, "Orientation" },
103 { TIFFTAG_SAMPLESPERPIXEL, 1, 1, TIFF_SHORT, FIELD_SAMPLESPERPIXEL,
104 FALSE, FALSE, "SamplesPerPixel" },
105 { TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_LONG, FIELD_ROWSPERSTRIP,
106 FALSE, FALSE, "RowsPerStrip" },
107 { TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_SHORT, FIELD_ROWSPERSTRIP,
108 FALSE, FALSE, "RowsPerStrip" },
109 { TIFFTAG_STRIPBYTECOUNTS, -1,-1, TIFF_LONG, FIELD_STRIPBYTECOUNTS,
110 FALSE, FALSE, "StripByteCounts" },
111 { TIFFTAG_STRIPBYTECOUNTS, -1,-1, TIFF_SHORT, FIELD_STRIPBYTECOUNTS,
112 FALSE, FALSE, "StripByteCounts" },
113 { TIFFTAG_MINSAMPLEVALUE, -2,-1, TIFF_SHORT, FIELD_MINSAMPLEVALUE,
114 TRUE, FALSE, "MinSampleValue" },
115 { TIFFTAG_MAXSAMPLEVALUE, -2,-1, TIFF_SHORT, FIELD_MAXSAMPLEVALUE,
116 TRUE, FALSE, "MaxSampleValue" },
117 { TIFFTAG_XRESOLUTION, 1, 1, TIFF_RATIONAL, FIELD_RESOLUTION,
118 FALSE, FALSE, "XResolution" },
119 { TIFFTAG_YRESOLUTION, 1, 1, TIFF_RATIONAL, FIELD_RESOLUTION,
120 FALSE, FALSE, "YResolution" },
121 { TIFFTAG_PLANARCONFIG, 1, 1, TIFF_SHORT, FIELD_PLANARCONFIG,
122 FALSE, FALSE, "PlanarConfiguration" },
123 { TIFFTAG_PAGENAME, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
124 TRUE, FALSE, "PageName" },
125 { TIFFTAG_XPOSITION, 1, 1, TIFF_RATIONAL, FIELD_POSITION,
126 TRUE, FALSE, "XPosition" },
127 { TIFFTAG_YPOSITION, 1, 1, TIFF_RATIONAL, FIELD_POSITION,
128 TRUE, FALSE, "YPosition" },
129 { TIFFTAG_FREEOFFSETS, -1,-1, TIFF_LONG, FIELD_IGNORE,
130 FALSE, FALSE, "FreeOffsets" },
131 { TIFFTAG_FREEBYTECOUNTS, -1,-1, TIFF_LONG, FIELD_IGNORE,
132 FALSE, FALSE, "FreeByteCounts" },
133 { TIFFTAG_GRAYRESPONSEUNIT, 1, 1, TIFF_SHORT, FIELD_IGNORE,
134 TRUE, FALSE, "GrayResponseUnit" },
135 { TIFFTAG_GRAYRESPONSECURVE,-1,-1, TIFF_SHORT, FIELD_IGNORE,
136 TRUE, FALSE, "GrayResponseCurve" },
137 { TIFFTAG_RESOLUTIONUNIT, 1, 1, TIFF_SHORT, FIELD_RESOLUTIONUNIT,
138 FALSE, FALSE, "ResolutionUnit" },
139 { TIFFTAG_PAGENUMBER, 2, 2, TIFF_SHORT, FIELD_PAGENUMBER,
140 TRUE, FALSE, "PageNumber" },
141 { TIFFTAG_COLORRESPONSEUNIT, 1, 1, TIFF_SHORT, FIELD_IGNORE,
142 TRUE, FALSE, "ColorResponseUnit" },
143 { TIFFTAG_TRANSFERFUNCTION, -1,-1, TIFF_SHORT, FIELD_TRANSFERFUNCTION,
144 TRUE, FALSE, "TransferFunction" },
145 { TIFFTAG_SOFTWARE, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
146 TRUE, FALSE, "Software" },
147 { TIFFTAG_DATETIME, 20,20, TIFF_ASCII, FIELD_CUSTOM,
148 TRUE, FALSE, "DateTime" },
149 { TIFFTAG_ARTIST, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
150 TRUE, FALSE, "Artist" },
151 { TIFFTAG_HOSTCOMPUTER, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
152 TRUE, FALSE, "HostComputer" },
153 { TIFFTAG_WHITEPOINT, 2, 2, TIFF_RATIONAL, FIELD_WHITEPOINT,
154 TRUE, FALSE, "WhitePoint" },
155 { TIFFTAG_PRIMARYCHROMATICITIES,6,6,TIFF_RATIONAL, FIELD_CUSTOM,
156 TRUE, FALSE, "PrimaryChromaticities" },
157 { TIFFTAG_COLORMAP, -1,-1, TIFF_SHORT, FIELD_COLORMAP,
158 TRUE, FALSE, "ColorMap" },
159 { TIFFTAG_HALFTONEHINTS, 2, 2, TIFF_SHORT, FIELD_HALFTONEHINTS,
160 TRUE, FALSE, "HalftoneHints" },
161 { TIFFTAG_TILEWIDTH, 1, 1, TIFF_LONG, FIELD_TILEDIMENSIONS,
162 FALSE, FALSE, "TileWidth" },
163 { TIFFTAG_TILEWIDTH, 1, 1, TIFF_SHORT, FIELD_TILEDIMENSIONS,
164 FALSE, FALSE, "TileWidth" },
165 { TIFFTAG_TILELENGTH, 1, 1, TIFF_LONG, FIELD_TILEDIMENSIONS,
166 FALSE, FALSE, "TileLength" },
167 { TIFFTAG_TILELENGTH, 1, 1, TIFF_SHORT, FIELD_TILEDIMENSIONS,
168 FALSE, FALSE, "TileLength" },
169 { TIFFTAG_TILEOFFSETS, -1, 1, TIFF_LONG, FIELD_STRIPOFFSETS,
170 FALSE, FALSE, "TileOffsets" },
171 { TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_LONG, FIELD_STRIPBYTECOUNTS,
172 FALSE, FALSE, "TileByteCounts" },
173 { TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_SHORT, FIELD_STRIPBYTECOUNTS,
174 FALSE, FALSE, "TileByteCounts" },
175 { TIFFTAG_SUBIFD, -1,-1, TIFF_IFD, FIELD_SUBIFD,
176 TRUE, TRUE, "SubIFD" },
177 { TIFFTAG_SUBIFD, -1,-1, TIFF_LONG, FIELD_SUBIFD,
178 TRUE, TRUE, "SubIFD" },
179 { TIFFTAG_INKSET, 1, 1, TIFF_SHORT, FIELD_INKSET,
180 FALSE, FALSE, "InkSet" },
181 { TIFFTAG_INKNAMES, -1,-1, TIFF_ASCII, FIELD_INKNAMES,
182 TRUE, TRUE, "InkNames" },
183 { TIFFTAG_NUMBEROFINKS, 1, 1, TIFF_SHORT, FIELD_NUMBEROFINKS,
184 TRUE, FALSE, "NumberOfInks" },
185 { TIFFTAG_DOTRANGE, 2, 2, TIFF_SHORT, FIELD_DOTRANGE,
186 FALSE, FALSE, "DotRange" },
187 { TIFFTAG_DOTRANGE, 2, 2, TIFF_BYTE, FIELD_DOTRANGE,
188 FALSE, FALSE, "DotRange" },
189 { TIFFTAG_TARGETPRINTER, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
190 TRUE, FALSE, "TargetPrinter" },
191 { TIFFTAG_EXTRASAMPLES, -1,-1, TIFF_SHORT, FIELD_EXTRASAMPLES,
192 FALSE, TRUE, "ExtraSamples" },
193 /* XXX for bogus Adobe Photoshop v2.5 files */
194 { TIFFTAG_EXTRASAMPLES, -1,-1, TIFF_BYTE, FIELD_EXTRASAMPLES,
195 FALSE, TRUE, "ExtraSamples" },
196 { TIFFTAG_SAMPLEFORMAT, -1,-1, TIFF_SHORT, FIELD_SAMPLEFORMAT,
197 FALSE, FALSE, "SampleFormat" },
198 { TIFFTAG_SMINSAMPLEVALUE, -2,-1, TIFF_ANY, FIELD_SMINSAMPLEVALUE,
199 TRUE, FALSE, "SMinSampleValue" },
200 { TIFFTAG_SMAXSAMPLEVALUE, -2,-1, TIFF_ANY, FIELD_SMAXSAMPLEVALUE,
201 TRUE, FALSE, "SMaxSampleValue" },
202 { TIFFTAG_CLIPPATH, -1, -3, TIFF_BYTE, FIELD_CUSTOM,
203 FALSE, TRUE, "ClipPath" },
204 { TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SLONG, FIELD_CUSTOM,
205 FALSE, FALSE, "XClipPathUnits" },
206 { TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SSHORT, FIELD_CUSTOM,
207 FALSE, FALSE, "XClipPathUnits" },
208 { TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SBYTE, FIELD_CUSTOM,
209 FALSE, FALSE, "XClipPathUnits" },
210 { TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_SLONG, FIELD_CUSTOM,
211 FALSE, FALSE, "YClipPathUnits" },
212 { TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_SSHORT, FIELD_CUSTOM,
213 FALSE, FALSE, "YClipPathUnits" },
214 { TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_SBYTE, FIELD_CUSTOM,
215 FALSE, FALSE, "YClipPathUnits" },
216 { TIFFTAG_YCBCRCOEFFICIENTS, 3, 3, TIFF_RATIONAL, FIELD_YCBCRCOEFFICIENTS,
217 FALSE, FALSE, "YCbCrCoefficients" },
218 { TIFFTAG_YCBCRSUBSAMPLING, 2, 2, TIFF_SHORT, FIELD_YCBCRSUBSAMPLING,
219 FALSE, FALSE, "YCbCrSubsampling" },
220 { TIFFTAG_YCBCRPOSITIONING, 1, 1, TIFF_SHORT, FIELD_YCBCRPOSITIONING,
221 FALSE, FALSE, "YCbCrPositioning" },
222 { TIFFTAG_REFERENCEBLACKWHITE,6,6,TIFF_RATIONAL, FIELD_REFBLACKWHITE,
223 TRUE, FALSE, "ReferenceBlackWhite" },
224 /* XXX temporarily accept LONG for backwards compatibility */
225 { TIFFTAG_REFERENCEBLACKWHITE,6,6,TIFF_LONG, FIELD_REFBLACKWHITE,
226 TRUE, FALSE, "ReferenceBlackWhite" },
227 { TIFFTAG_XMLPACKET, -1,-3, TIFF_BYTE, FIELD_XMLPACKET,
228 FALSE, TRUE, "XMLPacket" },
229 { TIFFTAG_OPIIMAGEID, -1,-1, TIFF_ASCII, FIELD_OPIIMAGEID,
230 TRUE, FALSE, "OPIImageID" },
231 /* begin SGI tags */
232 { TIFFTAG_MATTEING, 1, 1, TIFF_SHORT, FIELD_EXTRASAMPLES,
233 FALSE, FALSE, "Matteing" },
234 { TIFFTAG_DATATYPE, -2,-1, TIFF_SHORT, FIELD_SAMPLEFORMAT,
235 FALSE, FALSE, "DataType" },
236 { TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_LONG, FIELD_IMAGEDEPTH,
237 FALSE, FALSE, "ImageDepth" },
238 { TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_SHORT, FIELD_IMAGEDEPTH,
239 FALSE, FALSE, "ImageDepth" },
240 { TIFFTAG_TILEDEPTH, 1, 1, TIFF_LONG, FIELD_TILEDEPTH,
241 FALSE, FALSE, "TileDepth" },
242 { TIFFTAG_TILEDEPTH, 1, 1, TIFF_SHORT, FIELD_TILEDEPTH,
243 FALSE, FALSE, "TileDepth" },
244 /* end SGI tags */
245 /* begin Pixar tags */
246 { TIFFTAG_PIXAR_IMAGEFULLWIDTH, 1, 1, TIFF_LONG, FIELD_CUSTOM,
247 TRUE, FALSE, "ImageFullWidth" },
248 { TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG, FIELD_CUSTOM,
249 TRUE, FALSE, "ImageFullLength" },
250 { TIFFTAG_PIXAR_TEXTUREFORMAT, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
251 TRUE, FALSE, "TextureFormat" },
252 { TIFFTAG_PIXAR_WRAPMODES, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
253 TRUE, FALSE, "TextureWrapModes" },
254 { TIFFTAG_PIXAR_FOVCOT, 1, 1, TIFF_FLOAT, FIELD_CUSTOM,
255 TRUE, FALSE, "FieldOfViewCotangent" },
256 { TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN, 16,16, TIFF_FLOAT,
257 FIELD_CUSTOM, TRUE, FALSE, "MatrixWorldToScreen" },
258 { TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA, 16,16, TIFF_FLOAT,
259 FIELD_CUSTOM, TRUE, FALSE, "MatrixWorldToCamera" },
260 { TIFFTAG_COPYRIGHT, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
261 TRUE, FALSE, "Copyright" },
262 /* end Pixar tags */
263 { TIFFTAG_RICHTIFFIPTC, -1, -3, TIFF_LONG, FIELD_RICHTIFFIPTC,
264 FALSE, TRUE, "RichTIFFIPTC" },
265 { TIFFTAG_PHOTOSHOP, -1, -3, TIFF_BYTE, FIELD_PHOTOSHOP,
266 FALSE, TRUE, "Photoshop" },
267 { TIFFTAG_EXIFIFD, 1, 1, TIFF_LONG, FIELD_CUSTOM,
268 FALSE, FALSE, "EXIFIFDOffset" },
269 { TIFFTAG_ICCPROFILE, -1, -3, TIFF_UNDEFINED, FIELD_ICCPROFILE,
270 FALSE, TRUE, "ICC Profile" },
271 { TIFFTAG_GPSIFD, 1, 1, TIFF_LONG, FIELD_CUSTOM,
272 FALSE, FALSE, "GPSIFDOffset" },
273 { TIFFTAG_STONITS, 1, 1, TIFF_DOUBLE, FIELD_STONITS,
274 FALSE, FALSE, "StoNits" },
275 { TIFFTAG_INTEROPERABILITYIFD, 1, 1, TIFF_LONG, FIELD_CUSTOM,
276 FALSE, FALSE, "InteroperabilityIFDOffset" },
277 /* begin DNG tags */
278 { TIFFTAG_DNGVERSION, 4, 4, TIFF_BYTE, FIELD_CUSTOM,
279 FALSE, FALSE, "DNGVersion" },
280 { TIFFTAG_DNGBACKWARDVERSION, 4, 4, TIFF_BYTE, FIELD_CUSTOM,
281 FALSE, FALSE, "DNGBackwardVersion" },
282 { TIFFTAG_UNIQUECAMERAMODEL, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
283 TRUE, FALSE, "UniqueCameraModel" },
284 { TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
285 TRUE, FALSE, "LocalizedCameraModel" },
286 { TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_BYTE, FIELD_CUSTOM,
287 TRUE, TRUE, "LocalizedCameraModel" },
288 { TIFFTAG_CFAPLANECOLOR, -1, -1, TIFF_BYTE, FIELD_CUSTOM,
289 FALSE, TRUE, "CFAPlaneColor" },
290 { TIFFTAG_CFALAYOUT, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
291 FALSE, FALSE, "CFALayout" },
292 { TIFFTAG_LINEARIZATIONTABLE, -1, -1, TIFF_SHORT, FIELD_CUSTOM,
293 FALSE, TRUE, "LinearizationTable" },
294 { TIFFTAG_BLACKLEVELREPEATDIM, 2, 2, TIFF_SHORT, FIELD_CUSTOM,
295 FALSE, FALSE, "BlackLevelRepeatDim" },
296 { TIFFTAG_BLACKLEVEL, -1, -1, TIFF_LONG, FIELD_CUSTOM,
297 FALSE, TRUE, "BlackLevel" },
298 { TIFFTAG_BLACKLEVEL, -1, -1, TIFF_SHORT, FIELD_CUSTOM,
299 FALSE, TRUE, "BlackLevel" },
300 { TIFFTAG_BLACKLEVEL, -1, -1, TIFF_RATIONAL, FIELD_CUSTOM,
301 FALSE, TRUE, "BlackLevel" },
302 { TIFFTAG_BLACKLEVELDELTAH, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
303 FALSE, TRUE, "BlackLevelDeltaH" },
304 { TIFFTAG_BLACKLEVELDELTAV, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
305 FALSE, TRUE, "BlackLevelDeltaV" },
306 { TIFFTAG_WHITELEVEL, -2, -2, TIFF_LONG, FIELD_CUSTOM,
307 FALSE, FALSE, "WhiteLevel" },
308 { TIFFTAG_WHITELEVEL, -2, -2, TIFF_SHORT, FIELD_CUSTOM,
309 FALSE, FALSE, "WhiteLevel" },
310 { TIFFTAG_DEFAULTSCALE, 2, 2, TIFF_RATIONAL, FIELD_CUSTOM,
311 FALSE, FALSE, "DefaultScale" },
312 { TIFFTAG_BESTQUALITYSCALE, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
313 FALSE, FALSE, "BestQualityScale" },
314 { TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_LONG, FIELD_CUSTOM,
315 FALSE, FALSE, "DefaultCropOrigin" },
316 { TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_SHORT, FIELD_CUSTOM,
317 FALSE, FALSE, "DefaultCropOrigin" },
318 { TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_RATIONAL, FIELD_CUSTOM,
319 FALSE, FALSE, "DefaultCropOrigin" },
320 { TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_LONG, FIELD_CUSTOM,
321 FALSE, FALSE, "DefaultCropSize" },
322 { TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_SHORT, FIELD_CUSTOM,
323 FALSE, FALSE, "DefaultCropSize" },
324 { TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, FIELD_CUSTOM,
325 FALSE, FALSE, "DefaultCropSize" },
326 { TIFFTAG_COLORMATRIX1, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
327 FALSE, TRUE, "ColorMatrix1" },
328 { TIFFTAG_COLORMATRIX2, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
329 FALSE, TRUE, "ColorMatrix2" },
330 { TIFFTAG_CAMERACALIBRATION1, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
331 FALSE, TRUE, "CameraCalibration1" },
332 { TIFFTAG_CAMERACALIBRATION2, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
333 FALSE, TRUE, "CameraCalibration2" },
334 { TIFFTAG_REDUCTIONMATRIX1, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
335 FALSE, TRUE, "ReductionMatrix1" },
336 { TIFFTAG_REDUCTIONMATRIX2, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
337 FALSE, TRUE, "ReductionMatrix2" },
338 { TIFFTAG_ANALOGBALANCE, -1, -1, TIFF_RATIONAL, FIELD_CUSTOM,
339 FALSE, TRUE, "AnalogBalance" },
340 { TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_SHORT, FIELD_CUSTOM,
341 FALSE, TRUE, "AsShotNeutral" },
342 { TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_RATIONAL, FIELD_CUSTOM,
343 FALSE, TRUE, "AsShotNeutral" },
344 { TIFFTAG_ASSHOTWHITEXY, 2, 2, TIFF_RATIONAL, FIELD_CUSTOM,
345 FALSE, FALSE, "AsShotWhiteXY" },
346 { TIFFTAG_BASELINEEXPOSURE, 1, 1, TIFF_SRATIONAL, FIELD_CUSTOM,
347 FALSE, FALSE, "BaselineExposure" },
348 { TIFFTAG_BASELINENOISE, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
349 FALSE, FALSE, "BaselineNoise" },
350 { TIFFTAG_BASELINESHARPNESS, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
351 FALSE, FALSE, "BaselineSharpness" },
352 { TIFFTAG_BAYERGREENSPLIT, 1, 1, TIFF_LONG, FIELD_CUSTOM,
353 FALSE, FALSE, "BayerGreenSplit" },
354 { TIFFTAG_LINEARRESPONSELIMIT, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
355 FALSE, FALSE, "LinearResponseLimit" },
356 { TIFFTAG_CAMERASERIALNUMBER, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
357 TRUE, FALSE, "CameraSerialNumber" },
358 { TIFFTAG_LENSINFO, 4, 4, TIFF_RATIONAL, FIELD_CUSTOM,
359 FALSE, FALSE, "LensInfo" },
360 { TIFFTAG_CHROMABLURRADIUS, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
361 FALSE, FALSE, "ChromaBlurRadius" },
362 { TIFFTAG_ANTIALIASSTRENGTH, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
363 FALSE, FALSE, "AntiAliasStrength" },
364 { TIFFTAG_SHADOWSCALE, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
365 FALSE, FALSE, "ShadowScale" },
366 { TIFFTAG_DNGPRIVATEDATA, -1, -1, TIFF_BYTE, FIELD_CUSTOM,
367 FALSE, TRUE, "DNGPrivateData" },
368 { TIFFTAG_MAKERNOTESAFETY, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
369 FALSE, FALSE, "MakerNoteSafety" },
370 { TIFFTAG_CALIBRATIONILLUMINANT1, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
371 FALSE, FALSE, "CalibrationIlluminant1" },
372 { TIFFTAG_CALIBRATIONILLUMINANT2, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
373 FALSE, FALSE, "CalibrationIlluminant2" },
374 { TIFFTAG_RAWDATAUNIQUEID, 16, 16, TIFF_BYTE, FIELD_CUSTOM,
375 FALSE, FALSE, "RawDataUniqueID" },
376 { TIFFTAG_ORIGINALRAWFILENAME, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
377 TRUE, FALSE, "OriginalRawFileName" },
378 { TIFFTAG_ORIGINALRAWFILENAME, -1, -1, TIFF_BYTE, FIELD_CUSTOM,
379 TRUE, TRUE, "OriginalRawFileName" },
380 { TIFFTAG_ORIGINALRAWFILEDATA, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
381 FALSE, TRUE, "OriginalRawFileData" },
382 { TIFFTAG_ACTIVEAREA, 4, 4, TIFF_LONG, FIELD_CUSTOM,
383 FALSE, FALSE, "ActiveArea" },
384 { TIFFTAG_ACTIVEAREA, 4, 4, TIFF_SHORT, FIELD_CUSTOM,
385 FALSE, FALSE, "ActiveArea" },
386 { TIFFTAG_MASKEDAREAS, -1, -1, TIFF_LONG, FIELD_CUSTOM,
387 FALSE, TRUE, "MaskedAreas" },
388 { TIFFTAG_ASSHOTICCPROFILE, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
389 FALSE, TRUE, "AsShotICCProfile" },
390 { TIFFTAG_ASSHOTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
391 FALSE, TRUE, "AsShotPreProfileMatrix" },
392 { TIFFTAG_CURRENTICCPROFILE, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
393 FALSE, TRUE, "CurrentICCProfile" },
394 { TIFFTAG_CURRENTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
395 FALSE, TRUE, "CurrentPreProfileMatrix" },
396 /* end DNG tags */
397 };
398 #define N(a) (sizeof (a) / sizeof (a[0]))
399
400 void
_TIFFSetupFieldInfo(TIFF * tif)401 _TIFFSetupFieldInfo(TIFF* tif)
402 {
403 if (tif->tif_fieldinfo) {
404 unsigned int i;
405
406 for (i = 0; i < tif->tif_nfields; i++)
407 {
408 TIFFFieldInfo *fld = tif->tif_fieldinfo[i];
409 if (fld->field_bit == FIELD_CUSTOM &&
410 strncmp("Tag ", fld->field_name, 4) == 0) {
411 _TIFFfree(fld->field_name);
412 _TIFFfree(fld);
413 }
414 }
415
416 _TIFFfree(tif->tif_fieldinfo);
417 tif->tif_nfields = 0;
418 }
419 TIFFMergeFieldInfo(tif, tiffFieldInfo, N(tiffFieldInfo));
420 }
421
422 static int
tagCompare(const void * a,const void * b)423 tagCompare(const void* a, const void* b)
424 {
425 const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a;
426 const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b;
427 /* NB: be careful of return values for 16-bit platforms */
428 if (ta->field_tag != tb->field_tag)
429 return (ta->field_tag < tb->field_tag ? -1 : 1);
430 else
431 return ((int)tb->field_type - (int)ta->field_type);
432 }
433
434 static int
tagNameCompare(const void * a,const void * b)435 tagNameCompare(const void* a, const void* b)
436 {
437 const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a;
438 const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b;
439
440 return strcmp(ta->field_name, tb->field_name);
441 }
442
443 void
TIFFMergeFieldInfo(TIFF * tif,const TIFFFieldInfo info[],int n)444 TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n)
445 {
446 TIFFFieldInfo** tp;
447 int i;
448
449 tif->tif_foundfield = NULL;
450
451 if (tif->tif_nfields > 0) {
452 tif->tif_fieldinfo = (TIFFFieldInfo**)
453 _TIFFrealloc(tif->tif_fieldinfo,
454 (tif->tif_nfields+n) * sizeof (TIFFFieldInfo*));
455 } else {
456 tif->tif_fieldinfo = (TIFFFieldInfo**)
457 _TIFFmalloc(n * sizeof (TIFFFieldInfo*));
458 }
459 assert(tif->tif_fieldinfo != NULL);
460 tp = &tif->tif_fieldinfo[tif->tif_nfields];
461 for (i = 0; i < n; i++)
462 tp[i] = (TIFFFieldInfo*) &info[i]; /* XXX */
463
464 /* Sort the field info by tag number */
465 qsort(tif->tif_fieldinfo, tif->tif_nfields += n,
466 sizeof (TIFFFieldInfo*), tagCompare);
467 }
468
469 #ifdef PDFLIB_TIFFWRITE_SUPPORT
470 void
_TIFFPrintFieldInfo(TIFF * tif,FILE * fd)471 _TIFFPrintFieldInfo(TIFF* tif, FILE* fd)
472 {
473 unsigned int i;
474
475 fprintf(fd, "%s: \n", tif->tif_name);
476 for (i = 0; i < tif->tif_nfields; i++) {
477 const TIFFFieldInfo* fip = tif->tif_fieldinfo[i];
478 fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n"
479 , i
480 , (unsigned long) fip->field_tag
481 , fip->field_readcount, fip->field_writecount
482 , fip->field_type
483 , fip->field_bit
484 , fip->field_oktochange ? "TRUE" : "FALSE"
485 , fip->field_passcount ? "TRUE" : "FALSE"
486 , fip->field_name
487 );
488 }
489 }
490 #endif /* PDFLIB_TIFFWRITE_SUPPORT */
491
492 /*
493 * Return size of TIFFDataType in bytes
494 */
495 int
TIFFDataWidth(TIFFDataType type)496 TIFFDataWidth(TIFFDataType type)
497 {
498 switch(type)
499 {
500 case 0: /* nothing */
501 case 1: /* TIFF_BYTE */
502 case 2: /* TIFF_ASCII */
503 case 6: /* TIFF_SBYTE */
504 case 7: /* TIFF_UNDEFINED */
505 return 1;
506 case 3: /* TIFF_SHORT */
507 case 8: /* TIFF_SSHORT */
508 return 2;
509 case 4: /* TIFF_LONG */
510 case 9: /* TIFF_SLONG */
511 case 11: /* TIFF_FLOAT */
512 case 13: /* TIFF_IFD */
513 return 4;
514 case 5: /* TIFF_RATIONAL */
515 case 10: /* TIFF_SRATIONAL */
516 case 12: /* TIFF_DOUBLE */
517 return 8;
518 default:
519 return 0; /* will return 0 for unknown types */
520 }
521 }
522
523 /*
524 * Return size of TIFFDataType in bytes.
525 *
526 * XXX: We need a separate function to determine the space needed
527 * to store the value. For TIFF_RATIONAL values TIFFDataWidth() returns 8,
528 * but we use 4-byte float to represent rationals.
529 */
530 int
_TIFFDataSize(TIFFDataType type)531 _TIFFDataSize(TIFFDataType type)
532 {
533 switch (type) {
534 case TIFF_BYTE:
535 case TIFF_SBYTE:
536 case TIFF_ASCII:
537 case TIFF_UNDEFINED:
538 return 1;
539 case TIFF_SHORT:
540 case TIFF_SSHORT:
541 return 2;
542 case TIFF_LONG:
543 case TIFF_SLONG:
544 case TIFF_FLOAT:
545 case TIFF_IFD:
546 case TIFF_RATIONAL:
547 case TIFF_SRATIONAL:
548 return 4;
549 case TIFF_DOUBLE:
550 return 8;
551 default:
552 return 0;
553 }
554 }
555
556 /*
557 * Return nearest TIFFDataType to the sample type of an image.
558 */
559 TIFFDataType
_TIFFSampleToTagType(TIFF * tif)560 _TIFFSampleToTagType(TIFF* tif)
561 {
562 uint32 bps = TIFFhowmany8(tif->tif_dir.td_bitspersample);
563
564 switch (tif->tif_dir.td_sampleformat) {
565 case SAMPLEFORMAT_IEEEFP:
566 return (bps == 4 ? TIFF_FLOAT : TIFF_DOUBLE);
567 case SAMPLEFORMAT_INT:
568 return (bps <= 1 ? TIFF_SBYTE :
569 bps <= 2 ? TIFF_SSHORT : TIFF_SLONG);
570 case SAMPLEFORMAT_UINT:
571 return (bps <= 1 ? TIFF_BYTE :
572 bps <= 2 ? TIFF_SHORT : TIFF_LONG);
573 case SAMPLEFORMAT_VOID:
574 return (TIFF_UNDEFINED);
575 }
576 /*NOTREACHED*/
577 return (TIFF_UNDEFINED);
578 }
579
580 /* PDFlib GmbH: inserted new function implementation for bugfix from
581 * libtiff 3.7.0
582 */
583
584 const TIFFFieldInfo*
TIFFFindFieldInfo(TIFF * tif,ttag_t tag,TIFFDataType dt)585 TIFFFindFieldInfo(TIFF* tif, ttag_t tag, TIFFDataType dt)
586 {
587 int i, n;
588
589 if (tif->tif_foundfield && tif->tif_foundfield->field_tag == tag &&
590 (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
591 return (tif->tif_foundfield);
592 /* NB: use sorted search (e.g. binary search) */
593 if(dt != TIFF_ANY) {
594 TIFFFieldInfo key = {0, 0, 0, (TIFFDataType) 0, 0, 0, 0, 0};
595 key.field_tag = tag;
596 key.field_type = dt;
597 return((const TIFFFieldInfo *) bsearch(&key,
598 tif->tif_fieldinfo,
599 tif->tif_nfields,
600 sizeof(TIFFFieldInfo),
601 tagCompare));
602 } else for (i = 0, n = tif->tif_nfields; i < n; i++) {
603 const TIFFFieldInfo* fip = tif->tif_fieldinfo[i];
604 if (fip->field_tag == tag &&
605 (dt == TIFF_ANY || fip->field_type == dt))
606 return (tif->tif_foundfield = fip);
607 }
608 return ((const TIFFFieldInfo *)0);
609 }
610
611 const TIFFFieldInfo*
_TIFFFindFieldInfoByName(TIFF * tif,const char * field_name,TIFFDataType dt)612 _TIFFFindFieldInfoByName(TIFF* tif, const char *field_name, TIFFDataType dt)
613 {
614 int i, n;
615
616 if (tif->tif_foundfield
617 && streq(tif->tif_foundfield->field_name, field_name)
618 && (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
619 return (tif->tif_foundfield);
620 /* NB: use sorted search (e.g. binary search) */
621 if(dt != TIFF_ANY) {
622 TIFFFieldInfo key = {(ttag_t)0, (short)0, (short)0, (TIFFDataType)0,
623 (unsigned short)0, (unsigned char)0, (unsigned char)0,
624 (char *)0};
625 key.field_name = (char *)field_name;
626 key.field_type = dt;
627 return((const TIFFFieldInfo *) pdc_lfind(&key,
628 tif->tif_fieldinfo,
629 &tif->tif_nfields,
630 sizeof(TIFFFieldInfo),
631 tagNameCompare));
632 } else
633 for (i = 0, n = tif->tif_nfields; i < n; i++) {
634 const TIFFFieldInfo* fip = tif->tif_fieldinfo[i];
635 if (streq(fip->field_name, field_name) &&
636 (dt == TIFF_ANY || fip->field_type == dt))
637 return (tif->tif_foundfield = fip);
638 }
639 return ((const TIFFFieldInfo *)0);
640 }
641
642 const TIFFFieldInfo*
TIFFFieldWithTag(TIFF * tif,ttag_t tag)643 TIFFFieldWithTag(TIFF* tif, ttag_t tag)
644 {
645 const TIFFFieldInfo* fip = TIFFFindFieldInfo(tif, tag, TIFF_ANY);
646 if (!fip) {
647 _TIFFError(tif, "TIFFFieldWithTag",
648 "Internal error, unknown tag 0x%x",
649 (unsigned int) tag);
650 assert(fip != NULL);
651 /*NOTREACHED*/
652 }
653 return (fip);
654 }
655
656 const TIFFFieldInfo*
_TIFFFieldWithName(TIFF * tif,const char * field_name)657 _TIFFFieldWithName(TIFF* tif, const char *field_name)
658 {
659 const TIFFFieldInfo* fip =
660 _TIFFFindFieldInfoByName(tif, field_name, TIFF_ANY);
661 if (!fip) {
662 _TIFFError(tif, "TIFFFieldWithName",
663 "Internal error, unknown tag %s", field_name);
664 assert(fip != NULL);
665 /*NOTREACHED*/
666 }
667 return (fip);
668 }
669
670 const TIFFFieldInfo*
_TIFFFindOrRegisterFieldInfo(TIFF * tif,ttag_t tag,TIFFDataType dt)671 _TIFFFindOrRegisterFieldInfo( TIFF *tif, ttag_t tag, TIFFDataType dt )
672
673 {
674 const TIFFFieldInfo *fld;
675
676 fld = TIFFFindFieldInfo( tif, tag, dt );
677 if( fld == NULL )
678 {
679 fld = _TIFFCreateAnonFieldInfo( tif, tag, dt );
680 TIFFMergeFieldInfo( tif, fld, 1 );
681 }
682
683 return fld;
684 }
685
686 TIFFFieldInfo*
_TIFFCreateAnonFieldInfo(TIFF * tif,ttag_t tag,TIFFDataType field_type)687 _TIFFCreateAnonFieldInfo(TIFF *tif, ttag_t tag, TIFFDataType field_type)
688 {
689 TIFFFieldInfo *fld;
690
691 fld = (TIFFFieldInfo *) _TIFFmalloc(sizeof (TIFFFieldInfo));
692 if (fld == NULL)
693 return NULL;
694 _TIFFmemset( fld, 0, sizeof(TIFFFieldInfo) );
695
696 fld->field_tag = tag;
697 fld->field_readcount = TIFF_VARIABLE;
698 fld->field_writecount = TIFF_VARIABLE;
699 fld->field_type = field_type;
700 fld->field_bit = FIELD_CUSTOM;
701 fld->field_oktochange = TRUE;
702 fld->field_passcount = TRUE;
703 fld->field_name = (char *) _TIFFmalloc(32);
704 if (fld->field_name == NULL) {
705 _TIFFfree(fld);
706 return NULL;
707 }
708
709 /* note that this name is a special sign to TIFFClose() and
710 * _TIFFSetupFieldInfo() to free the field
711 */
712 sprintf(fld->field_name, "Tag %d", (int) tag);
713
714 return fld;
715 }
716
717 /* vim: set ts=8 sts=8 sw=8 noet: */
718