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