home *** CD-ROM | disk | FTP | other *** search
- $Header: /usr/people/sam/tiff/libtiff/RCS/README,v 1.14 92/02/19 14:04:31 sam 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.
-