1 /* $Id: tif_dirinfo.c,v 1.127 2017-06-01 12:44:04 erouault 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 <precomp.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 interpret the -1, -2 and -3 42 * values accordingly. 43 */ 44 45 /* const object should be initialized */ 46 #ifdef _MSC_VER 47 #pragma warning( push ) 48 #pragma warning( disable : 4132 ) 49 #endif 50 static const TIFFFieldArray tiffFieldArray; 51 static const TIFFFieldArray exifFieldArray; 52 #ifdef _MSC_VER 53 #pragma warning( pop ) 54 #endif 55 56 static const TIFFField 57 tiffFields[] = { 58 { TIFFTAG_SUBFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_SUBFILETYPE, 1, 0, "SubfileType", NULL }, 59 { TIFFTAG_OSUBFILETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_SUBFILETYPE, 1, 0, "OldSubfileType", NULL }, 60 { TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_IMAGEDIMENSIONS, 0, 0, "ImageWidth", NULL }, 61 { TIFFTAG_IMAGELENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_IMAGEDIMENSIONS, 1, 0, "ImageLength", NULL }, 62 { TIFFTAG_BITSPERSAMPLE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_BITSPERSAMPLE, 0, 0, "BitsPerSample", NULL }, 63 { TIFFTAG_COMPRESSION, -1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_COMPRESSION, 0, 0, "Compression", NULL }, 64 { TIFFTAG_PHOTOMETRIC, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_PHOTOMETRIC, 0, 0, "PhotometricInterpretation", NULL }, 65 { TIFFTAG_THRESHHOLDING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_THRESHHOLDING, 1, 0, "Threshholding", NULL }, 66 { TIFFTAG_CELLWIDTH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "CellWidth", NULL }, 67 { TIFFTAG_CELLLENGTH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "CellLength", NULL }, 68 { TIFFTAG_FILLORDER, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_FILLORDER, 0, 0, "FillOrder", NULL }, 69 { TIFFTAG_DOCUMENTNAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DocumentName", NULL }, 70 { TIFFTAG_IMAGEDESCRIPTION, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageDescription", NULL }, 71 { TIFFTAG_MAKE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Make", NULL }, 72 { TIFFTAG_MODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Model", NULL }, 73 { TIFFTAG_STRIPOFFSETS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPOFFSETS, 0, 0, "StripOffsets", NULL }, 74 { TIFFTAG_ORIENTATION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_ORIENTATION, 0, 0, "Orientation", NULL }, 75 { TIFFTAG_SAMPLESPERPIXEL, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_SAMPLESPERPIXEL, 0, 0, "SamplesPerPixel", NULL }, 76 { TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_ROWSPERSTRIP, 0, 0, "RowsPerStrip", NULL }, 77 { TIFFTAG_STRIPBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPBYTECOUNTS, 0, 0, "StripByteCounts", NULL }, 78 { TIFFTAG_MINSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_MINSAMPLEVALUE, 1, 0, "MinSampleValue", NULL }, 79 { TIFFTAG_MAXSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_MAXSAMPLEVALUE, 1, 0, "MaxSampleValue", NULL }, 80 { TIFFTAG_XRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTION, 1, 0, "XResolution", NULL }, 81 { TIFFTAG_YRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTION, 1, 0, "YResolution", NULL }, 82 { TIFFTAG_PLANARCONFIG, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_PLANARCONFIG, 0, 0, "PlanarConfiguration", NULL }, 83 { TIFFTAG_PAGENAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PageName", NULL }, 84 { TIFFTAG_XPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_POSITION, 1, 0, "XPosition", NULL }, 85 { TIFFTAG_YPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_POSITION, 1, 0, "YPosition", NULL }, 86 { TIFFTAG_FREEOFFSETS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeOffsets", NULL }, 87 { TIFFTAG_FREEBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeByteCounts", NULL }, 88 { TIFFTAG_GRAYRESPONSEUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "GrayResponseUnit", NULL }, 89 { TIFFTAG_GRAYRESPONSECURVE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "GrayResponseCurve", NULL }, 90 { TIFFTAG_RESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTIONUNIT, 1, 0, "ResolutionUnit", NULL }, 91 { TIFFTAG_PAGENUMBER, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_PAGENUMBER, 1, 0, "PageNumber", NULL }, 92 { TIFFTAG_COLORRESPONSEUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "ColorResponseUnit", NULL }, 93 { TIFFTAG_TRANSFERFUNCTION, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_OTHER, TIFF_SETGET_UNDEFINED, FIELD_TRANSFERFUNCTION, 1, 0, "TransferFunction", NULL }, 94 { TIFFTAG_SOFTWARE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Software", NULL }, 95 { TIFFTAG_DATETIME, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTime", NULL }, 96 { TIFFTAG_ARTIST, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Artist", NULL }, 97 { TIFFTAG_HOSTCOMPUTER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "HostComputer", NULL }, 98 { TIFFTAG_WHITEPOINT, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WhitePoint", NULL }, 99 { TIFFTAG_PRIMARYCHROMATICITIES, 6, 6, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PrimaryChromaticities", NULL }, 100 { TIFFTAG_COLORMAP, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_OTHER, TIFF_SETGET_UNDEFINED, FIELD_COLORMAP, 1, 0, "ColorMap", NULL }, 101 { TIFFTAG_HALFTONEHINTS, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_HALFTONEHINTS, 1, 0, "HalftoneHints", NULL }, 102 { TIFFTAG_TILEWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_TILEDIMENSIONS, 0, 0, "TileWidth", NULL }, 103 { TIFFTAG_TILELENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_TILEDIMENSIONS, 0, 0, "TileLength", NULL }, 104 { TIFFTAG_TILEOFFSETS, -1, 1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPOFFSETS, 0, 0, "TileOffsets", NULL }, 105 { TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPBYTECOUNTS, 0, 0, "TileByteCounts", NULL }, 106 { TIFFTAG_SUBIFD, -1, -1, TIFF_IFD8, 0, TIFF_SETGET_C16_IFD8, TIFF_SETGET_UNDEFINED, FIELD_SUBIFD, 1, 1, "SubIFD", (TIFFFieldArray*) &tiffFieldArray }, 107 { TIFFTAG_INKSET, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "InkSet", NULL }, 108 { TIFFTAG_INKNAMES, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_C16_ASCII, TIFF_SETGET_UNDEFINED, FIELD_INKNAMES, 1, 1, "InkNames", NULL }, 109 { TIFFTAG_NUMBEROFINKS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "NumberOfInks", NULL }, 110 { TIFFTAG_DOTRANGE, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DotRange", NULL }, 111 { TIFFTAG_TARGETPRINTER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TargetPrinter", NULL }, 112 { TIFFTAG_EXTRASAMPLES, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_EXTRASAMPLES, 0, 1, "ExtraSamples", NULL }, 113 { TIFFTAG_SAMPLEFORMAT, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_SAMPLEFORMAT, 0, 0, "SampleFormat", NULL }, 114 { TIFFTAG_SMINSAMPLEVALUE, -2, -1, TIFF_ANY, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_SMINSAMPLEVALUE, 1, 0, "SMinSampleValue", NULL }, 115 { TIFFTAG_SMAXSAMPLEVALUE, -2, -1, TIFF_ANY, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_SMAXSAMPLEVALUE, 1, 0, "SMaxSampleValue", NULL }, 116 { TIFFTAG_CLIPPATH, -1, -3, TIFF_BYTE, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ClipPath", NULL }, 117 { TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SLONG, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "XClipPathUnits", NULL }, 118 { TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SBYTE, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "XClipPathUnits", NULL }, 119 { TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_SLONG, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "YClipPathUnits", NULL }, 120 { TIFFTAG_YCBCRCOEFFICIENTS, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "YCbCrCoefficients", NULL }, 121 { TIFFTAG_YCBCRSUBSAMPLING, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_YCBCRSUBSAMPLING, 0, 0, "YCbCrSubsampling", NULL }, 122 { TIFFTAG_YCBCRPOSITIONING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_YCBCRPOSITIONING, 0, 0, "YCbCrPositioning", NULL }, 123 { TIFFTAG_REFERENCEBLACKWHITE, 6, 6, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_REFBLACKWHITE, 1, 0, "ReferenceBlackWhite", NULL }, 124 { TIFFTAG_XMLPACKET, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "XMLPacket", NULL }, 125 /* begin SGI tags */ 126 { TIFFTAG_MATTEING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_EXTRASAMPLES, 0, 0, "Matteing", NULL }, 127 { TIFFTAG_DATATYPE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_SAMPLEFORMAT, 0, 0, "DataType", NULL }, 128 { TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_IMAGEDEPTH, 0, 0, "ImageDepth", NULL }, 129 { TIFFTAG_TILEDEPTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_TILEDEPTH, 0, 0, "TileDepth", NULL }, 130 /* end SGI tags */ 131 /* begin Pixar tags */ 132 { TIFFTAG_PIXAR_IMAGEFULLWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageFullWidth", NULL }, 133 { TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageFullLength", NULL }, 134 { TIFFTAG_PIXAR_TEXTUREFORMAT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TextureFormat", NULL }, 135 { TIFFTAG_PIXAR_WRAPMODES, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TextureWrapModes", NULL }, 136 { TIFFTAG_PIXAR_FOVCOT, 1, 1, TIFF_FLOAT, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FieldOfViewCotangent", NULL }, 137 { TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MatrixWorldToScreen", NULL }, 138 { TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MatrixWorldToCamera", NULL }, 139 { TIFFTAG_CFAREPEATPATTERNDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CFARepeatPatternDim", NULL }, 140 { TIFFTAG_CFAPATTERN, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CFAPattern" , NULL}, 141 { TIFFTAG_COPYRIGHT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Copyright", NULL }, 142 /* end Pixar tags */ 143 { TIFFTAG_RICHTIFFIPTC, -3, -3, TIFF_LONG, 0, TIFF_SETGET_C32_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "RichTIFFIPTC", NULL }, 144 { TIFFTAG_PHOTOSHOP, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "Photoshop", NULL }, 145 { TIFFTAG_EXIFIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "EXIFIFDOffset", (TIFFFieldArray*) &exifFieldArray }, 146 { TIFFTAG_ICCPROFILE, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ICC Profile", NULL }, 147 { TIFFTAG_GPSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "GPSIFDOffset", NULL }, 148 { TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvParams", NULL }, 149 { TIFFTAG_FAXSUBADDRESS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxSubAddress", NULL }, 150 { TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvTime", NULL }, 151 { TIFFTAG_FAXDCS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxDcs", NULL }, 152 { TIFFTAG_STONITS, 1, 1, TIFF_DOUBLE, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "StoNits", NULL }, 153 { TIFFTAG_INTEROPERABILITYIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "InteroperabilityIFDOffset", NULL }, 154 /* begin DNG tags */ 155 { TIFFTAG_DNGVERSION, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DNGVersion", NULL }, 156 { TIFFTAG_DNGBACKWARDVERSION, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DNGBackwardVersion", NULL }, 157 { TIFFTAG_UNIQUECAMERAMODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "UniqueCameraModel", NULL }, 158 { TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "LocalizedCameraModel", NULL }, 159 { TIFFTAG_CFAPLANECOLOR, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CFAPlaneColor", NULL }, 160 { TIFFTAG_CFALAYOUT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CFALayout", NULL }, 161 { TIFFTAG_LINEARIZATIONTABLE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "LinearizationTable", NULL }, 162 { TIFFTAG_BLACKLEVELREPEATDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BlackLevelRepeatDim", NULL }, 163 { TIFFTAG_BLACKLEVEL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevel", NULL }, 164 { TIFFTAG_BLACKLEVELDELTAH, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevelDeltaH", NULL }, 165 { TIFFTAG_BLACKLEVELDELTAV, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevelDeltaV", NULL }, 166 { TIFFTAG_WHITELEVEL, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "WhiteLevel", NULL }, 167 { TIFFTAG_DEFAULTSCALE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultScale", NULL }, 168 { TIFFTAG_BESTQUALITYSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BestQualityScale", NULL }, 169 { TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultCropOrigin", NULL }, 170 { TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultCropSize", NULL }, 171 { TIFFTAG_COLORMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ColorMatrix1", NULL }, 172 { TIFFTAG_COLORMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ColorMatrix2", NULL }, 173 { TIFFTAG_CAMERACALIBRATION1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CameraCalibration1", NULL }, 174 { TIFFTAG_CAMERACALIBRATION2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CameraCalibration2", NULL }, 175 { TIFFTAG_REDUCTIONMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ReductionMatrix1", NULL }, 176 { TIFFTAG_REDUCTIONMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ReductionMatrix2", NULL }, 177 { TIFFTAG_ANALOGBALANCE, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AnalogBalance", NULL }, 178 { TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotNeutral", NULL }, 179 { TIFFTAG_ASSHOTWHITEXY, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "AsShotWhiteXY", NULL }, 180 { TIFFTAG_BASELINEEXPOSURE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineExposure", NULL }, 181 { TIFFTAG_BASELINENOISE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineNoise", NULL }, 182 { TIFFTAG_BASELINESHARPNESS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineSharpness", NULL }, 183 { TIFFTAG_BAYERGREENSPLIT, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BayerGreenSplit", NULL }, 184 { TIFFTAG_LINEARRESPONSELIMIT, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "LinearResponseLimit", NULL }, 185 { TIFFTAG_CAMERASERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CameraSerialNumber", NULL }, 186 { TIFFTAG_LENSINFO, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "LensInfo", NULL }, 187 { TIFFTAG_CHROMABLURRADIUS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ChromaBlurRadius", NULL }, 188 { TIFFTAG_ANTIALIASSTRENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "AntiAliasStrength", NULL }, 189 { TIFFTAG_SHADOWSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ShadowScale", NULL }, 190 { TIFFTAG_DNGPRIVATEDATA, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "DNGPrivateData", NULL }, 191 { TIFFTAG_MAKERNOTESAFETY, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "MakerNoteSafety", NULL }, 192 { TIFFTAG_CALIBRATIONILLUMINANT1, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CalibrationIlluminant1", NULL }, 193 { TIFFTAG_CALIBRATIONILLUMINANT2, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CalibrationIlluminant2", NULL }, 194 { TIFFTAG_RAWDATAUNIQUEID, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "RawDataUniqueID", NULL }, 195 { TIFFTAG_ORIGINALRAWFILENAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OriginalRawFileName", NULL }, 196 { TIFFTAG_ORIGINALRAWFILEDATA, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "OriginalRawFileData", NULL }, 197 { TIFFTAG_ACTIVEAREA, 4, 4, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ActiveArea", NULL }, 198 { TIFFTAG_MASKEDAREAS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "MaskedAreas", NULL }, 199 { TIFFTAG_ASSHOTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotICCProfile", NULL }, 200 { TIFFTAG_ASSHOTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotPreProfileMatrix", NULL }, 201 { TIFFTAG_CURRENTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CurrentICCProfile", NULL }, 202 { TIFFTAG_CURRENTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CurrentPreProfileMatrix", NULL }, 203 { TIFFTAG_PERSAMPLE, 0, 0, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "PerSample", NULL}, 204 /* end DNG tags */ 205 /* begin TIFF/FX tags */ 206 { TIFFTAG_INDEXED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "Indexed", NULL }, 207 { TIFFTAG_GLOBALPARAMETERSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "GlobalParametersIFD", NULL }, 208 { TIFFTAG_PROFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ProfileType", NULL }, 209 { TIFFTAG_FAXPROFILE, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "FaxProfile", NULL }, 210 { TIFFTAG_CODINGMETHODS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CodingMethods", NULL }, 211 { TIFFTAG_VERSIONYEAR, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "VersionYear", NULL }, 212 { TIFFTAG_MODENUMBER, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ModeNumber", NULL }, 213 { TIFFTAG_DECODE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "Decode", NULL }, 214 { TIFFTAG_IMAGEBASECOLOR, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ImageBaseColor", NULL }, 215 { TIFFTAG_T82OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "T82Options", NULL }, 216 { TIFFTAG_STRIPROWCOUNTS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "StripRowCounts", NULL }, 217 { TIFFTAG_IMAGELAYER, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ImageLayer", NULL }, 218 /* end TIFF/FX tags */ 219 /* begin pseudo tags */ 220 }; 221 222 static const TIFFField 223 exifFields[] = { 224 { EXIFTAG_EXPOSURETIME, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureTime", NULL }, 225 { EXIFTAG_FNUMBER, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FNumber", NULL }, 226 { EXIFTAG_EXPOSUREPROGRAM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureProgram", NULL }, 227 { EXIFTAG_SPECTRALSENSITIVITY, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SpectralSensitivity", NULL }, 228 { EXIFTAG_ISOSPEEDRATINGS, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ISOSpeedRatings", NULL }, 229 { EXIFTAG_OECF, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OptoelectricConversionFactor", NULL }, 230 { EXIFTAG_EXIFVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExifVersion", NULL }, 231 { EXIFTAG_DATETIMEORIGINAL, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeOriginal", NULL }, 232 { EXIFTAG_DATETIMEDIGITIZED, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeDigitized", NULL }, 233 { EXIFTAG_COMPONENTSCONFIGURATION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ComponentsConfiguration", NULL }, 234 { EXIFTAG_COMPRESSEDBITSPERPIXEL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CompressedBitsPerPixel", NULL }, 235 { EXIFTAG_SHUTTERSPEEDVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ShutterSpeedValue", NULL }, 236 { EXIFTAG_APERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ApertureValue", NULL }, 237 { EXIFTAG_BRIGHTNESSVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BrightnessValue", NULL }, 238 { EXIFTAG_EXPOSUREBIASVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureBiasValue", NULL }, 239 { EXIFTAG_MAXAPERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MaxApertureValue", NULL }, 240 { EXIFTAG_SUBJECTDISTANCE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistance", NULL }, 241 { EXIFTAG_METERINGMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MeteringMode", NULL }, 242 { EXIFTAG_LIGHTSOURCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LightSource", NULL }, 243 { EXIFTAG_FLASH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Flash", NULL }, 244 { EXIFTAG_FOCALLENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLength", NULL }, 245 { EXIFTAG_SUBJECTAREA, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SubjectArea", NULL }, 246 { EXIFTAG_MAKERNOTE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "MakerNote", NULL }, 247 { EXIFTAG_USERCOMMENT, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "UserComment", NULL }, 248 { EXIFTAG_SUBSECTIME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTime", NULL }, 249 { EXIFTAG_SUBSECTIMEORIGINAL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeOriginal", NULL }, 250 { EXIFTAG_SUBSECTIMEDIGITIZED, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeDigitized", NULL }, 251 { EXIFTAG_FLASHPIXVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashpixVersion", NULL }, 252 { EXIFTAG_COLORSPACE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ColorSpace", NULL }, 253 { EXIFTAG_PIXELXDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelXDimension", NULL }, 254 { EXIFTAG_PIXELYDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelYDimension", NULL }, 255 { EXIFTAG_RELATEDSOUNDFILE, 13, 13, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RelatedSoundFile", NULL }, 256 { EXIFTAG_FLASHENERGY, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashEnergy", NULL }, 257 { EXIFTAG_SPATIALFREQUENCYRESPONSE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SpatialFrequencyResponse", NULL }, 258 { EXIFTAG_FOCALPLANEXRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneXResolution", NULL }, 259 { EXIFTAG_FOCALPLANEYRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneYResolution", NULL }, 260 { EXIFTAG_FOCALPLANERESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneResolutionUnit", NULL }, 261 { EXIFTAG_SUBJECTLOCATION, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectLocation", NULL }, 262 { EXIFTAG_EXPOSUREINDEX, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureIndex", NULL }, 263 { EXIFTAG_SENSINGMETHOD, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SensingMethod", NULL }, 264 { EXIFTAG_FILESOURCE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FileSource", NULL }, 265 { EXIFTAG_SCENETYPE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneType", NULL }, 266 { EXIFTAG_CFAPATTERN, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CFAPattern", NULL }, 267 { EXIFTAG_CUSTOMRENDERED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CustomRendered", NULL }, 268 { EXIFTAG_EXPOSUREMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureMode", NULL }, 269 { EXIFTAG_WHITEBALANCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WhiteBalance", NULL }, 270 { EXIFTAG_DIGITALZOOMRATIO, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DigitalZoomRatio", NULL }, 271 { EXIFTAG_FOCALLENGTHIN35MMFILM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLengthIn35mmFilm", NULL }, 272 { EXIFTAG_SCENECAPTURETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneCaptureType", NULL }, 273 { EXIFTAG_GAINCONTROL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "GainControl", NULL }, 274 { EXIFTAG_CONTRAST, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Contrast", NULL }, 275 { EXIFTAG_SATURATION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Saturation", NULL }, 276 { EXIFTAG_SHARPNESS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Sharpness", NULL }, 277 { EXIFTAG_DEVICESETTINGDESCRIPTION, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "DeviceSettingDescription", NULL }, 278 { EXIFTAG_SUBJECTDISTANCERANGE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistanceRange", NULL }, 279 { EXIFTAG_IMAGEUNIQUEID, 33, 33, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageUniqueID", NULL } 280 }; 281 282 static const TIFFFieldArray 283 tiffFieldArray = { tfiatImage, 0, TIFFArrayCount(tiffFields), (TIFFField*) tiffFields }; 284 static const TIFFFieldArray 285 exifFieldArray = { tfiatExif, 0, TIFFArrayCount(exifFields), (TIFFField*) exifFields }; 286 287 /* 288 * We have our own local lfind() equivalent to avoid subtle differences 289 * in types passed to lfind() on different systems. 290 */ 291 292 static void * 293 td_lfind(const void *key, const void *base, size_t *nmemb, size_t size, 294 int(*compar)(const void *, const void *)) 295 { 296 char *element, *end; 297 298 end = (char *)base + *nmemb * size; 299 for (element = (char *)base; element < end; element += size) 300 if (!compar(key, element)) /* key found */ 301 return element; 302 303 return NULL; 304 } 305 306 const TIFFFieldArray* 307 _TIFFGetFields(void) 308 { 309 return(&tiffFieldArray); 310 } 311 312 const TIFFFieldArray* 313 _TIFFGetExifFields(void) 314 { 315 return(&exifFieldArray); 316 } 317 318 void 319 _TIFFSetupFields(TIFF* tif, const TIFFFieldArray* fieldarray) 320 { 321 if (tif->tif_fields && tif->tif_nfields > 0) { 322 uint32 i; 323 324 for (i = 0; i < tif->tif_nfields; i++) { 325 TIFFField *fld = tif->tif_fields[i]; 326 if (fld->field_bit == FIELD_CUSTOM && 327 strncmp("Tag ", fld->field_name, 4) == 0) { 328 _TIFFfree(fld->field_name); 329 _TIFFfree(fld); 330 } 331 } 332 333 _TIFFfree(tif->tif_fields); 334 tif->tif_fields = NULL; 335 tif->tif_nfields = 0; 336 } 337 if (!_TIFFMergeFields(tif, fieldarray->fields, fieldarray->count)) { 338 TIFFErrorExt(tif->tif_clientdata, "_TIFFSetupFields", 339 "Setting up field info failed"); 340 } 341 } 342 343 static int 344 tagCompare(const void* a, const void* b) 345 { 346 const TIFFField* ta = *(const TIFFField**) a; 347 const TIFFField* tb = *(const TIFFField**) b; 348 /* NB: be careful of return values for 16-bit platforms */ 349 if (ta->field_tag != tb->field_tag) 350 return (int)ta->field_tag - (int)tb->field_tag; 351 else 352 return (ta->field_type == TIFF_ANY) ? 353 0 : ((int)tb->field_type - (int)ta->field_type); 354 } 355 356 static int 357 tagNameCompare(const void* a, const void* b) 358 { 359 const TIFFField* ta = *(const TIFFField**) a; 360 const TIFFField* tb = *(const TIFFField**) b; 361 int ret = strcmp(ta->field_name, tb->field_name); 362 363 if (ret) 364 return ret; 365 else 366 return (ta->field_type == TIFF_ANY) ? 367 0 : ((int)tb->field_type - (int)ta->field_type); 368 } 369 370 int 371 _TIFFMergeFields(TIFF* tif, const TIFFField info[], uint32 n) 372 { 373 static const char module[] = "_TIFFMergeFields"; 374 static const char reason[] = "for fields array"; 375 /* TIFFField** tp; */ 376 uint32 i; 377 378 tif->tif_foundfield = NULL; 379 380 if (tif->tif_fields && tif->tif_nfields > 0) { 381 tif->tif_fields = (TIFFField**) 382 _TIFFCheckRealloc(tif, tif->tif_fields, 383 (tif->tif_nfields + n), 384 sizeof(TIFFField *), reason); 385 } else { 386 tif->tif_fields = (TIFFField **) 387 _TIFFCheckMalloc(tif, n, sizeof(TIFFField *), 388 reason); 389 } 390 if (!tif->tif_fields) { 391 TIFFErrorExt(tif->tif_clientdata, module, 392 "Failed to allocate fields array"); 393 return 0; 394 } 395 396 /* tp = tif->tif_fields + tif->tif_nfields; */ 397 for (i = 0; i < n; i++) { 398 const TIFFField *fip = 399 TIFFFindField(tif, info[i].field_tag, TIFF_ANY); 400 401 /* only add definitions that aren't already present */ 402 if (!fip) { 403 tif->tif_fields[tif->tif_nfields] = (TIFFField *) (info+i); 404 tif->tif_nfields++; 405 } 406 } 407 408 /* Sort the field info by tag number */ 409 qsort(tif->tif_fields, tif->tif_nfields, 410 sizeof(TIFFField *), tagCompare); 411 412 return n; 413 } 414 415 void 416 _TIFFPrintFieldInfo(TIFF* tif, FILE* fd) 417 { 418 uint32 i; 419 420 fprintf(fd, "%s: \n", tif->tif_name); 421 for (i = 0; i < tif->tif_nfields; i++) { 422 const TIFFField* fip = tif->tif_fields[i]; 423 fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n" 424 , (int)i 425 , (unsigned long) fip->field_tag 426 , fip->field_readcount, fip->field_writecount 427 , fip->field_type 428 , fip->field_bit 429 , fip->field_oktochange ? "TRUE" : "FALSE" 430 , fip->field_passcount ? "TRUE" : "FALSE" 431 , fip->field_name 432 ); 433 } 434 } 435 436 /* 437 * Return size of TIFFDataType in bytes 438 */ 439 int 440 TIFFDataWidth(TIFFDataType type) 441 { 442 switch(type) 443 { 444 case 0: /* nothing */ 445 case TIFF_BYTE: 446 case TIFF_ASCII: 447 case TIFF_SBYTE: 448 case TIFF_UNDEFINED: 449 return 1; 450 case TIFF_SHORT: 451 case TIFF_SSHORT: 452 return 2; 453 case TIFF_LONG: 454 case TIFF_SLONG: 455 case TIFF_FLOAT: 456 case TIFF_IFD: 457 return 4; 458 case TIFF_RATIONAL: 459 case TIFF_SRATIONAL: 460 case TIFF_DOUBLE: 461 case TIFF_LONG8: 462 case TIFF_SLONG8: 463 case TIFF_IFD8: 464 return 8; 465 default: 466 return 0; /* will return 0 for unknown types */ 467 } 468 } 469 470 /* 471 * Return size of TIFFDataType in bytes. 472 * 473 * XXX: We need a separate function to determine the space needed 474 * to store the value. For TIFF_RATIONAL values TIFFDataWidth() returns 8, 475 * but we use 4-byte float to represent rationals. 476 */ 477 int 478 _TIFFDataSize(TIFFDataType type) 479 { 480 switch (type) 481 { 482 case TIFF_BYTE: 483 case TIFF_SBYTE: 484 case TIFF_ASCII: 485 case TIFF_UNDEFINED: 486 return 1; 487 case TIFF_SHORT: 488 case TIFF_SSHORT: 489 return 2; 490 case TIFF_LONG: 491 case TIFF_SLONG: 492 case TIFF_FLOAT: 493 case TIFF_IFD: 494 case TIFF_RATIONAL: 495 case TIFF_SRATIONAL: 496 return 4; 497 case TIFF_DOUBLE: 498 case TIFF_LONG8: 499 case TIFF_SLONG8: 500 case TIFF_IFD8: 501 return 8; 502 default: 503 return 0; 504 } 505 } 506 507 const TIFFField* 508 TIFFFindField(TIFF* tif, uint32 tag, TIFFDataType dt) 509 { 510 TIFFField key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0, 0, 0, NULL, NULL}; 511 TIFFField* pkey = &key; 512 const TIFFField **ret; 513 if (tif->tif_foundfield && tif->tif_foundfield->field_tag == tag && 514 (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type)) 515 return tif->tif_foundfield; 516 517 /* If we are invoked with no field information, then just return. */ 518 if (!tif->tif_fields) 519 return NULL; 520 521 /* NB: use sorted search (e.g. binary search) */ 522 523 key.field_tag = tag; 524 key.field_type = dt; 525 526 ret = (const TIFFField **) bsearch(&pkey, tif->tif_fields, 527 tif->tif_nfields, 528 sizeof(TIFFField *), tagCompare); 529 return tif->tif_foundfield = (ret ? *ret : NULL); 530 } 531 532 static const TIFFField* 533 _TIFFFindFieldByName(TIFF* tif, const char *field_name, TIFFDataType dt) 534 { 535 TIFFField key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0, 0, 0, NULL, NULL}; 536 TIFFField* pkey = &key; 537 const TIFFField **ret; 538 if (tif->tif_foundfield 539 && streq(tif->tif_foundfield->field_name, field_name) 540 && (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type)) 541 return (tif->tif_foundfield); 542 543 /* If we are invoked with no field information, then just return. */ 544 if (!tif->tif_fields) 545 return NULL; 546 547 /* NB: use linear search since list is sorted by key#, not name */ 548 549 key.field_name = (char *)field_name; 550 key.field_type = dt; 551 552 ret = (const TIFFField **) 553 td_lfind(&pkey, tif->tif_fields, &tif->tif_nfields, 554 sizeof(TIFFField *), tagNameCompare); 555 556 return tif->tif_foundfield = (ret ? *ret : NULL); 557 } 558 559 const TIFFField* 560 TIFFFieldWithTag(TIFF* tif, uint32 tag) 561 { 562 const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY); 563 if (!fip) { 564 TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithTag", 565 "Internal error, unknown tag 0x%x", 566 (unsigned int) tag); 567 } 568 return (fip); 569 } 570 571 const TIFFField* 572 TIFFFieldWithName(TIFF* tif, const char *field_name) 573 { 574 const TIFFField* fip = 575 _TIFFFindFieldByName(tif, field_name, TIFF_ANY); 576 if (!fip) { 577 TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithName", 578 "Internal error, unknown tag %s", field_name); 579 } 580 return (fip); 581 } 582 583 uint32 584 TIFFFieldTag(const TIFFField* fip) 585 { 586 return fip->field_tag; 587 } 588 589 const char * 590 TIFFFieldName(const TIFFField* fip) 591 { 592 return fip->field_name; 593 } 594 595 TIFFDataType 596 TIFFFieldDataType(const TIFFField* fip) 597 { 598 return fip->field_type; 599 } 600 601 int 602 TIFFFieldPassCount(const TIFFField* fip) 603 { 604 return fip->field_passcount; 605 } 606 607 int 608 TIFFFieldReadCount(const TIFFField* fip) 609 { 610 return fip->field_readcount; 611 } 612 613 int 614 TIFFFieldWriteCount(const TIFFField* fip) 615 { 616 return fip->field_writecount; 617 } 618 619 const TIFFField* 620 _TIFFFindOrRegisterField(TIFF *tif, uint32 tag, TIFFDataType dt) 621 622 { 623 const TIFFField *fld; 624 625 fld = TIFFFindField(tif, tag, dt); 626 if (fld == NULL) { 627 fld = _TIFFCreateAnonField(tif, tag, dt); 628 if (!_TIFFMergeFields(tif, fld, 1)) 629 return NULL; 630 } 631 632 return fld; 633 } 634 635 TIFFField* 636 _TIFFCreateAnonField(TIFF *tif, uint32 tag, TIFFDataType field_type) 637 { 638 TIFFField *fld; 639 (void) tif; 640 641 fld = (TIFFField *) _TIFFmalloc(sizeof (TIFFField)); 642 if (fld == NULL) 643 return NULL; 644 _TIFFmemset(fld, 0, sizeof(TIFFField)); 645 646 fld->field_tag = tag; 647 fld->field_readcount = TIFF_VARIABLE2; 648 fld->field_writecount = TIFF_VARIABLE2; 649 fld->field_type = field_type; 650 fld->reserved = 0; 651 switch (field_type) 652 { 653 case TIFF_BYTE: 654 case TIFF_UNDEFINED: 655 fld->set_field_type = TIFF_SETGET_C32_UINT8; 656 fld->get_field_type = TIFF_SETGET_C32_UINT8; 657 break; 658 case TIFF_ASCII: 659 fld->set_field_type = TIFF_SETGET_C32_ASCII; 660 fld->get_field_type = TIFF_SETGET_C32_ASCII; 661 break; 662 case TIFF_SHORT: 663 fld->set_field_type = TIFF_SETGET_C32_UINT16; 664 fld->get_field_type = TIFF_SETGET_C32_UINT16; 665 break; 666 case TIFF_LONG: 667 fld->set_field_type = TIFF_SETGET_C32_UINT32; 668 fld->get_field_type = TIFF_SETGET_C32_UINT32; 669 break; 670 case TIFF_RATIONAL: 671 case TIFF_SRATIONAL: 672 case TIFF_FLOAT: 673 fld->set_field_type = TIFF_SETGET_C32_FLOAT; 674 fld->get_field_type = TIFF_SETGET_C32_FLOAT; 675 break; 676 case TIFF_SBYTE: 677 fld->set_field_type = TIFF_SETGET_C32_SINT8; 678 fld->get_field_type = TIFF_SETGET_C32_SINT8; 679 break; 680 case TIFF_SSHORT: 681 fld->set_field_type = TIFF_SETGET_C32_SINT16; 682 fld->get_field_type = TIFF_SETGET_C32_SINT16; 683 break; 684 case TIFF_SLONG: 685 fld->set_field_type = TIFF_SETGET_C32_SINT32; 686 fld->get_field_type = TIFF_SETGET_C32_SINT32; 687 break; 688 case TIFF_DOUBLE: 689 fld->set_field_type = TIFF_SETGET_C32_DOUBLE; 690 fld->get_field_type = TIFF_SETGET_C32_DOUBLE; 691 break; 692 case TIFF_IFD: 693 case TIFF_IFD8: 694 fld->set_field_type = TIFF_SETGET_C32_IFD8; 695 fld->get_field_type = TIFF_SETGET_C32_IFD8; 696 break; 697 case TIFF_LONG8: 698 fld->set_field_type = TIFF_SETGET_C32_UINT64; 699 fld->get_field_type = TIFF_SETGET_C32_UINT64; 700 break; 701 case TIFF_SLONG8: 702 fld->set_field_type = TIFF_SETGET_C32_SINT64; 703 fld->get_field_type = TIFF_SETGET_C32_SINT64; 704 break; 705 default: 706 fld->set_field_type = TIFF_SETGET_UNDEFINED; 707 fld->get_field_type = TIFF_SETGET_UNDEFINED; 708 break; 709 } 710 fld->field_bit = FIELD_CUSTOM; 711 fld->field_oktochange = TRUE; 712 fld->field_passcount = TRUE; 713 fld->field_name = (char *) _TIFFmalloc(32); 714 if (fld->field_name == NULL) { 715 _TIFFfree(fld); 716 return NULL; 717 } 718 fld->field_subfields = NULL; 719 720 /* 721 * note that this name is a special sign to TIFFClose() and 722 * _TIFFSetupFields() to free the field 723 */ 724 (void) snprintf(fld->field_name, 32, "Tag %d", (int) tag); 725 726 return fld; 727 } 728 729 /**************************************************************************** 730 * O B S O L E T E D I N T E R F A C E S 731 * 732 * Don't use this stuff in your applications, it may be removed in the future 733 * libtiff versions. 734 ****************************************************************************/ 735 736 static TIFFSetGetFieldType 737 _TIFFSetGetType(TIFFDataType type, short count, unsigned char passcount) 738 { 739 if (type == TIFF_ASCII && count == TIFF_VARIABLE && passcount == 0) 740 return TIFF_SETGET_ASCII; 741 742 else if (count == 1 && passcount == 0) { 743 switch (type) 744 { 745 case TIFF_BYTE: 746 case TIFF_UNDEFINED: 747 return TIFF_SETGET_UINT8; 748 case TIFF_ASCII: 749 return TIFF_SETGET_ASCII; 750 case TIFF_SHORT: 751 return TIFF_SETGET_UINT16; 752 case TIFF_LONG: 753 return TIFF_SETGET_UINT32; 754 case TIFF_RATIONAL: 755 case TIFF_SRATIONAL: 756 case TIFF_FLOAT: 757 return TIFF_SETGET_FLOAT; 758 case TIFF_SBYTE: 759 return TIFF_SETGET_SINT8; 760 case TIFF_SSHORT: 761 return TIFF_SETGET_SINT16; 762 case TIFF_SLONG: 763 return TIFF_SETGET_SINT32; 764 case TIFF_DOUBLE: 765 return TIFF_SETGET_DOUBLE; 766 case TIFF_IFD: 767 case TIFF_IFD8: 768 return TIFF_SETGET_IFD8; 769 case TIFF_LONG8: 770 return TIFF_SETGET_UINT64; 771 case TIFF_SLONG8: 772 return TIFF_SETGET_SINT64; 773 default: 774 return TIFF_SETGET_UNDEFINED; 775 } 776 } 777 778 else if (count >= 1 && passcount == 0) { 779 switch (type) 780 { 781 case TIFF_BYTE: 782 case TIFF_UNDEFINED: 783 return TIFF_SETGET_C0_UINT8; 784 case TIFF_ASCII: 785 return TIFF_SETGET_C0_ASCII; 786 case TIFF_SHORT: 787 return TIFF_SETGET_C0_UINT16; 788 case TIFF_LONG: 789 return TIFF_SETGET_C0_UINT32; 790 case TIFF_RATIONAL: 791 case TIFF_SRATIONAL: 792 case TIFF_FLOAT: 793 return TIFF_SETGET_C0_FLOAT; 794 case TIFF_SBYTE: 795 return TIFF_SETGET_C0_SINT8; 796 case TIFF_SSHORT: 797 return TIFF_SETGET_C0_SINT16; 798 case TIFF_SLONG: 799 return TIFF_SETGET_C0_SINT32; 800 case TIFF_DOUBLE: 801 return TIFF_SETGET_C0_DOUBLE; 802 case TIFF_IFD: 803 case TIFF_IFD8: 804 return TIFF_SETGET_C0_IFD8; 805 case TIFF_LONG8: 806 return TIFF_SETGET_C0_UINT64; 807 case TIFF_SLONG8: 808 return TIFF_SETGET_C0_SINT64; 809 default: 810 return TIFF_SETGET_UNDEFINED; 811 } 812 } 813 814 else if (count == TIFF_VARIABLE && passcount == 1) { 815 switch (type) 816 { 817 case TIFF_BYTE: 818 case TIFF_UNDEFINED: 819 return TIFF_SETGET_C16_UINT8; 820 case TIFF_ASCII: 821 return TIFF_SETGET_C16_ASCII; 822 case TIFF_SHORT: 823 return TIFF_SETGET_C16_UINT16; 824 case TIFF_LONG: 825 return TIFF_SETGET_C16_UINT32; 826 case TIFF_RATIONAL: 827 case TIFF_SRATIONAL: 828 case TIFF_FLOAT: 829 return TIFF_SETGET_C16_FLOAT; 830 case TIFF_SBYTE: 831 return TIFF_SETGET_C16_SINT8; 832 case TIFF_SSHORT: 833 return TIFF_SETGET_C16_SINT16; 834 case TIFF_SLONG: 835 return TIFF_SETGET_C16_SINT32; 836 case TIFF_DOUBLE: 837 return TIFF_SETGET_C16_DOUBLE; 838 case TIFF_IFD: 839 case TIFF_IFD8: 840 return TIFF_SETGET_C16_IFD8; 841 case TIFF_LONG8: 842 return TIFF_SETGET_C16_UINT64; 843 case TIFF_SLONG8: 844 return TIFF_SETGET_C16_SINT64; 845 default: 846 return TIFF_SETGET_UNDEFINED; 847 } 848 } 849 850 else if (count == TIFF_VARIABLE2 && passcount == 1) { 851 switch (type) 852 { 853 case TIFF_BYTE: 854 case TIFF_UNDEFINED: 855 return TIFF_SETGET_C32_UINT8; 856 case TIFF_ASCII: 857 return TIFF_SETGET_C32_ASCII; 858 case TIFF_SHORT: 859 return TIFF_SETGET_C32_UINT16; 860 case TIFF_LONG: 861 return TIFF_SETGET_C32_UINT32; 862 case TIFF_RATIONAL: 863 case TIFF_SRATIONAL: 864 case TIFF_FLOAT: 865 return TIFF_SETGET_C32_FLOAT; 866 case TIFF_SBYTE: 867 return TIFF_SETGET_C32_SINT8; 868 case TIFF_SSHORT: 869 return TIFF_SETGET_C32_SINT16; 870 case TIFF_SLONG: 871 return TIFF_SETGET_C32_SINT32; 872 case TIFF_DOUBLE: 873 return TIFF_SETGET_C32_DOUBLE; 874 case TIFF_IFD: 875 case TIFF_IFD8: 876 return TIFF_SETGET_C32_IFD8; 877 case TIFF_LONG8: 878 return TIFF_SETGET_C32_UINT64; 879 case TIFF_SLONG8: 880 return TIFF_SETGET_C32_SINT64; 881 default: 882 return TIFF_SETGET_UNDEFINED; 883 } 884 } 885 886 return TIFF_SETGET_UNDEFINED; 887 } 888 889 int 890 TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], uint32 n) 891 { 892 static const char module[] = "TIFFMergeFieldInfo"; 893 static const char reason[] = "for fields array"; 894 TIFFField *tp; 895 size_t nfields; 896 uint32 i; 897 898 if (tif->tif_nfieldscompat > 0) { 899 tif->tif_fieldscompat = (TIFFFieldArray *) 900 _TIFFCheckRealloc(tif, tif->tif_fieldscompat, 901 tif->tif_nfieldscompat + 1, 902 sizeof(TIFFFieldArray), reason); 903 } else { 904 tif->tif_fieldscompat = (TIFFFieldArray *) 905 _TIFFCheckMalloc(tif, 1, sizeof(TIFFFieldArray), 906 reason); 907 } 908 if (!tif->tif_fieldscompat) { 909 TIFFErrorExt(tif->tif_clientdata, module, 910 "Failed to allocate fields array"); 911 return -1; 912 } 913 nfields = tif->tif_nfieldscompat++; 914 915 tif->tif_fieldscompat[nfields].type = tfiatOther; 916 tif->tif_fieldscompat[nfields].allocated_size = n; 917 tif->tif_fieldscompat[nfields].count = n; 918 tif->tif_fieldscompat[nfields].fields = 919 (TIFFField *)_TIFFCheckMalloc(tif, n, sizeof(TIFFField), 920 reason); 921 if (!tif->tif_fieldscompat[nfields].fields) { 922 TIFFErrorExt(tif->tif_clientdata, module, 923 "Failed to allocate fields array"); 924 return -1; 925 } 926 927 tp = tif->tif_fieldscompat[nfields].fields; 928 for (i = 0; i < n; i++) { 929 tp->field_tag = info[i].field_tag; 930 tp->field_readcount = info[i].field_readcount; 931 tp->field_writecount = info[i].field_writecount; 932 tp->field_type = info[i].field_type; 933 tp->reserved = 0; 934 tp->set_field_type = 935 _TIFFSetGetType(info[i].field_type, 936 info[i].field_readcount, 937 info[i].field_passcount); 938 tp->get_field_type = 939 _TIFFSetGetType(info[i].field_type, 940 info[i].field_readcount, 941 info[i].field_passcount); 942 tp->field_bit = info[i].field_bit; 943 tp->field_oktochange = info[i].field_oktochange; 944 tp->field_passcount = info[i].field_passcount; 945 tp->field_name = info[i].field_name; 946 tp->field_subfields = NULL; 947 tp++; 948 } 949 950 if (!_TIFFMergeFields(tif, tif->tif_fieldscompat[nfields].fields, n)) { 951 TIFFErrorExt(tif->tif_clientdata, module, 952 "Setting up field info failed"); 953 return -1; 954 } 955 956 return 0; 957 } 958 959 int 960 _TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag) 961 { 962 /* Filter out non-codec specific tags */ 963 switch (tag) { 964 /* Shared tags */ 965 case TIFFTAG_PREDICTOR: 966 /* JPEG tags */ 967 case TIFFTAG_JPEGTABLES: 968 /* OJPEG tags */ 969 case TIFFTAG_JPEGIFOFFSET: 970 case TIFFTAG_JPEGIFBYTECOUNT: 971 case TIFFTAG_JPEGQTABLES: 972 case TIFFTAG_JPEGDCTABLES: 973 case TIFFTAG_JPEGACTABLES: 974 case TIFFTAG_JPEGPROC: 975 case TIFFTAG_JPEGRESTARTINTERVAL: 976 /* CCITT* */ 977 case TIFFTAG_BADFAXLINES: 978 case TIFFTAG_CLEANFAXDATA: 979 case TIFFTAG_CONSECUTIVEBADFAXLINES: 980 case TIFFTAG_GROUP3OPTIONS: 981 case TIFFTAG_GROUP4OPTIONS: 982 break; 983 default: 984 return 1; 985 } 986 /* Check if codec specific tags are allowed for the current 987 * compression scheme (codec) */ 988 switch (tif->tif_dir.td_compression) { 989 case COMPRESSION_LZW: 990 if (tag == TIFFTAG_PREDICTOR) 991 return 1; 992 break; 993 case COMPRESSION_PACKBITS: 994 /* No codec-specific tags */ 995 break; 996 case COMPRESSION_THUNDERSCAN: 997 /* No codec-specific tags */ 998 break; 999 case COMPRESSION_NEXT: 1000 /* No codec-specific tags */ 1001 break; 1002 case COMPRESSION_JPEG: 1003 if (tag == TIFFTAG_JPEGTABLES) 1004 return 1; 1005 break; 1006 case COMPRESSION_OJPEG: 1007 switch (tag) { 1008 case TIFFTAG_JPEGIFOFFSET: 1009 case TIFFTAG_JPEGIFBYTECOUNT: 1010 case TIFFTAG_JPEGQTABLES: 1011 case TIFFTAG_JPEGDCTABLES: 1012 case TIFFTAG_JPEGACTABLES: 1013 case TIFFTAG_JPEGPROC: 1014 case TIFFTAG_JPEGRESTARTINTERVAL: 1015 return 1; 1016 } 1017 break; 1018 case COMPRESSION_CCITTRLE: 1019 case COMPRESSION_CCITTRLEW: 1020 case COMPRESSION_CCITTFAX3: 1021 case COMPRESSION_CCITTFAX4: 1022 switch (tag) { 1023 case TIFFTAG_BADFAXLINES: 1024 case TIFFTAG_CLEANFAXDATA: 1025 case TIFFTAG_CONSECUTIVEBADFAXLINES: 1026 return 1; 1027 case TIFFTAG_GROUP3OPTIONS: 1028 if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX3) 1029 return 1; 1030 break; 1031 case TIFFTAG_GROUP4OPTIONS: 1032 if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4) 1033 return 1; 1034 break; 1035 } 1036 break; 1037 case COMPRESSION_JBIG: 1038 /* No codec-specific tags */ 1039 break; 1040 case COMPRESSION_DEFLATE: 1041 case COMPRESSION_ADOBE_DEFLATE: 1042 if (tag == TIFFTAG_PREDICTOR) 1043 return 1; 1044 break; 1045 case COMPRESSION_PIXARLOG: 1046 if (tag == TIFFTAG_PREDICTOR) 1047 return 1; 1048 break; 1049 case COMPRESSION_SGILOG: 1050 case COMPRESSION_SGILOG24: 1051 /* No codec-specific tags */ 1052 break; 1053 case COMPRESSION_LZMA: 1054 if (tag == TIFFTAG_PREDICTOR) 1055 return 1; 1056 break; 1057 1058 } 1059 return 0; 1060 } 1061 1062 /* vim: set ts=8 sts=8 sw=8 noet: */ 1063 1064 /* 1065 * Local Variables: 1066 * mode: c 1067 * c-basic-offset: 8 1068 * fill-column: 78 1069 * End: 1070 */ 1071