ReactOS Fundraising Campaign 2012
 
€ 3,303 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

tif_dirinfo.c

Go to the documentation of this file.
00001 /* $Id: tif_dirinfo.c,v 1.65.2.9 2010-06-09 21:15:27 bfriesen Exp $ */
00002 
00003 /*
00004  * Copyright (c) 1988-1997 Sam Leffler
00005  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
00006  *
00007  * Permission to use, copy, modify, distribute, and sell this software and 
00008  * its documentation for any purpose is hereby granted without fee, provided
00009  * that (i) the above copyright notices and this permission notice appear in
00010  * all copies of the software and related documentation, and (ii) the names of
00011  * Sam Leffler and Silicon Graphics may not be used in any advertising or
00012  * publicity relating to the software without the specific, prior written
00013  * permission of Sam Leffler and Silicon Graphics.
00014  * 
00015  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
00016  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
00017  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
00018  * 
00019  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
00020  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
00021  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
00022  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
00023  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
00024  * OF THIS SOFTWARE.
00025  */
00026 
00027 /*
00028  * TIFF Library.
00029  *
00030  * Core Directory Tag Support.
00031  */
00032 #include "tiffiop.h"
00033 #include <stdlib.h>
00034 #include <string.h>
00035 
00036 /*
00037  * NB: NB: THIS ARRAY IS ASSUMED TO BE SORTED BY TAG.
00038  *       If a tag can have both LONG and SHORT types then the LONG must be
00039  *       placed before the SHORT for writing to work properly.
00040  *
00041  * NOTE: The second field (field_readcount) and third field (field_writecount)
00042  *       sometimes use the values TIFF_VARIABLE (-1), TIFF_VARIABLE2 (-3)
00043  *       and TIFFTAG_SPP (-2). The macros should be used but would throw off 
00044  *       the formatting of the code, so please interprete the -1, -2 and -3 
00045  *       values accordingly.
00046  */
00047 static const TIFFFieldInfo
00048 tiffFieldInfo[] = {
00049     { TIFFTAG_SUBFILETYPE,   1, 1,  TIFF_LONG,  FIELD_SUBFILETYPE,
00050       1,    0,  "SubfileType" },
00051 /* XXX SHORT for compatibility w/ old versions of the library */
00052     { TIFFTAG_SUBFILETYPE,   1, 1,  TIFF_SHORT, FIELD_SUBFILETYPE,
00053       1,    0,  "SubfileType" },
00054     { TIFFTAG_OSUBFILETYPE,  1, 1,  TIFF_SHORT, FIELD_SUBFILETYPE,
00055       1,    0,  "OldSubfileType" },
00056     { TIFFTAG_IMAGEWIDTH,    1, 1,  TIFF_LONG,  FIELD_IMAGEDIMENSIONS,
00057       0,    0,  "ImageWidth" },
00058     { TIFFTAG_IMAGEWIDTH,    1, 1,  TIFF_SHORT, FIELD_IMAGEDIMENSIONS,
00059       0,    0,  "ImageWidth" },
00060     { TIFFTAG_IMAGELENGTH,   1, 1,  TIFF_LONG,  FIELD_IMAGEDIMENSIONS,
00061       1,    0,  "ImageLength" },
00062     { TIFFTAG_IMAGELENGTH,   1, 1,  TIFF_SHORT, FIELD_IMAGEDIMENSIONS,
00063       1,    0,  "ImageLength" },
00064     { TIFFTAG_BITSPERSAMPLE,    -1,-1,  TIFF_SHORT, FIELD_BITSPERSAMPLE,
00065       0,    0,  "BitsPerSample" },
00066 /* XXX LONG for compatibility with some broken TIFF writers */
00067     { TIFFTAG_BITSPERSAMPLE,    -1,-1,  TIFF_LONG,  FIELD_BITSPERSAMPLE,
00068       0,    0,  "BitsPerSample" },
00069     { TIFFTAG_COMPRESSION,  -1, 1,  TIFF_SHORT, FIELD_COMPRESSION,
00070       0,    0,  "Compression" },
00071 /* XXX LONG for compatibility with some broken TIFF writers */
00072     { TIFFTAG_COMPRESSION,  -1, 1,  TIFF_LONG,  FIELD_COMPRESSION,
00073       0,    0,  "Compression" },
00074     { TIFFTAG_PHOTOMETRIC,   1, 1,  TIFF_SHORT, FIELD_PHOTOMETRIC,
00075       0,    0,  "PhotometricInterpretation" },
00076 /* XXX LONG for compatibility with some broken TIFF writers */
00077     { TIFFTAG_PHOTOMETRIC,   1, 1,  TIFF_LONG,  FIELD_PHOTOMETRIC,
00078       0,    0,  "PhotometricInterpretation" },
00079     { TIFFTAG_THRESHHOLDING,     1, 1,  TIFF_SHORT, FIELD_THRESHHOLDING,
00080       1,    0,  "Threshholding" },
00081     { TIFFTAG_CELLWIDTH,     1, 1,  TIFF_SHORT, FIELD_IGNORE,
00082       1,    0,  "CellWidth" },
00083     { TIFFTAG_CELLLENGTH,    1, 1,  TIFF_SHORT, FIELD_IGNORE,
00084       1,    0,  "CellLength" },
00085     { TIFFTAG_FILLORDER,     1, 1,  TIFF_SHORT, FIELD_FILLORDER,
00086       0,    0,  "FillOrder" },
00087     { TIFFTAG_DOCUMENTNAME, -1,-1,  TIFF_ASCII, FIELD_CUSTOM,
00088       1,    0,  "DocumentName" },
00089     { TIFFTAG_IMAGEDESCRIPTION, -1,-1,  TIFF_ASCII, FIELD_CUSTOM,
00090       1,    0,  "ImageDescription" },
00091     { TIFFTAG_MAKE,     -1,-1,  TIFF_ASCII, FIELD_CUSTOM,
00092       1,    0,  "Make" },
00093     { TIFFTAG_MODEL,        -1,-1,  TIFF_ASCII, FIELD_CUSTOM,
00094       1,    0,  "Model" },
00095     { TIFFTAG_STRIPOFFSETS, -1,-1,  TIFF_LONG,  FIELD_STRIPOFFSETS,
00096       0,    0,  "StripOffsets" },
00097     { TIFFTAG_STRIPOFFSETS, -1,-1,  TIFF_SHORT, FIELD_STRIPOFFSETS,
00098       0,    0,  "StripOffsets" },
00099     { TIFFTAG_ORIENTATION,   1, 1,  TIFF_SHORT, FIELD_ORIENTATION,
00100       0,    0,  "Orientation" },
00101     { TIFFTAG_SAMPLESPERPIXEL,   1, 1,  TIFF_SHORT, FIELD_SAMPLESPERPIXEL,
00102       0,    0,  "SamplesPerPixel" },
00103     { TIFFTAG_ROWSPERSTRIP,  1, 1,  TIFF_LONG,  FIELD_ROWSPERSTRIP,
00104       0,    0,  "RowsPerStrip" },
00105     { TIFFTAG_ROWSPERSTRIP,  1, 1,  TIFF_SHORT, FIELD_ROWSPERSTRIP,
00106       0,    0,  "RowsPerStrip" },
00107     { TIFFTAG_STRIPBYTECOUNTS,  -1,-1,  TIFF_LONG,  FIELD_STRIPBYTECOUNTS,
00108       0,    0,  "StripByteCounts" },
00109     { TIFFTAG_STRIPBYTECOUNTS,  -1,-1,  TIFF_SHORT, FIELD_STRIPBYTECOUNTS,
00110       0,    0,  "StripByteCounts" },
00111     { TIFFTAG_MINSAMPLEVALUE,   -2,-1,  TIFF_SHORT, FIELD_MINSAMPLEVALUE,
00112       1,    0,  "MinSampleValue" },
00113     { TIFFTAG_MAXSAMPLEVALUE,   -2,-1,  TIFF_SHORT, FIELD_MAXSAMPLEVALUE,
00114       1,    0,  "MaxSampleValue" },
00115     { TIFFTAG_XRESOLUTION,   1, 1,  TIFF_RATIONAL,  FIELD_RESOLUTION,
00116       1,    0,  "XResolution" },
00117     { TIFFTAG_YRESOLUTION,   1, 1,  TIFF_RATIONAL,  FIELD_RESOLUTION,
00118       1,    0,  "YResolution" },
00119     { TIFFTAG_PLANARCONFIG,  1, 1,  TIFF_SHORT, FIELD_PLANARCONFIG,
00120       0,    0,  "PlanarConfiguration" },
00121     { TIFFTAG_PAGENAME,     -1,-1,  TIFF_ASCII, FIELD_CUSTOM,
00122       1,    0,  "PageName" },
00123     { TIFFTAG_XPOSITION,     1, 1,  TIFF_RATIONAL,  FIELD_POSITION,
00124       1,    0,  "XPosition" },
00125     { TIFFTAG_YPOSITION,     1, 1,  TIFF_RATIONAL,  FIELD_POSITION,
00126       1,    0,  "YPosition" },
00127     { TIFFTAG_FREEOFFSETS,  -1,-1,  TIFF_LONG,  FIELD_IGNORE,
00128       0,    0,  "FreeOffsets" },
00129     { TIFFTAG_FREEBYTECOUNTS,   -1,-1,  TIFF_LONG,  FIELD_IGNORE,
00130       0,    0,  "FreeByteCounts" },
00131     { TIFFTAG_GRAYRESPONSEUNIT,  1, 1,  TIFF_SHORT, FIELD_IGNORE,
00132       1,    0,  "GrayResponseUnit" },
00133     { TIFFTAG_GRAYRESPONSECURVE,-1,-1,  TIFF_SHORT, FIELD_IGNORE,
00134       1,    0,  "GrayResponseCurve" },
00135     { TIFFTAG_RESOLUTIONUNIT,    1, 1,  TIFF_SHORT, FIELD_RESOLUTIONUNIT,
00136       1,    0,  "ResolutionUnit" },
00137     { TIFFTAG_PAGENUMBER,    2, 2,  TIFF_SHORT, FIELD_PAGENUMBER,
00138       1,    0,  "PageNumber" },
00139     { TIFFTAG_COLORRESPONSEUNIT, 1, 1,  TIFF_SHORT, FIELD_IGNORE,
00140       1,    0,  "ColorResponseUnit" },
00141     { TIFFTAG_TRANSFERFUNCTION, -1,-1,  TIFF_SHORT, FIELD_TRANSFERFUNCTION,
00142       1,    0,  "TransferFunction" },
00143     { TIFFTAG_SOFTWARE,     -1,-1,  TIFF_ASCII, FIELD_CUSTOM,
00144       1,    0,  "Software" },
00145     { TIFFTAG_DATETIME,     20,20,  TIFF_ASCII, FIELD_CUSTOM,
00146       1,    0,  "DateTime" },
00147     { TIFFTAG_ARTIST,       -1,-1,  TIFF_ASCII, FIELD_CUSTOM,
00148       1,    0,  "Artist" },
00149     { TIFFTAG_HOSTCOMPUTER, -1,-1,  TIFF_ASCII, FIELD_CUSTOM,
00150       1,    0,  "HostComputer" },
00151     { TIFFTAG_WHITEPOINT,    2, 2,  TIFF_RATIONAL,  FIELD_CUSTOM,
00152       1,    0,  "WhitePoint" },
00153     { TIFFTAG_PRIMARYCHROMATICITIES,6,6,TIFF_RATIONAL,  FIELD_CUSTOM,
00154       1,    0,  "PrimaryChromaticities" },
00155     { TIFFTAG_COLORMAP,     -1,-1,  TIFF_SHORT, FIELD_COLORMAP,
00156       1,    0,  "ColorMap" },
00157     { TIFFTAG_HALFTONEHINTS,     2, 2,  TIFF_SHORT, FIELD_HALFTONEHINTS,
00158       1,    0,  "HalftoneHints" },
00159     { TIFFTAG_TILEWIDTH,     1, 1,  TIFF_LONG,  FIELD_TILEDIMENSIONS,
00160       0,    0,  "TileWidth" },
00161     { TIFFTAG_TILEWIDTH,     1, 1,  TIFF_SHORT, FIELD_TILEDIMENSIONS,
00162       0,    0,  "TileWidth" },
00163     { TIFFTAG_TILELENGTH,    1, 1,  TIFF_LONG,  FIELD_TILEDIMENSIONS,
00164       0,    0,  "TileLength" },
00165     { TIFFTAG_TILELENGTH,    1, 1,  TIFF_SHORT, FIELD_TILEDIMENSIONS,
00166       0,    0,  "TileLength" },
00167     { TIFFTAG_TILEOFFSETS,  -1, 1,  TIFF_LONG,  FIELD_STRIPOFFSETS,
00168       0,    0,  "TileOffsets" },
00169     { TIFFTAG_TILEBYTECOUNTS,   -1, 1,  TIFF_LONG,  FIELD_STRIPBYTECOUNTS,
00170       0,    0,  "TileByteCounts" },
00171     { TIFFTAG_TILEBYTECOUNTS,   -1, 1,  TIFF_SHORT, FIELD_STRIPBYTECOUNTS,
00172       0,    0,  "TileByteCounts" },
00173     { TIFFTAG_SUBIFD,       -1,-1,  TIFF_IFD,   FIELD_SUBIFD,
00174       1,    1,  "SubIFD" },
00175     { TIFFTAG_SUBIFD,       -1,-1,  TIFF_LONG,  FIELD_SUBIFD,
00176       1,    1,  "SubIFD" },
00177     { TIFFTAG_INKSET,        1, 1,  TIFF_SHORT, FIELD_CUSTOM,
00178       0,    0,  "InkSet" },
00179     { TIFFTAG_INKNAMES,     -1,-1,  TIFF_ASCII, FIELD_INKNAMES,
00180       1,    1,  "InkNames" },
00181     { TIFFTAG_NUMBEROFINKS,  1, 1,  TIFF_SHORT, FIELD_CUSTOM,
00182       1,    0,  "NumberOfInks" },
00183     { TIFFTAG_DOTRANGE,      2, 2,  TIFF_SHORT, FIELD_CUSTOM,
00184       0,    0,  "DotRange" },
00185     { TIFFTAG_DOTRANGE,      2, 2,  TIFF_BYTE,  FIELD_CUSTOM,
00186       0,    0,  "DotRange" },
00187     { TIFFTAG_TARGETPRINTER,    -1,-1,  TIFF_ASCII, FIELD_CUSTOM,
00188       1,    0,  "TargetPrinter" },
00189     { TIFFTAG_EXTRASAMPLES, -1,-1,  TIFF_SHORT, FIELD_EXTRASAMPLES,
00190       0,    1,  "ExtraSamples" },
00191 /* XXX for bogus Adobe Photoshop v2.5 files */
00192     { TIFFTAG_EXTRASAMPLES, -1,-1,  TIFF_BYTE,  FIELD_EXTRASAMPLES,
00193       0,    1,  "ExtraSamples" },
00194     { TIFFTAG_SAMPLEFORMAT, -1,-1,  TIFF_SHORT, FIELD_SAMPLEFORMAT,
00195       0,    0,  "SampleFormat" },
00196     { TIFFTAG_SMINSAMPLEVALUE,  -2,-1,  TIFF_ANY,   FIELD_SMINSAMPLEVALUE,
00197       1,    0,  "SMinSampleValue" },
00198     { TIFFTAG_SMAXSAMPLEVALUE,  -2,-1,  TIFF_ANY,   FIELD_SMAXSAMPLEVALUE,
00199       1,    0,  "SMaxSampleValue" },
00200     { TIFFTAG_CLIPPATH,     -1, -3, TIFF_BYTE,  FIELD_CUSTOM,
00201       0,    1,  "ClipPath" },
00202     { TIFFTAG_XCLIPPATHUNITS,    1, 1,  TIFF_SLONG, FIELD_CUSTOM,
00203       0,    0,  "XClipPathUnits" },
00204     { TIFFTAG_XCLIPPATHUNITS,    1, 1,  TIFF_SSHORT,    FIELD_CUSTOM,
00205       0,    0,  "XClipPathUnits" },
00206     { TIFFTAG_XCLIPPATHUNITS,    1, 1,  TIFF_SBYTE, FIELD_CUSTOM,
00207       0,    0,  "XClipPathUnits" },
00208     { TIFFTAG_YCLIPPATHUNITS,    1, 1,  TIFF_SLONG, FIELD_CUSTOM,
00209       0,    0,  "YClipPathUnits" },
00210     { TIFFTAG_YCLIPPATHUNITS,    1, 1,  TIFF_SSHORT,    FIELD_CUSTOM,
00211       0,    0,  "YClipPathUnits" },
00212     { TIFFTAG_YCLIPPATHUNITS,    1, 1,  TIFF_SBYTE, FIELD_CUSTOM,
00213       0,    0,  "YClipPathUnits" },
00214     { TIFFTAG_YCBCRCOEFFICIENTS, 3, 3,  TIFF_RATIONAL,  FIELD_CUSTOM,
00215       0,    0,  "YCbCrCoefficients" },
00216     { TIFFTAG_YCBCRSUBSAMPLING,  2, 2,  TIFF_SHORT, FIELD_YCBCRSUBSAMPLING,
00217       0,    0,  "YCbCrSubsampling" },
00218     { TIFFTAG_YCBCRPOSITIONING,  1, 1,  TIFF_SHORT, FIELD_YCBCRPOSITIONING,
00219       0,    0,  "YCbCrPositioning" },
00220     { TIFFTAG_REFERENCEBLACKWHITE, 6, 6, TIFF_RATIONAL, FIELD_REFBLACKWHITE,
00221       1,    0,  "ReferenceBlackWhite" },
00222 /* XXX temporarily accept LONG for backwards compatibility */
00223     { TIFFTAG_REFERENCEBLACKWHITE, 6, 6, TIFF_LONG, FIELD_REFBLACKWHITE,
00224       1,    0,  "ReferenceBlackWhite" },
00225     { TIFFTAG_XMLPACKET,    -3,-3,  TIFF_BYTE,  FIELD_CUSTOM,
00226       0,    1,  "XMLPacket" },
00227 /* begin SGI tags */
00228     { TIFFTAG_MATTEING,      1, 1,  TIFF_SHORT, FIELD_EXTRASAMPLES,
00229       0,    0,  "Matteing" },
00230     { TIFFTAG_DATATYPE,     -2,-1,  TIFF_SHORT, FIELD_SAMPLEFORMAT,
00231       0,    0,  "DataType" },
00232     { TIFFTAG_IMAGEDEPTH,    1, 1,  TIFF_LONG,  FIELD_IMAGEDEPTH,
00233       0,    0,  "ImageDepth" },
00234     { TIFFTAG_IMAGEDEPTH,    1, 1,  TIFF_SHORT, FIELD_IMAGEDEPTH,
00235       0,    0,  "ImageDepth" },
00236     { TIFFTAG_TILEDEPTH,     1, 1,  TIFF_LONG,  FIELD_TILEDEPTH,
00237       0,    0,  "TileDepth" },
00238     { TIFFTAG_TILEDEPTH,     1, 1,  TIFF_SHORT, FIELD_TILEDEPTH,
00239       0,    0,  "TileDepth" },
00240 /* end SGI tags */
00241 /* begin Pixar tags */
00242     { TIFFTAG_PIXAR_IMAGEFULLWIDTH,  1, 1, TIFF_LONG,   FIELD_CUSTOM,
00243       1,    0,  "ImageFullWidth" },
00244     { TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG,   FIELD_CUSTOM,
00245       1,    0,  "ImageFullLength" },
00246     { TIFFTAG_PIXAR_TEXTUREFORMAT,  -1, -1, TIFF_ASCII, FIELD_CUSTOM,
00247       1,    0,  "TextureFormat" },
00248     { TIFFTAG_PIXAR_WRAPMODES,      -1, -1, TIFF_ASCII, FIELD_CUSTOM,
00249       1,    0,  "TextureWrapModes" },
00250     { TIFFTAG_PIXAR_FOVCOT,      1, 1, TIFF_FLOAT,  FIELD_CUSTOM,
00251       1,    0,  "FieldOfViewCotangent" },
00252     { TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN,   16,16,  TIFF_FLOAT,
00253       FIELD_CUSTOM, 1,  0,  "MatrixWorldToScreen" },
00254     { TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA,   16,16,  TIFF_FLOAT,
00255        FIELD_CUSTOM,    1,  0,  "MatrixWorldToCamera" },
00256     { TIFFTAG_COPYRIGHT,    -1, -1, TIFF_ASCII, FIELD_CUSTOM,
00257       1,    0,  "Copyright" },
00258 /* end Pixar tags */
00259     { TIFFTAG_RICHTIFFIPTC, -3, -3, TIFF_LONG,  FIELD_CUSTOM, 
00260       0,    1,   "RichTIFFIPTC" },
00261     { TIFFTAG_PHOTOSHOP,    -3, -3, TIFF_BYTE,  FIELD_CUSTOM, 
00262       0,    1,   "Photoshop" },
00263     { TIFFTAG_EXIFIFD,      1, 1,   TIFF_LONG,  FIELD_CUSTOM,
00264       0,    0,  "EXIFIFDOffset" },
00265     { TIFFTAG_ICCPROFILE,   -3, -3, TIFF_UNDEFINED, FIELD_CUSTOM,
00266       0,    1,  "ICC Profile" },
00267     { TIFFTAG_GPSIFD,       1, 1,   TIFF_LONG,  FIELD_CUSTOM,
00268       0,    0,  "GPSIFDOffset" },
00269     { TIFFTAG_STONITS,       1, 1,  TIFF_DOUBLE,    FIELD_CUSTOM,
00270       0,    0,  "StoNits" },
00271     { TIFFTAG_INTEROPERABILITYIFD, 1, 1, TIFF_LONG, FIELD_CUSTOM,
00272       0,    0,  "InteroperabilityIFDOffset" },
00273 /* begin DNG tags */
00274     { TIFFTAG_DNGVERSION,   4, 4,   TIFF_BYTE,  FIELD_CUSTOM, 
00275       0,    0,  "DNGVersion" },
00276     { TIFFTAG_DNGBACKWARDVERSION, 4, 4, TIFF_BYTE,  FIELD_CUSTOM, 
00277       0,    0,  "DNGBackwardVersion" },
00278     { TIFFTAG_UNIQUECAMERAMODEL,    -1, -1, TIFF_ASCII, FIELD_CUSTOM,
00279       1,    0,  "UniqueCameraModel" },
00280     { TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
00281       1,    0,  "LocalizedCameraModel" },
00282     { TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_BYTE,  FIELD_CUSTOM,
00283       1,    1,  "LocalizedCameraModel" },
00284     { TIFFTAG_CFAPLANECOLOR,    -1, -1, TIFF_BYTE,  FIELD_CUSTOM, 
00285       0,    1,  "CFAPlaneColor" },
00286     { TIFFTAG_CFALAYOUT,    1, 1,   TIFF_SHORT, FIELD_CUSTOM, 
00287       0,    0,  "CFALayout" },
00288     { TIFFTAG_LINEARIZATIONTABLE, -1, -1, TIFF_SHORT,   FIELD_CUSTOM, 
00289       0,    1,  "LinearizationTable" },
00290     { TIFFTAG_BLACKLEVELREPEATDIM, 2, 2, TIFF_SHORT,    FIELD_CUSTOM, 
00291       0,    0,  "BlackLevelRepeatDim" },
00292     { TIFFTAG_BLACKLEVEL,   -1, -1, TIFF_LONG,  FIELD_CUSTOM, 
00293       0,    1,  "BlackLevel" },
00294     { TIFFTAG_BLACKLEVEL,   -1, -1, TIFF_SHORT, FIELD_CUSTOM, 
00295       0,    1,  "BlackLevel" },
00296     { TIFFTAG_BLACKLEVEL,   -1, -1, TIFF_RATIONAL,  FIELD_CUSTOM, 
00297       0,    1,  "BlackLevel" },
00298     { TIFFTAG_BLACKLEVELDELTAH, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
00299       0,    1,  "BlackLevelDeltaH" },
00300     { TIFFTAG_BLACKLEVELDELTAV, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
00301       0,    1,  "BlackLevelDeltaV" },
00302     { TIFFTAG_WHITELEVEL,   -2, -2, TIFF_LONG,  FIELD_CUSTOM, 
00303       0,    0,  "WhiteLevel" },
00304     { TIFFTAG_WHITELEVEL,   -2, -2, TIFF_SHORT, FIELD_CUSTOM, 
00305       0,    0,  "WhiteLevel" },
00306     { TIFFTAG_DEFAULTSCALE, 2, 2,   TIFF_RATIONAL,  FIELD_CUSTOM, 
00307       0,    0,  "DefaultScale" },
00308     { TIFFTAG_BESTQUALITYSCALE, 1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
00309       0,    0,  "BestQualityScale" },
00310     { TIFFTAG_DEFAULTCROPORIGIN,    2, 2,   TIFF_LONG,  FIELD_CUSTOM, 
00311       0,    0,  "DefaultCropOrigin" },
00312     { TIFFTAG_DEFAULTCROPORIGIN,    2, 2,   TIFF_SHORT, FIELD_CUSTOM, 
00313       0,    0,  "DefaultCropOrigin" },
00314     { TIFFTAG_DEFAULTCROPORIGIN,    2, 2,   TIFF_RATIONAL,  FIELD_CUSTOM, 
00315       0,    0,  "DefaultCropOrigin" },
00316     { TIFFTAG_DEFAULTCROPSIZE,  2, 2,   TIFF_LONG,  FIELD_CUSTOM, 
00317       0,    0,  "DefaultCropSize" },
00318     { TIFFTAG_DEFAULTCROPSIZE,  2, 2,   TIFF_SHORT, FIELD_CUSTOM, 
00319       0,    0,  "DefaultCropSize" },
00320     { TIFFTAG_DEFAULTCROPSIZE,  2, 2,   TIFF_RATIONAL,  FIELD_CUSTOM, 
00321       0,    0,  "DefaultCropSize" },
00322     { TIFFTAG_COLORMATRIX1, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
00323       0,    1,  "ColorMatrix1" },
00324     { TIFFTAG_COLORMATRIX2, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
00325       0,    1,  "ColorMatrix2" },
00326     { TIFFTAG_CAMERACALIBRATION1,   -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
00327       0,    1,  "CameraCalibration1" },
00328     { TIFFTAG_CAMERACALIBRATION2,   -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
00329       0,    1,  "CameraCalibration2" },
00330     { TIFFTAG_REDUCTIONMATRIX1, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
00331       0,    1,  "ReductionMatrix1" },
00332     { TIFFTAG_REDUCTIONMATRIX2, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
00333       0,    1,  "ReductionMatrix2" },
00334     { TIFFTAG_ANALOGBALANCE,    -1, -1, TIFF_RATIONAL,  FIELD_CUSTOM, 
00335       0,    1,  "AnalogBalance" },
00336     { TIFFTAG_ASSHOTNEUTRAL,    -1, -1, TIFF_SHORT, FIELD_CUSTOM, 
00337       0,    1,  "AsShotNeutral" },
00338     { TIFFTAG_ASSHOTNEUTRAL,    -1, -1, TIFF_RATIONAL,  FIELD_CUSTOM, 
00339       0,    1,  "AsShotNeutral" },
00340     { TIFFTAG_ASSHOTWHITEXY,    2, 2,   TIFF_RATIONAL,  FIELD_CUSTOM, 
00341       0,    0,  "AsShotWhiteXY" },
00342     { TIFFTAG_BASELINEEXPOSURE, 1, 1,   TIFF_SRATIONAL, FIELD_CUSTOM, 
00343       0,    0,  "BaselineExposure" },
00344     { TIFFTAG_BASELINENOISE,    1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
00345       0,    0,  "BaselineNoise" },
00346     { TIFFTAG_BASELINESHARPNESS,    1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
00347       0,    0,  "BaselineSharpness" },
00348     { TIFFTAG_BAYERGREENSPLIT,  1, 1,   TIFF_LONG,  FIELD_CUSTOM, 
00349       0,    0,  "BayerGreenSplit" },
00350     { TIFFTAG_LINEARRESPONSELIMIT,  1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
00351       0,    0,  "LinearResponseLimit" },
00352     { TIFFTAG_CAMERASERIALNUMBER,    -1, -1, TIFF_ASCII,    FIELD_CUSTOM,
00353       1,    0,  "CameraSerialNumber" },
00354     { TIFFTAG_LENSINFO, 4, 4,   TIFF_RATIONAL,  FIELD_CUSTOM, 
00355       0,    0,  "LensInfo" },
00356     { TIFFTAG_CHROMABLURRADIUS, 1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
00357       0,    0,  "ChromaBlurRadius" },
00358     { TIFFTAG_ANTIALIASSTRENGTH,    1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
00359       0,    0,  "AntiAliasStrength" },
00360     { TIFFTAG_SHADOWSCALE,  1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
00361       0,    0,  "ShadowScale" },
00362     { TIFFTAG_DNGPRIVATEDATA,    -1, -1, TIFF_BYTE, FIELD_CUSTOM,
00363       0,    1,  "DNGPrivateData" },
00364     { TIFFTAG_MAKERNOTESAFETY,  1, 1,   TIFF_SHORT, FIELD_CUSTOM, 
00365       0,    0,  "MakerNoteSafety" },
00366     { TIFFTAG_CALIBRATIONILLUMINANT1,   1, 1,   TIFF_SHORT, FIELD_CUSTOM, 
00367       0,    0,  "CalibrationIlluminant1" },
00368     { TIFFTAG_CALIBRATIONILLUMINANT2,   1, 1,   TIFF_SHORT, FIELD_CUSTOM, 
00369       0,    0,  "CalibrationIlluminant2" },
00370     { TIFFTAG_RAWDATAUNIQUEID,  16, 16, TIFF_BYTE,  FIELD_CUSTOM, 
00371       0,    0,  "RawDataUniqueID" },
00372     { TIFFTAG_ORIGINALRAWFILENAME,    -1, -1, TIFF_ASCII,   FIELD_CUSTOM,
00373       1,    0,  "OriginalRawFileName" },
00374     { TIFFTAG_ORIGINALRAWFILENAME,    -1, -1, TIFF_BYTE,    FIELD_CUSTOM,
00375       1,    1,  "OriginalRawFileName" },
00376     { TIFFTAG_ORIGINALRAWFILEDATA,    -1, -1, TIFF_UNDEFINED,   FIELD_CUSTOM,
00377       0,    1,  "OriginalRawFileData" },
00378     { TIFFTAG_ACTIVEAREA,   4, 4,   TIFF_LONG,  FIELD_CUSTOM, 
00379       0,    0,  "ActiveArea" },
00380     { TIFFTAG_ACTIVEAREA,   4, 4,   TIFF_SHORT, FIELD_CUSTOM, 
00381       0,    0,  "ActiveArea" },
00382     { TIFFTAG_MASKEDAREAS,  -1, -1, TIFF_LONG,  FIELD_CUSTOM, 
00383       0,    1,  "MaskedAreas" },
00384     { TIFFTAG_ASSHOTICCPROFILE,    -1, -1, TIFF_UNDEFINED,  FIELD_CUSTOM,
00385       0,    1,  "AsShotICCProfile" },
00386     { TIFFTAG_ASSHOTPREPROFILEMATRIX,   -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
00387       0,    1,  "AsShotPreProfileMatrix" },
00388     { TIFFTAG_CURRENTICCPROFILE,    -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
00389       0,    1,  "CurrentICCProfile" },
00390     { TIFFTAG_CURRENTPREPROFILEMATRIX,  -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM, 
00391       0,    1,  "CurrentPreProfileMatrix" },
00392 /* end DNG tags */
00393 };
00394 
00395 static const TIFFFieldInfo
00396 exifFieldInfo[] = {
00397     { EXIFTAG_EXPOSURETIME, 1, 1,       TIFF_RATIONAL,  FIELD_CUSTOM, 
00398       1,    0,  "ExposureTime" },
00399     { EXIFTAG_FNUMBER,      1, 1,       TIFF_RATIONAL,  FIELD_CUSTOM, 
00400       1,    0,  "FNumber" },
00401     { EXIFTAG_EXPOSUREPROGRAM,  1, 1,       TIFF_SHORT, FIELD_CUSTOM,
00402       1,    0,  "ExposureProgram" },
00403     { EXIFTAG_SPECTRALSENSITIVITY,    -1, -1,   TIFF_ASCII, FIELD_CUSTOM,
00404       1,    0,  "SpectralSensitivity" },
00405     { EXIFTAG_ISOSPEEDRATINGS,  -1, -1,     TIFF_SHORT, FIELD_CUSTOM,
00406       1,    1,  "ISOSpeedRatings" },
00407     { EXIFTAG_OECF, -1, -1,         TIFF_UNDEFINED, FIELD_CUSTOM,
00408       1,    1,  "OptoelectricConversionFactor" },
00409     { EXIFTAG_EXIFVERSION,  4, 4,       TIFF_UNDEFINED, FIELD_CUSTOM,
00410       1,    0,  "ExifVersion" },
00411     { EXIFTAG_DATETIMEORIGINAL, 20, 20,     TIFF_ASCII, FIELD_CUSTOM,
00412       1,    0,  "DateTimeOriginal" },
00413     { EXIFTAG_DATETIMEDIGITIZED, 20, 20,    TIFF_ASCII, FIELD_CUSTOM,
00414       1,    0,  "DateTimeDigitized" },
00415     { EXIFTAG_COMPONENTSCONFIGURATION,   4, 4,  TIFF_UNDEFINED, FIELD_CUSTOM,
00416       1,    0,  "ComponentsConfiguration" },
00417     { EXIFTAG_COMPRESSEDBITSPERPIXEL,    1, 1,  TIFF_RATIONAL,  FIELD_CUSTOM,
00418       1,    0,  "CompressedBitsPerPixel" },
00419     { EXIFTAG_SHUTTERSPEEDVALUE,    1, 1,   TIFF_SRATIONAL, FIELD_CUSTOM, 
00420       1,    0,  "ShutterSpeedValue" },
00421     { EXIFTAG_APERTUREVALUE,    1, 1,       TIFF_RATIONAL,  FIELD_CUSTOM, 
00422       1,    0,  "ApertureValue" },
00423     { EXIFTAG_BRIGHTNESSVALUE,  1, 1,       TIFF_SRATIONAL, FIELD_CUSTOM, 
00424       1,    0,  "BrightnessValue" },
00425     { EXIFTAG_EXPOSUREBIASVALUE,    1, 1,   TIFF_SRATIONAL, FIELD_CUSTOM, 
00426       1,    0,  "ExposureBiasValue" },
00427     { EXIFTAG_MAXAPERTUREVALUE, 1, 1,       TIFF_RATIONAL,  FIELD_CUSTOM, 
00428       1,    0,  "MaxApertureValue" },
00429     { EXIFTAG_SUBJECTDISTANCE,  1, 1,       TIFF_RATIONAL,  FIELD_CUSTOM, 
00430       1,    0,  "SubjectDistance" },
00431     { EXIFTAG_METERINGMODE, 1, 1,       TIFF_SHORT, FIELD_CUSTOM,
00432       1,    0,  "MeteringMode" },
00433     { EXIFTAG_LIGHTSOURCE,  1, 1,       TIFF_SHORT, FIELD_CUSTOM,
00434       1,    0,  "LightSource" },
00435     { EXIFTAG_FLASH,    1, 1,           TIFF_SHORT, FIELD_CUSTOM,
00436       1,    0,  "Flash" },
00437     { EXIFTAG_FOCALLENGTH,  1, 1,       TIFF_RATIONAL,  FIELD_CUSTOM, 
00438       1,    0,  "FocalLength" },
00439     { EXIFTAG_SUBJECTAREA,  -1, -1,     TIFF_SHORT, FIELD_CUSTOM,
00440       1,    1,  "SubjectArea" },
00441     { EXIFTAG_MAKERNOTE,    -1, -1,     TIFF_UNDEFINED, FIELD_CUSTOM,
00442       1,    1,  "MakerNote" },
00443     { EXIFTAG_USERCOMMENT,  -1, -1,     TIFF_UNDEFINED, FIELD_CUSTOM,
00444       1,    1,  "UserComment" },
00445     { EXIFTAG_SUBSECTIME,    -1, -1,        TIFF_ASCII, FIELD_CUSTOM,
00446       1,    0,  "SubSecTime" },
00447     { EXIFTAG_SUBSECTIMEORIGINAL, -1, -1,   TIFF_ASCII, FIELD_CUSTOM,
00448       1,    0,  "SubSecTimeOriginal" },
00449     { EXIFTAG_SUBSECTIMEDIGITIZED,-1, -1,   TIFF_ASCII, FIELD_CUSTOM,
00450       1,    0,  "SubSecTimeDigitized" },
00451     { EXIFTAG_FLASHPIXVERSION,  4, 4,       TIFF_UNDEFINED, FIELD_CUSTOM,
00452       1,    0,  "FlashpixVersion" },
00453     { EXIFTAG_COLORSPACE,   1, 1,       TIFF_SHORT, FIELD_CUSTOM,
00454       1,    0,  "ColorSpace" },
00455     { EXIFTAG_PIXELXDIMENSION,  1, 1,       TIFF_LONG,  FIELD_CUSTOM,
00456       1,    0,  "PixelXDimension" },
00457     { EXIFTAG_PIXELXDIMENSION,  1, 1,       TIFF_SHORT, FIELD_CUSTOM,
00458       1,    0,  "PixelXDimension" },
00459     { EXIFTAG_PIXELYDIMENSION,  1, 1,       TIFF_LONG,  FIELD_CUSTOM,
00460       1,    0,  "PixelYDimension" },
00461     { EXIFTAG_PIXELYDIMENSION,  1, 1,       TIFF_SHORT, FIELD_CUSTOM,
00462       1,    0,  "PixelYDimension" },
00463     { EXIFTAG_RELATEDSOUNDFILE, 13, 13,     TIFF_ASCII, FIELD_CUSTOM,
00464       1,    0,  "RelatedSoundFile" },
00465     { EXIFTAG_FLASHENERGY,  1, 1,       TIFF_RATIONAL,  FIELD_CUSTOM, 
00466       1,    0,  "FlashEnergy" },
00467     { EXIFTAG_SPATIALFREQUENCYRESPONSE, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
00468       1,    1,  "SpatialFrequencyResponse" },
00469     { EXIFTAG_FOCALPLANEXRESOLUTION,    1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
00470       1,    0,  "FocalPlaneXResolution" },
00471     { EXIFTAG_FOCALPLANEYRESOLUTION,    1, 1,   TIFF_RATIONAL,  FIELD_CUSTOM, 
00472       1,    0,  "FocalPlaneYResolution" },
00473     { EXIFTAG_FOCALPLANERESOLUTIONUNIT, 1, 1,   TIFF_SHORT, FIELD_CUSTOM,
00474       1,    0,  "FocalPlaneResolutionUnit" },
00475     { EXIFTAG_SUBJECTLOCATION,  2, 2,       TIFF_SHORT, FIELD_CUSTOM,
00476       1,    0,  "SubjectLocation" },
00477     { EXIFTAG_EXPOSUREINDEX,    1, 1,       TIFF_RATIONAL,  FIELD_CUSTOM, 
00478       1,    0,  "ExposureIndex" },
00479     { EXIFTAG_SENSINGMETHOD,    1, 1,       TIFF_SHORT, FIELD_CUSTOM,
00480       1,    0,  "SensingMethod" },
00481     { EXIFTAG_FILESOURCE,   1, 1,       TIFF_UNDEFINED, FIELD_CUSTOM,
00482       1,    0,  "FileSource" },
00483     { EXIFTAG_SCENETYPE,    1, 1,       TIFF_UNDEFINED, FIELD_CUSTOM,
00484       1,    0,  "SceneType" },
00485     { EXIFTAG_CFAPATTERN,   -1, -1,     TIFF_UNDEFINED, FIELD_CUSTOM,
00486       1,    1,  "CFAPattern" },
00487     { EXIFTAG_CUSTOMRENDERED,   1, 1,       TIFF_SHORT, FIELD_CUSTOM,
00488       1,    0,  "CustomRendered" },
00489     { EXIFTAG_EXPOSUREMODE, 1, 1,       TIFF_SHORT, FIELD_CUSTOM,
00490       1,    0,  "ExposureMode" },
00491     { EXIFTAG_WHITEBALANCE, 1, 1,       TIFF_SHORT, FIELD_CUSTOM,
00492       1,    0,  "WhiteBalance" },
00493     { EXIFTAG_DIGITALZOOMRATIO, 1, 1,       TIFF_RATIONAL,  FIELD_CUSTOM, 
00494       1,    0,  "DigitalZoomRatio" },
00495     { EXIFTAG_FOCALLENGTHIN35MMFILM, 1, 1,  TIFF_SHORT, FIELD_CUSTOM,
00496       1,    0,  "FocalLengthIn35mmFilm" },
00497     { EXIFTAG_SCENECAPTURETYPE, 1, 1,       TIFF_SHORT, FIELD_CUSTOM,
00498       1,    0,  "SceneCaptureType" },
00499     { EXIFTAG_GAINCONTROL,  1, 1,       TIFF_RATIONAL,  FIELD_CUSTOM, 
00500       1,    0,  "GainControl" },
00501     { EXIFTAG_CONTRAST,     1, 1,       TIFF_SHORT, FIELD_CUSTOM,
00502       1,    0,  "Contrast" },
00503     { EXIFTAG_SATURATION,   1, 1,       TIFF_SHORT, FIELD_CUSTOM,
00504       1,    0,  "Saturation" },
00505     { EXIFTAG_SHARPNESS,    1, 1,       TIFF_SHORT, FIELD_CUSTOM,
00506       1,    0,  "Sharpness" },
00507     { EXIFTAG_DEVICESETTINGDESCRIPTION, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
00508       1,    1,  "DeviceSettingDescription" },
00509     { EXIFTAG_SUBJECTDISTANCERANGE, 1, 1,   TIFF_SHORT, FIELD_CUSTOM,
00510       1,    0,  "SubjectDistanceRange" },
00511     { EXIFTAG_IMAGEUNIQUEID,    33, 33,     TIFF_ASCII, FIELD_CUSTOM,
00512       1,    0,  "ImageUniqueID" }
00513 };
00514 
00515 const TIFFFieldInfo *
00516 _TIFFGetFieldInfo(size_t *size)
00517 {
00518     *size = TIFFArrayCount(tiffFieldInfo);
00519     return tiffFieldInfo;
00520 }
00521 
00522 const TIFFFieldInfo *
00523 _TIFFGetExifFieldInfo(size_t *size)
00524 {
00525     *size = TIFFArrayCount(exifFieldInfo);
00526     return exifFieldInfo;
00527 }
00528 
00529 void
00530 _TIFFSetupFieldInfo(TIFF* tif, const TIFFFieldInfo info[], size_t n)
00531 {
00532     if (tif->tif_fieldinfo) {
00533         size_t  i;
00534 
00535         for (i = 0; i < tif->tif_nfields; i++) 
00536         {
00537             TIFFFieldInfo *fld = tif->tif_fieldinfo[i];
00538             if (fld->field_bit == FIELD_CUSTOM && 
00539                 strncmp("Tag ", fld->field_name, 4) == 0) {
00540                     _TIFFfree(fld->field_name);
00541                     _TIFFfree(fld);
00542                 }
00543         }   
00544       
00545         _TIFFfree(tif->tif_fieldinfo);
00546         tif->tif_nfields = 0;
00547     }
00548     if (!_TIFFMergeFieldInfo(tif, info, n))
00549     {
00550         TIFFErrorExt(tif->tif_clientdata, "_TIFFSetupFieldInfo",
00551                  "Setting up field info failed");
00552     }
00553 }
00554 
00555 static int
00556 tagCompare(const void* a, const void* b)
00557 {
00558     const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a;
00559     const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b;
00560     /* NB: be careful of return values for 16-bit platforms */
00561     if (ta->field_tag != tb->field_tag)
00562         return (int)ta->field_tag - (int)tb->field_tag;
00563     else
00564         return (ta->field_type == TIFF_ANY) ?
00565             0 : ((int)tb->field_type - (int)ta->field_type);
00566 }
00567 
00568 static int
00569 tagNameCompare(const void* a, const void* b)
00570 {
00571     const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a;
00572     const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b;
00573     int ret = strcmp(ta->field_name, tb->field_name);
00574 
00575     if (ret)
00576         return ret;
00577     else
00578         return (ta->field_type == TIFF_ANY) ?
00579             0 : ((int)tb->field_type - (int)ta->field_type);
00580 }
00581 
00582 void
00583 TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n)
00584 {
00585     if (_TIFFMergeFieldInfo(tif, info, n) < 0)
00586     {
00587         TIFFErrorExt(tif->tif_clientdata, "TIFFMergeFieldInfo",
00588                  "Merging block of %d fields failed", n);
00589     }
00590 }
00591 
00592 int
00593 _TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n)
00594 {
00595     static const char module[] = "_TIFFMergeFieldInfo";
00596     static const char reason[] = "for field info array";
00597     TIFFFieldInfo** tp;
00598     int i;
00599 
00600         tif->tif_foundfield = NULL;
00601 
00602     if (tif->tif_nfields > 0) {
00603         tif->tif_fieldinfo = (TIFFFieldInfo**)
00604             _TIFFCheckRealloc(tif, tif->tif_fieldinfo,
00605                       (tif->tif_nfields + n),
00606                       sizeof (TIFFFieldInfo*), reason);
00607     } else {
00608         tif->tif_fieldinfo = (TIFFFieldInfo**)
00609             _TIFFCheckMalloc(tif, n, sizeof (TIFFFieldInfo*),
00610                      reason);
00611     }
00612     if (!tif->tif_fieldinfo) {
00613         TIFFErrorExt(tif->tif_clientdata, module,
00614                  "Failed to allocate field info array");
00615         return 0;
00616     }
00617     tp = tif->tif_fieldinfo + tif->tif_nfields;
00618     for (i = 0; i < n; i++)
00619         {
00620             const TIFFFieldInfo *fip =
00621                 _TIFFFindFieldInfo(tif, info[i].field_tag, info[i].field_type);
00622 
00623             /* only add definitions that aren't already present */
00624             if (!fip) {
00625                 *tp++ = (TIFFFieldInfo*) (info + i);
00626                 tif->tif_nfields++;
00627             }
00628         }
00629 
00630         /* Sort the field info by tag number */
00631         qsort(tif->tif_fieldinfo, tif->tif_nfields,
00632           sizeof (TIFFFieldInfo*), tagCompare);
00633 
00634     return n;
00635 }
00636 
00637 void
00638 _TIFFPrintFieldInfo(TIFF* tif, FILE* fd)
00639 {
00640     size_t i;
00641 
00642     fprintf(fd, "%s: \n", tif->tif_name);
00643     for (i = 0; i < tif->tif_nfields; i++) {
00644         const TIFFFieldInfo* fip = tif->tif_fieldinfo[i];
00645         fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n"
00646             , (int)i
00647             , (unsigned long) fip->field_tag
00648             , fip->field_readcount, fip->field_writecount
00649             , fip->field_type
00650             , fip->field_bit
00651             , fip->field_oktochange ? "TRUE" : "FALSE"
00652             , fip->field_passcount ? "TRUE" : "FALSE"
00653             , fip->field_name
00654         );
00655     }
00656 }
00657 
00658 /*
00659  * Return size of TIFFDataType in bytes
00660  */
00661 int
00662 TIFFDataWidth(TIFFDataType type)
00663 {
00664     switch(type)
00665     {
00666     case 0:  /* nothing */
00667     case 1:  /* TIFF_BYTE */
00668     case 2:  /* TIFF_ASCII */
00669     case 6:  /* TIFF_SBYTE */
00670     case 7:  /* TIFF_UNDEFINED */
00671         return 1;
00672     case 3:  /* TIFF_SHORT */
00673     case 8:  /* TIFF_SSHORT */
00674         return 2;
00675     case 4:  /* TIFF_LONG */
00676     case 9:  /* TIFF_SLONG */
00677     case 11: /* TIFF_FLOAT */
00678         case 13: /* TIFF_IFD */
00679         return 4;
00680     case 5:  /* TIFF_RATIONAL */
00681     case 10: /* TIFF_SRATIONAL */
00682     case 12: /* TIFF_DOUBLE */
00683         return 8;
00684     default:
00685         return 0; /* will return 0 for unknown types */
00686     }
00687 }
00688 
00689 /*
00690  * Return size of TIFFDataType in bytes.
00691  *
00692  * XXX: We need a separate function to determine the space needed
00693  * to store the value. For TIFF_RATIONAL values TIFFDataWidth() returns 8,
00694  * but we use 4-byte float to represent rationals.
00695  */
00696 int
00697 _TIFFDataSize(TIFFDataType type)
00698 {
00699     switch (type) {
00700         case TIFF_BYTE:
00701         case TIFF_SBYTE:
00702         case TIFF_ASCII:
00703         case TIFF_UNDEFINED:
00704             return 1;
00705         case TIFF_SHORT:
00706         case TIFF_SSHORT:
00707             return 2;
00708         case TIFF_LONG:
00709         case TIFF_SLONG:
00710         case TIFF_FLOAT:
00711         case TIFF_IFD:
00712         case TIFF_RATIONAL:
00713         case TIFF_SRATIONAL:
00714             return 4;
00715         case TIFF_DOUBLE:
00716             return 8;
00717         default:
00718             return 0;
00719     }
00720 }
00721 
00722 /*
00723  * Return nearest TIFFDataType to the sample type of an image.
00724  */
00725 TIFFDataType
00726 _TIFFSampleToTagType(TIFF* tif)
00727 {
00728     uint32 bps = TIFFhowmany8(tif->tif_dir.td_bitspersample);
00729 
00730     switch (tif->tif_dir.td_sampleformat) {
00731     case SAMPLEFORMAT_IEEEFP:
00732         return (bps == 4 ? TIFF_FLOAT : TIFF_DOUBLE);
00733     case SAMPLEFORMAT_INT:
00734         return (bps <= 1 ? TIFF_SBYTE :
00735             bps <= 2 ? TIFF_SSHORT : TIFF_SLONG);
00736     case SAMPLEFORMAT_UINT:
00737         return (bps <= 1 ? TIFF_BYTE :
00738             bps <= 2 ? TIFF_SHORT : TIFF_LONG);
00739     case SAMPLEFORMAT_VOID:
00740         return (TIFF_UNDEFINED);
00741     }
00742     /*NOTREACHED*/
00743     return (TIFF_UNDEFINED);
00744 }
00745 
00746 const TIFFFieldInfo*
00747 _TIFFFindFieldInfo(TIFF* tif, ttag_t tag, TIFFDataType dt)
00748 {
00749         TIFFFieldInfo key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0};
00750     TIFFFieldInfo* pkey = &key;
00751     const TIFFFieldInfo **ret;
00752 
00753     if (tif->tif_foundfield && tif->tif_foundfield->field_tag == tag &&
00754         (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
00755         return tif->tif_foundfield;
00756 
00757     /* If we are invoked with no field information, then just return. */
00758     if ( !tif->tif_fieldinfo ) {
00759         return NULL;
00760     }
00761 
00762     /* NB: use sorted search (e.g. binary search) */
00763     key.field_tag = tag;
00764         key.field_type = dt;
00765 
00766     ret = (const TIFFFieldInfo **) bsearch(&pkey,
00767                            tif->tif_fieldinfo, 
00768                            tif->tif_nfields,
00769                            sizeof(TIFFFieldInfo *), 
00770                            tagCompare);
00771     return tif->tif_foundfield = (ret ? *ret : NULL);
00772 }
00773 
00774 const TIFFFieldInfo*
00775 _TIFFFindFieldInfoByName(TIFF* tif, const char *field_name, TIFFDataType dt)
00776 {
00777         TIFFFieldInfo key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0};
00778     TIFFFieldInfo* pkey = &key;
00779     const TIFFFieldInfo **ret;
00780 
00781     if (tif->tif_foundfield
00782         && streq(tif->tif_foundfield->field_name, field_name)
00783         && (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
00784         return (tif->tif_foundfield);
00785 
00786     /* If we are invoked with no field information, then just return. */
00787     if ( !tif->tif_fieldinfo ) {
00788         return NULL;
00789     }
00790 
00791     /* NB: use sorted search (e.g. binary search) */
00792         key.field_name = (char *)field_name;
00793         key.field_type = dt;
00794 
00795         ret = (const TIFFFieldInfo **) lfind(&pkey,
00796                          tif->tif_fieldinfo, 
00797                          &tif->tif_nfields,
00798                          sizeof(TIFFFieldInfo *),
00799                          tagNameCompare);
00800     return tif->tif_foundfield = (ret ? *ret : NULL);
00801 }
00802 
00803 const TIFFFieldInfo*
00804 _TIFFFieldWithTag(TIFF* tif, ttag_t tag)
00805 {
00806     const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY);
00807     if (!fip) {
00808         TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithTag",
00809                  "Internal error, unknown tag 0x%x",
00810                  (unsigned int) tag);
00811         assert(fip != NULL);
00812         /*NOTREACHED*/
00813     }
00814     return (fip);
00815 }
00816 
00817 const TIFFFieldInfo*
00818 _TIFFFieldWithName(TIFF* tif, const char *field_name)
00819 {
00820     const TIFFFieldInfo* fip =
00821         _TIFFFindFieldInfoByName(tif, field_name, TIFF_ANY);
00822     if (!fip) {
00823         TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithName",
00824                  "Internal error, unknown tag %s", field_name);
00825         assert(fip != NULL);
00826         /*NOTREACHED*/
00827     }
00828     return (fip);
00829 }
00830 
00831 const TIFFFieldInfo*
00832 _TIFFFindOrRegisterFieldInfo( TIFF *tif, ttag_t tag, TIFFDataType dt )
00833 
00834 {
00835     const TIFFFieldInfo *fld;
00836 
00837     fld = _TIFFFindFieldInfo( tif, tag, dt );
00838     if( fld == NULL )
00839     {
00840         fld = _TIFFCreateAnonFieldInfo( tif, tag, dt );
00841         if (!_TIFFMergeFieldInfo(tif, fld, 1))
00842         return NULL;
00843     }
00844 
00845     return fld;
00846 }
00847 
00848 TIFFFieldInfo*
00849 _TIFFCreateAnonFieldInfo(TIFF *tif, ttag_t tag, TIFFDataType field_type)
00850 {
00851     TIFFFieldInfo *fld;
00852     (void) tif;
00853 
00854     fld = (TIFFFieldInfo *) _TIFFmalloc(sizeof (TIFFFieldInfo));
00855     if (fld == NULL)
00856         return NULL;
00857     _TIFFmemset( fld, 0, sizeof(TIFFFieldInfo) );
00858 
00859     fld->field_tag = tag;
00860     fld->field_readcount = TIFF_VARIABLE2;
00861     fld->field_writecount = TIFF_VARIABLE2;
00862     fld->field_type = field_type;
00863     fld->field_bit = FIELD_CUSTOM;
00864     fld->field_oktochange = TRUE;
00865     fld->field_passcount = TRUE;
00866     fld->field_name = (char *) _TIFFmalloc(32);
00867     if (fld->field_name == NULL) {
00868         _TIFFfree(fld);
00869         return NULL;
00870     }
00871 
00872     /* 
00873      * note that this name is a special sign to TIFFClose() and
00874      * _TIFFSetupFieldInfo() to free the field
00875      */
00876     sprintf(fld->field_name, "Tag %d", (int) tag);
00877 
00878     return fld;    
00879 }
00880 
00881 /* vim: set ts=8 sts=8 sw=8 noet: */
00882 /*
00883  * Local Variables:
00884  * mode: c
00885  * c-basic-offset: 8
00886  * fill-column: 78
00887  * End:
00888  */

Generated on Tue May 15 04:41:29 2012 for ReactOS by doxygen 1.6.3

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.