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 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_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 214static TIFFField 215exifFields[] = { 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 274static TIFFFieldArray 275tiffFieldArray = { tfiatImage, 0, TIFFArrayCount(tiffFields), tiffFields }; 276static TIFFFieldArray 277exifFieldArray = { 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 284static void * 285td_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 298const TIFFFieldArray* 299_TIFFGetFields(void) 300{ 301 return(&tiffFieldArray); 302} 303 304const TIFFFieldArray* 305_TIFFGetExifFields(void) 306{ 307 return(&exifFieldArray); 308} 309 310void 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 335static int 336tagCompare(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 348static int 349tagNameCompare(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 362int 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 407void 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 */ 431int 432TIFFDataWidth(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 */ 469int 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 499const TIFFField* 500TIFFFindField(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 524const 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 551const TIFFField* 552TIFFFieldWithTag(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 563const TIFFField* 564TIFFFieldWithName(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 575uint32 576TIFFFieldTag(const TIFFField* fip) 577{ 578 return fip->field_tag; 579} 580 581const char * 582TIFFFieldName(const TIFFField* fip) 583{ 584 return fip->field_name; 585} 586 587TIFFDataType 588TIFFFieldDataType(const TIFFField* fip) 589{ 590 return fip->field_type; 591} 592 593int 594TIFFFieldPassCount(const TIFFField* fip) 595{ 596 return fip->field_passcount; 597} 598 599int 600TIFFFieldReadCount(const TIFFField* fip) 601{ 602 return fip->field_readcount; 603} 604 605int 606TIFFFieldWriteCount(const TIFFField* fip) 607{ 608 return fip->field_writecount; 609} 610 611const 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 627TIFFField* 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 728static 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 881int 882TIFFMergeFieldInfo(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