tif_dirinfo.c
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:32k
源码类别:

打印编程

开发平台:

Visual C++

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