| 1 | <HTML>
|
|---|
| 2 | <HEAD>
|
|---|
| 3 | <TITLE>
|
|---|
| 4 | Modifying The TIFF Library
|
|---|
| 5 | </TITLE>
|
|---|
| 6 | </HEAD>
|
|---|
| 7 | <BODY BGCOLOR=white>
|
|---|
| 8 | <FONT FACE="Arial, Helvetica, Sans">
|
|---|
| 9 | <H1>
|
|---|
| 10 | <IMG SRC=images/dave.gif WIDTH=107 HEIGHT=148 BORDER=2 ALIGN=left HSPACE=6>
|
|---|
| 11 | Modifying The TIFF Library
|
|---|
| 12 | </H1>
|
|---|
| 13 |
|
|---|
| 14 |
|
|---|
| 15 | <P>
|
|---|
| 16 | This chapter provides information about the internal structure of
|
|---|
| 17 | the library, how to control the configuration when building it, and
|
|---|
| 18 | how to add new support to the library.
|
|---|
| 19 | The following sections are found in this chapter:
|
|---|
| 20 |
|
|---|
| 21 | <UL>
|
|---|
| 22 | <LI><A HREF=#Config>Library Configuration</A>
|
|---|
| 23 | <LI><A HREF=#Portability>General Portability Comments</A>
|
|---|
| 24 | <LI><A HREF="#Types">Types and Portability</A>
|
|---|
| 25 | <LI><A HREF="addingtags.html">Adding New Tags</A>
|
|---|
| 26 | <LI><A HREF=#AddingCODECS>Adding New Builtin Codecs</A>
|
|---|
| 27 | <LI><A HREF="addingtags.html#AddingCODECTags">Adding New Codec-private Tags</A>
|
|---|
| 28 | <LI><A HREF=#Other>Other Comments</A>
|
|---|
| 29 | </UL>
|
|---|
| 30 |
|
|---|
| 31 |
|
|---|
| 32 | <A NAME="Config"><P><HR WIDTH=65% ALIGN=right><H3>Library Configuration</H3></A>
|
|---|
| 33 |
|
|---|
| 34 | Information on compiling the library is given
|
|---|
| 35 | <A HREF=build.html>elsewhere in this documentation</A>.
|
|---|
| 36 | This section describes the low-level mechanisms used to control
|
|---|
| 37 | the optional parts of the library that are configured at build
|
|---|
| 38 | time. Control is based on
|
|---|
| 39 | a collection of C defines that are specified either on the compiler
|
|---|
| 40 | command line or in a configuration file such as <TT>port.h</TT>
|
|---|
| 41 | (as generated by the <TT>configure</TT> script for UNIX systems)
|
|---|
| 42 | or <B>tiffconf.h</B>.
|
|---|
| 43 |
|
|---|
| 44 | <P>
|
|---|
| 45 | Configuration defines are split into three areas:
|
|---|
| 46 | <UL>
|
|---|
| 47 | <LI>those that control which compression schemes are
|
|---|
| 48 | configured as part of the builtin codecs,
|
|---|
| 49 | <LI>those that control support for groups of tags that
|
|---|
| 50 | are considered optional, and
|
|---|
| 51 | <LI>those that control operating system or machine-specific support.
|
|---|
| 52 | </UL>
|
|---|
| 53 |
|
|---|
| 54 | <P>
|
|---|
| 55 | If the define <TT>COMPRESSION_SUPPORT</TT> is <STRONG>not defined</STRONG>
|
|---|
| 56 | then a default set of compression schemes is automatically
|
|---|
| 57 | configured:
|
|---|
| 58 | <UL>
|
|---|
| 59 | <LI>CCITT Group 3 and 4 algorithms (compression codes 2, 3, 4, and 32771),
|
|---|
| 60 | <LI>the Macintosh PackBits algorithm (compression 32773),
|
|---|
| 61 | <LI>a 4-bit run-length encoding scheme from ThunderScan (compression 32809),
|
|---|
| 62 | <LI>a 2-bit encoding scheme used by NeXT (compression 32766), and
|
|---|
| 63 | <LI>two experimental schemes intended for images with high dynamic range
|
|---|
| 64 | (compression 34676 and 34677).
|
|---|
| 65 | </UL>
|
|---|
| 66 |
|
|---|
| 67 | <P>
|
|---|
| 68 |
|
|---|
| 69 | To override the default compression behaviour define
|
|---|
| 70 | <TT>COMPRESSION_SUPPORT</TT> and then one or more additional defines
|
|---|
| 71 | to enable configuration of the appropriate codecs (see the table
|
|---|
| 72 | below); e.g.
|
|---|
| 73 |
|
|---|
| 74 | <UL><PRE>
|
|---|
| 75 | #define COMPRESSION_SUPPORT
|
|---|
| 76 | #define CCITT_SUPPORT
|
|---|
| 77 | #define PACKBITS_SUPPORT
|
|---|
| 78 | </PRE></UL>
|
|---|
| 79 |
|
|---|
| 80 | Several other compression schemes are configured separately from
|
|---|
| 81 | the default set because they depend on ancillary software
|
|---|
| 82 | packages that are not distributed with <TT>libtiff</TT>.
|
|---|
| 83 |
|
|---|
| 84 | <P>
|
|---|
| 85 | Support for JPEG compression is controlled by <TT>JPEG_SUPPORT</TT>.
|
|---|
| 86 | The JPEG codec that comes with <TT>libtiff</TT> is designed for
|
|---|
| 87 | use with release 5 or later of the Independent JPEG Group's freely
|
|---|
| 88 | available software distribution.
|
|---|
| 89 | This software can be retrieved from the directory
|
|---|
| 90 | <A HREF=ftp://ftp.uu.net/graphics/jpeg>ftp.uu.net:/graphics/jpeg/</A>.
|
|---|
| 91 |
|
|---|
| 92 |
|
|---|
| 93 | <P>
|
|---|
| 94 | <IMG SRC="images/info.gif" ALT="NOTE: " ALIGN=left HSPACE=8>
|
|---|
| 95 | <EM>Enabling JPEG support automatically enables support for
|
|---|
| 96 | the TIFF 6.0 colorimetry and YCbCr-related tags.</EM>
|
|---|
| 97 |
|
|---|
| 98 | <P>
|
|---|
| 99 | Experimental support for the deflate algorithm is controlled by
|
|---|
| 100 | <TT>DEFLATE_SUPPORT</TT>.
|
|---|
| 101 | The deflate codec that comes with <TT>libtiff</TT> is designed
|
|---|
| 102 | for use with version 0.99 or later of the freely available
|
|---|
| 103 | <TT>libz</TT> library written by Jean-loup Gailly and Mark Adler.
|
|---|
| 104 | The data format used by this library is described
|
|---|
| 105 | in the files
|
|---|
| 106 | <A HREF=ftp://ftp.uu.net/pub/archiving/zip/doc/zlib-3.1.doc>zlib-3.1.doc</A>,
|
|---|
| 107 | and
|
|---|
| 108 | <A HREF=ftp://ftp.uu.net/pub/archiving/zip/doc/deflate-1.1.doc>deflate-1.1.doc</A>,
|
|---|
| 109 | available in the directory
|
|---|
| 110 | <A HREF=ftp://ftp.uu.net/pub/archiving/zip/doc>ftp.uu.net:/pub/archiving/zip/doc</A>.</EM>
|
|---|
| 111 | The library can be retried from the directory
|
|---|
| 112 | <A HREF=ftp://ftp.uu.net/pub/archiving/zip/zlib/>ftp.uu.net:/pub/archiving/zip/zlib/</A>
|
|---|
| 113 | (or try <A HREF=ftp://quest.jpl.nasa.gov/beta/zlib/>quest.jpl.nasa.gov:/beta/zlib/</A>).
|
|---|
| 114 |
|
|---|
| 115 | <P>
|
|---|
| 116 | <IMG SRC="images/warning.gif" ALT="NOTE: " ALIGN=left HSPACE=8 VSPACE=6>
|
|---|
| 117 | <EM>The deflate algorithm is experimental. Do not expect
|
|---|
| 118 | to exchange files using this compression scheme;
|
|---|
| 119 | it is included only because the similar, and more common,
|
|---|
| 120 | LZW algorithm is claimed to be governed by licensing restrictions.</EM>
|
|---|
| 121 |
|
|---|
| 122 |
|
|---|
| 123 | <P>
|
|---|
| 124 | By default <B>tiffconf.h</B> defines
|
|---|
| 125 | <TT>COLORIMETRY_SUPPORT</TT>,
|
|---|
| 126 | <TT>YCBCR_SUPPORT</TT>,
|
|---|
| 127 | and
|
|---|
| 128 | <TT>CMYK_SUPPORT</TT>.
|
|---|
| 129 |
|
|---|
| 130 | <P>
|
|---|
| 131 | <TABLE BORDER CELLPADDING=3>
|
|---|
| 132 |
|
|---|
| 133 | <TR><TH ALIGN=left>Define</TH><TH ALIGN=left>Description</TH></TR>
|
|---|
| 134 |
|
|---|
| 135 | <TR>
|
|---|
| 136 | <TD VALIGN=top><TT>CCITT_SUPPORT</TT></TD>
|
|---|
| 137 | <TD>CCITT Group 3 and 4 algorithms (compression codes 2, 3, 4,
|
|---|
| 138 | and 32771)</TD>
|
|---|
| 139 | </TR>
|
|---|
| 140 |
|
|---|
| 141 | <TR>
|
|---|
| 142 | <TD VALIGN=top><TT>PACKBITS_SUPPORT</TT></TD>
|
|---|
| 143 | <TD>Macintosh PackBits algorithm (compression 32773)</TD>
|
|---|
| 144 | </TR>
|
|---|
| 145 |
|
|---|
| 146 | <TR>
|
|---|
| 147 | <TD VALIGN=top><TT>LZW_SUPPORT</TT></TD>
|
|---|
| 148 | <TD>Lempel-Ziv & Welch (LZW) algorithm (compression 5)</TD>
|
|---|
| 149 | </TR>
|
|---|
| 150 |
|
|---|
| 151 | <TR>
|
|---|
| 152 | <TD VALIGN=top><TT>THUNDER_SUPPORT</TT></TD>
|
|---|
| 153 | <TD>4-bit
|
|---|
| 154 | run-length encoding scheme from ThunderScan (compression 32809)</TD>
|
|---|
| 155 | </TR>
|
|---|
| 156 |
|
|---|
| 157 | <TR>
|
|---|
| 158 | <TD VALIGN=top><TT>NEXT_SUPPORT</TT></TD>
|
|---|
| 159 | <TD>2-bit encoding scheme used by NeXT (compression 32766)</TD>
|
|---|
| 160 | </TR>
|
|---|
| 161 |
|
|---|
| 162 | <TR>
|
|---|
| 163 | <TD VALIGN=top><TT>OJPEG_SUPPORT</TT></TD>
|
|---|
| 164 | <TD>obsolete JPEG scheme defined in the 6.0 spec (compression 6)</TD>
|
|---|
| 165 | </TR>
|
|---|
| 166 |
|
|---|
| 167 | <TR>
|
|---|
| 168 | <TD VALIGN=top><TT>JPEG_SUPPORT</TT></TD>
|
|---|
| 169 | <TD>current JPEG scheme defined in TTN2 (compression 7)</TD>
|
|---|
| 170 | </TR>
|
|---|
| 171 |
|
|---|
| 172 | <TR>
|
|---|
| 173 | <TD VALIGN=top><TT>ZIP_SUPPORT</TT></TD>
|
|---|
| 174 | <TD>experimental Deflate scheme (compression 32946)</TD>
|
|---|
| 175 | </TR>
|
|---|
| 176 |
|
|---|
| 177 | <TR>
|
|---|
| 178 | <TD VALIGN=top><TT>PIXARLOG_SUPPORT</TT></TD>
|
|---|
| 179 | <TD>Pixar's compression scheme for high-resolution color images (compression 32909)</TD>
|
|---|
| 180 | </TR>
|
|---|
| 181 |
|
|---|
| 182 | <TR>
|
|---|
| 183 | <TD VALIGN=top><TT>SGILOG_SUPPORT</TT></TD>
|
|---|
| 184 | <TD>SGI's compression scheme for high-resolution color images (compression 34676 and 34677)</TD>
|
|---|
| 185 | </TR>
|
|---|
| 186 |
|
|---|
| 187 | <TR>
|
|---|
| 188 | <TD VALIGN=top><TT>COLORIMETRY_SUPPORT</TT></TD>
|
|---|
| 189 | <TD>support for the TIFF 6.0 colorimetry tags</TD>
|
|---|
| 190 | </TR>
|
|---|
| 191 |
|
|---|
| 192 | <TR>
|
|---|
| 193 | <TD VALIGN=top><TT>YCBCR_SUPPORT</TT></TD>
|
|---|
| 194 | <TD>support for the TIFF 6.0 YCbCr-related tags</TD>
|
|---|
| 195 | </TR>
|
|---|
| 196 |
|
|---|
| 197 | <TR>
|
|---|
| 198 | <TD VALIGN=top><TT>CMYK_SUPPORT</TT></TD>
|
|---|
| 199 | <TD>support for the TIFF 6.0 CMYK-related tags</TD>
|
|---|
| 200 | </TR>
|
|---|
| 201 |
|
|---|
| 202 | <TR>
|
|---|
| 203 | <TD VALIGN=top><TT>ICC_SUPPORT</TT></TD>
|
|---|
| 204 | <TD>support for the ICC Profile tag; see
|
|---|
| 205 | <I>The ICC Profile Format Specification</I>,
|
|---|
| 206 | Annex B.3 "Embedding ICC Profiles in TIFF Files";
|
|---|
| 207 | available at
|
|---|
| 208 | <A HREF=http://www.color.org>http://www.color.org</A>
|
|---|
| 209 | </TD>
|
|---|
| 210 | </TR>
|
|---|
| 211 |
|
|---|
| 212 | </TABLE>
|
|---|
| 213 |
|
|---|
| 214 |
|
|---|
| 215 | <A NAME="Portability"><P><HR WIDTH=65% ALIGN=right><H3>General Portability Comments</H3></A>
|
|---|
| 216 |
|
|---|
| 217 | This software is developed on Silicon Graphics UNIX
|
|---|
| 218 | systems (big-endian, MIPS CPU, 32-bit ints,
|
|---|
| 219 | IEEE floating point).
|
|---|
| 220 | The <TT>configure</TT> shell script generates the appropriate
|
|---|
| 221 | include files and make files for UNIX systems.
|
|---|
| 222 | Makefiles exist for non-UNIX platforms that the
|
|---|
| 223 | code runs on -- this work has mostly been done by other people.
|
|---|
| 224 |
|
|---|
| 225 | <P>
|
|---|
| 226 | In general, the code is guaranteed to work only on SGI machines.
|
|---|
| 227 | In practice it is highly portable to any 32-bit or 64-bit system and much
|
|---|
| 228 | work has been done to insure portability to 16-bit systems.
|
|---|
| 229 | If you encounter portability problems please return fixes so
|
|---|
| 230 | that future distributions can be improved.
|
|---|
| 231 |
|
|---|
| 232 | <P>
|
|---|
| 233 | The software is written to assume an ANSI C compilation environment.
|
|---|
| 234 | If your compiler does not support ANSI function prototypes, <TT>const</TT>,
|
|---|
| 235 | and <TT><stdarg.h></TT> then you will have to make modifications to the
|
|---|
| 236 | software. In the past I have tried to support compilers without <TT>const</TT>
|
|---|
| 237 | and systems without <TT><stdarg.h></TT>, but I am
|
|---|
| 238 | <EM>no longer interested in these
|
|---|
| 239 | antiquated environments</EM>. With the general availability of
|
|---|
| 240 | the freely available GCC compiler, I
|
|---|
| 241 | see no reason to incorporate modifications to the software for these
|
|---|
| 242 | purposes.
|
|---|
| 243 |
|
|---|
| 244 | <P>
|
|---|
| 245 | An effort has been made to isolate as many of the
|
|---|
| 246 | operating system-dependencies
|
|---|
| 247 | as possible in two files: <B>tiffcomp.h</B> and
|
|---|
| 248 | <B>libtiff/tif_<os>.c</B>. The latter file contains
|
|---|
| 249 | operating system-specific routines to do I/O and I/O-related operations.
|
|---|
| 250 | The UNIX (<B>tif_unix.c</B>),
|
|---|
| 251 | Macintosh (<B>tif_apple.c</B>),
|
|---|
| 252 | and VMS (<B>tif_vms.c</B>)
|
|---|
| 253 | code has had the most use;
|
|---|
| 254 | the MS/DOS support (<B>tif_msdos.c</B>) assumes
|
|---|
| 255 | some level of UNIX system call emulation (i.e.
|
|---|
| 256 | <TT>open</TT>,
|
|---|
| 257 | <TT>read</TT>,
|
|---|
| 258 | <TT>write</TT>,
|
|---|
| 259 | <TT>fstat</TT>,
|
|---|
| 260 | <TT>malloc</TT>,
|
|---|
| 261 | <TT>free</TT>).
|
|---|
| 262 |
|
|---|
| 263 | <P>
|
|---|
| 264 | Native CPU byte order is determined on the fly by
|
|---|
| 265 | the library and does not need to be specified.
|
|---|
| 266 | The <TT>HOST_FILLORDER</TT> and <TT>HOST_BIGENDIAN</TT>
|
|---|
| 267 | definitions are not currently used, but may be employed by
|
|---|
| 268 | codecs for optimization purposes.
|
|---|
| 269 |
|
|---|
| 270 | <P>
|
|---|
| 271 | The following defines control general portability:
|
|---|
| 272 |
|
|---|
| 273 | <P>
|
|---|
| 274 | <TABLE BORDER CELLPADDING=3 WIDTH=100%>
|
|---|
| 275 |
|
|---|
| 276 | <TR>
|
|---|
| 277 | <TD VALIGN=top><TT>BSDTYPES</TT></TD>
|
|---|
| 278 | <TD>Define this if your system does NOT define the
|
|---|
| 279 | usual BSD typedefs: <TT>u_char</TT>,
|
|---|
| 280 | <TT>u_short</TT>, <TT>u_int</TT>, <TT>u_long</TT>.</TD>
|
|---|
| 281 | </TR>
|
|---|
| 282 |
|
|---|
| 283 | <TR>
|
|---|
| 284 | <TD VALIGN=top><TT>HAVE_IEEEFP</TT></TD>
|
|---|
| 285 | <TD>Define this as 0 or 1 according to the floating point
|
|---|
| 286 | format suported by the machine. If your machine does
|
|---|
| 287 | not support IEEE floating point then you will need to
|
|---|
| 288 | add support to tif_machdep.c to convert between the
|
|---|
| 289 | native format and IEEE format.</TD>
|
|---|
| 290 | </TR>
|
|---|
| 291 |
|
|---|
| 292 | <TR>
|
|---|
| 293 | <TD VALIGN=top><TT>HAVE_MMAP</TT></TD>
|
|---|
| 294 | <TD>Define this if there is <I>mmap-style</I> support for
|
|---|
| 295 | mapping files into memory (used only to read data).</TD>
|
|---|
| 296 | </TR>
|
|---|
| 297 |
|
|---|
| 298 | <TR>
|
|---|
| 299 | <TD VALIGN=top><TT>HOST_FILLORDER</TT></TD>
|
|---|
| 300 | <TD>Define the native CPU bit order: one of <TT>FILLORDER_MSB2LSB</TT>
|
|---|
| 301 | or <TT>FILLORDER_LSB2MSB</TT></TD>
|
|---|
| 302 | </TR>
|
|---|
| 303 |
|
|---|
| 304 | <TR>
|
|---|
| 305 | <TD VALIGN=top><TT>HOST_BIGENDIAN</TT></TD>
|
|---|
| 306 | <TD>Define the native CPU byte order: 1 if big-endian (Motorola)
|
|---|
| 307 | or 0 if little-endian (Intel); this may be used
|
|---|
| 308 | in codecs to optimize code</TD>
|
|---|
| 309 | </TR>
|
|---|
| 310 | </TABLE>
|
|---|
| 311 |
|
|---|
| 312 | <P>
|
|---|
| 313 | On UNIX systems <TT>HAVE_MMAP</TT> is defined through the running of
|
|---|
| 314 | the <TT>configure</TT> script; otherwise support for memory-mapped
|
|---|
| 315 | files is disabled.
|
|---|
| 316 | Note that <B>tiffcomp.h</B> defines <TT>HAVE_IEEEFP</TT> to be
|
|---|
| 317 | 1 (<TT>BSDTYPES</TT> is not defined).
|
|---|
| 318 |
|
|---|
| 319 |
|
|---|
| 320 | <A NAME="Types"><P><HR WIDTH=65% ALIGN=right><H3>Types and Portability</H3></A>
|
|---|
| 321 |
|
|---|
| 322 | The software makes extensive use of C typedefs to promote portability.
|
|---|
| 323 | Two sets of typedefs are used, one for communication with clients
|
|---|
| 324 | of the library and one for internal data structures and parsing of the
|
|---|
| 325 | TIFF format. There are interactions between these two to be careful
|
|---|
| 326 | of, but for the most part you should be able to deal with portability
|
|---|
| 327 | purely by fiddling with the following machine-dependent typedefs:
|
|---|
| 328 |
|
|---|
| 329 |
|
|---|
| 330 | <P>
|
|---|
| 331 | <TABLE BORDER CELLPADDING=3 WIDTH=100%>
|
|---|
| 332 |
|
|---|
| 333 | <TR>
|
|---|
| 334 | <TD>uint8</TD>
|
|---|
| 335 | <TD>8-bit unsigned integer</TD>
|
|---|
| 336 | <TD>tiff.h</TD>
|
|---|
| 337 | </TR>
|
|---|
| 338 |
|
|---|
| 339 | <TR>
|
|---|
| 340 | <TD>int8</TD>
|
|---|
| 341 | <TD>8-bit signed integer</TD>
|
|---|
| 342 | <TD>tiff.h</TD>
|
|---|
| 343 | </TR>
|
|---|
| 344 |
|
|---|
| 345 | <TR>
|
|---|
| 346 | <TD>uint16</TD>
|
|---|
| 347 | <TD>16-bit unsigned integer</TD>
|
|---|
| 348 | <TD>tiff.h</TD>
|
|---|
| 349 | </TR>
|
|---|
| 350 |
|
|---|
| 351 | <TR>
|
|---|
| 352 | <TD>int16</TD>
|
|---|
| 353 | <TD>16-bit signed integer</TD>
|
|---|
| 354 | <TD>tiff.h</TD>
|
|---|
| 355 | </TR>
|
|---|
| 356 |
|
|---|
| 357 | <TR>
|
|---|
| 358 | <TD>uint32</TD>
|
|---|
| 359 | <TD>32-bit unsigned integer</TD>
|
|---|
| 360 | <TD>tiff.h</TD>
|
|---|
| 361 | </TR>
|
|---|
| 362 |
|
|---|
| 363 | <TR>
|
|---|
| 364 | <TD>int32</TD>
|
|---|
| 365 | <TD>32-bit signed integer</TD>
|
|---|
| 366 | <TD>tiff.h</TD>
|
|---|
| 367 | </TR>
|
|---|
| 368 |
|
|---|
| 369 | <TR>
|
|---|
| 370 | <TD>dblparam_t</TD>
|
|---|
| 371 | <TD>promoted type for floats</TD>
|
|---|
| 372 | <TD>tiffcomp.h</TD>
|
|---|
| 373 | </TR>
|
|---|
| 374 |
|
|---|
| 375 | </TABLE>
|
|---|
| 376 |
|
|---|
| 377 | <P>
|
|---|
| 378 | (to clarify <TT>dblparam_t</TT>, it is the type that float parameters are
|
|---|
| 379 | promoted to when passed by value in a function call.)
|
|---|
| 380 |
|
|---|
| 381 | <P>
|
|---|
| 382 | The following typedefs are used throughout the library and interfaces
|
|---|
| 383 | to refer to certain objects whose size is dependent on the TIFF image
|
|---|
| 384 | structure:
|
|---|
| 385 |
|
|---|
| 386 |
|
|---|
| 387 | <P>
|
|---|
| 388 | <TABLE BORDER CELLPADDING=3 WIDTH=100%>
|
|---|
| 389 |
|
|---|
| 390 | <TR>
|
|---|
| 391 | <TD WIDTH=25%>typedef unsigned int ttag_t;</TD> <TD>directory tag</TD>
|
|---|
| 392 | </TR>
|
|---|
| 393 |
|
|---|
| 394 | <TR>
|
|---|
| 395 | <TD>typedef uint16 tdir_t;</TD> <TD>directory index</TD>
|
|---|
| 396 | </TR>
|
|---|
| 397 |
|
|---|
| 398 | <TR>
|
|---|
| 399 | <TD>typedef uint16 tsample_t;</TD> <TD>sample number</TD>
|
|---|
| 400 | </TR>
|
|---|
| 401 |
|
|---|
| 402 | <TR>
|
|---|
| 403 | <TD>typedef uint32 tstrip_t;</TD> <TD>strip number</TD>
|
|---|
| 404 | </TR>
|
|---|
| 405 |
|
|---|
| 406 | <TR>
|
|---|
| 407 | <TD>typedef uint32 ttile_t;</TD> <TD>tile number</TD>
|
|---|
| 408 | </TR>
|
|---|
| 409 |
|
|---|
| 410 | <TR>
|
|---|
| 411 | <TD>typedef int32 tsize_t;</TD> <TD>i/o size in bytes</TD>
|
|---|
| 412 | </TR>
|
|---|
| 413 |
|
|---|
| 414 | <TR>
|
|---|
| 415 | <TD>typedef void* tdata_t;</TD> <TD>image data ref</TD>
|
|---|
| 416 | </TR>
|
|---|
| 417 |
|
|---|
| 418 | <TR>
|
|---|
| 419 | <TD>typedef void* thandle_t;</TD> <TD>client data handle</TD>
|
|---|
| 420 | </TR>
|
|---|
| 421 |
|
|---|
| 422 | <TR>
|
|---|
| 423 | <TD>typedef int32 toff_t;</TD> <TD>file offset (should be off_t)</TD>
|
|---|
| 424 | </TR>
|
|---|
| 425 |
|
|---|
| 426 | <TR>
|
|---|
| 427 | <TD>typedef unsigned char* tidata_t;</TD> <TD>internal image data</TD>
|
|---|
| 428 | </TR>
|
|---|
| 429 |
|
|---|
| 430 | </TABLE>
|
|---|
| 431 |
|
|---|
| 432 | <P>
|
|---|
| 433 | Note that <TT>tstrip_t</TT>, <TT>ttile_t</TT>, and <TT>tsize_t</TT>
|
|---|
| 434 | are constrained to be
|
|---|
| 435 | no more than 32-bit quantities by 32-bit fields they are stored
|
|---|
| 436 | in in the TIFF image. Likewise <TT>tsample_t</TT> is limited by the 16-bit
|
|---|
| 437 | field used to store the <TT>SamplesPerPixel</TT> tag. <TT>tdir_t</TT>
|
|---|
| 438 | constrains
|
|---|
| 439 | the maximum number of IFDs that may appear in an image and may
|
|---|
| 440 | be an arbitrary size (without penalty). <TT>ttag_t</TT> must be either
|
|---|
| 441 | <TT>int</TT>, <TT>unsigned int</TT>, pointer, or <TT>double</TT>
|
|---|
| 442 | because the library uses a varargs
|
|---|
| 443 | interface and ANSI C restricts the type of the parameter before an
|
|---|
| 444 | ellipsis to be a promoted type. <TT>toff_t</TT> is defined as
|
|---|
| 445 | <TT>int32</TT> because
|
|---|
| 446 | TIFF file offsets are (unsigned) 32-bit quantities. A signed
|
|---|
| 447 | value is used because some interfaces return -1 on error (sigh).
|
|---|
| 448 | Finally, note that <TT>tidata_t</TT> is used internally to the library to
|
|---|
| 449 | manipulate internal data. User-specified data references are
|
|---|
| 450 | passed as opaque handles and only cast at the lowest layers where
|
|---|
| 451 | their type is presumed.
|
|---|
| 452 |
|
|---|
| 453 |
|
|---|
| 454 | <P><HR WIDTH=65% ALIGN=right><H3>General Comments</H3></A>
|
|---|
| 455 |
|
|---|
| 456 | The library is designed to hide as much of the details of TIFF from
|
|---|
| 457 | applications as
|
|---|
| 458 | possible. In particular, TIFF directories are read in their entirety
|
|---|
| 459 | into an internal format. Only the tags known by the library are
|
|---|
| 460 | available to a user and certain tag data may be maintained that a user
|
|---|
| 461 | does not care about (e.g. transfer function tables).
|
|---|
| 462 |
|
|---|
| 463 | <A NAME=AddingCODECS><P><HR WIDTH=65% ALIGN=right><H3>Adding New Builtin Codecs</H3></A>
|
|---|
| 464 |
|
|---|
| 465 | To add builtin support for a new compression algorithm, you can either
|
|---|
| 466 | use the "tag-extension" trick to override the handling of the
|
|---|
| 467 | TIFF Compression tag (see <A HREF=addingtags.html>Adding New Tags</A>),
|
|---|
| 468 | or do the following to add support directly to the core library:
|
|---|
| 469 |
|
|---|
| 470 | <OL>
|
|---|
| 471 | <LI>Define the tag value in <B>tiff.h</B>.
|
|---|
| 472 | <LI>Edit the file <B>tif_codec.c</B> to add an entry to the
|
|---|
| 473 | _TIFFBuiltinCODECS array (see how other algorithms are handled).
|
|---|
| 474 | <LI>Add the appropriate function prototype declaration to
|
|---|
| 475 | <B>tiffiop.h</B> (close to the bottom).
|
|---|
| 476 | <LI>Create a file with the compression scheme code, by convention files
|
|---|
| 477 | are named <B>tif_*.c</B> (except perhaps on some systems where the
|
|---|
| 478 | tif_ prefix pushes some filenames over 14 chars.
|
|---|
| 479 | <LI>Edit <B>Makefile.in</B> (and any other Makefiles)
|
|---|
| 480 | to include the new source file.
|
|---|
| 481 | </OL>
|
|---|
| 482 |
|
|---|
| 483 | <P>
|
|---|
| 484 | A codec, say <TT>foo</TT>, can have many different entry points:
|
|---|
| 485 |
|
|---|
| 486 | <PRE>
|
|---|
| 487 | TIFFInitfoo(tif, scheme)/* initialize scheme and setup entry points in tif */
|
|---|
| 488 | fooSetupDecode(tif) /* called once per IFD after tags has been frozen */
|
|---|
| 489 | fooPreDecode(tif, sample)/* called once per strip/tile, after data is read,
|
|---|
| 490 | but before the first row is decoded */
|
|---|
| 491 | fooDecode*(tif, bp, cc, sample)/* decode cc bytes of data into the buffer */
|
|---|
| 492 | fooDecodeRow(...) /* called to decode a single scanline */
|
|---|
| 493 | fooDecodeStrip(...) /* called to decode an entire strip */
|
|---|
| 494 | fooDecodeTile(...) /* called to decode an entire tile */
|
|---|
| 495 | fooSetupEncode(tif) /* called once per IFD after tags has been frozen */
|
|---|
| 496 | fooPreEncode(tif, sample)/* called once per strip/tile, before the first row in
|
|---|
| 497 | a strip/tile is encoded */
|
|---|
| 498 | fooEncode*(tif, bp, cc, sample)/* encode cc bytes of user data (bp) */
|
|---|
| 499 | fooEncodeRow(...) /* called to decode a single scanline */
|
|---|
| 500 | fooEncodeStrip(...) /* called to decode an entire strip */
|
|---|
| 501 | fooEncodeTile(...) /* called to decode an entire tile */
|
|---|
| 502 | fooPostEncode(tif) /* called once per strip/tile, just before data is written */
|
|---|
| 503 | fooSeek(tif, row) /* seek forwards row scanlines from the beginning
|
|---|
| 504 | of a strip (row will always be >0 and <rows/strip */
|
|---|
| 505 | fooCleanup(tif) /* called when compression scheme is replaced by user */
|
|---|
| 506 | </PRE>
|
|---|
| 507 |
|
|---|
| 508 | <P>
|
|---|
| 509 | Note that the encoding and decoding variants are only needed when
|
|---|
| 510 | a compression algorithm is dependent on the structure of the data.
|
|---|
| 511 | For example, Group 3 2D encoding and decoding maintains a reference
|
|---|
| 512 | scanline. The sample parameter identifies which sample is to be
|
|---|
| 513 | encoded or decoded if the image is organized with <TT>PlanarConfig</TT>=2
|
|---|
| 514 | (separate planes). This is important for algorithms such as JPEG.
|
|---|
| 515 | If <TT>PlanarConfig</TT>=1 (interleaved), then sample will always be 0.
|
|---|
| 516 |
|
|---|
| 517 | <A NAME=Other><P><HR WIDTH=65% ALIGN=right><H3>Other Comments</H3></A>
|
|---|
| 518 |
|
|---|
| 519 | The library handles most I/O buffering. There are two data buffers
|
|---|
| 520 | when decoding data: a raw data buffer that holds all the data in a
|
|---|
| 521 | strip, and a user-supplied scanline buffer that compression schemes
|
|---|
| 522 | place decoded data into. When encoding data the data in the
|
|---|
| 523 | user-supplied scanline buffer is encoded into the raw data buffer (from
|
|---|
| 524 | where it is written). Decoding routines should never have to explicitly
|
|---|
| 525 | read data -- a full strip/tile's worth of raw data is read and scanlines
|
|---|
| 526 | never cross strip boundaries. Encoding routines must be cognizant of
|
|---|
| 527 | the raw data buffer size and call <TT>TIFFFlushData1()</TT> when necessary.
|
|---|
| 528 | Note that any pending data is automatically flushed when a new strip/tile is
|
|---|
| 529 | started, so there's no need do that in the tif_postencode routine (if
|
|---|
| 530 | one exists). Bit order is automatically handled by the library when
|
|---|
| 531 | a raw strip or tile is filled. If the decoded samples are interpreted
|
|---|
| 532 | by the decoding routine before they are passed back to the user, then
|
|---|
| 533 | the decoding logic must handle byte-swapping by overriding the
|
|---|
| 534 | <TT>tif_postdecode</TT>
|
|---|
| 535 | routine (set it to <TT>TIFFNoPostDecode</TT>) and doing the required work
|
|---|
| 536 | internally. For an example of doing this look at the horizontal
|
|---|
| 537 | differencing code in the routines in <B>tif_predict.c</B>.
|
|---|
| 538 |
|
|---|
| 539 | <P>
|
|---|
| 540 | The variables <TT>tif_rawcc</TT>, <TT>tif_rawdata</TT>, and
|
|---|
| 541 | <TT>tif_rawcp</TT> in a <TT>TIFF</TT> structure
|
|---|
| 542 | are associated with the raw data buffer. <TT>tif_rawcc</TT> must be non-zero
|
|---|
| 543 | for the library to automatically flush data. The variable
|
|---|
| 544 | <TT>tif_scanlinesize</TT> is the size a user's scanline buffer should be. The
|
|---|
| 545 | variable <TT>tif_tilesize</TT> is the size of a tile for tiled images. This
|
|---|
| 546 | should not normally be used by compression routines, except where it
|
|---|
| 547 | relates to the compression algorithm. That is, the <TT>cc</TT> parameter to the
|
|---|
| 548 | <TT>tif_decode*</TT> and <TT>tif_encode*</TT>
|
|---|
| 549 | routines should be used in terminating
|
|---|
| 550 | decompression/compression. This ensures these routines can be used,
|
|---|
| 551 | for example, to decode/encode entire strips of data.
|
|---|
| 552 |
|
|---|
| 553 | <P>
|
|---|
| 554 | In general, if you have a new compression algorithm to add, work from
|
|---|
| 555 | the code for an existing routine. In particular,
|
|---|
| 556 | <B>tif_dumpmode.c</B>
|
|---|
| 557 | has the trivial code for the "nil" compression scheme,
|
|---|
| 558 | <B>tif_packbits.c</B> is a
|
|---|
| 559 | simple byte-oriented scheme that has to watch out for buffer
|
|---|
| 560 | boundaries, and <B>tif_lzw.c</B> has the LZW scheme that has the most
|
|---|
| 561 | complexity -- it tracks the buffer boundary at a bit level.
|
|---|
| 562 | Of course, using a private compression scheme (or private tags) limits
|
|---|
| 563 | the portability of your TIFF files.
|
|---|
| 564 |
|
|---|
| 565 | <P>
|
|---|
| 566 | <HR>
|
|---|
| 567 |
|
|---|
| 568 | Last updated: $Date: 2004/09/10 14:47:31 $
|
|---|
| 569 |
|
|---|
| 570 | </BODY>
|
|---|
| 571 |
|
|---|
| 572 | </HTML>
|
|---|