AWARE [SYSTEMS] Imaging expertise for the Delphi developer
AWare Systems, Imaging expertise for the Delphi developer, Home TIFF and LibTiff Mailing List Archive

LibTiff Mailing List

TIFF and LibTiff Mailing List Archive
March 2005

Previous Thread
Next Thread

Previous by Thread
Next by Thread

Previous by Date
Next by Date

Contact

The TIFF Mailing List Homepage
This list is run by Frank Warmerdam
Archive maintained by AWare Systems



Valid HTML 4.01!



2005.03.04 22:36 "Advice on replacing use of tiffiop.h internals with public APIs", by Jon Leech

I'm porting some old software to current versions of libtiff, and
trying to eliminate use of libtiff non-public data structures and APIs
in tiffiop.h, so there's no dependency on a specific version of libtiff
being installed (it was written more than a decade ago, and at the time,
was built and bundled with its own copy of libtiff). I've been browsing
the libtiff code, but would appreciate sanity-checking and advice.

Right now when writing TIFF images this software constructs a lot of
the TIFF and TIFFDirectory header information itself. For starters,
there are a bunch of reads and writes of TIFFDirectory members, which I
think can almost all be replaced with TIFFSetField/GetField. Is the
member / tag mapping below accurate (for libtiff 3.5.7 and earlier,
anyway)?

    TIFFDirectory member	    Corresponding tag
    --------------------	    -----------------
    tif_dir.td_bitspersample	    TIFFTAG_BITSPERSAMPLE
    tif_dir.td_compression	    TIFFTAG_COMPRESSION
    tif_dir.td_extrasamples	    TIFFTAG_EXTRASAMPLES (first value)
    tif_dir.td_sampleinfo	    TIFFTAG_EXTRASAMPLES (second value)
    tif_dir.td_imagedepth	    TIFFTAG_IMAGEDEPTH
    tif_dir.td_imagedescription   TIFFTAG_IMAGEDESCRIPTION
    tif_dir.td_imagelength	    TIFFTAG_IMAGELENGTH
    tif_dir.td_imagewidth	    TIFFTAG_IMAGEWIDTH
    tif_dir.td_orientation	    TIFFTAG_ORIENTATION
    tif_dir.td_photometric	    TIFFTAG_PHOTOMETRIC
    tif_dir.td_planarconfig	    TIFFTAG_PLANARCONFIG
    tif_dir.td_rowsperstrip	    TIFFTAG_ROWSPERSTRIP
    tif_dir.td_sampleformat	    TIFFTAG_SAMPLEFORMAT
    tif_dir.td_samplesperpixel    TIFFTAG_SAMPLESPERPIXEL
    tif_dir.td_stripbytecount	    TIFFTAG_STRIPBYTECOUNTS
    tif_dir.td_stripoffset	    TIFFTAG_STRIPOFFSETS
    tif_dir.td_tiledepth	    TIFFTAG_TILEDEPTH
    tif_dir.td_tilelength	    TIFFTAG_TILELENGTH
    tif_dir.td_tilewidth	    TIFFTAG_TILEWIDTH
    tif_dif.td_stripsperimage	    (does this have a tag? It appears to
				    be derived from tag data in some
				    fashion)

There is also some use of internal macros, functions, and TIFF
members, which will be harder to fix. I'd appreciate any help in
understanding what the following internals mean, and how they are
initialized or used by libtiff itself. The following code fragment is
used when preparing to write a TIFF image, either the first image in a
file after opening it, or appending a new image to an existing file, in
which case a TIFFWriteDirectory() preceded. It's obviously performing
some initialization of the directory for the new image, but I'm not
clear if any of this is actually needed under the circumstances?

    /* either TIFFOpen() or TIFFWriteDirectory(), followed by: */
    TIFFFreeDirectory(tiff);
    TIFFDefaultDirectory(tiff);
    tiff->tif_flags &= ~TIFF_ISTILED;
    tiff->tif_diroff = 0;

That's followed by setting a whole bunch of the tags listed above,
and also some setting or querying of TIFF struct members including:

    tiff->tif_curoff = 0;
    tiff->tif_scanlinesize = TIFFScanlineSize(tiff);
    tiff->tif_tilesize
    tiff->tif_scanlinesize
    tiff->tif_mode  (replaceable by TIFFGetMode()?)

And finally, there's repeated use of the macro

	isTiled(tiff)

which is used to control how some of those members are initialized.

Thanks for any advice you can offer!

Jon Leech
SGI

P.S. Yes, that reply address works.