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>
|
---|