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