~ubuntu-branches/ubuntu/vivid/tiff/vivid-proposed

« back to all changes in this revision

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

  • Committer: Package Import Robot
  • Author(s): Michael Gilbert
  • Date: 2013-06-17 01:27:17 UTC
  • Revision ID: package-import@ubuntu.com-20130617012717-s4yksbuv0ri97x5g
Tags: 4.0.2-6+nmu1
* Non-maintainer upload by the Security Team.
* Fix cve-2013-1960: heap-based buffer overlow in tiff2pdf
  (closes: #706675).
* Fix cve-2013-1961: stack-based buffer overflow in tiff2pdf
  (closes: #706674). 

Show diffs side-by-side

added added

removed removed

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