Home | History | Annotate | Download | only in libtiff
      1 /* $Id: tif_dirinfo.c,v 1.121 2014-05-07 01:58:46 bfriesen Exp $ */
      2 
      3 /*
      4  * Copyright (c) 1988-1997 Sam Leffler
      5  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
      6  *
      7  * Permission to use, copy, modify, distribute, and sell this software and
      8  * its documentation for any purpose is hereby granted without fee, provided
      9  * that (i) the above copyright notices and this permission notice appear in
     10  * all copies of the software and related documentation, and (ii) the names of
     11  * Sam Leffler and Silicon Graphics may not be used in any advertising or
     12  * publicity relating to the software without the specific, prior written
     13  * permission of Sam Leffler and Silicon Graphics.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
     16  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
     17  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
     18  *
     19  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
     20  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
     21  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
     22  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
     23  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
     24  * OF THIS SOFTWARE.
     25  */
     26 
     27 /*
     28  * TIFF Library.
     29  *
     30  * Core Directory Tag Support.
     31  */
     32 #include "tiffiop.h"
     33 #include <stdlib.h>
     34 
     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 TIFF_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_CFAREPEATPATTERNDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED,	FIELD_CUSTOM, 0,	0,	"CFARepeatPatternDim", NULL },
    132 	{ TIFFTAG_CFAPATTERN,	4, 4,	TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0,	0,	"CFAPattern" , NULL},
    133 	{ TIFFTAG_COPYRIGHT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Copyright", NULL },
    134 	/* end Pixar tags */
    135 	{ TIFFTAG_RICHTIFFIPTC, -3, -3, TIFF_LONG, 0, TIFF_SETGET_C32_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "RichTIFFIPTC", NULL },
    136 	{ TIFFTAG_PHOTOSHOP, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "Photoshop", NULL },
    137 	{ TIFFTAG_EXIFIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "EXIFIFDOffset", &exifFieldArray },
    138 	{ TIFFTAG_ICCPROFILE, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ICC Profile", NULL },
    139 	{ TIFFTAG_GPSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "GPSIFDOffset", NULL },
    140 	{ TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvParams", NULL },
    141 	{ TIFFTAG_FAXSUBADDRESS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxSubAddress", NULL },
    142 	{ TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvTime", NULL },
    143 	{ TIFFTAG_FAXDCS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxDcs", NULL },
    144 	{ TIFFTAG_STONITS, 1, 1, TIFF_DOUBLE, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "StoNits", NULL },
    145 	{ TIFFTAG_INTEROPERABILITYIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "InteroperabilityIFDOffset", NULL },
    146 	/* begin DNG tags */
    147 	{ TIFFTAG_DNGVERSION, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DNGVersion", NULL },
    148 	{ TIFFTAG_DNGBACKWARDVERSION, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DNGBackwardVersion", NULL },
    149 	{ TIFFTAG_UNIQUECAMERAMODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "UniqueCameraModel", NULL },
    150 	{ TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "LocalizedCameraModel", NULL },
    151 	{ TIFFTAG_CFAPLANECOLOR, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CFAPlaneColor", NULL },
    152 	{ TIFFTAG_CFALAYOUT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CFALayout", NULL },
    153 	{ TIFFTAG_LINEARIZATIONTABLE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "LinearizationTable", NULL },
    154 	{ TIFFTAG_BLACKLEVELREPEATDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BlackLevelRepeatDim", NULL },
    155 	{ TIFFTAG_BLACKLEVEL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevel", NULL },
    156 	{ TIFFTAG_BLACKLEVELDELTAH, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevelDeltaH", NULL },
    157 	{ TIFFTAG_BLACKLEVELDELTAV, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevelDeltaV", NULL },
    158 	{ TIFFTAG_WHITELEVEL, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "WhiteLevel", NULL },
    159 	{ TIFFTAG_DEFAULTSCALE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultScale", NULL },
    160 	{ TIFFTAG_BESTQUALITYSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BestQualityScale", NULL },
    161 	{ TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultCropOrigin", NULL },
    162 	{ TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultCropSize", NULL },
    163 	{ TIFFTAG_COLORMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ColorMatrix1", NULL },
    164 	{ TIFFTAG_COLORMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ColorMatrix2", NULL },
    165 	{ TIFFTAG_CAMERACALIBRATION1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CameraCalibration1", NULL },
    166 	{ TIFFTAG_CAMERACALIBRATION2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CameraCalibration2", NULL },
    167 	{ TIFFTAG_REDUCTIONMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ReductionMatrix1", NULL },
    168 	{ TIFFTAG_REDUCTIONMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ReductionMatrix2", NULL },
    169 	{ TIFFTAG_ANALOGBALANCE, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AnalogBalance", NULL },
    170 	{ TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotNeutral", NULL },
    171 	{ TIFFTAG_ASSHOTWHITEXY, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "AsShotWhiteXY", NULL },
    172 	{ TIFFTAG_BASELINEEXPOSURE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineExposure", NULL },
    173 	{ TIFFTAG_BASELINENOISE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineNoise", NULL },
    174 	{ TIFFTAG_BASELINESHARPNESS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineSharpness", NULL },
    175 	{ TIFFTAG_BAYERGREENSPLIT, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BayerGreenSplit", NULL },
    176 	{ TIFFTAG_LINEARRESPONSELIMIT, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "LinearResponseLimit", NULL },
    177 	{ TIFFTAG_CAMERASERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CameraSerialNumber", NULL },
    178 	{ TIFFTAG_LENSINFO, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "LensInfo", NULL },
    179 	{ TIFFTAG_CHROMABLURRADIUS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ChromaBlurRadius", NULL },
    180 	{ TIFFTAG_ANTIALIASSTRENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "AntiAliasStrength", NULL },
    181 	{ TIFFTAG_SHADOWSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ShadowScale", NULL },
    182 	{ TIFFTAG_DNGPRIVATEDATA, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "DNGPrivateData", NULL },
    183 	{ TIFFTAG_MAKERNOTESAFETY, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "MakerNoteSafety", NULL },
    184 	{ TIFFTAG_CALIBRATIONILLUMINANT1, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CalibrationIlluminant1", NULL },
    185 	{ TIFFTAG_CALIBRATIONILLUMINANT2, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CalibrationIlluminant2", NULL },
    186 	{ TIFFTAG_RAWDATAUNIQUEID, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "RawDataUniqueID", NULL },
    187 	{ TIFFTAG_ORIGINALRAWFILENAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OriginalRawFileName", NULL },
    188 	{ TIFFTAG_ORIGINALRAWFILEDATA, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "OriginalRawFileData", NULL },
    189 	{ TIFFTAG_ACTIVEAREA, 4, 4, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ActiveArea", NULL },
    190 	{ TIFFTAG_MASKEDAREAS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "MaskedAreas", NULL },
    191 	{ TIFFTAG_ASSHOTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotICCProfile", NULL },
    192 	{ TIFFTAG_ASSHOTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotPreProfileMatrix", NULL },
    193 	{ TIFFTAG_CURRENTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CurrentICCProfile", NULL },
    194 	{ TIFFTAG_CURRENTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CurrentPreProfileMatrix", NULL },
    195 	{ TIFFTAG_PERSAMPLE, 0, 0, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "PerSample", NULL},
    196 	/* end DNG tags */
    197 	/* begin TIFF/FX tags */
    198         { TIFFTAG_INDEXED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "Indexed", NULL },
    199         { TIFFTAG_GLOBALPARAMETERSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "GlobalParametersIFD", NULL },
    200         { TIFFTAG_PROFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ProfileType", NULL },
    201         { TIFFTAG_FAXPROFILE, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "FaxProfile", NULL },
    202         { TIFFTAG_CODINGMETHODS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CodingMethods", NULL },
    203         { TIFFTAG_VERSIONYEAR, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "VersionYear", NULL },
    204         { TIFFTAG_MODENUMBER, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ModeNumber", NULL },
    205         { TIFFTAG_DECODE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "Decode", NULL },
    206         { TIFFTAG_IMAGEBASECOLOR, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ImageBaseColor", NULL },
    207         { TIFFTAG_T82OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "T82Options", NULL },
    208         { TIFFTAG_STRIPROWCOUNTS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "StripRowCounts", NULL },
    209         { TIFFTAG_IMAGELAYER, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ImageLayer", NULL },
    210 	/* end TIFF/FX tags */
    211 	/* begin pseudo tags */
    212 };
    213 
    214 static TIFFField
    215 exifFields[] = {
    216 	{ EXIFTAG_EXPOSURETIME, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureTime", NULL },
    217 	{ EXIFTAG_FNUMBER, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FNumber", NULL },
    218 	{ EXIFTAG_EXPOSUREPROGRAM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureProgram", NULL },
    219 	{ EXIFTAG_SPECTRALSENSITIVITY, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SpectralSensitivity", NULL },
    220 	{ EXIFTAG_ISOSPEEDRATINGS, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ISOSpeedRatings", NULL },
    221 	{ EXIFTAG_OECF, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OptoelectricConversionFactor", NULL },
    222 	{ EXIFTAG_EXIFVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExifVersion", NULL },
    223 	{ EXIFTAG_DATETIMEORIGINAL, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeOriginal", NULL },
    224 	{ EXIFTAG_DATETIMEDIGITIZED, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeDigitized", NULL },
    225 	{ EXIFTAG_COMPONENTSCONFIGURATION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ComponentsConfiguration", NULL },
    226 	{ EXIFTAG_COMPRESSEDBITSPERPIXEL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CompressedBitsPerPixel", NULL },
    227 	{ EXIFTAG_SHUTTERSPEEDVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ShutterSpeedValue", NULL },
    228 	{ EXIFTAG_APERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ApertureValue", NULL },
    229 	{ EXIFTAG_BRIGHTNESSVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BrightnessValue", NULL },
    230 	{ EXIFTAG_EXPOSUREBIASVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureBiasValue", NULL },
    231 	{ EXIFTAG_MAXAPERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MaxApertureValue", NULL },
    232 	{ EXIFTAG_SUBJECTDISTANCE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistance", NULL },
    233 	{ EXIFTAG_METERINGMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MeteringMode", NULL },
    234 	{ EXIFTAG_LIGHTSOURCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LightSource", NULL },
    235 	{ EXIFTAG_FLASH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Flash", NULL },
    236 	{ EXIFTAG_FOCALLENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLength", NULL },
    237 	{ EXIFTAG_SUBJECTAREA, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SubjectArea", NULL },
    238 	{ EXIFTAG_MAKERNOTE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "MakerNote", NULL },
    239 	{ EXIFTAG_USERCOMMENT, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "UserComment", NULL },
    240 	{ EXIFTAG_SUBSECTIME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTime", NULL },
    241 	{ EXIFTAG_SUBSECTIMEORIGINAL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeOriginal", NULL },
    242 	{ EXIFTAG_SUBSECTIMEDIGITIZED, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeDigitized", NULL },
    243 	{ EXIFTAG_FLASHPIXVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashpixVersion", NULL },
    244 	{ EXIFTAG_COLORSPACE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ColorSpace", NULL },
    245 	{ EXIFTAG_PIXELXDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelXDimension", NULL },
    246 	{ EXIFTAG_PIXELYDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelYDimension", NULL },
    247 	{ EXIFTAG_RELATEDSOUNDFILE, 13, 13, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RelatedSoundFile", NULL },
    248 	{ EXIFTAG_FLASHENERGY, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashEnergy", NULL },
    249 	{ EXIFTAG_SPATIALFREQUENCYRESPONSE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SpatialFrequencyResponse", NULL },
    250 	{ EXIFTAG_FOCALPLANEXRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneXResolution", NULL },
    251 	{ EXIFTAG_FOCALPLANEYRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneYResolution", NULL },
    252 	{ EXIFTAG_FOCALPLANERESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneResolutionUnit", NULL },
    253 	{ EXIFTAG_SUBJECTLOCATION, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectLocation", NULL },
    254 	{ EXIFTAG_EXPOSUREINDEX, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureIndex", NULL },
    255 	{ EXIFTAG_SENSINGMETHOD, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SensingMethod", NULL },
    256 	{ EXIFTAG_FILESOURCE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FileSource", NULL },
    257 	{ EXIFTAG_SCENETYPE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneType", NULL },
    258 	{ EXIFTAG_CFAPATTERN, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CFAPattern", NULL },
    259 	{ EXIFTAG_CUSTOMRENDERED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CustomRendered", NULL },
    260 	{ EXIFTAG_EXPOSUREMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureMode", NULL },
    261 	{ EXIFTAG_WHITEBALANCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WhiteBalance", NULL },
    262 	{ EXIFTAG_DIGITALZOOMRATIO, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DigitalZoomRatio", NULL },
    263 	{ EXIFTAG_FOCALLENGTHIN35MMFILM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLengthIn35mmFilm", NULL },
    264 	{ EXIFTAG_SCENECAPTURETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneCaptureType", NULL },
    265 	{ EXIFTAG_GAINCONTROL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "GainControl", NULL },
    266 	{ EXIFTAG_CONTRAST, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Contrast", NULL },
    267 	{ EXIFTAG_SATURATION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Saturation", NULL },
    268 	{ EXIFTAG_SHARPNESS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Sharpness", NULL },
    269 	{ EXIFTAG_DEVICESETTINGDESCRIPTION, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "DeviceSettingDescription", NULL },
    270 	{ EXIFTAG_SUBJECTDISTANCERANGE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistanceRange", NULL },
    271 	{ EXIFTAG_IMAGEUNIQUEID, 33, 33, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageUniqueID", NULL }
    272 };
    273 
    274 static TIFFFieldArray
    275 tiffFieldArray = { tfiatImage, 0, TIFFArrayCount(tiffFields), tiffFields };
    276 static TIFFFieldArray
    277 exifFieldArray = { tfiatExif, 0, TIFFArrayCount(exifFields), exifFields };
    278 
    279 /*
    280  *  We have our own local lfind() equivelent to avoid subtle differences
    281  *  in types passed to lfind() on different systems.
    282  */
    283 
    284 static void *
    285 td_lfind(const void *key, const void *base, size_t *nmemb, size_t size,
    286          int(*compar)(const void *, const void *))
    287 {
    288     char *element, *end;
    289 
    290     end = (char *)base + *nmemb * size;
    291     for (element = (char *)base; element < end; element += size)
    292         if (!compar(key, element))		/* key found */
    293             return element;
    294 
    295     return NULL;
    296 }
    297 
    298 const TIFFFieldArray*
    299 _TIFFGetFields(void)
    300 {
    301 	return(&tiffFieldArray);
    302 }
    303 
    304 const TIFFFieldArray*
    305 _TIFFGetExifFields(void)
    306 {
    307 	return(&exifFieldArray);
    308 }
    309 
    310 void
    311 _TIFFSetupFields(TIFF* tif, const TIFFFieldArray* fieldarray)
    312 {
    313 	if (tif->tif_fields && tif->tif_nfields > 0) {
    314 		uint32 i;
    315 
    316 		for (i = 0; i < tif->tif_nfields; i++) {
    317 			TIFFField *fld = tif->tif_fields[i];
    318 			if (fld->field_bit == FIELD_CUSTOM &&
    319 				strncmp("Tag ", fld->field_name, 4) == 0) {
    320 					_TIFFfree(fld->field_name);
    321 					_TIFFfree(fld);
    322 				}
    323 		}
    324 
    325 		_TIFFfree(tif->tif_fields);
    326 		tif->tif_fields = NULL;
    327 		tif->tif_nfields = 0;
    328 	}
    329 	if (!_TIFFMergeFields(tif, fieldarray->fields, fieldarray->count)) {
    330 		TIFFErrorExt(tif->tif_clientdata, "_TIFFSetupFields",
    331 			     "Setting up field info failed");
    332 	}
    333 }
    334 
    335 static int
    336 tagCompare(const void* a, const void* b)
    337 {
    338 	const TIFFField* ta = *(const TIFFField**) a;
    339 	const TIFFField* tb = *(const TIFFField**) b;
    340 	/* NB: be careful of return values for 16-bit platforms */
    341 	if (ta->field_tag != tb->field_tag)
    342 		return (int)ta->field_tag - (int)tb->field_tag;
    343 	else
    344 		return (ta->field_type == TIFF_ANY) ?
    345 			0 : ((int)tb->field_type - (int)ta->field_type);
    346 }
    347 
    348 static int
    349 tagNameCompare(const void* a, const void* b)
    350 {
    351 	const TIFFField* ta = *(const TIFFField**) a;
    352 	const TIFFField* tb = *(const TIFFField**) b;
    353 	int ret = strcmp(ta->field_name, tb->field_name);
    354 
    355 	if (ret)
    356 		return ret;
    357 	else
    358 		return (ta->field_type == TIFF_ANY) ?
    359 			0 : ((int)tb->field_type - (int)ta->field_type);
    360 }
    361 
    362 int
    363 _TIFFMergeFields(TIFF* tif, const TIFFField info[], uint32 n)
    364 {
    365 	static const char module[] = "_TIFFMergeFields";
    366 	static const char reason[] = "for fields array";
    367 	/* TIFFField** tp; */
    368 	uint32 i;
    369 
    370         tif->tif_foundfield = NULL;
    371 
    372 	if (tif->tif_fields && tif->tif_nfields > 0) {
    373 		tif->tif_fields = (TIFFField**)
    374 			_TIFFCheckRealloc(tif, tif->tif_fields,
    375 					  (tif->tif_nfields + n),
    376 					  sizeof(TIFFField *), reason);
    377 	} else {
    378 		tif->tif_fields = (TIFFField **)
    379 			_TIFFCheckMalloc(tif, n, sizeof(TIFFField *),
    380 					 reason);
    381 	}
    382 	if (!tif->tif_fields) {
    383 		TIFFErrorExt(tif->tif_clientdata, module,
    384 			     "Failed to allocate fields array");
    385 		return 0;
    386 	}
    387 
    388 	/* tp = tif->tif_fields + tif->tif_nfields; */
    389 	for (i = 0; i < n; i++) {
    390 		const TIFFField *fip =
    391 			TIFFFindField(tif, info[i].field_tag, TIFF_ANY);
    392 
    393                 /* only add definitions that aren't already present */
    394 		if (!fip) {
    395                         tif->tif_fields[tif->tif_nfields] = (TIFFField *) (info+i);
    396                         tif->tif_nfields++;
    397                 }
    398 	}
    399 
    400         /* Sort the field info by tag number */
    401 	qsort(tif->tif_fields, tif->tif_nfields,
    402 	      sizeof(TIFFField *), tagCompare);
    403 
    404 	return n;
    405 }
    406 
    407 void
    408 _TIFFPrintFieldInfo(TIFF* tif, FILE* fd)
    409 {
    410 	uint32 i;
    411 
    412 	fprintf(fd, "%s: \n", tif->tif_name);
    413 	for (i = 0; i < tif->tif_nfields; i++) {
    414 		const TIFFField* fip = tif->tif_fields[i];
    415 		fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n"
    416 			, (int)i
    417 			, (unsigned long) fip->field_tag
    418 			, fip->field_readcount, fip->field_writecount
    419 			, fip->field_type
    420 			, fip->field_bit
    421 			, fip->field_oktochange ? "TRUE" : "FALSE"
    422 			, fip->field_passcount ? "TRUE" : "FALSE"
    423 			, fip->field_name
    424 		);
    425 	}
    426 }
    427 
    428 /*
    429  * Return size of TIFFDataType in bytes
    430  */
    431 int
    432 TIFFDataWidth(TIFFDataType type)
    433 {
    434 	switch(type)
    435 	{
    436 		case 0:  /* nothing */
    437 		case TIFF_BYTE:
    438 		case TIFF_ASCII:
    439 		case TIFF_SBYTE:
    440 		case TIFF_UNDEFINED:
    441 			return 1;
    442 		case TIFF_SHORT:
    443 		case TIFF_SSHORT:
    444 			return 2;
    445 		case TIFF_LONG:
    446 		case TIFF_SLONG:
    447 		case TIFF_FLOAT:
    448 		case TIFF_IFD:
    449 			return 4;
    450 		case TIFF_RATIONAL:
    451 		case TIFF_SRATIONAL:
    452 		case TIFF_DOUBLE:
    453 		case TIFF_LONG8:
    454 		case TIFF_SLONG8:
    455 		case TIFF_IFD8:
    456 			return 8;
    457 		default:
    458 			return 0; /* will return 0 for unknown types */
    459 	}
    460 }
    461 
    462 /*
    463  * Return size of TIFFDataType in bytes.
    464  *
    465  * XXX: We need a separate function to determine the space needed
    466  * to store the value. For TIFF_RATIONAL values TIFFDataWidth() returns 8,
    467  * but we use 4-byte float to represent rationals.
    468  */
    469 int
    470 _TIFFDataSize(TIFFDataType type)
    471 {
    472 	switch (type)
    473 	{
    474 		case TIFF_BYTE:
    475 		case TIFF_SBYTE:
    476 		case TIFF_ASCII:
    477 		case TIFF_UNDEFINED:
    478 		    return 1;
    479 		case TIFF_SHORT:
    480 		case TIFF_SSHORT:
    481 		    return 2;
    482 		case TIFF_LONG:
    483 		case TIFF_SLONG:
    484 		case TIFF_FLOAT:
    485 		case TIFF_IFD:
    486 		case TIFF_RATIONAL:
    487 		case TIFF_SRATIONAL:
    488 		    return 4;
    489 		case TIFF_DOUBLE:
    490 		case TIFF_LONG8:
    491 		case TIFF_SLONG8:
    492 		case TIFF_IFD8:
    493 		    return 8;
    494 		default:
    495 		    return 0;
    496 	}
    497 }
    498 
    499 const TIFFField*
    500 TIFFFindField(TIFF* tif, uint32 tag, TIFFDataType dt)
    501 {
    502 	TIFFField key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0, 0, 0, NULL, NULL};
    503 	TIFFField* pkey = &key;
    504 	const TIFFField **ret;
    505 	if (tif->tif_foundfield && tif->tif_foundfield->field_tag == tag &&
    506 	    (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
    507 		return tif->tif_foundfield;
    508 
    509 	/* If we are invoked with no field information, then just return. */
    510 	if (!tif->tif_fields)
    511 		return NULL;
    512 
    513 	/* NB: use sorted search (e.g. binary search) */
    514 
    515 	key.field_tag = tag;
    516 	key.field_type = dt;
    517 
    518 	ret = (const TIFFField **) bsearch(&pkey, tif->tif_fields,
    519 					   tif->tif_nfields,
    520 					   sizeof(TIFFField *), tagCompare);
    521 	return tif->tif_foundfield = (ret ? *ret : NULL);
    522 }
    523 
    524 const TIFFField*
    525 _TIFFFindFieldByName(TIFF* tif, const char *field_name, TIFFDataType dt)
    526 {
    527 	TIFFField key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0, 0, 0, NULL, NULL};
    528 	TIFFField* pkey = &key;
    529 	const TIFFField **ret;
    530 	if (tif->tif_foundfield
    531 	    && streq(tif->tif_foundfield->field_name, field_name)
    532 	    && (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
    533 		return (tif->tif_foundfield);
    534 
    535 	/* If we are invoked with no field information, then just return. */
    536 	if (!tif->tif_fields)
    537 		return NULL;
    538 
    539 	/* NB: use linear search since list is sorted by key#, not name */
    540 
    541 	key.field_name = (char *)field_name;
    542 	key.field_type = dt;
    543 
    544 	ret = (const TIFFField **)
    545             td_lfind(&pkey, tif->tif_fields, &tif->tif_nfields,
    546                      sizeof(TIFFField *), tagNameCompare);
    547 
    548 	return tif->tif_foundfield = (ret ? *ret : NULL);
    549 }
    550 
    551 const TIFFField*
    552 TIFFFieldWithTag(TIFF* tif, uint32 tag)
    553 {
    554 	const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY);
    555 	if (!fip) {
    556 		TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithTag",
    557 			     "Internal error, unknown tag 0x%x",
    558 			     (unsigned int) tag);
    559 	}
    560 	return (fip);
    561 }
    562 
    563 const TIFFField*
    564 TIFFFieldWithName(TIFF* tif, const char *field_name)
    565 {
    566 	const TIFFField* fip =
    567 		_TIFFFindFieldByName(tif, field_name, TIFF_ANY);
    568 	if (!fip) {
    569 		TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithName",
    570 			     "Internal error, unknown tag %s", field_name);
    571 	}
    572 	return (fip);
    573 }
    574 
    575 uint32
    576 TIFFFieldTag(const TIFFField* fip)
    577 {
    578 	return fip->field_tag;
    579 }
    580 
    581 const char *
    582 TIFFFieldName(const TIFFField* fip)
    583 {
    584 	return fip->field_name;
    585 }
    586 
    587 TIFFDataType
    588 TIFFFieldDataType(const TIFFField* fip)
    589 {
    590 	return fip->field_type;
    591 }
    592 
    593 int
    594 TIFFFieldPassCount(const TIFFField* fip)
    595 {
    596 	return fip->field_passcount;
    597 }
    598 
    599 int
    600 TIFFFieldReadCount(const TIFFField* fip)
    601 {
    602 	return fip->field_readcount;
    603 }
    604 
    605 int
    606 TIFFFieldWriteCount(const TIFFField* fip)
    607 {
    608 	return fip->field_writecount;
    609 }
    610 
    611 const TIFFField*
    612 _TIFFFindOrRegisterField(TIFF *tif, uint32 tag, TIFFDataType dt)
    613 
    614 {
    615 	const TIFFField *fld;
    616 
    617 	fld = TIFFFindField(tif, tag, dt);
    618 	if (fld == NULL) {
    619 		fld = _TIFFCreateAnonField(tif, tag, dt);
    620 		if (!_TIFFMergeFields(tif, fld, 1))
    621 			return NULL;
    622 	}
    623 
    624 	return fld;
    625 }
    626 
    627 TIFFField*
    628 _TIFFCreateAnonField(TIFF *tif, uint32 tag, TIFFDataType field_type)
    629 {
    630 	TIFFField *fld;
    631 	(void) tif;
    632 
    633 	fld = (TIFFField *) _TIFFmalloc(sizeof (TIFFField));
    634 	if (fld == NULL)
    635 	    return NULL;
    636 	_TIFFmemset(fld, 0, sizeof(TIFFField));
    637 
    638 	fld->field_tag = tag;
    639 	fld->field_readcount = TIFF_VARIABLE2;
    640 	fld->field_writecount = TIFF_VARIABLE2;
    641 	fld->field_type = field_type;
    642 	fld->reserved = 0;
    643 	switch (field_type)
    644 	{
    645 		case TIFF_BYTE:
    646 		case TIFF_UNDEFINED:
    647 			fld->set_field_type = TIFF_SETGET_C32_UINT8;
    648 			fld->get_field_type = TIFF_SETGET_C32_UINT8;
    649 			break;
    650 		case TIFF_ASCII:
    651 			fld->set_field_type = TIFF_SETGET_C32_ASCII;
    652 			fld->get_field_type = TIFF_SETGET_C32_ASCII;
    653 			break;
    654 		case TIFF_SHORT:
    655 			fld->set_field_type = TIFF_SETGET_C32_UINT16;
    656 			fld->get_field_type = TIFF_SETGET_C32_UINT16;
    657 			break;
    658 		case TIFF_LONG:
    659 			fld->set_field_type = TIFF_SETGET_C32_UINT32;
    660 			fld->get_field_type = TIFF_SETGET_C32_UINT32;
    661 			break;
    662 		case TIFF_RATIONAL:
    663 		case TIFF_SRATIONAL:
    664 		case TIFF_FLOAT:
    665 			fld->set_field_type = TIFF_SETGET_C32_FLOAT;
    666 			fld->get_field_type = TIFF_SETGET_C32_FLOAT;
    667 			break;
    668 		case TIFF_SBYTE:
    669 			fld->set_field_type = TIFF_SETGET_C32_SINT8;
    670 			fld->get_field_type = TIFF_SETGET_C32_SINT8;
    671 			break;
    672 		case TIFF_SSHORT:
    673 			fld->set_field_type = TIFF_SETGET_C32_SINT16;
    674 			fld->get_field_type = TIFF_SETGET_C32_SINT16;
    675 			break;
    676 		case TIFF_SLONG:
    677 			fld->set_field_type = TIFF_SETGET_C32_SINT32;
    678 			fld->get_field_type = TIFF_SETGET_C32_SINT32;
    679 			break;
    680 		case TIFF_DOUBLE:
    681 			fld->set_field_type = TIFF_SETGET_C32_DOUBLE;
    682 			fld->get_field_type = TIFF_SETGET_C32_DOUBLE;
    683 			break;
    684 		case TIFF_IFD:
    685 		case TIFF_IFD8:
    686 			fld->set_field_type = TIFF_SETGET_C32_IFD8;
    687 			fld->get_field_type = TIFF_SETGET_C32_IFD8;
    688 			break;
    689 		case TIFF_LONG8:
    690 			fld->set_field_type = TIFF_SETGET_C32_UINT64;
    691 			fld->get_field_type = TIFF_SETGET_C32_UINT64;
    692 			break;
    693 		case TIFF_SLONG8:
    694 			fld->set_field_type = TIFF_SETGET_C32_SINT64;
    695 			fld->get_field_type = TIFF_SETGET_C32_SINT64;
    696 			break;
    697 		default:
    698 			fld->set_field_type = TIFF_SETGET_UNDEFINED;
    699 			fld->get_field_type = TIFF_SETGET_UNDEFINED;
    700 			break;
    701 	}
    702 	fld->field_bit = FIELD_CUSTOM;
    703 	fld->field_oktochange = TRUE;
    704 	fld->field_passcount = TRUE;
    705 	fld->field_name = (char *) _TIFFmalloc(32);
    706 	if (fld->field_name == NULL) {
    707 	    _TIFFfree(fld);
    708 	    return NULL;
    709 	}
    710 	fld->field_subfields = NULL;
    711 
    712 	/*
    713 	 * note that this name is a special sign to TIFFClose() and
    714 	 * _TIFFSetupFields() to free the field
    715 	 */
    716 	snprintf(fld->field_name, 32, "Tag %d", (int) tag);
    717 
    718 	return fld;
    719 }
    720 
    721 /****************************************************************************
    722  *               O B S O L E T E D    I N T E R F A C E S
    723  *
    724  * Don't use this stuff in your applications, it may be removed in the future
    725  * libtiff versions.
    726  ****************************************************************************/
    727 
    728 static TIFFSetGetFieldType
    729 _TIFFSetGetType(TIFFDataType type, short count, unsigned char passcount)
    730 {
    731 	if (type == TIFF_ASCII && count == TIFF_VARIABLE && passcount == 0)
    732 		return TIFF_SETGET_ASCII;
    733 
    734 	else if (count == 1 && passcount == 0) {
    735 		switch (type)
    736 		{
    737 			case TIFF_BYTE:
    738 			case TIFF_UNDEFINED:
    739 				return TIFF_SETGET_UINT8;
    740 			case TIFF_ASCII:
    741 				return TIFF_SETGET_ASCII;
    742 			case TIFF_SHORT:
    743 				return TIFF_SETGET_UINT16;
    744 			case TIFF_LONG:
    745 				return TIFF_SETGET_UINT32;
    746 			case TIFF_RATIONAL:
    747 			case TIFF_SRATIONAL:
    748 			case TIFF_FLOAT:
    749 				return TIFF_SETGET_FLOAT;
    750 			case TIFF_SBYTE:
    751 				return TIFF_SETGET_SINT8;
    752 			case TIFF_SSHORT:
    753 				return TIFF_SETGET_SINT16;
    754 			case TIFF_SLONG:
    755 				return TIFF_SETGET_SINT32;
    756 			case TIFF_DOUBLE:
    757 				return TIFF_SETGET_DOUBLE;
    758 			case TIFF_IFD:
    759 			case TIFF_IFD8:
    760 				return TIFF_SETGET_IFD8;
    761 			case TIFF_LONG8:
    762 				return TIFF_SETGET_UINT64;
    763 			case TIFF_SLONG8:
    764 				return TIFF_SETGET_SINT64;
    765 			default:
    766 				return TIFF_SETGET_UNDEFINED;
    767 		}
    768 	}
    769 
    770 	else if (count >= 1 && passcount == 0) {
    771 		switch (type)
    772 		{
    773 			case TIFF_BYTE:
    774 			case TIFF_UNDEFINED:
    775 				return TIFF_SETGET_C0_UINT8;
    776 			case TIFF_ASCII:
    777 				return TIFF_SETGET_C0_ASCII;
    778 			case TIFF_SHORT:
    779 				return TIFF_SETGET_C0_UINT16;
    780 			case TIFF_LONG:
    781 				return TIFF_SETGET_C0_UINT32;
    782 			case TIFF_RATIONAL:
    783 			case TIFF_SRATIONAL:
    784 			case TIFF_FLOAT:
    785 				return TIFF_SETGET_C0_FLOAT;
    786 			case TIFF_SBYTE:
    787 				return TIFF_SETGET_C0_SINT8;
    788 			case TIFF_SSHORT:
    789 				return TIFF_SETGET_C0_SINT16;
    790 			case TIFF_SLONG:
    791 				return TIFF_SETGET_C0_SINT32;
    792 			case TIFF_DOUBLE:
    793 				return TIFF_SETGET_C0_DOUBLE;
    794 			case TIFF_IFD:
    795 			case TIFF_IFD8:
    796 				return TIFF_SETGET_C0_IFD8;
    797 			case TIFF_LONG8:
    798 				return TIFF_SETGET_C0_UINT64;
    799 			case TIFF_SLONG8:
    800 				return TIFF_SETGET_C0_SINT64;
    801 			default:
    802 				return TIFF_SETGET_UNDEFINED;
    803 		}
    804 	}
    805 
    806 	else if (count == TIFF_VARIABLE && passcount == 1) {
    807 		switch (type)
    808 		{
    809 			case TIFF_BYTE:
    810 			case TIFF_UNDEFINED:
    811 				return TIFF_SETGET_C16_UINT8;
    812 			case TIFF_ASCII:
    813 				return TIFF_SETGET_C16_ASCII;
    814 			case TIFF_SHORT:
    815 				return TIFF_SETGET_C16_UINT16;
    816 			case TIFF_LONG:
    817 				return TIFF_SETGET_C16_UINT32;
    818 			case TIFF_RATIONAL:
    819 			case TIFF_SRATIONAL:
    820 			case TIFF_FLOAT:
    821 				return TIFF_SETGET_C16_FLOAT;
    822 			case TIFF_SBYTE:
    823 				return TIFF_SETGET_C16_SINT8;
    824 			case TIFF_SSHORT:
    825 				return TIFF_SETGET_C16_SINT16;
    826 			case TIFF_SLONG:
    827 				return TIFF_SETGET_C16_SINT32;
    828 			case TIFF_DOUBLE:
    829 				return TIFF_SETGET_C16_DOUBLE;
    830 			case TIFF_IFD:
    831 			case TIFF_IFD8:
    832 				return TIFF_SETGET_C16_IFD8;
    833 			case TIFF_LONG8:
    834 				return TIFF_SETGET_C16_UINT64;
    835 			case TIFF_SLONG8:
    836 				return TIFF_SETGET_C16_SINT64;
    837 			default:
    838 				return TIFF_SETGET_UNDEFINED;
    839 		}
    840 	}
    841 
    842 	else if (count == TIFF_VARIABLE2 && passcount == 1) {
    843 		switch (type)
    844 		{
    845 			case TIFF_BYTE:
    846 			case TIFF_UNDEFINED:
    847 				return TIFF_SETGET_C32_UINT8;
    848 			case TIFF_ASCII:
    849 				return TIFF_SETGET_C32_ASCII;
    850 			case TIFF_SHORT:
    851 				return TIFF_SETGET_C32_UINT16;
    852 			case TIFF_LONG:
    853 				return TIFF_SETGET_C32_UINT32;
    854 			case TIFF_RATIONAL:
    855 			case TIFF_SRATIONAL:
    856 			case TIFF_FLOAT:
    857 				return TIFF_SETGET_C32_FLOAT;
    858 			case TIFF_SBYTE:
    859 				return TIFF_SETGET_C32_SINT8;
    860 			case TIFF_SSHORT:
    861 				return TIFF_SETGET_C32_SINT16;
    862 			case TIFF_SLONG:
    863 				return TIFF_SETGET_C32_SINT32;
    864 			case TIFF_DOUBLE:
    865 				return TIFF_SETGET_C32_DOUBLE;
    866 			case TIFF_IFD:
    867 			case TIFF_IFD8:
    868 				return TIFF_SETGET_C32_IFD8;
    869 			case TIFF_LONG8:
    870 				return TIFF_SETGET_C32_UINT64;
    871 			case TIFF_SLONG8:
    872 				return TIFF_SETGET_C32_SINT64;
    873 			default:
    874 				return TIFF_SETGET_UNDEFINED;
    875 		}
    876 	}
    877 
    878 	return TIFF_SETGET_UNDEFINED;
    879 }
    880 
    881 int
    882 TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], uint32 n)
    883 {
    884 	static const char module[] = "TIFFMergeFieldInfo";
    885 	static const char reason[] = "for fields array";
    886 	TIFFField *tp;
    887 	size_t nfields;
    888 	uint32 i;
    889 
    890 	if (tif->tif_nfieldscompat > 0) {
    891 		tif->tif_fieldscompat = (TIFFFieldArray *)
    892 			_TIFFCheckRealloc(tif, tif->tif_fieldscompat,
    893 					  tif->tif_nfieldscompat + 1,
    894 					  sizeof(TIFFFieldArray), reason);
    895 	} else {
    896 		tif->tif_fieldscompat = (TIFFFieldArray *)
    897 			_TIFFCheckMalloc(tif, 1, sizeof(TIFFFieldArray),
    898 					 reason);
    899 	}
    900 	if (!tif->tif_fieldscompat) {
    901 		TIFFErrorExt(tif->tif_clientdata, module,
    902 			     "Failed to allocate fields array");
    903 		return -1;
    904 	}
    905 	nfields = tif->tif_nfieldscompat++;
    906 
    907 	tif->tif_fieldscompat[nfields].type = tfiatOther;
    908 	tif->tif_fieldscompat[nfields].allocated_size = n;
    909 	tif->tif_fieldscompat[nfields].count = n;
    910 	tif->tif_fieldscompat[nfields].fields =
    911 		(TIFFField *)_TIFFCheckMalloc(tif, n, sizeof(TIFFField),
    912 					      reason);
    913 	if (!tif->tif_fieldscompat[nfields].fields) {
    914 		TIFFErrorExt(tif->tif_clientdata, module,
    915 			     "Failed to allocate fields array");
    916 		return -1;
    917 	}
    918 
    919 	tp = tif->tif_fieldscompat[nfields].fields;
    920 	for (i = 0; i < n; i++) {
    921 		tp->field_tag = info[i].field_tag;
    922 		tp->field_readcount = info[i].field_readcount;
    923 		tp->field_writecount = info[i].field_writecount;
    924 		tp->field_type = info[i].field_type;
    925 		tp->reserved = 0;
    926 		tp->set_field_type =
    927 		     _TIFFSetGetType(info[i].field_type,
    928 				info[i].field_readcount,
    929 				info[i].field_passcount);
    930 		tp->get_field_type =
    931 		     _TIFFSetGetType(info[i].field_type,
    932 				info[i].field_readcount,
    933 				info[i].field_passcount);
    934 		tp->field_bit = info[i].field_bit;
    935 		tp->field_oktochange = info[i].field_oktochange;
    936 		tp->field_passcount = info[i].field_passcount;
    937 		tp->field_name = info[i].field_name;
    938 		tp->field_subfields = NULL;
    939 		tp++;
    940 	}
    941 
    942 	if (!_TIFFMergeFields(tif, tif->tif_fieldscompat[nfields].fields, n)) {
    943 		TIFFErrorExt(tif->tif_clientdata, module,
    944 			     "Setting up field info failed");
    945 		return -1;
    946 	}
    947 
    948 	return 0;
    949 }
    950 
    951 /* vim: set ts=8 sts=8 sw=8 noet: */
    952 
    953 /*
    954  * Local Variables:
    955  * mode: c
    956  * c-basic-offset: 8
    957  * fill-column: 78
    958  * End:
    959  */
    960