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 45static TIFFFieldArray tiffFieldArray; 46static TIFFFieldArray exifFieldArray; 47 48static TIFFField 49tiffFields[] = { 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 198static TIFFField 199exifFields[] = { 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 258static TIFFFieldArray 259tiffFieldArray = { tfiatImage, 0, TIFFArrayCount(tiffFields), tiffFields }; 260static TIFFFieldArray 261exifFieldArray = { 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 268static void * 269td_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 282const TIFFFieldArray* 283_TIFFGetFields(void) 284{ 285 return(&tiffFieldArray); 286} 287 288const TIFFFieldArray* 289_TIFFGetExifFields(void) 290{ 291 return(&exifFieldArray); 292} 293 294void 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 319static int 320tagCompare(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 332static int 333tagNameCompare(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 346int 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 391void 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 */ 415int 416TIFFDataWidth(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 */ 453int 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 483const TIFFField* 484TIFFFindField(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 508const 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 535const TIFFField* 536TIFFFieldWithTag(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 547const TIFFField* 548TIFFFieldWithName(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 559const 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 575TIFFField* 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 676static 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 829int 830TIFFMergeFieldInfo(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 */ 908