home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 February / PCWorld_2002-02_cd.bin / Software / Vyzkuste / pdflib / pdflib-4.0.1.sit / pdflib-4.0.1 / tiff / tif_dirinfo.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-07-04  |  15.4 KB  |  404 lines  |  [TEXT/CWIE]

  1. /*
  2.  * Copyright (c) 1988-1997 Sam Leffler
  3.  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
  4.  *
  5.  * Permission to use, copy, modify, distribute, and sell this software and 
  6.  * its documentation for any purpose is hereby granted without fee, provided
  7.  * that (i) the above copyright notices and this permission notice appear in
  8.  * all copies of the software and related documentation, and (ii) the names of
  9.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  10.  * publicity relating to the software without the specific, prior written
  11.  * permission of Sam Leffler and Silicon Graphics.
  12.  * 
  13.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  14.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  15.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  16.  * 
  17.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  18.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  19.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  20.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  21.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  22.  * OF THIS SOFTWARE.
  23.  */
  24.  
  25. /*
  26.  * TIFF Library.
  27.  *
  28.  * Core Directory Tag Support.
  29.  */
  30.  
  31. /* $Id: tif_dirinfo.c,v 1.6 2001/04/05 09:44:06 rjs Exp $ */
  32.  
  33. #include "tiffiop.h"
  34. #include <stdlib.h>
  35.  
  36. /*
  37.  * NB: NB: THIS ARRAY IS ASSUMED TO BE SORTED BY TAG.
  38.  *     If a tag can have both LONG and SHORT types
  39.  *     then the LONG must be placed before the SHORT for
  40.  *     writing to work properly.
  41.  */
  42. static const TIFFFieldInfo tiffFieldInfo[] = {
  43.     { TIFFTAG_SUBFILETYPE,     1, 1, TIFF_LONG,    FIELD_SUBFILETYPE,
  44.       TRUE,    FALSE,    "SubfileType" },
  45. /* XXX SHORT for compatibility w/ old versions of the library */
  46.     { TIFFTAG_SUBFILETYPE,     1, 1, TIFF_SHORT,    FIELD_SUBFILETYPE,
  47.       TRUE,    FALSE,    "SubfileType" },
  48.     { TIFFTAG_OSUBFILETYPE,     1, 1, TIFF_SHORT,    FIELD_SUBFILETYPE,
  49.       TRUE,    FALSE,    "OldSubfileType" },
  50.     { TIFFTAG_IMAGEWIDTH,     1, 1, TIFF_LONG,    FIELD_IMAGEDIMENSIONS,
  51.       FALSE,    FALSE,    "ImageWidth" },
  52.     { TIFFTAG_IMAGEWIDTH,     1, 1, TIFF_SHORT,    FIELD_IMAGEDIMENSIONS,
  53.       FALSE,    FALSE,    "ImageWidth" },
  54.     { TIFFTAG_IMAGELENGTH,     1, 1, TIFF_LONG,    FIELD_IMAGEDIMENSIONS,
  55.       TRUE,    FALSE,    "ImageLength" },
  56.     { TIFFTAG_IMAGELENGTH,     1, 1, TIFF_SHORT,    FIELD_IMAGEDIMENSIONS,
  57.       TRUE,    FALSE,    "ImageLength" },
  58.     { TIFFTAG_BITSPERSAMPLE,    -1,-1, TIFF_SHORT,    FIELD_BITSPERSAMPLE,
  59.       FALSE,    FALSE,    "BitsPerSample" },
  60.     { TIFFTAG_COMPRESSION,    -1, 1, TIFF_SHORT,    FIELD_COMPRESSION,
  61.       FALSE,    FALSE,    "Compression" },
  62.     { TIFFTAG_PHOTOMETRIC,     1, 1, TIFF_SHORT,    FIELD_PHOTOMETRIC,
  63.       FALSE,    FALSE,    "PhotometricInterpretation" },
  64.     { TIFFTAG_THRESHHOLDING,     1, 1, TIFF_SHORT,    FIELD_THRESHHOLDING,
  65.       TRUE,    FALSE,    "Threshholding" },
  66.     { TIFFTAG_CELLWIDTH,     1, 1, TIFF_SHORT,    FIELD_IGNORE,
  67.       TRUE,    FALSE,    "CellWidth" },
  68.     { TIFFTAG_CELLLENGTH,     1, 1, TIFF_SHORT,    FIELD_IGNORE,
  69.       TRUE,    FALSE,    "CellLength" },
  70.     { TIFFTAG_FILLORDER,     1, 1, TIFF_SHORT,    FIELD_FILLORDER,
  71.       FALSE,    FALSE,    "FillOrder" },
  72.     { TIFFTAG_DOCUMENTNAME,    -1,-1, TIFF_ASCII,    FIELD_DOCUMENTNAME,
  73.       TRUE,    FALSE,    "DocumentName" },
  74.     { TIFFTAG_IMAGEDESCRIPTION,    -1,-1, TIFF_ASCII,    FIELD_IMAGEDESCRIPTION,
  75.       TRUE,    FALSE,    "ImageDescription" },
  76.     { TIFFTAG_MAKE,        -1,-1, TIFF_ASCII,    FIELD_MAKE,
  77.       TRUE,    FALSE,    "Make" },
  78.     { TIFFTAG_MODEL,        -1,-1, TIFF_ASCII,    FIELD_MODEL,
  79.       TRUE,    FALSE,    "Model" },
  80.     { TIFFTAG_STRIPOFFSETS,    -1,-1, TIFF_LONG,    FIELD_STRIPOFFSETS,
  81.       FALSE,    FALSE,    "StripOffsets" },
  82.     { TIFFTAG_STRIPOFFSETS,    -1,-1, TIFF_SHORT,    FIELD_STRIPOFFSETS,
  83.       FALSE,    FALSE,    "StripOffsets" },
  84.     { TIFFTAG_ORIENTATION,     1, 1, TIFF_SHORT,    FIELD_ORIENTATION,
  85.       FALSE,    FALSE,    "Orientation" },
  86.     { TIFFTAG_SAMPLESPERPIXEL,     1, 1, TIFF_SHORT,    FIELD_SAMPLESPERPIXEL,
  87.       FALSE,    FALSE,    "SamplesPerPixel" },
  88.     { TIFFTAG_ROWSPERSTRIP,     1, 1, TIFF_LONG,    FIELD_ROWSPERSTRIP,
  89.       FALSE,    FALSE,    "RowsPerStrip" },
  90.     { TIFFTAG_ROWSPERSTRIP,     1, 1, TIFF_SHORT,    FIELD_ROWSPERSTRIP,
  91.       FALSE,    FALSE,    "RowsPerStrip" },
  92.     { TIFFTAG_STRIPBYTECOUNTS,    -1,-1, TIFF_LONG,    FIELD_STRIPBYTECOUNTS,
  93.       FALSE,    FALSE,    "StripByteCounts" },
  94.     { TIFFTAG_STRIPBYTECOUNTS,    -1,-1, TIFF_SHORT,    FIELD_STRIPBYTECOUNTS,
  95.       FALSE,    FALSE,    "StripByteCounts" },
  96.     { TIFFTAG_MINSAMPLEVALUE,    -2,-1, TIFF_SHORT,    FIELD_MINSAMPLEVALUE,
  97.       TRUE,    FALSE,    "MinSampleValue" },
  98.     { TIFFTAG_MAXSAMPLEVALUE,    -2,-1, TIFF_SHORT,    FIELD_MAXSAMPLEVALUE,
  99.       TRUE,    FALSE,    "MaxSampleValue" },
  100.     { TIFFTAG_XRESOLUTION,     1, 1, TIFF_RATIONAL,    FIELD_RESOLUTION,
  101.       FALSE,    FALSE,    "XResolution" },
  102.     { TIFFTAG_YRESOLUTION,     1, 1, TIFF_RATIONAL,    FIELD_RESOLUTION,
  103.       FALSE,    FALSE,    "YResolution" },
  104.     { TIFFTAG_PLANARCONFIG,     1, 1, TIFF_SHORT,    FIELD_PLANARCONFIG,
  105.       FALSE,    FALSE,    "PlanarConfiguration" },
  106.     { TIFFTAG_PAGENAME,        -1,-1, TIFF_ASCII,    FIELD_PAGENAME,
  107.       TRUE,    FALSE,    "PageName" },
  108.     { TIFFTAG_XPOSITION,     1, 1, TIFF_RATIONAL,    FIELD_POSITION,
  109.       TRUE,    FALSE,    "XPosition" },
  110.     { TIFFTAG_YPOSITION,     1, 1, TIFF_RATIONAL,    FIELD_POSITION,
  111.       TRUE,    FALSE,    "YPosition" },
  112.     { TIFFTAG_FREEOFFSETS,    -1,-1, TIFF_LONG,    FIELD_IGNORE,
  113.       FALSE,    FALSE,    "FreeOffsets" },
  114.     { TIFFTAG_FREEBYTECOUNTS,    -1,-1, TIFF_LONG,    FIELD_IGNORE,
  115.       FALSE,    FALSE,    "FreeByteCounts" },
  116.     { TIFFTAG_GRAYRESPONSEUNIT,     1, 1, TIFF_SHORT,    FIELD_IGNORE,
  117.       TRUE,    FALSE,    "GrayResponseUnit" },
  118.     { TIFFTAG_GRAYRESPONSECURVE,-1,-1, TIFF_SHORT,    FIELD_IGNORE,
  119.       TRUE,    FALSE,    "GrayResponseCurve" },
  120.     { TIFFTAG_RESOLUTIONUNIT,     1, 1, TIFF_SHORT,    FIELD_RESOLUTIONUNIT,
  121.       FALSE,    FALSE,    "ResolutionUnit" },
  122.     { TIFFTAG_PAGENUMBER,     2, 2, TIFF_SHORT,    FIELD_PAGENUMBER,
  123.       TRUE,    FALSE,    "PageNumber" },
  124.     { TIFFTAG_COLORRESPONSEUNIT, 1, 1, TIFF_SHORT,    FIELD_IGNORE,
  125.       TRUE,    FALSE,    "ColorResponseUnit" },
  126. #ifdef COLORIMETRY_SUPPORT
  127.     { TIFFTAG_TRANSFERFUNCTION,    -1,-1, TIFF_SHORT,    FIELD_TRANSFERFUNCTION,
  128.       TRUE,    FALSE,    "TransferFunction" },
  129. #endif
  130.     { TIFFTAG_SOFTWARE,        -1,-1, TIFF_ASCII,    FIELD_SOFTWARE,
  131.       TRUE,    FALSE,    "Software" },
  132.     { TIFFTAG_DATETIME,        20,20, TIFF_ASCII,    FIELD_DATETIME,
  133.       TRUE,    FALSE,    "DateTime" },
  134.     { TIFFTAG_ARTIST,        -1,-1, TIFF_ASCII,    FIELD_ARTIST,
  135.       TRUE,    FALSE,    "Artist" },
  136.     { TIFFTAG_HOSTCOMPUTER,    -1,-1, TIFF_ASCII,    FIELD_HOSTCOMPUTER,
  137.       TRUE,    FALSE,    "HostComputer" },
  138. #define    FIELD_PREDICTOR    (FIELD_CODEC+0)        /* XXX */
  139.     { TIFFTAG_PREDICTOR,     1, 1, TIFF_SHORT,    FIELD_PREDICTOR,
  140.       FALSE,    FALSE,    "Predictor" },
  141. #ifdef COLORIMETRY_SUPPORT
  142.     { TIFFTAG_WHITEPOINT,     2, 2, TIFF_RATIONAL,FIELD_WHITEPOINT,
  143.       TRUE,    FALSE,    "WhitePoint" },
  144.     { TIFFTAG_PRIMARYCHROMATICITIES,6,6,TIFF_RATIONAL,FIELD_PRIMARYCHROMAS,
  145.       TRUE,    FALSE,    "PrimaryChromaticities" },
  146. #endif
  147.     { TIFFTAG_COLORMAP,        -1,-1, TIFF_SHORT,    FIELD_COLORMAP,
  148.       TRUE,    FALSE,    "ColorMap" },
  149.     { TIFFTAG_HALFTONEHINTS,     2, 2, TIFF_SHORT,    FIELD_HALFTONEHINTS,
  150.       TRUE,    FALSE,    "HalftoneHints" },
  151.     { TIFFTAG_TILEWIDTH,     1, 1, TIFF_LONG,    FIELD_TILEDIMENSIONS,
  152.       FALSE,    FALSE,    "TileWidth" },
  153.     { TIFFTAG_TILEWIDTH,     1, 1, TIFF_SHORT,    FIELD_TILEDIMENSIONS,
  154.       FALSE,    FALSE,    "TileWidth" },
  155.     { TIFFTAG_TILELENGTH,     1, 1, TIFF_LONG,    FIELD_TILEDIMENSIONS,
  156.       FALSE,    FALSE,    "TileLength" },
  157.     { TIFFTAG_TILELENGTH,     1, 1, TIFF_SHORT,    FIELD_TILEDIMENSIONS,
  158.       FALSE,    FALSE,    "TileLength" },
  159.     { TIFFTAG_TILEOFFSETS,    -1, 1, TIFF_LONG,    FIELD_STRIPOFFSETS,
  160.       FALSE,    FALSE,    "TileOffsets" },
  161.     { TIFFTAG_TILEBYTECOUNTS,    -1, 1, TIFF_LONG,    FIELD_STRIPBYTECOUNTS,
  162.       FALSE,    FALSE,    "TileByteCounts" },
  163.     { TIFFTAG_TILEBYTECOUNTS,    -1, 1, TIFF_SHORT,    FIELD_STRIPBYTECOUNTS,
  164.       FALSE,    FALSE,    "TileByteCounts" },
  165. #ifdef TIFFTAG_SUBIFD
  166.     { TIFFTAG_SUBIFD,        -1,-1, TIFF_LONG,    FIELD_SUBIFD,
  167.       TRUE,    TRUE,    "SubIFD" },
  168. #endif
  169. #ifdef CMYK_SUPPORT        /* 6.0 CMYK tags */
  170.     { TIFFTAG_INKSET,         1, 1, TIFF_SHORT,    FIELD_INKSET,
  171.       FALSE,    FALSE,    "InkSet" },
  172.     { TIFFTAG_INKNAMES,        -1,-1, TIFF_ASCII,    FIELD_INKNAMES,
  173.       TRUE,    TRUE,    "InkNames" },
  174.     { TIFFTAG_NUMBEROFINKS,     1, 1, TIFF_SHORT,    FIELD_NUMBEROFINKS,
  175.       TRUE,    FALSE,    "NumberOfInks" },
  176.     { TIFFTAG_DOTRANGE,         2, 2, TIFF_SHORT,    FIELD_DOTRANGE,
  177.       FALSE,    FALSE,    "DotRange" },
  178.     { TIFFTAG_DOTRANGE,         2, 2, TIFF_BYTE,    FIELD_DOTRANGE,
  179.       FALSE,    FALSE,    "DotRange" },
  180.     { TIFFTAG_TARGETPRINTER,    -1,-1, TIFF_ASCII,    FIELD_TARGETPRINTER,
  181.       TRUE,    FALSE,    "TargetPrinter" },
  182. #endif
  183.     { TIFFTAG_EXTRASAMPLES,    -1,-1, TIFF_SHORT,    FIELD_EXTRASAMPLES,
  184.       FALSE,    FALSE,    "ExtraSamples" },
  185. /* XXX for bogus Adobe Photoshop v2.5 files */
  186.     { TIFFTAG_EXTRASAMPLES,    -1,-1, TIFF_BYTE,    FIELD_EXTRASAMPLES,
  187.       FALSE,    FALSE,    "ExtraSamples" },
  188.     { TIFFTAG_SAMPLEFORMAT,    -1,-1, TIFF_SHORT,    FIELD_SAMPLEFORMAT,
  189.       FALSE,    FALSE,    "SampleFormat" },
  190.     { TIFFTAG_SMINSAMPLEVALUE,    -2,-1, TIFF_ANY,    FIELD_SMINSAMPLEVALUE,
  191.       TRUE,    FALSE,    "SMinSampleValue" },
  192.     { TIFFTAG_SMAXSAMPLEVALUE,    -2,-1, TIFF_ANY,    FIELD_SMAXSAMPLEVALUE,
  193.       TRUE,    FALSE,    "SMaxSampleValue" },
  194. #ifdef YCBCR_SUPPORT        /* 6.0 YCbCr tags */
  195.     { TIFFTAG_YCBCRCOEFFICIENTS, 3, 3, TIFF_RATIONAL,    FIELD_YCBCRCOEFFICIENTS,
  196.       FALSE,    FALSE,    "YCbCrCoefficients" },
  197.     { TIFFTAG_YCBCRSUBSAMPLING,     2, 2, TIFF_SHORT,    FIELD_YCBCRSUBSAMPLING,
  198.       FALSE,    FALSE,    "YCbCrSubsampling" },
  199.     { TIFFTAG_YCBCRPOSITIONING,     1, 1, TIFF_SHORT,    FIELD_YCBCRPOSITIONING,
  200.       FALSE,    FALSE,    "YCbCrPositioning" },
  201. #endif
  202. #ifdef COLORIMETRY_SUPPORT
  203.     { TIFFTAG_REFERENCEBLACKWHITE,6,6,TIFF_RATIONAL,    FIELD_REFBLACKWHITE,
  204.       TRUE,    FALSE,    "ReferenceBlackWhite" },
  205. /* XXX temporarily accept LONG for backwards compatibility */
  206.     { TIFFTAG_REFERENCEBLACKWHITE,6,6,TIFF_LONG,    FIELD_REFBLACKWHITE,
  207.       TRUE,    FALSE,    "ReferenceBlackWhite" },
  208. #endif
  209. /* begin SGI tags */
  210.     { TIFFTAG_MATTEING,         1, 1, TIFF_SHORT,    FIELD_EXTRASAMPLES,
  211.       FALSE,    FALSE,    "Matteing" },
  212.     { TIFFTAG_DATATYPE,        -2,-1, TIFF_SHORT,    FIELD_SAMPLEFORMAT,
  213.       FALSE,    FALSE,    "DataType" },
  214.     { TIFFTAG_IMAGEDEPTH,     1, 1, TIFF_LONG,    FIELD_IMAGEDEPTH,
  215.       FALSE,    FALSE,    "ImageDepth" },
  216.     { TIFFTAG_IMAGEDEPTH,     1, 1, TIFF_SHORT,    FIELD_IMAGEDEPTH,
  217.       FALSE,    FALSE,    "ImageDepth" },
  218.     { TIFFTAG_TILEDEPTH,     1, 1, TIFF_LONG,    FIELD_TILEDEPTH,
  219.       FALSE,    FALSE,    "TileDepth" },
  220.     { TIFFTAG_TILEDEPTH,     1, 1, TIFF_SHORT,    FIELD_TILEDEPTH,
  221.       FALSE,    FALSE,    "TileDepth" },
  222. /* end SGI tags */
  223. #ifdef IPTC_SUPPORT
  224. #ifdef PHOTOSHOP_SUPPORT
  225.     { TIFFTAG_RICHTIFFIPTC, -1,-1, TIFF_LONG,   FIELD_RICHTIFFIPTC, 
  226.       FALSE,    TRUE,   "RichTIFFIPTC" },
  227. #else
  228.     { TIFFTAG_RICHTIFFIPTC, -1,-3, TIFF_UNDEFINED, FIELD_RICHTIFFIPTC, 
  229.       FALSE,    TRUE,   "RichTIFFIPTC" },
  230. #endif
  231. #endif
  232. #ifdef PHOTOSHOP_SUPPORT
  233.     { TIFFTAG_PHOTOSHOP,    -1,-3, TIFF_UNDEFINED, FIELD_PHOTOSHOP, 
  234.       FALSE,    TRUE,   "Photoshop" },
  235.     { TIFFTAG_PHOTOSHOP,    -1,-1, TIFF_BYTE,   FIELD_PHOTOSHOP, 
  236.       FALSE,    TRUE,   "Photoshop" },
  237. #endif
  238. #ifdef ICC_SUPPORT
  239.     { TIFFTAG_ICCPROFILE,    -1,-3, TIFF_UNDEFINED,    FIELD_ICCPROFILE,
  240.       FALSE,    TRUE,    "ICC Profile" },
  241. #endif
  242.     { TIFFTAG_STONITS,         1, 1, TIFF_DOUBLE,    FIELD_STONITS,
  243.       FALSE,    FALSE,    "StoNits" },
  244. /* begin Pixar tags */
  245.     { TIFFTAG_PIXAR_IMAGEFULLWIDTH,  1, 1, TIFF_LONG,    FIELD_IMAGEFULLWIDTH,
  246.       TRUE,    FALSE,    "ImageFullWidth" },
  247.     { TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG,    FIELD_IMAGEFULLLENGTH,
  248.       TRUE,    FALSE,    "ImageFullLength" },
  249.     { TIFFTAG_PIXAR_TEXTUREFORMAT,  -1,-1, TIFF_ASCII,    FIELD_TEXTUREFORMAT,
  250.       TRUE,    FALSE,    "TextureFormat" },
  251.     { TIFFTAG_PIXAR_WRAPMODES,        -1,-1, TIFF_ASCII,    FIELD_WRAPMODES,
  252.       TRUE,    FALSE,    "TextureWrapModes" },
  253.     { TIFFTAG_PIXAR_FOVCOT,         1, 1, TIFF_FLOAT,    FIELD_FOVCOT,
  254.       TRUE,    FALSE,    "FieldOfViewCotan" },
  255.     { TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN,    16,16,    TIFF_FLOAT,
  256.       FIELD_MATRIX_WORLDTOSCREEN,    TRUE,    FALSE,    "MatrixWorldToScreen" },
  257.     { TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA,    16,16,    TIFF_FLOAT,
  258.        FIELD_MATRIX_WORLDTOCAMERA,    TRUE,    FALSE,    "MatrixWorldToCamera" },
  259. /* end Pixar tags */
  260. };
  261. #define    N(a)    (sizeof (a) / sizeof (a[0]))
  262.  
  263. void
  264. _TIFFSetupFieldInfo(TIFF* tif)
  265. {
  266.     if (tif->tif_fieldinfo) {
  267.         _TIFFfree(tif, tif->tif_fieldinfo);
  268.         tif->tif_nfields = 0;
  269.     }
  270.     _TIFFMergeFieldInfo(tif, tiffFieldInfo, N(tiffFieldInfo));
  271. }
  272.  
  273. static int
  274. tagCompare(const void* a, const void* b)
  275. {
  276.     const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a;
  277.     const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b;
  278.     /* NB: be careful of return values for 16-bit platforms */
  279.     if (ta->field_tag != tb->field_tag)
  280.         return (ta->field_tag < tb->field_tag ? -1 : 1);
  281.     else
  282.         return (tb->field_type < ta->field_type ? -1 : 1);
  283. }
  284.  
  285. void
  286. _TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n)
  287. {
  288.     TIFFFieldInfo** tp;
  289.     int i;
  290.  
  291.     if (tif->tif_nfields > 0) {
  292.         tif->tif_fieldinfo = (TIFFFieldInfo**)
  293.             _TIFFrealloc(tif, tif->tif_fieldinfo,
  294.             (tif->tif_nfields+n) * sizeof (TIFFFieldInfo*));
  295.     } else {
  296.         tif->tif_fieldinfo = (TIFFFieldInfo**)
  297.             _TIFFmalloc(tif, n * sizeof (TIFFFieldInfo*));
  298.     }
  299.     tp = &tif->tif_fieldinfo[tif->tif_nfields];
  300.     for (i = 0; i < n; i++)
  301.         tp[i] = (TIFFFieldInfo*) &info[i];    /* XXX */
  302.     /*
  303.      * NB: the core tags are presumed sorted correctly.
  304.      */
  305.     if (tif->tif_nfields > 0)
  306.         qsort(tif->tif_fieldinfo, (size_t) (tif->tif_nfields += n),
  307.             sizeof (TIFFFieldInfo*), tagCompare);
  308.     else
  309.         tif->tif_nfields += n;
  310. }
  311.  
  312. void
  313. _TIFFPrintFieldInfo(TIFF* tif, FILE* fd)
  314. {
  315.     int i;
  316.  
  317.     fprintf(fd, "%s: \n", tif->tif_name);
  318.     for (i = 0; i < tif->tif_nfields; i++) {
  319.         const TIFFFieldInfo* fip = tif->tif_fieldinfo[i];
  320.         fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n"
  321.             , i
  322.             , (unsigned long) fip->field_tag
  323.             , fip->field_readcount, fip->field_writecount
  324.             , fip->field_type
  325.             , fip->field_bit
  326.             , fip->field_oktochange ? "TRUE" : "FALSE"
  327.             , fip->field_passcount ? "TRUE" : "FALSE"
  328.             , fip->field_name
  329.         );
  330.     }
  331. }
  332.  
  333. const int tiffDataWidth[] = {
  334.     1,    /* nothing */
  335.     1,    /* TIFF_BYTE */
  336.     1,    /* TIFF_ASCII */
  337.     2,    /* TIFF_SHORT */
  338.     4,    /* TIFF_LONG */
  339.     8,    /* TIFF_RATIONAL */
  340.     1,    /* TIFF_SBYTE */
  341.     1,    /* TIFF_UNDEFINED */
  342.     2,    /* TIFF_SSHORT */
  343.     4,    /* TIFF_SLONG */
  344.     8,    /* TIFF_SRATIONAL */
  345.     4,    /* TIFF_FLOAT */
  346.     8,    /* TIFF_DOUBLE */
  347. };
  348.  
  349. /*
  350.  * Return nearest TIFFDataType to the sample type of an image.
  351.  */
  352. TIFFDataType
  353. _TIFFSampleToTagType(TIFF* tif)
  354. {
  355.     int bps = (int) TIFFhowmany(tif->tif_dir.td_bitspersample, 8);
  356.  
  357.     switch (tif->tif_dir.td_sampleformat) {
  358.     case SAMPLEFORMAT_IEEEFP:
  359.         return (bps == 4 ? TIFF_FLOAT : TIFF_DOUBLE);
  360.     case SAMPLEFORMAT_INT:
  361.         return (bps <= 1 ? TIFF_SBYTE :
  362.             bps <= 2 ? TIFF_SSHORT : TIFF_SLONG);
  363.     case SAMPLEFORMAT_UINT:
  364.         return (bps <= 1 ? TIFF_BYTE :
  365.             bps <= 2 ? TIFF_SHORT : TIFF_LONG);
  366.     case SAMPLEFORMAT_VOID:
  367.         return (TIFF_UNDEFINED);
  368.     }
  369.     /*NOTREACHED*/
  370.     return (TIFF_UNDEFINED);
  371. }
  372.  
  373. const TIFFFieldInfo*
  374. _TIFFFindFieldInfo(TIFF* tif, ttag_t tag, TIFFDataType dt)
  375. {
  376.     static const TIFFFieldInfo *last = NULL;
  377.     int i, n;
  378.  
  379.     if (last && last->field_tag == tag &&
  380.         (dt == TIFF_ANY || dt == last->field_type))
  381.         return (last);
  382.     /* NB: if table gets big, use sorted search (e.g. binary search) */
  383.     for (i = 0, n = tif->tif_nfields; i < n; i++) {
  384.         const TIFFFieldInfo* fip = tif->tif_fieldinfo[i];
  385.         if (fip->field_tag == tag &&
  386.             (dt == TIFF_ANY || fip->field_type == dt))
  387.             return (last = fip);
  388.     }
  389.     return ((const TIFFFieldInfo *)0);
  390. }
  391.  
  392. #include <stdio.h>
  393.  
  394. const TIFFFieldInfo*
  395. _TIFFFieldWithTag(TIFF* tif, ttag_t tag)
  396. {
  397.     const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY);
  398.     if (!fip) {
  399.         TIFFError("TIFFFieldWithTag",
  400.             "Internal error, unknown tag 0x%x", (u_int) tag);
  401.     }
  402.     return (fip);
  403. }
  404.