AWARE SYSTEMS
TIFF and LibTiff Mail List Archive

Thread

2002.09.11 13:55 "Tags modifcation", by Gerben Koopmans
2002.09.11 14:21 "Re: Tags modifcation", by Frank Warmerdam
2002.09.30 18:23 "Re: Seek help", by Zhongfu Zhou
2002.09.30 17:34 "Seek help", by Zhongfu Zhou
2002.09.30 18:00 "Re: Seek help", by Frank Warmerdam
2002.10.01 04:36 "Re: Seek help", by Peter Montgomery

2002.09.11 14:21 "Re: Tags modifcation", by Frank Warmerdam

Hi there,

In trying to use the tag extension schemes in "./contrib/tags" I came across a not so obvious limitation in the lines

#define FIELD_SETLONGS 3
#define FIELD_LAST (32*FIELD_SETLONGS-1)
u_long td_fieldsset[FIELD_SETLONGS];

in tif_dir.h.

Here FIELD_LAST indicates the maximum number of tags you may define in libtiff. If, for instance, you want to read Exif files it seems you need to increase FIELD_SETLONGS to accomodate the large number of tags.

Gerben,

I would like to take this opportunity to suggest that the libtiff 3.5.x mechanism for extending the set of tags (as in contrib/tags) is flawed in a number of ways, including the one you mention, and I would encourage you to use the new (CVS only) mechanism for extending tags.

The key item is that there is now a TIFFMergeFieldInfo() function which you can call to register new tags, and there is a field value "FIELD_CUSTOM" which avoids the need to assign specific field values for new tags.

I have attached the xtiff.c for libgeotiff using the new mechanism as an example.

Best regards,

-- 
---------------------------------------+--------------------------------------
I set the clouds in motion - turn up   | Frank Warmerdam, warmerdam@pobox.com
light and sound - activate the windows | http://pobox.com/~warmerdam
and watch the world go round - Rush    | Geospatial Programmer for Rent

/*
 * xtiff.c
 *
 * Extended TIFF Directory GEO Tag Support.
 *
 *  You may use this file as a template to add your own
 *  extended tags to the library. Only the parts of the code
 *  marked with "XXX" require modification.
 *
 *  Author: Niles D. Ritter
 *
 *  Revisions:
 *    18 Sep 1995   -- Deprecated Integraph Matrix tag with new one.
 *                     Backward compatible support provided.  --NDR.
 */
 
#include "xtiffio.h"
#include <stdio.h>

/*  Tiff info structure.
 *
 *     Entry format:
 *        { TAGNUMBER, ReadCount, WriteCount, DataType, FIELDNUM, 
 *          OkToChange, PassDirCountOnSet, AsciiName }
 *
 *     For ReadCount, WriteCount, -1 = unknown.
 */

static const TIFFFieldInfo xtiffFieldInfo[] = {

  /* XXX Insert Your tags here */

    { TIFFTAG_GEOPIXELSCALE,    -1,-1, TIFF_DOUBLE,     FIELD_CUSTOM,

      TRUE,     TRUE,   "GeoPixelScale" },
    { TIFFTAG_INTERGRAPH_MATRIX,-1,-1, TIFF_DOUBLE,     FIELD_CUSTOM,
      TRUE,     TRUE,   "Intergraph TransformationMatrix" },
    { TIFFTAG_GEOTRANSMATRIX,   -1,-1, TIFF_DOUBLE,     FIELD_CUSTOM,
      TRUE,     TRUE,   "GeoTransformationMatrix" },
    { TIFFTAG_GEOTIEPOINTS,     -1,-1, TIFF_DOUBLE,     FIELD_CUSTOM,
      TRUE,     TRUE,   "GeoTiePoints" },
    { TIFFTAG_GEOKEYDIRECTORY,-1,-1, TIFF_SHORT,        FIELD_CUSTOM,
      TRUE,     TRUE,   "GeoKeyDirectory" },
    { TIFFTAG_GEODOUBLEPARAMS,  -1,-1, TIFF_DOUBLE,     FIELD_CUSTOM,
      TRUE,     TRUE,   "GeoDoubleParams" },

    { TIFFTAG_GEOASCIIPARAMS,   -1,-1, TIFF_ASCII,      FIELD_CUSTOM,

      TRUE,     FALSE,  "GeoASCIIParams" },

#ifdef JPL_TAG_SUPPORT

    { TIFFTAG_JPL_CARTO_IFD,     1, 1, TIFF_LONG,       FIELD_CUSTOM,

      TRUE,     TRUE,   "JPL Carto IFD offset" },  /** Don't use this! **/

#endif
};

#define N(a) (sizeof (a) / sizeof (a[0]))
static void _XTIFFLocalDefaultDirectory(TIFF *tif)
{
    /* Install the extended Tag field info */
    TIFFMergeFieldInfo(tif, xtiffFieldInfo, N(xtiffFieldInfo));
}

/**********************************************************************
 *    Nothing below this line should need to be changed.
 **********************************************************************/

static TIFFExtendProc _ParentExtender;

/*

static void
_XTIFFDefaultDirectory(TIFF *tif)
{
    /* set up our own defaults */
    _XTIFFLocalDefaultDirectory(tif);

    /* Since an XTIFF client module may have overridden
     * the default directory method, we call it now to
     * allow it to set up the rest of its own methods.
     */

    if (_ParentExtender)
        (*_ParentExtender)(tif);
}

/*

 */

static
void _XTIFFInitialize(void)
{
    static int first_time=1;

    if (! first_time) return; /* Been there. Done that. */
    first_time = 0;

    /* Grab the inherited method and install */
    _ParentExtender = TIFFSetTagExtender(_XTIFFDefaultDirectory);
}

/**

The name of the file to be opened should be passed as <b>name</b>, and an opening mode ("r", "w" or "a") acceptable to TIFFOpen() should be passed as the <b>mode</b>.<p>

If XTIFFOpen() fails it will return NULL. Otherwise, normal TIFFOpen() error reporting steps will have already taken place.<p>

 */

TIFF*
XTIFFOpen(const char* name, const char* mode)
{
    TIFF *tif;

    /* Set up the callback */
    _XTIFFInitialize();

    /* Open the file; the callback will set everything up
     */
    tif = TIFFOpen(name, mode);
    if (!tif) return tif;

    return tif;
}

TIFF*
XTIFFFdOpen(int fd, const char* name, const char* mode)
{
    TIFF *tif;

    /* Set up the callback */
    _XTIFFInitialize();

    /* Open the file; the callback will set everything up
     */
    tif = TIFFFdOpen(fd, name, mode);
    if (!tif) return tif;

    return tif;
}

/**
 * Close a file opened with XTIFFOpen().
 *

*/

void
XTIFFClose(TIFF *tif)
{
    TIFFClose(tif);
}