$Header: /cvs/bao-parsec/ext/splash2/apps/volrend/src/libtiff/README,v 1.1.1.1 2012/03/29 17:22:40 uid42307 Exp $

Configuration Comments:
----------------------
Aside from the compression algorithm support, there are
configuration-related defines that you can set in the Makefile:

COLORIMETRY_SUPPORT
		if this is defined, support for the colorimetry
		tags will be compiled in.
JPEG_SUPPORT	if this is defined, support for the JPEG-related
		tags will be compiled in.  Note that at the present
		time the JPEG compression support is not included.
YCBCR_SUPPORT	if this is defined, support for the YCbCr-related
		tags will be compiled in.  Note that you'll want
		YCBCR support for JPEG compression+decompression.
CMYK_SUPPORT	if this is defined, support for the CMYK-related
		tags will be compiled in.
MMAP_SUPPORT	if this is set, and OS support exists for memory
		mapping files, then the library will try to map
		a file if it is opened for reading.  If mmap does
		not exist on your system, or the mmap call fails
		on the file, then the normal read system calls are
		used.  It is not clear how useful this facility is.

By default, the above are not defined.

Portability Comments:
--------------------
I run this code on SGI machines (big-endian, MIPS CPU, 32-bit ints,
IEEE floating point).  Makefiles exist for other platforms that the
code runs on -- this work has mostly been done by other people.
I've also been told that the code runs on Macintosh and PC-based
systems, although I don't know the particulars.

In general, I promise only that the code runs on SGI machines.
I will, however, gladly take back fixes to make it work on other
systems -- when the changes are reasonable unobtrusive.

I've tried to isolate as many of the UNIX-dependencies as possible in
two files: tiffcompat.h and tif_compat.c.  There are still some problems
with the use of lseek().  I personally don't care to devote
much effort to making the code work (untouched) on lots of non-UNIX
platforms.

Machine dependencies such as byte order are determined on the
fly and do not need to be specified.

Three general portability-related defines are:
    USE_VARARGS		define as 0 or 1 to select between the use of
			varargs.h and stdarg.h; i.e.  -DUSE_VARARGS=0
			means use stdarg.h
    USE_PROTOTYPES	define as 0 or 1 to select function declarations
			with parameter types
    USE_CONST		if your compiler defines __STDC__ or __EXTENSIONS__,
			but does not support const, define this as 0,
			otherwise leave it alone
    BSDTYPES		define this if your system does NOT define the
			usual 4BSD typedefs
If you compile the code with prototypes (USE_PROTOTYPES=1), then
you must have USE_VARARGS=0.

Beware that if __STDC__ is defined and the USE_* symbols are
NOT defined, then compat.h defines:
    USE_PROTOTYPES	1
    USE_VARARGS		0
    USE_CONST		1

General Comments:
----------------
The library is designed to hide as much of the details of TIFF as
possible.  In particular, TIFF directories are read in their entirety
into an internal format.  This means that only the tags known by the
library are available to a user and that certain tag data may be
maintained that a user doesn't care about (e.g. transfer function
tables).

To add support for a new directory tag the following changes will be
needed:

1. Define the tag in tiff.h.
2. Add a field to the directory structure in tiffioP.h and define a
   FIELD_* bit.
3. Add an entry in the FieldInfo array defined at the top of tiff_dirinfo.c.
4. Add entries in TIFFSetField() and TIFFGetField1() for the new tag.
5. (optional) If the value associated with the tag is not a scalar value
   (e.g. the array for TransferFunction), then add the appropriate
   code to TIFFReadDirectory() and TIFFWriteDirectory().  You're best
   off finding a similar tag and cribbing code.
6. Add support to TIFFPrintDirectory() in tiff_print.c to print the
   tag's value.

To add support for a compression algorithm:

1. Define the tag value in tiff.h.
2. Edit the file tiff_compress.c to add an entry to the
   CompressionSchemes[] array.
3. Create a file with the compression scheme code, by convention files
   are named tif_*.c (except perhaps on System V where the tif_ prefix
   pushes some filenames over 14 chars.
4. Edit the Makefile to include the new source file.

A compression scheme, say foo, can have up to 10 entry points:

TIFFfoo(tif)		/* initialize scheme and setup entry points in tif */
fooPreDecode(tif)	/* called once per strip, after data is read,
			   but before the first row in a strip is decoded */
fooDecode*(tif, bp, cc, sample)/* decode cc bytes of data into the buffer */
    fooDecodeRow(...)	/* called to decode a single scanline */
    fooDecodeStrip(...)	/* called to decode an entire strip */
    fooDecodeTile(...)	/* called to decode an entire tile */
fooPreEncode(tif)	/* called once per strip/tile, before the first row in
			   a strip is encoded */
fooEncode*(tif, bp, cc, sample)/* encode cc bytes of user data (bp) */
    fooEncodeRow(...)	/* called to decode a single scanline */
    fooEncodeStrip(...)	/* called to decode an entire strip */
    fooEncodeTile(...)	/* called to decode an entire tile */
fooPostEncode(tif)	/* called once per strip/tile, just before data is written */
fooSeek(tif, row)	/* seek forwards row scanlines from the beginning
			   of a strip (row will always be >0 and <rows/strip */
fooCleanup(tif)		/* called when compression scheme is replaced by user */

Note that the encoding and decoding variants are only needed when
a compression algorithm is dependent on the structure of the data.
For example, Group 3 2D encoding and decoding maintains a reference
scanline.  The sample parameter identifies which sample is to be
encoded or decoded if the image is orgnanized with PlanarConfig=2
(separate planes).  This is important for algorithms such as JPEG.
If PlanarConfig=1 (interleaved), then sample will always be 0.

The library handles most I/O buffering.  There are two data buffers
when decoding data: a raw data buffer that holds all the data in a
strip, and a user-supplied scanline buffer that compression schemes
place decoded data into.  When encoding data the data in the
user-supplied scanline buffer is encoded into the raw data buffer (from
where it's written).  Decoding routines should never have to explicitly
read data -- a full strip/tile's worth of raw data is read and scanlines
never cross strip boundaries.  Encoding routines must be cognizant of
the raw data buffer size and call TIFFFlushData1() when necessary.
Note that any pending data is automatically flushed when a new strip/tile is
started, so there's no need do that in the tif_postencode routine (if
one exists).

The variables tif_rawcc, tif_rawdata, and tif_rawcp in a TIFF structure
are associated with the raw data buffer.  tif_rawcc must be non-zero
for the library to automatically flush data.  The variable
tif_scanlinesize is the size a user's scanline buffer should be.  The
varaible tif_tilesize is the size of a tile for tiled images.  This
should not normally be used by compression routines, except where it
relates to the compression algorithm.  That is, the cc parameter to the
tif_decode* and tif_encode* routines should be used in terminating
decompression/compression.  This ensures these routines can be used,
for example, to decode/encode entire strips of data.

In general, if you have a new compression algorithm to add, work from
the code for an existing routine.  In particular, tiff_dumpmode.c has
the trivial code for the "nil" compression scheme, tiff_packbits.c is a
simple byte-oriented scheme that has to watch out for buffer
boundaries, and tiff_lzw.c has the LZW scheme that has the most
complexity -- it tracks the buffer boundary at a bit level.

Of course, using a private compression scheme (or private tags) limits
the portability of your TIFF files.
