0
|
1 |
INSTALLATION INSTRUCTIONS for the Independent JPEG Group's JPEG software
|
|
2 |
|
|
3 |
Copyright (C) 1991-1998, Thomas G. Lane.
|
|
4 |
This file is part of the Independent JPEG Group's software.
|
|
5 |
For conditions of distribution and use, see the accompanying README file.
|
|
6 |
|
|
7 |
|
|
8 |
This file explains how to configure and install the IJG software. We have
|
|
9 |
tried to make this software extremely portable and flexible, so that it can be
|
|
10 |
adapted to almost any environment. The downside of this decision is that the
|
|
11 |
installation process is complicated. We have provided shortcuts to simplify
|
|
12 |
the task on common systems. But in any case, you will need at least a little
|
|
13 |
familiarity with C programming and program build procedures for your system.
|
|
14 |
|
|
15 |
If you are only using this software as part of a larger program, the larger
|
|
16 |
program's installation procedure may take care of configuring the IJG code.
|
|
17 |
For example, Ghostscript's installation script will configure the IJG code.
|
|
18 |
You don't need to read this file if you just want to compile Ghostscript.
|
|
19 |
|
|
20 |
If you are on a Unix machine, you may not need to read this file at all.
|
|
21 |
Try doing
|
|
22 |
./configure
|
|
23 |
make
|
|
24 |
make test
|
|
25 |
If that doesn't complain, do
|
|
26 |
make install
|
|
27 |
(better do "make -n install" first to see if the makefile will put the files
|
|
28 |
where you want them). Read further if you run into snags or want to customize
|
|
29 |
the code for your system.
|
|
30 |
|
|
31 |
|
|
32 |
TABLE OF CONTENTS
|
|
33 |
-----------------
|
|
34 |
|
|
35 |
Before you start
|
|
36 |
Configuring the software:
|
|
37 |
using the automatic "configure" script
|
|
38 |
using one of the supplied jconfig and makefile files
|
|
39 |
by hand
|
|
40 |
Building the software
|
|
41 |
Testing the software
|
|
42 |
Installing the software
|
|
43 |
Optional stuff
|
|
44 |
Optimization
|
|
45 |
Hints for specific systems
|
|
46 |
|
|
47 |
|
|
48 |
BEFORE YOU START
|
|
49 |
================
|
|
50 |
|
|
51 |
Before installing the software you must unpack the distributed source code.
|
|
52 |
Since you are reading this file, you have probably already succeeded in this
|
|
53 |
task. However, there is a potential for error if you needed to convert the
|
|
54 |
files to the local standard text file format (for example, if you are on
|
|
55 |
MS-DOS you may have converted LF end-of-line to CR/LF). You must apply
|
|
56 |
such conversion to all the files EXCEPT those whose names begin with "test".
|
|
57 |
The test files contain binary data; if you change them in any way then the
|
|
58 |
self-test will give bad results.
|
|
59 |
|
|
60 |
Please check the last section of this file to see if there are hints for the
|
|
61 |
specific machine or compiler you are using.
|
|
62 |
|
|
63 |
|
|
64 |
CONFIGURING THE SOFTWARE
|
|
65 |
========================
|
|
66 |
|
|
67 |
To configure the IJG code for your system, you need to create two files:
|
|
68 |
* jconfig.h: contains values for system-dependent #define symbols.
|
|
69 |
* Makefile: controls the compilation process.
|
|
70 |
(On a non-Unix machine, you may create "project files" or some other
|
|
71 |
substitute for a Makefile. jconfig.h is needed in any environment.)
|
|
72 |
|
|
73 |
We provide three different ways to generate these files:
|
|
74 |
* On a Unix system, you can just run the "configure" script.
|
|
75 |
* We provide sample jconfig files and makefiles for popular machines;
|
|
76 |
if your machine matches one of the samples, just copy the right sample
|
|
77 |
files to jconfig.h and Makefile.
|
|
78 |
* If all else fails, read the instructions below and make your own files.
|
|
79 |
|
|
80 |
|
|
81 |
Configuring the software using the automatic "configure" script
|
|
82 |
---------------------------------------------------------------
|
|
83 |
|
|
84 |
If you are on a Unix machine, you can just type
|
|
85 |
./configure
|
|
86 |
and let the configure script construct appropriate configuration files.
|
|
87 |
If you're using "csh" on an old version of System V, you might need to type
|
|
88 |
sh configure
|
|
89 |
instead to prevent csh from trying to execute configure itself.
|
|
90 |
Expect configure to run for a few minutes, particularly on slower machines;
|
|
91 |
it works by compiling a series of test programs.
|
|
92 |
|
|
93 |
Configure was created with GNU Autoconf and it follows the usual conventions
|
|
94 |
for GNU configure scripts. It makes a few assumptions that you may want to
|
|
95 |
override. You can do this by providing optional switches to configure:
|
|
96 |
|
|
97 |
* If you want to build libjpeg as a shared library, say
|
|
98 |
./configure --enable-shared
|
|
99 |
To get both shared and static libraries, say
|
|
100 |
./configure --enable-shared --enable-static
|
|
101 |
Note that these switches invoke GNU libtool to take care of system-dependent
|
|
102 |
shared library building methods. If things don't work this way, please try
|
|
103 |
running configure without either switch; that should build a static library
|
|
104 |
without using libtool. If that works, your problem is probably with libtool
|
|
105 |
not with the IJG code. libtool is fairly new and doesn't support all flavors
|
|
106 |
of Unix yet. (You might be able to find a newer version of libtool than the
|
|
107 |
one included with libjpeg; see ftp.gnu.org. Report libtool problems to
|
|
108 |
bug-libtool@gnu.org.)
|
|
109 |
|
|
110 |
* Configure will use gcc (GNU C compiler) if it's available, otherwise cc.
|
|
111 |
To force a particular compiler to be selected, use the CC option, for example
|
|
112 |
./configure CC='cc'
|
|
113 |
The same method can be used to include any unusual compiler switches.
|
|
114 |
For example, on HP-UX you probably want to say
|
|
115 |
./configure CC='cc -Aa'
|
|
116 |
to get HP's compiler to run in ANSI mode.
|
|
117 |
|
|
118 |
* The default CFLAGS setting is "-O" for non-gcc compilers, "-O2" for gcc.
|
|
119 |
You can override this by saying, for example,
|
|
120 |
./configure CFLAGS='-g'
|
|
121 |
if you want to compile with debugging support.
|
|
122 |
|
|
123 |
* Configure will set up the makefile so that "make install" will install files
|
|
124 |
into /usr/local/bin, /usr/local/man, etc. You can specify an installation
|
|
125 |
prefix other than "/usr/local" by giving configure the option "--prefix=PATH".
|
|
126 |
|
|
127 |
* If you don't have a lot of swap space, you may need to enable the IJG
|
|
128 |
software's internal virtual memory mechanism. To do this, give the option
|
|
129 |
"--enable-maxmem=N" where N is the default maxmemory limit in megabytes.
|
|
130 |
This is discussed in more detail under "Selecting a memory manager", below.
|
|
131 |
You probably don't need to worry about this on reasonably-sized Unix machines,
|
|
132 |
unless you plan to process very large images.
|
|
133 |
|
|
134 |
Configure has some other features that are useful if you are cross-compiling
|
|
135 |
or working in a network of multiple machine types; but if you need those
|
|
136 |
features, you probably already know how to use them.
|
|
137 |
|
|
138 |
|
|
139 |
Configuring the software using one of the supplied jconfig and makefile files
|
|
140 |
-----------------------------------------------------------------------------
|
|
141 |
|
|
142 |
If you have one of these systems, you can just use the provided configuration
|
|
143 |
files:
|
|
144 |
|
|
145 |
Makefile jconfig file System and/or compiler
|
|
146 |
|
|
147 |
makefile.manx jconfig.manx Amiga, Manx Aztec C
|
|
148 |
makefile.sas jconfig.sas Amiga, SAS C
|
|
149 |
makeproj.mac jconfig.mac Apple Macintosh, Metrowerks CodeWarrior
|
|
150 |
mak*jpeg.st jconfig.st Atari ST/STE/TT, Pure C or Turbo C
|
|
151 |
makefile.bcc jconfig.bcc MS-DOS or OS/2, Borland C
|
|
152 |
makefile.dj jconfig.dj MS-DOS, DJGPP (Delorie's port of GNU C)
|
|
153 |
makefile.mc6 jconfig.mc6 MS-DOS, Microsoft C (16-bit only)
|
|
154 |
makefile.wat jconfig.wat MS-DOS, OS/2, or Windows NT, Watcom C
|
|
155 |
makefile.vc jconfig.vc Windows NT/95, MS Visual C++
|
|
156 |
make*.ds jconfig.vc Windows NT/95, MS Developer Studio
|
|
157 |
makefile.mms jconfig.vms Digital VMS, with MMS software
|
|
158 |
makefile.vms jconfig.vms Digital VMS, without MMS software
|
|
159 |
|
|
160 |
Copy the proper jconfig file to jconfig.h and the makefile to Makefile (or
|
|
161 |
whatever your system uses as the standard makefile name). For more info see
|
|
162 |
the appropriate system-specific hints section near the end of this file.
|
|
163 |
|
|
164 |
|
|
165 |
Configuring the software by hand
|
|
166 |
--------------------------------
|
|
167 |
|
|
168 |
First, generate a jconfig.h file. If you are moderately familiar with C,
|
|
169 |
the comments in jconfig.doc should be enough information to do this; just
|
|
170 |
copy jconfig.doc to jconfig.h and edit it appropriately. Otherwise, you may
|
|
171 |
prefer to use the ckconfig.c program. You will need to compile and execute
|
|
172 |
ckconfig.c by hand --- we hope you know at least enough to do that.
|
|
173 |
ckconfig.c may not compile the first try (in fact, the whole idea is for it
|
|
174 |
to fail if anything is going to). If you get compile errors, fix them by
|
|
175 |
editing ckconfig.c according to the directions given in ckconfig.c. Once
|
|
176 |
you get it to run, it will write a suitable jconfig.h file, and will also
|
|
177 |
print out some advice about which makefile to use.
|
|
178 |
|
|
179 |
You may also want to look at the canned jconfig files, if there is one for a
|
|
180 |
system similar to yours.
|
|
181 |
|
|
182 |
Second, select a makefile and copy it to Makefile (or whatever your system
|
|
183 |
uses as the standard makefile name). The most generic makefiles we provide
|
|
184 |
are
|
|
185 |
makefile.ansi: if your C compiler supports function prototypes
|
|
186 |
makefile.unix: if not.
|
|
187 |
(You have function prototypes if ckconfig.c put "#define HAVE_PROTOTYPES"
|
|
188 |
in jconfig.h.) You may want to start from one of the other makefiles if
|
|
189 |
there is one for a system similar to yours.
|
|
190 |
|
|
191 |
Look over the selected Makefile and adjust options as needed. In particular
|
|
192 |
you may want to change the CC and CFLAGS definitions. For instance, if you
|
|
193 |
are using GCC, set CC=gcc. If you had to use any compiler switches to get
|
|
194 |
ckconfig.c to work, make sure the same switches are in CFLAGS.
|
|
195 |
|
|
196 |
If you are on a system that doesn't use makefiles, you'll need to set up
|
|
197 |
project files (or whatever you do use) to compile all the source files and
|
|
198 |
link them into executable files cjpeg, djpeg, jpegtran, rdjpgcom, and wrjpgcom.
|
|
199 |
See the file lists in any of the makefiles to find out which files go into
|
|
200 |
each program. Note that the provided makefiles all make a "library" file
|
|
201 |
libjpeg first, but you don't have to do that if you don't want to; the file
|
|
202 |
lists identify which source files are actually needed for compression,
|
|
203 |
decompression, or both. As a last resort, you can make a batch script that
|
|
204 |
just compiles everything and links it all together; makefile.vms is an example
|
|
205 |
of this (it's for VMS systems that have no make-like utility).
|
|
206 |
|
|
207 |
Here are comments about some specific configuration decisions you'll
|
|
208 |
need to make:
|
|
209 |
|
|
210 |
Command line style
|
|
211 |
------------------
|
|
212 |
|
|
213 |
These programs can use a Unix-like command line style which supports
|
|
214 |
redirection and piping, like this:
|
|
215 |
cjpeg inputfile >outputfile
|
|
216 |
cjpeg <inputfile >outputfile
|
|
217 |
source program | cjpeg >outputfile
|
|
218 |
The simpler "two file" command line style is just
|
|
219 |
cjpeg inputfile outputfile
|
|
220 |
You may prefer the two-file style, particularly if you don't have pipes.
|
|
221 |
|
|
222 |
You MUST use two-file style on any system that doesn't cope well with binary
|
|
223 |
data fed through stdin/stdout; this is true for some MS-DOS compilers, for
|
|
224 |
example. If you're not on a Unix system, it's safest to assume you need
|
|
225 |
two-file style. (But if your compiler provides either the Posix-standard
|
|
226 |
fdopen() library routine or a Microsoft-compatible setmode() routine, you
|
|
227 |
can safely use the Unix command line style, by defining USE_FDOPEN or
|
|
228 |
USE_SETMODE respectively.)
|
|
229 |
|
|
230 |
To use the two-file style, make jconfig.h say "#define TWO_FILE_COMMANDLINE".
|
|
231 |
|
|
232 |
Selecting a memory manager
|
|
233 |
--------------------------
|
|
234 |
|
|
235 |
The IJG code is capable of working on images that are too big to fit in main
|
|
236 |
memory; data is swapped out to temporary files as necessary. However, the
|
|
237 |
code to do this is rather system-dependent. We provide five different
|
|
238 |
memory managers:
|
|
239 |
|
|
240 |
* jmemansi.c This version uses the ANSI-standard library routine tmpfile(),
|
|
241 |
which not all non-ANSI systems have. On some systems
|
|
242 |
tmpfile() may put the temporary file in a non-optimal
|
|
243 |
location; if you don't like what it does, use jmemname.c.
|
|
244 |
|
|
245 |
* jmemname.c This version creates named temporary files. For anything
|
|
246 |
except a Unix machine, you'll need to configure the
|
|
247 |
select_file_name() routine appropriately; see the comments
|
|
248 |
near the head of jmemname.c. If you use this version, define
|
|
249 |
NEED_SIGNAL_CATCHER in jconfig.h to make sure the temp files
|
|
250 |
are removed if the program is aborted.
|
|
251 |
|
|
252 |
* jmemnobs.c (That stands for No Backing Store :-).) This will compile on
|
|
253 |
almost any system, but it assumes you have enough main memory
|
|
254 |
or virtual memory to hold the biggest images you work with.
|
|
255 |
|
|
256 |
* jmemdos.c This should be used with most 16-bit MS-DOS compilers.
|
|
257 |
See the system-specific notes about MS-DOS for more info.
|
|
258 |
IMPORTANT: if you use this, define USE_MSDOS_MEMMGR in
|
|
259 |
jconfig.h, and include the assembly file jmemdosa.asm in the
|
|
260 |
programs. The supplied makefiles and jconfig files for
|
|
261 |
16-bit MS-DOS compilers already do both.
|
|
262 |
|
|
263 |
* jmemmac.c Custom version for Apple Macintosh; see the system-specific
|
|
264 |
notes for Macintosh for more info.
|
|
265 |
|
|
266 |
To use a particular memory manager, change the SYSDEPMEM variable in your
|
|
267 |
makefile to equal the corresponding object file name (for example, jmemansi.o
|
|
268 |
or jmemansi.obj for jmemansi.c).
|
|
269 |
|
|
270 |
If you have plenty of (real or virtual) main memory, just use jmemnobs.c.
|
|
271 |
"Plenty" means about ten bytes for every pixel in the largest images
|
|
272 |
you plan to process, so a lot of systems don't meet this criterion.
|
|
273 |
If yours doesn't, try jmemansi.c first. If that doesn't compile, you'll have
|
|
274 |
to use jmemname.c; be sure to adjust select_file_name() for local conditions.
|
|
275 |
You may also need to change unlink() to remove() in close_backing_store().
|
|
276 |
|
|
277 |
Except with jmemnobs.c or jmemmac.c, you need to adjust the DEFAULT_MAX_MEM
|
|
278 |
setting to a reasonable value for your system (either by adding a #define for
|
|
279 |
DEFAULT_MAX_MEM to jconfig.h, or by adding a -D switch to the Makefile).
|
|
280 |
This value limits the amount of data space the program will attempt to
|
|
281 |
allocate. Code and static data space isn't counted, so the actual memory
|
|
282 |
needs for cjpeg or djpeg are typically 100 to 150Kb more than the max-memory
|
|
283 |
setting. Larger max-memory settings reduce the amount of I/O needed to
|
|
284 |
process a large image, but too large a value can result in "insufficient
|
|
285 |
memory" failures. On most Unix machines (and other systems with virtual
|
|
286 |
memory), just set DEFAULT_MAX_MEM to several million and forget it. At the
|
|
287 |
other end of the spectrum, for MS-DOS machines you probably can't go much
|
|
288 |
above 300K to 400K. (On MS-DOS the value refers to conventional memory only.
|
|
289 |
Extended/expanded memory is handled separately by jmemdos.c.)
|
|
290 |
|
|
291 |
|
|
292 |
BUILDING THE SOFTWARE
|
|
293 |
=====================
|
|
294 |
|
|
295 |
Now you should be able to compile the software. Just say "make" (or
|
|
296 |
whatever's necessary to start the compilation). Have a cup of coffee.
|
|
297 |
|
|
298 |
Here are some things that could go wrong:
|
|
299 |
|
|
300 |
If your compiler complains about undefined structures, you should be able to
|
|
301 |
shut it up by putting "#define INCOMPLETE_TYPES_BROKEN" in jconfig.h.
|
|
302 |
|
|
303 |
If you have trouble with missing system include files or inclusion of the
|
|
304 |
wrong ones, read jinclude.h. This shouldn't happen if you used configure
|
|
305 |
or ckconfig.c to set up jconfig.h.
|
|
306 |
|
|
307 |
There are a fair number of routines that do not use all of their parameters;
|
|
308 |
some compilers will issue warnings about this, which you can ignore. There
|
|
309 |
are also a few configuration checks that may give "unreachable code" warnings.
|
|
310 |
Any other warning deserves investigation.
|
|
311 |
|
|
312 |
If you don't have a getenv() library routine, define NO_GETENV.
|
|
313 |
|
|
314 |
Also see the system-specific hints, below.
|
|
315 |
|
|
316 |
|
|
317 |
TESTING THE SOFTWARE
|
|
318 |
====================
|
|
319 |
|
|
320 |
As a quick test of functionality we've included a small sample image in
|
|
321 |
several forms:
|
|
322 |
testorig.jpg Starting point for the djpeg tests.
|
|
323 |
testimg.ppm The output of djpeg testorig.jpg
|
|
324 |
testimg.bmp The output of djpeg -bmp -colors 256 testorig.jpg
|
|
325 |
testimg.jpg The output of cjpeg testimg.ppm
|
|
326 |
testprog.jpg Progressive-mode equivalent of testorig.jpg.
|
|
327 |
testimgp.jpg The output of cjpeg -progressive -optimize testimg.ppm
|
|
328 |
(The first- and second-generation .jpg files aren't identical since JPEG is
|
|
329 |
lossy.) If you can generate duplicates of the testimg* files then you
|
|
330 |
probably have working programs.
|
|
331 |
|
|
332 |
With most of the makefiles, "make test" will perform the necessary
|
|
333 |
comparisons.
|
|
334 |
|
|
335 |
If you're using a makefile that doesn't provide the test option, run djpeg
|
|
336 |
and cjpeg by hand and compare the output files to testimg* with whatever
|
|
337 |
binary file comparison tool you have. The files should be bit-for-bit
|
|
338 |
identical.
|
|
339 |
|
|
340 |
If the programs complain "MAX_ALLOC_CHUNK is wrong, please fix", then you
|
|
341 |
need to reduce MAX_ALLOC_CHUNK to a value that fits in type size_t.
|
|
342 |
Try adding "#define MAX_ALLOC_CHUNK 65520L" to jconfig.h. A less likely
|
|
343 |
configuration error is "ALIGN_TYPE is wrong, please fix": defining ALIGN_TYPE
|
|
344 |
as long should take care of that one.
|
|
345 |
|
|
346 |
If the cjpeg test run fails with "Missing Huffman code table entry", it's a
|
|
347 |
good bet that you needed to define RIGHT_SHIFT_IS_UNSIGNED. Go back to the
|
|
348 |
configuration step and run ckconfig.c. (This is a good plan for any other
|
|
349 |
test failure, too.)
|
|
350 |
|
|
351 |
If you are using Unix (one-file) command line style on a non-Unix system,
|
|
352 |
it's a good idea to check that binary I/O through stdin/stdout actually
|
|
353 |
works. You should get the same results from "djpeg <testorig.jpg >out.ppm"
|
|
354 |
as from "djpeg -outfile out.ppm testorig.jpg". Note that the makefiles all
|
|
355 |
use the latter style and therefore do not exercise stdin/stdout! If this
|
|
356 |
check fails, try recompiling with USE_SETMODE or USE_FDOPEN defined.
|
|
357 |
If it still doesn't work, better use two-file style.
|
|
358 |
|
|
359 |
If you chose a memory manager other than jmemnobs.c, you should test that
|
|
360 |
temporary-file usage works. Try "djpeg -bmp -colors 256 -max 0 testorig.jpg"
|
|
361 |
and make sure its output matches testimg.bmp. If you have any really large
|
|
362 |
images handy, try compressing them with -optimize and/or decompressing with
|
|
363 |
-colors 256 to make sure your DEFAULT_MAX_MEM setting is not too large.
|
|
364 |
|
|
365 |
NOTE: this is far from an exhaustive test of the JPEG software; some modules,
|
|
366 |
such as 1-pass color quantization, are not exercised at all. It's just a
|
|
367 |
quick test to give you some confidence that you haven't missed something
|
|
368 |
major.
|
|
369 |
|
|
370 |
|
|
371 |
INSTALLING THE SOFTWARE
|
|
372 |
=======================
|
|
373 |
|
|
374 |
Once you're done with the above steps, you can install the software by
|
|
375 |
copying the executable files (cjpeg, djpeg, jpegtran, rdjpgcom, and wrjpgcom)
|
|
376 |
to wherever you normally install programs. On Unix systems, you'll also want
|
|
377 |
to put the man pages (cjpeg.1, djpeg.1, jpegtran.1, rdjpgcom.1, wrjpgcom.1)
|
|
378 |
in the man-page directory. The pre-fab makefiles don't support this step
|
|
379 |
since there's such a wide variety of installation procedures on different
|
|
380 |
systems.
|
|
381 |
|
|
382 |
If you generated a Makefile with the "configure" script, you can just say
|
|
383 |
make install
|
|
384 |
to install the programs and their man pages into the standard places.
|
|
385 |
(You'll probably need to be root to do this.) We recommend first saying
|
|
386 |
make -n install
|
|
387 |
to see where configure thought the files should go. You may need to edit
|
|
388 |
the Makefile, particularly if your system's conventions for man page
|
|
389 |
filenames don't match what configure expects.
|
|
390 |
|
|
391 |
If you want to install the IJG library itself, for use in compiling other
|
|
392 |
programs besides ours, then you need to put the four include files
|
|
393 |
jpeglib.h jerror.h jconfig.h jmorecfg.h
|
|
394 |
into your include-file directory, and put the library file libjpeg.a
|
|
395 |
(extension may vary depending on system) wherever library files go.
|
|
396 |
If you generated a Makefile with "configure", it will do what it thinks
|
|
397 |
is the right thing if you say
|
|
398 |
make install-lib
|
|
399 |
|
|
400 |
|
|
401 |
OPTIONAL STUFF
|
|
402 |
==============
|
|
403 |
|
|
404 |
Progress monitor:
|
|
405 |
|
|
406 |
If you like, you can #define PROGRESS_REPORT (in jconfig.h) to enable display
|
|
407 |
of percent-done progress reports. The routine provided in cdjpeg.c merely
|
|
408 |
prints percentages to stderr, but you can customize it to do something
|
|
409 |
fancier.
|
|
410 |
|
|
411 |
Utah RLE file format support:
|
|
412 |
|
|
413 |
We distribute the software with support for RLE image files (Utah Raster
|
|
414 |
Toolkit format) disabled, because the RLE support won't compile without the
|
|
415 |
Utah library. If you have URT version 3.1 or later, you can enable RLE
|
|
416 |
support as follows:
|
|
417 |
1. #define RLE_SUPPORTED in jconfig.h.
|
|
418 |
2. Add a -I option to CFLAGS in the Makefile for the directory
|
|
419 |
containing the URT .h files (typically the "include"
|
|
420 |
subdirectory of the URT distribution).
|
|
421 |
3. Add -L... -lrle to LDLIBS in the Makefile, where ... specifies
|
|
422 |
the directory containing the URT "librle.a" file (typically the
|
|
423 |
"lib" subdirectory of the URT distribution).
|
|
424 |
|
|
425 |
Support for 12-bit-deep pixel data:
|
|
426 |
|
|
427 |
The JPEG standard allows either 8-bit or 12-bit data precision. (For color,
|
|
428 |
this means 8 or 12 bits per channel, of course.) If you need to work with
|
|
429 |
deeper than 8-bit data, you can compile the IJG code for 12-bit operation.
|
|
430 |
To do so:
|
|
431 |
1. In jmorecfg.h, define BITS_IN_JSAMPLE as 12 rather than 8.
|
|
432 |
2. In jconfig.h, undefine BMP_SUPPORTED, RLE_SUPPORTED, and TARGA_SUPPORTED,
|
|
433 |
because the code for those formats doesn't handle 12-bit data and won't
|
|
434 |
even compile. (The PPM code does work, as explained below. The GIF
|
|
435 |
code works too; it scales 8-bit GIF data to and from 12-bit depth
|
|
436 |
automatically.)
|
|
437 |
3. Compile. Don't expect "make test" to pass, since the supplied test
|
|
438 |
files are for 8-bit data.
|
|
439 |
|
|
440 |
Currently, 12-bit support does not work on 16-bit-int machines.
|
|
441 |
|
|
442 |
Note that a 12-bit version will not read 8-bit JPEG files, nor vice versa;
|
|
443 |
so you'll want to keep around a regular 8-bit compilation as well.
|
|
444 |
(Run-time selection of data depth, to allow a single copy that does both,
|
|
445 |
is possible but would probably slow things down considerably; it's very low
|
|
446 |
on our to-do list.)
|
|
447 |
|
|
448 |
The PPM reader (rdppm.c) can read 12-bit data from either text-format or
|
|
449 |
binary-format PPM and PGM files. Binary-format PPM/PGM files which have a
|
|
450 |
maxval greater than 255 are assumed to use 2 bytes per sample, LSB first
|
|
451 |
(little-endian order). As of early 1995, 2-byte binary format is not
|
|
452 |
officially supported by the PBMPLUS library, but it is expected that a
|
|
453 |
future release of PBMPLUS will support it. Note that the PPM reader will
|
|
454 |
read files of any maxval regardless of the BITS_IN_JSAMPLE setting; incoming
|
|
455 |
data is automatically rescaled to either maxval=255 or maxval=4095 as
|
|
456 |
appropriate for the cjpeg bit depth.
|
|
457 |
|
|
458 |
The PPM writer (wrppm.c) will normally write 2-byte binary PPM or PGM
|
|
459 |
format, maxval 4095, when compiled with BITS_IN_JSAMPLE=12. Since this
|
|
460 |
format is not yet widely supported, you can disable it by compiling wrppm.c
|
|
461 |
with PPM_NORAWWORD defined; then the data is scaled down to 8 bits to make a
|
|
462 |
standard 1-byte/sample PPM or PGM file. (Yes, this means still another copy
|
|
463 |
of djpeg to keep around. But hopefully you won't need it for very long.
|
|
464 |
Poskanzer's supposed to get that new PBMPLUS release out Real Soon Now.)
|
|
465 |
|
|
466 |
Of course, if you are working with 12-bit data, you probably have it stored
|
|
467 |
in some other, nonstandard format. In that case you'll probably want to
|
|
468 |
write your own I/O modules to read and write your format.
|
|
469 |
|
|
470 |
Note that a 12-bit version of cjpeg always runs in "-optimize" mode, in
|
|
471 |
order to generate valid Huffman tables. This is necessary because our
|
|
472 |
default Huffman tables only cover 8-bit data.
|
|
473 |
|
|
474 |
Removing code:
|
|
475 |
|
|
476 |
If you need to make a smaller version of the JPEG software, some optional
|
|
477 |
functions can be removed at compile time. See the xxx_SUPPORTED #defines in
|
|
478 |
jconfig.h and jmorecfg.h. If at all possible, we recommend that you leave in
|
|
479 |
decoder support for all valid JPEG files, to ensure that you can read anyone's
|
|
480 |
output. Taking out support for image file formats that you don't use is the
|
|
481 |
most painless way to make the programs smaller. Another possibility is to
|
|
482 |
remove some of the DCT methods: in particular, the "IFAST" method may not be
|
|
483 |
enough faster than the others to be worth keeping on your machine. (If you
|
|
484 |
do remove ISLOW or IFAST, be sure to redefine JDCT_DEFAULT or JDCT_FASTEST
|
|
485 |
to a supported method, by adding a #define in jconfig.h.)
|
|
486 |
|
|
487 |
|
|
488 |
OPTIMIZATION
|
|
489 |
============
|
|
490 |
|
|
491 |
Unless you own a Cray, you'll probably be interested in making the JPEG
|
|
492 |
software go as fast as possible. This section covers some machine-dependent
|
|
493 |
optimizations you may want to try. We suggest that before trying any of
|
|
494 |
this, you first get the basic installation to pass the self-test step.
|
|
495 |
Repeat the self-test after any optimization to make sure that you haven't
|
|
496 |
broken anything.
|
|
497 |
|
|
498 |
The integer DCT routines perform a lot of multiplications. These
|
|
499 |
multiplications must yield 32-bit results, but none of their input values
|
|
500 |
are more than 16 bits wide. On many machines, notably the 680x0 and 80x86
|
|
501 |
CPUs, a 16x16=>32 bit multiply instruction is faster than a full 32x32=>32
|
|
502 |
bit multiply. Unfortunately there is no portable way to specify such a
|
|
503 |
multiplication in C, but some compilers can generate one when you use the
|
|
504 |
right combination of casts. See the MULTIPLYxxx macro definitions in
|
|
505 |
jdct.h. If your compiler makes "int" be 32 bits and "short" be 16 bits,
|
|
506 |
defining SHORTxSHORT_32 is fairly likely to work. When experimenting with
|
|
507 |
alternate definitions, be sure to test not only whether the code still works
|
|
508 |
(use the self-test), but also whether it is actually faster --- on some
|
|
509 |
compilers, alternate definitions may compute the right answer, yet be slower
|
|
510 |
than the default. Timing cjpeg on a large PGM (grayscale) input file is the
|
|
511 |
best way to check this, as the DCT will be the largest fraction of the runtime
|
|
512 |
in that mode. (Note: some of the distributed compiler-specific jconfig files
|
|
513 |
already contain #define switches to select appropriate MULTIPLYxxx
|
|
514 |
definitions.)
|
|
515 |
|
|
516 |
If your machine has sufficiently fast floating point hardware, you may find
|
|
517 |
that the float DCT method is faster than the integer DCT methods, even
|
|
518 |
after tweaking the integer multiply macros. In that case you may want to
|
|
519 |
make the float DCT be the default method. (The only objection to this is
|
|
520 |
that float DCT results may vary slightly across machines.) To do that, add
|
|
521 |
"#define JDCT_DEFAULT JDCT_FLOAT" to jconfig.h. Even if you don't change
|
|
522 |
the default, you should redefine JDCT_FASTEST, which is the method selected
|
|
523 |
by djpeg's -fast switch. Don't forget to update the documentation files
|
|
524 |
(usage.doc and/or cjpeg.1, djpeg.1) to agree with what you've done.
|
|
525 |
|
|
526 |
If access to "short" arrays is slow on your machine, it may be a win to
|
|
527 |
define type JCOEF as int rather than short. This will cost a good deal of
|
|
528 |
memory though, particularly in some multi-pass modes, so don't do it unless
|
|
529 |
you have memory to burn and short is REALLY slow.
|
|
530 |
|
|
531 |
If your compiler can compile function calls in-line, make sure the INLINE
|
|
532 |
macro in jmorecfg.h is defined as the keyword that marks a function
|
|
533 |
inline-able. Some compilers have a switch that tells the compiler to inline
|
|
534 |
any function it thinks is profitable (e.g., -finline-functions for gcc).
|
|
535 |
Enabling such a switch is likely to make the compiled code bigger but faster.
|
|
536 |
|
|
537 |
In general, it's worth trying the maximum optimization level of your compiler,
|
|
538 |
and experimenting with any optional optimizations such as loop unrolling.
|
|
539 |
(Unfortunately, far too many compilers have optimizer bugs ... be prepared to
|
|
540 |
back off if the code fails self-test.) If you do any experimentation along
|
|
541 |
these lines, please report the optimal settings to jpeg-info@uunet.uu.net so
|
|
542 |
we can mention them in future releases. Be sure to specify your machine and
|
|
543 |
compiler version.
|
|
544 |
|
|
545 |
|
|
546 |
HINTS FOR SPECIFIC SYSTEMS
|
|
547 |
==========================
|
|
548 |
|
|
549 |
We welcome reports on changes needed for systems not mentioned here. Submit
|
|
550 |
'em to jpeg-info@uunet.uu.net. Also, if configure or ckconfig.c is wrong
|
|
551 |
about how to configure the JPEG software for your system, please let us know.
|
|
552 |
|
|
553 |
|
|
554 |
Acorn RISC OS:
|
|
555 |
|
|
556 |
(Thanks to Simon Middleton for these hints on compiling with Desktop C.)
|
|
557 |
After renaming the files according to Acorn conventions, take a copy of
|
|
558 |
makefile.ansi, change all occurrences of 'libjpeg.a' to 'libjpeg.o' and
|
|
559 |
change these definitions as indicated:
|
|
560 |
|
|
561 |
CFLAGS= -throwback -IC: -Wn
|
|
562 |
LDLIBS=C:o.Stubs
|
|
563 |
SYSDEPMEM=jmemansi.o
|
|
564 |
LN=Link
|
|
565 |
AR=LibFile -c -o
|
|
566 |
|
|
567 |
Also add a new line '.c.o:; $(cc) $< $(cflags) -c -o $@'. Remove the
|
|
568 |
lines '$(RM) libjpeg.o' and '$(AR2) libjpeg.o' and the 'jconfig.h'
|
|
569 |
dependency section.
|
|
570 |
|
|
571 |
Copy jconfig.doc to jconfig.h. Edit jconfig.h to define TWO_FILE_COMMANDLINE
|
|
572 |
and CHAR_IS_UNSIGNED.
|
|
573 |
|
|
574 |
Run the makefile using !AMU not !Make. If you want to use the 'clean' and
|
|
575 |
'test' makefile entries then you will have to fiddle with the syntax a bit
|
|
576 |
and rename the test files.
|
|
577 |
|
|
578 |
|
|
579 |
Amiga:
|
|
580 |
|
|
581 |
SAS C 6.50 reportedly is too buggy to compile the IJG code properly.
|
|
582 |
A patch to update to 6.51 is available from SAS or AmiNet FTP sites.
|
|
583 |
|
|
584 |
The supplied config files are set up to use jmemname.c as the memory
|
|
585 |
manager, with temporary files being created on the device named by
|
|
586 |
"JPEGTMP:".
|
|
587 |
|
|
588 |
|
|
589 |
Atari ST/STE/TT:
|
|
590 |
|
|
591 |
Copy the project files makcjpeg.st, makdjpeg.st, maktjpeg.st, and makljpeg.st
|
|
592 |
to cjpeg.prj, djpeg.prj, jpegtran.prj, and libjpeg.prj respectively. The
|
|
593 |
project files should work as-is with Pure C. For Turbo C, change library
|
|
594 |
filenames "pc..." to "tc..." in each project file. Note that libjpeg.prj
|
|
595 |
selects jmemansi.c as the recommended memory manager. You'll probably want to
|
|
596 |
adjust the DEFAULT_MAX_MEM setting --- you want it to be a couple hundred K
|
|
597 |
less than your normal free memory. Put "#define DEFAULT_MAX_MEM nnnn" into
|
|
598 |
jconfig.h to do this.
|
|
599 |
|
|
600 |
To use the 68881/68882 coprocessor for the floating point DCT, add the
|
|
601 |
compiler option "-8" to the project files and replace pcfltlib.lib with
|
|
602 |
pc881lib.lib in cjpeg.prj and djpeg.prj. Or if you don't have a
|
|
603 |
coprocessor, you may prefer to remove the float DCT code by undefining
|
|
604 |
DCT_FLOAT_SUPPORTED in jmorecfg.h (since without a coprocessor, the float
|
|
605 |
code will be too slow to be useful). In that case, you can delete
|
|
606 |
pcfltlib.lib from the project files.
|
|
607 |
|
|
608 |
Note that you must make libjpeg.lib before making cjpeg.ttp, djpeg.ttp,
|
|
609 |
or jpegtran.ttp. You'll have to perform the self-test by hand.
|
|
610 |
|
|
611 |
We haven't bothered to include project files for rdjpgcom and wrjpgcom.
|
|
612 |
Those source files should just be compiled by themselves; they don't
|
|
613 |
depend on the JPEG library.
|
|
614 |
|
|
615 |
There is a bug in some older versions of the Turbo C library which causes the
|
|
616 |
space used by temporary files created with "tmpfile()" not to be freed after
|
|
617 |
an abnormal program exit. If you check your disk afterwards, you will find
|
|
618 |
cluster chains that are allocated but not used by a file. This should not
|
|
619 |
happen in cjpeg/djpeg/jpegtran, since we enable a signal catcher to explicitly
|
|
620 |
close temp files before exiting. But if you use the JPEG library with your
|
|
621 |
own code, be sure to supply a signal catcher, or else use a different
|
|
622 |
system-dependent memory manager.
|
|
623 |
|
|
624 |
|
|
625 |
Cray:
|
|
626 |
|
|
627 |
Should you be so fortunate as to be running JPEG on a Cray YMP, there is a
|
|
628 |
compiler bug in old versions of Cray's Standard C (prior to 3.1). If you
|
|
629 |
still have an old compiler, you'll need to insert a line reading
|
|
630 |
"#pragma novector" just before the loop
|
|
631 |
for (i = 1; i <= (int) htbl->bits[l]; i++)
|
|
632 |
huffsize[p++] = (char) l;
|
|
633 |
in fix_huff_tbl (in V5beta1, line 204 of jchuff.c and line 176 of jdhuff.c).
|
|
634 |
[This bug may or may not still occur with the current IJG code, but it's
|
|
635 |
probably a dead issue anyway...]
|
|
636 |
|
|
637 |
|
|
638 |
HP-UX:
|
|
639 |
|
|
640 |
If you have HP-UX 7.05 or later with the "software development" C compiler,
|
|
641 |
you should run the compiler in ANSI mode. If using the configure script,
|
|
642 |
say
|
|
643 |
./configure CC='cc -Aa'
|
|
644 |
(or -Ae if you prefer). If configuring by hand, use makefile.ansi and add
|
|
645 |
"-Aa" to the CFLAGS line in the makefile.
|
|
646 |
|
|
647 |
If you have a pre-7.05 system, or if you are using the non-ANSI C compiler
|
|
648 |
delivered with a minimum HP-UX system, then you must use makefile.unix
|
|
649 |
(and do NOT add -Aa); or just run configure without the CC option.
|
|
650 |
|
|
651 |
On HP 9000 series 800 machines, the HP C compiler is buggy in revisions prior
|
|
652 |
to A.08.07. If you get complaints about "not a typedef name", you'll have to
|
|
653 |
use makefile.unix, or run configure without the CC option.
|
|
654 |
|
|
655 |
|
|
656 |
Macintosh, generic comments:
|
|
657 |
|
|
658 |
The supplied user-interface files (cjpeg.c, djpeg.c, etc) are set up to
|
|
659 |
provide a Unix-style command line interface. You can use this interface on
|
|
660 |
the Mac by means of the ccommand() library routine provided by Metrowerks
|
|
661 |
CodeWarrior or Think C. This is only appropriate for testing the library,
|
|
662 |
however; to make a user-friendly equivalent of cjpeg/djpeg you'd really want
|
|
663 |
to develop a Mac-style user interface. There isn't a complete example
|
|
664 |
available at the moment, but there are some helpful starting points:
|
|
665 |
1. Sam Bushell's free "To JPEG" applet provides drag-and-drop conversion to
|
|
666 |
JPEG under System 7 and later. This only illustrates how to use the
|
|
667 |
compression half of the library, but it does a very nice job of that part.
|
|
668 |
The CodeWarrior source code is available from http://www.pobox.com/~jsam.
|
|
669 |
2. Jim Brunner prepared a Mac-style user interface for both compression and
|
|
670 |
decompression. Unfortunately, it hasn't been updated since IJG v4, and
|
|
671 |
the library's API has changed considerably since then. Still it may be of
|
|
672 |
some help, particularly as a guide to compiling the IJG code under Think C.
|
|
673 |
Jim's code is available from the Info-Mac archives, at sumex-aim.stanford.edu
|
|
674 |
or mirrors thereof; see file /info-mac/dev/src/jpeg-convert-c.hqx.
|
|
675 |
|
|
676 |
jmemmac.c is the recommended memory manager back end for Macintosh. It uses
|
|
677 |
NewPtr/DisposePtr instead of malloc/free, and has a Mac-specific
|
|
678 |
implementation of jpeg_mem_available(). It also creates temporary files that
|
|
679 |
follow Mac conventions. (That part of the code relies on System-7-or-later OS
|
|
680 |
functions. See the comments in jmemmac.c if you need to run it on System 6.)
|
|
681 |
NOTE that USE_MAC_MEMMGR must be defined in jconfig.h to use jmemmac.c.
|
|
682 |
|
|
683 |
You can also use jmemnobs.c, if you don't care about handling images larger
|
|
684 |
than available memory. If you use any memory manager back end other than
|
|
685 |
jmemmac.c, we recommend replacing "malloc" and "free" by "NewPtr" and
|
|
686 |
"DisposePtr", because Mac C libraries often have peculiar implementations of
|
|
687 |
malloc/free. (For instance, free() may not return the freed space to the
|
|
688 |
Mac Memory Manager. This is undesirable for the IJG code because jmemmgr.c
|
|
689 |
already clumps space requests.)
|
|
690 |
|
|
691 |
|
|
692 |
Macintosh, Metrowerks CodeWarrior:
|
|
693 |
|
|
694 |
The Unix-command-line-style interface can be used by defining USE_CCOMMAND.
|
|
695 |
You'll also need to define TWO_FILE_COMMANDLINE to avoid stdin/stdout.
|
|
696 |
This means that when using the cjpeg/djpeg programs, you'll have to type the
|
|
697 |
input and output file names in the "Arguments" text-edit box, rather than
|
|
698 |
using the file radio buttons. (Perhaps USE_FDOPEN or USE_SETMODE would
|
|
699 |
eliminate the problem, but I haven't heard from anyone who's tried it.)
|
|
700 |
|
|
701 |
On 680x0 Macs, Metrowerks defines type "double" as a 10-byte IEEE extended
|
|
702 |
float. jmemmgr.c won't like this: it wants sizeof(ALIGN_TYPE) to be a power
|
|
703 |
of 2. Add "#define ALIGN_TYPE long" to jconfig.h to eliminate the complaint.
|
|
704 |
|
|
705 |
The supplied configuration file jconfig.mac can be used for your jconfig.h;
|
|
706 |
it includes all the recommended symbol definitions. If you have AppleScript
|
|
707 |
installed, you can run the supplied script makeproj.mac to create CodeWarrior
|
|
708 |
project files for the library and the testbed applications, then build the
|
|
709 |
library and applications. (Thanks to Dan Sears and Don Agro for this nifty
|
|
710 |
hack, which saves us from trying to maintain CodeWarrior project files as part
|
|
711 |
of the IJG distribution...)
|
|
712 |
|
|
713 |
|
|
714 |
Macintosh, Think C:
|
|
715 |
|
|
716 |
The documentation in Jim Brunner's "JPEG Convert" source code (see above)
|
|
717 |
includes detailed build instructions for Think C; it's probably somewhat
|
|
718 |
out of date for the current release, but may be helpful.
|
|
719 |
|
|
720 |
If you want to build the minimal command line version, proceed as follows.
|
|
721 |
You'll have to prepare project files for the programs; we don't include any
|
|
722 |
in the distribution since they are not text files. Use the file lists in
|
|
723 |
any of the supplied makefiles as a guide. Also add the ANSI and Unix C
|
|
724 |
libraries in a separate segment. You may need to divide the JPEG files into
|
|
725 |
more than one segment; we recommend dividing compression and decompression
|
|
726 |
modules. Define USE_CCOMMAND in jconfig.h so that the ccommand() routine is
|
|
727 |
called. You must also define TWO_FILE_COMMANDLINE because stdin/stdout
|
|
728 |
don't handle binary data correctly.
|
|
729 |
|
|
730 |
On 680x0 Macs, Think C defines type "double" as a 12-byte IEEE extended float.
|
|
731 |
jmemmgr.c won't like this: it wants sizeof(ALIGN_TYPE) to be a power of 2.
|
|
732 |
Add "#define ALIGN_TYPE long" to jconfig.h to eliminate the complaint.
|
|
733 |
|
|
734 |
jconfig.mac should work as a jconfig.h configuration file for Think C,
|
|
735 |
but the makeproj.mac AppleScript script is specific to CodeWarrior. Sorry.
|
|
736 |
|
|
737 |
|
|
738 |
MIPS R3000:
|
|
739 |
|
|
740 |
MIPS's cc version 1.31 has a rather nasty optimization bug. Don't use -O
|
|
741 |
if you have that compiler version. (Use "cc -V" to check the version.)
|
|
742 |
Note that the R3000 chip is found in workstations from DEC and others.
|
|
743 |
|
|
744 |
|
|
745 |
MS-DOS, generic comments for 16-bit compilers:
|
|
746 |
|
|
747 |
The IJG code is designed to work well in 80x86 "small" or "medium" memory
|
|
748 |
models (i.e., data pointers are 16 bits unless explicitly declared "far";
|
|
749 |
code pointers can be either size). You may be able to use small model to
|
|
750 |
compile cjpeg or djpeg by itself, but you will probably have to use medium
|
|
751 |
model for any larger application. This won't make much difference in
|
|
752 |
performance. You *will* take a noticeable performance hit if you use a
|
|
753 |
large-data memory model, and you should avoid "huge" model if at all
|
|
754 |
possible. Be sure that NEED_FAR_POINTERS is defined in jconfig.h if you use
|
|
755 |
a small-data memory model; be sure it is NOT defined if you use a large-data
|
|
756 |
model. (The supplied makefiles and jconfig files for Borland and Microsoft C
|
|
757 |
compile in medium model and define NEED_FAR_POINTERS.)
|
|
758 |
|
|
759 |
The DOS-specific memory manager, jmemdos.c, should be used if possible.
|
|
760 |
It needs some assembly-code routines which are in jmemdosa.asm; make sure
|
|
761 |
your makefile assembles that file and includes it in the library. If you
|
|
762 |
don't have a suitable assembler, you can get pre-assembled object files for
|
|
763 |
jmemdosa by FTP from ftp.uu.net:/graphics/jpeg/jdosaobj.zip. (DOS-oriented
|
|
764 |
distributions of the IJG source code often include these object files.)
|
|
765 |
|
|
766 |
When using jmemdos.c, jconfig.h must define USE_MSDOS_MEMMGR and must set
|
|
767 |
MAX_ALLOC_CHUNK to less than 64K (65520L is a typical value). If your
|
|
768 |
C library's far-heap malloc() can't allocate blocks that large, reduce
|
|
769 |
MAX_ALLOC_CHUNK to whatever it can handle.
|
|
770 |
|
|
771 |
If you can't use jmemdos.c for some reason --- for example, because you
|
|
772 |
don't have an assembler to assemble jmemdosa.asm --- you'll have to fall
|
|
773 |
back to jmemansi.c or jmemname.c. You'll probably still need to set
|
|
774 |
MAX_ALLOC_CHUNK in jconfig.h, because most DOS C libraries won't malloc()
|
|
775 |
more than 64K at a time. IMPORTANT: if you use jmemansi.c or jmemname.c,
|
|
776 |
you will have to compile in a large-data memory model in order to get the
|
|
777 |
right stdio library. Too bad.
|
|
778 |
|
|
779 |
wrjpgcom needs to be compiled in large model, because it malloc()s a 64KB
|
|
780 |
work area to hold the comment text. If your C library's malloc can't
|
|
781 |
handle that, reduce MAX_COM_LENGTH as necessary in wrjpgcom.c.
|
|
782 |
|
|
783 |
Most MS-DOS compilers treat stdin/stdout as text files, so you must use
|
|
784 |
two-file command line style. But if your compiler has either fdopen() or
|
|
785 |
setmode(), you can use one-file style if you like. To do this, define
|
|
786 |
USE_SETMODE or USE_FDOPEN so that stdin/stdout will be set to binary mode.
|
|
787 |
(USE_SETMODE seems to work with more DOS compilers than USE_FDOPEN.) You
|
|
788 |
should test that I/O through stdin/stdout produces the same results as I/O
|
|
789 |
to explicitly named files... the "make test" procedures in the supplied
|
|
790 |
makefiles do NOT use stdin/stdout.
|
|
791 |
|
|
792 |
|
|
793 |
MS-DOS, generic comments for 32-bit compilers:
|
|
794 |
|
|
795 |
None of the above comments about memory models apply if you are using a
|
|
796 |
32-bit flat-memory-space environment, such as DJGPP or Watcom C. (And you
|
|
797 |
should use one if you have it, as performance will be much better than
|
|
798 |
8086-compatible code!) For flat-memory-space compilers, do NOT define
|
|
799 |
NEED_FAR_POINTERS, and do NOT use jmemdos.c. Use jmemnobs.c if the
|
|
800 |
environment supplies adequate virtual memory, otherwise use jmemansi.c or
|
|
801 |
jmemname.c.
|
|
802 |
|
|
803 |
You'll still need to be careful about binary I/O through stdin/stdout.
|
|
804 |
See the last paragraph of the previous section.
|
|
805 |
|
|
806 |
|
|
807 |
MS-DOS, Borland C:
|
|
808 |
|
|
809 |
Be sure to convert all the source files to DOS text format (CR/LF newlines).
|
|
810 |
Although Borland C will often work OK with unmodified Unix (LF newlines)
|
|
811 |
source files, sometimes it will give bogus compile errors.
|
|
812 |
"Illegal character '#'" is the most common such error. (This is true with
|
|
813 |
Borland C 3.1, but perhaps is fixed in newer releases.)
|
|
814 |
|
|
815 |
If you want one-file command line style, just undefine TWO_FILE_COMMANDLINE.
|
|
816 |
jconfig.bcc already includes #define USE_SETMODE to make this work.
|
|
817 |
(fdopen does not work correctly.)
|
|
818 |
|
|
819 |
|
|
820 |
MS-DOS, Microsoft C:
|
|
821 |
|
|
822 |
makefile.mc6 works with Microsoft C, DOS Visual C++, etc. It should only
|
|
823 |
be used if you want to build a 16-bit (small or medium memory model) program.
|
|
824 |
|
|
825 |
If you want one-file command line style, just undefine TWO_FILE_COMMANDLINE.
|
|
826 |
jconfig.mc6 already includes #define USE_SETMODE to make this work.
|
|
827 |
(fdopen does not work correctly.)
|
|
828 |
|
|
829 |
Note that this makefile assumes that the working copy of itself is called
|
|
830 |
"makefile". If you want to call it something else, say "makefile.mak",
|
|
831 |
be sure to adjust the dependency line that reads "$(RFILE) : makefile".
|
|
832 |
Otherwise the make will fail because it doesn't know how to create "makefile".
|
|
833 |
Worse, some releases of Microsoft's make utilities give an incorrect error
|
|
834 |
message in this situation.
|
|
835 |
|
|
836 |
Old versions of MS C fail with an "out of macro expansion space" error
|
|
837 |
because they can't cope with the macro TRACEMS8 (defined in jerror.h).
|
|
838 |
If this happens to you, the easiest solution is to change TRACEMS8 to
|
|
839 |
expand to nothing. You'll lose the ability to dump out JPEG coefficient
|
|
840 |
tables with djpeg -debug -debug, but at least you can compile.
|
|
841 |
|
|
842 |
Original MS C 6.0 is very buggy; it compiles incorrect code unless you turn
|
|
843 |
off optimization entirely (remove -O from CFLAGS). 6.00A is better, but it
|
|
844 |
still generates bad code if you enable loop optimizations (-Ol or -Ox).
|
|
845 |
|
|
846 |
MS C 8.0 crashes when compiling jquant1.c with optimization switch /Oo ...
|
|
847 |
which is on by default. To work around this bug, compile that one file
|
|
848 |
with /Oo-.
|
|
849 |
|
|
850 |
|
|
851 |
Microsoft Windows (all versions), generic comments:
|
|
852 |
|
|
853 |
Some Windows system include files define typedef boolean as "unsigned char".
|
|
854 |
The IJG code also defines typedef boolean, but we make it "int" by default.
|
|
855 |
This doesn't affect the IJG programs because we don't import those Windows
|
|
856 |
include files. But if you use the JPEG library in your own program, and some
|
|
857 |
of your program's files import one definition of boolean while some import the
|
|
858 |
other, you can get all sorts of mysterious problems. A good preventive step
|
|
859 |
is to make the IJG library use "unsigned char" for boolean. To do that,
|
|
860 |
add something like this to your jconfig.h file:
|
|
861 |
/* Define "boolean" as unsigned char, not int, per Windows custom */
|
|
862 |
#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
|
|
863 |
typedef unsigned char boolean;
|
|
864 |
#endif
|
|
865 |
#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
|
|
866 |
(This is already in jconfig.vc, by the way.)
|
|
867 |
|
|
868 |
windef.h contains the declarations
|
|
869 |
#define far
|
|
870 |
#define FAR far
|
|
871 |
Since jmorecfg.h tries to define FAR as empty, you may get a compiler
|
|
872 |
warning if you include both jpeglib.h and windef.h (which windows.h
|
|
873 |
includes). To suppress the warning, you can put "#ifndef FAR"/"#endif"
|
|
874 |
around the line "#define FAR" in jmorecfg.h.
|
|
875 |
|
|
876 |
When using the library in a Windows application, you will almost certainly
|
|
877 |
want to modify or replace the error handler module jerror.c, since our
|
|
878 |
default error handler does a couple of inappropriate things:
|
|
879 |
1. it tries to write error and warning messages on stderr;
|
|
880 |
2. in event of a fatal error, it exits by calling exit().
|
|
881 |
|
|
882 |
A simple stopgap solution for problem 1 is to replace the line
|
|
883 |
fprintf(stderr, "%s\n", buffer);
|
|
884 |
(in output_message in jerror.c) with
|
|
885 |
MessageBox(GetActiveWindow(),buffer,"JPEG Error",MB_OK|MB_ICONERROR);
|
|
886 |
It's highly recommended that you at least do that much, since otherwise
|
|
887 |
error messages will disappear into nowhere. (Beginning with IJG v6b, this
|
|
888 |
code is already present in jerror.c; just define USE_WINDOWS_MESSAGEBOX in
|
|
889 |
jconfig.h to enable it.)
|
|
890 |
|
|
891 |
The proper solution for problem 2 is to return control to your calling
|
|
892 |
application after a library error. This can be done with the setjmp/longjmp
|
|
893 |
technique discussed in libjpeg.doc and illustrated in example.c. (NOTE:
|
|
894 |
some older Windows C compilers provide versions of setjmp/longjmp that
|
|
895 |
don't actually work under Windows. You may need to use the Windows system
|
|
896 |
functions Catch and Throw instead.)
|
|
897 |
|
|
898 |
The recommended memory manager under Windows is jmemnobs.c; in other words,
|
|
899 |
let Windows do any virtual memory management needed. You should NOT use
|
|
900 |
jmemdos.c nor jmemdosa.asm under Windows.
|
|
901 |
|
|
902 |
For Windows 3.1, we recommend compiling in medium or large memory model;
|
|
903 |
for newer Windows versions, use a 32-bit flat memory model. (See the MS-DOS
|
|
904 |
sections above for more info about memory models.) In the 16-bit memory
|
|
905 |
models only, you'll need to put
|
|
906 |
#define MAX_ALLOC_CHUNK 65520L /* Maximum request to malloc() */
|
|
907 |
into jconfig.h to limit allocation chunks to 64Kb. (Without that, you'd
|
|
908 |
have to use huge memory model, which slows things down unnecessarily.)
|
|
909 |
jmemnobs.c works without modification in large or flat memory models, but to
|
|
910 |
use medium model, you need to modify its jpeg_get_large and jpeg_free_large
|
|
911 |
routines to allocate far memory. In any case, you might like to replace
|
|
912 |
its calls to malloc and free with direct calls on Windows memory allocation
|
|
913 |
functions.
|
|
914 |
|
|
915 |
You may also want to modify jdatasrc.c and jdatadst.c to use Windows file
|
|
916 |
operations rather than fread/fwrite. This is only necessary if your C
|
|
917 |
compiler doesn't provide a competent implementation of C stdio functions.
|
|
918 |
|
|
919 |
You might want to tweak the RGB_xxx macros in jmorecfg.h so that the library
|
|
920 |
will accept or deliver color pixels in BGR sample order, not RGB; BGR order
|
|
921 |
is usually more convenient under Windows. Note that this change will break
|
|
922 |
the sample applications cjpeg/djpeg, but the library itself works fine.
|
|
923 |
|
|
924 |
|
|
925 |
Many people want to convert the IJG library into a DLL. This is reasonably
|
|
926 |
straightforward, but watch out for the following:
|
|
927 |
|
|
928 |
1. Don't try to compile as a DLL in small or medium memory model; use
|
|
929 |
large model, or even better, 32-bit flat model. Many places in the IJG code
|
|
930 |
assume the address of a local variable is an ordinary (not FAR) pointer;
|
|
931 |
that isn't true in a medium-model DLL.
|
|
932 |
|
|
933 |
2. Microsoft C cannot pass file pointers between applications and DLLs.
|
|
934 |
(See Microsoft Knowledge Base, PSS ID Number Q50336.) So jdatasrc.c and
|
|
935 |
jdatadst.c don't work if you open a file in your application and then pass
|
|
936 |
the pointer to the DLL. One workaround is to make jdatasrc.c/jdatadst.c
|
|
937 |
part of your main application rather than part of the DLL.
|
|
938 |
|
|
939 |
3. You'll probably need to modify the macros GLOBAL() and EXTERN() to
|
|
940 |
attach suitable linkage keywords to the exported routine names. Similarly,
|
|
941 |
you'll want to modify METHODDEF() and JMETHOD() to ensure function pointers
|
|
942 |
are declared in a way that lets application routines be called back through
|
|
943 |
the function pointers. These macros are in jmorecfg.h. Typical definitions
|
|
944 |
for a 16-bit DLL are:
|
|
945 |
#define GLOBAL(type) type _far _pascal _loadds _export
|
|
946 |
#define EXTERN(type) extern type _far _pascal _loadds
|
|
947 |
#define METHODDEF(type) static type _far _pascal
|
|
948 |
#define JMETHOD(type,methodname,arglist) \
|
|
949 |
type (_far _pascal *methodname) arglist
|
|
950 |
For a 32-bit DLL you may want something like
|
|
951 |
#define GLOBAL(type) __declspec(dllexport) type
|
|
952 |
#define EXTERN(type) extern __declspec(dllexport) type
|
|
953 |
Although not all the GLOBAL routines are actually intended to be called by
|
|
954 |
the application, the performance cost of making them all DLL entry points is
|
|
955 |
negligible.
|
|
956 |
|
|
957 |
The unmodified IJG library presents a very C-specific application interface,
|
|
958 |
so the resulting DLL is only usable from C or C++ applications. There has
|
|
959 |
been some talk of writing wrapper code that would present a simpler interface
|
|
960 |
usable from other languages, such as Visual Basic. This is on our to-do list
|
|
961 |
but hasn't been very high priority --- any volunteers out there?
|
|
962 |
|
|
963 |
|
|
964 |
Microsoft Windows, Borland C:
|
|
965 |
|
|
966 |
The provided jconfig.bcc should work OK in a 32-bit Windows environment,
|
|
967 |
but you'll need to tweak it in a 16-bit environment (you'd need to define
|
|
968 |
NEED_FAR_POINTERS and MAX_ALLOC_CHUNK). Beware that makefile.bcc will need
|
|
969 |
alteration if you want to use it for Windows --- in particular, you should
|
|
970 |
use jmemnobs.c not jmemdos.c under Windows.
|
|
971 |
|
|
972 |
Borland C++ 4.5 fails with an internal compiler error when trying to compile
|
|
973 |
jdmerge.c in 32-bit mode. If enough people complain, perhaps Borland will fix
|
|
974 |
it. In the meantime, the simplest known workaround is to add a redundant
|
|
975 |
definition of the variable range_limit in h2v1_merged_upsample(), at the head
|
|
976 |
of the block that handles odd image width (about line 268 in v6 jdmerge.c):
|
|
977 |
/* If image width is odd, do the last output column separately */
|
|
978 |
if (cinfo->output_width & 1) {
|
|
979 |
register JSAMPLE * range_limit = cinfo->sample_range_limit; /* ADD THIS */
|
|
980 |
cb = GETJSAMPLE(*inptr1);
|
|
981 |
Pretty bizarre, especially since the very similar routine h2v2_merged_upsample
|
|
982 |
doesn't trigger the bug.
|
|
983 |
Recent reports suggest that this bug does not occur with "bcc32a" (the
|
|
984 |
Pentium-optimized version of the compiler).
|
|
985 |
|
|
986 |
Another report from a user of Borland C 4.5 was that incorrect code (leading
|
|
987 |
to a color shift in processed images) was produced if any of the following
|
|
988 |
optimization switch combinations were used:
|
|
989 |
-Ot -Og
|
|
990 |
-Ot -Op
|
|
991 |
-Ot -Om
|
|
992 |
So try backing off on optimization if you see such a problem. (Are there
|
|
993 |
several different releases all numbered "4.5"??)
|
|
994 |
|
|
995 |
|
|
996 |
Microsoft Windows, Microsoft Visual C++:
|
|
997 |
|
|
998 |
jconfig.vc should work OK with any Microsoft compiler for a 32-bit memory
|
|
999 |
model. makefile.vc is intended for command-line use. (If you are using
|
|
1000 |
the Developer Studio environment, you may prefer the DevStudio project
|
|
1001 |
files; see below.)
|
|
1002 |
|
|
1003 |
Some users feel that it's easier to call the library from C++ code if you
|
|
1004 |
force VC++ to treat the library as C++ code, which you can do by renaming
|
|
1005 |
all the *.c files to *.cpp (and adjusting the makefile to match). This
|
|
1006 |
avoids the need to put extern "C" { ... } around #include "jpeglib.h" in
|
|
1007 |
your C++ application.
|
|
1008 |
|
|
1009 |
|
|
1010 |
Microsoft Windows, Microsoft Developer Studio:
|
|
1011 |
|
|
1012 |
We include makefiles that should work as project files in DevStudio 4.2 or
|
|
1013 |
later. There is a library makefile that builds the IJG library as a static
|
|
1014 |
Win32 library, and an application makefile that builds the sample applications
|
|
1015 |
as Win32 console applications. (Even if you only want the library, we
|
|
1016 |
recommend building the applications so that you can run the self-test.)
|
|
1017 |
|
|
1018 |
To use:
|
|
1019 |
1. Copy jconfig.vc to jconfig.h, makelib.ds to jpeg.mak, and
|
|
1020 |
makeapps.ds to apps.mak. (Note that the renaming is critical!)
|
|
1021 |
2. Click on the .mak files to construct project workspaces.
|
|
1022 |
(If you are using DevStudio more recent than 4.2, you'll probably
|
|
1023 |
get a message saying that the makefiles are being updated.)
|
|
1024 |
3. Build the library project, then the applications project.
|
|
1025 |
4. Move the application .exe files from `app`\Release to an
|
|
1026 |
appropriate location on your path.
|
|
1027 |
5. To perform the self-test, execute the command line
|
|
1028 |
NMAKE /f makefile.vc test
|
|
1029 |
|
|
1030 |
|
|
1031 |
OS/2, Borland C++:
|
|
1032 |
|
|
1033 |
Watch out for optimization bugs in older Borland compilers; you may need
|
|
1034 |
to back off the optimization switch settings. See the comments in
|
|
1035 |
makefile.bcc.
|
|
1036 |
|
|
1037 |
|
|
1038 |
SGI:
|
|
1039 |
|
|
1040 |
On some SGI systems, you may need to set "AR2= ar -ts" in the Makefile.
|
|
1041 |
If you are using configure, you can do this by saying
|
|
1042 |
./configure RANLIB='ar -ts'
|
|
1043 |
This change is not needed on all SGIs. Use it only if the make fails at the
|
|
1044 |
stage of linking the completed programs.
|
|
1045 |
|
|
1046 |
On the MIPS R4000 architecture (Indy, etc.), the compiler option "-mips2"
|
|
1047 |
reportedly speeds up the float DCT method substantially, enough to make it
|
|
1048 |
faster than the default int method (but still slower than the fast int
|
|
1049 |
method). If you use -mips2, you may want to alter the default DCT method to
|
|
1050 |
be float. To do this, put "#define JDCT_DEFAULT JDCT_FLOAT" in jconfig.h.
|
|
1051 |
|
|
1052 |
|
|
1053 |
VMS:
|
|
1054 |
|
|
1055 |
On an Alpha/VMS system with MMS, be sure to use the "/Marco=Alpha=1"
|
|
1056 |
qualifier with MMS when building the JPEG package.
|
|
1057 |
|
|
1058 |
VAX/VMS v5.5-1 may have problems with the test step of the build procedure
|
|
1059 |
reporting differences when it compares the original and test images. If the
|
|
1060 |
error points to the last block of the files, it is most likely bogus and may
|
|
1061 |
be safely ignored. It seems to be because the files are Stream_LF and
|
|
1062 |
Backup/Compare has difficulty with the (presumably) null padded files.
|
|
1063 |
This problem was not observed on VAX/VMS v6.1 or AXP/VMS v6.1.
|