Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
96e4e7eb60 |
@@ -1,7 +0,0 @@
|
|||||||
|
|
||||||
dcommander = DRC <dcommander@users.sourceforge.net>
|
|
||||||
astrand = Peter Åstrand <astrand@cendio.se>
|
|
||||||
ossman_ = Pierre Ossman <ossman@cendio.se>
|
|
||||||
const_k = Constantin Kaplinsky <const@tightvnc.com>
|
|
||||||
atkac = Adam Tkac <atkac@redhat.com>
|
|
||||||
|
|
||||||
45
.gitignore
vendored
@@ -1,45 +0,0 @@
|
|||||||
.DS_Store
|
|
||||||
Makefile.in
|
|
||||||
Makefile
|
|
||||||
/CMakeFiles
|
|
||||||
/autom4te.cache
|
|
||||||
/aclocal.m4
|
|
||||||
/compile
|
|
||||||
/configure
|
|
||||||
/depcomp
|
|
||||||
/install-sh
|
|
||||||
/libtool
|
|
||||||
/missing
|
|
||||||
/stamp-h*
|
|
||||||
/java/classnoinst.stamp
|
|
||||||
/pkgscripts/
|
|
||||||
/jconfig.h
|
|
||||||
/jconfigint.h
|
|
||||||
/config.guess
|
|
||||||
/config.h
|
|
||||||
/config.h.in
|
|
||||||
/config.log
|
|
||||||
/config.status
|
|
||||||
/config.sub
|
|
||||||
/ltmain.sh
|
|
||||||
/ar-lib
|
|
||||||
/libjpeg.map
|
|
||||||
/.libs/
|
|
||||||
/simd/.libs/
|
|
||||||
/simd/jsimdcfg.inc
|
|
||||||
*.o
|
|
||||||
*.lo
|
|
||||||
*.la
|
|
||||||
/cjpeg
|
|
||||||
/djpeg
|
|
||||||
/jcstest
|
|
||||||
/jpegtran
|
|
||||||
/jpegyuv
|
|
||||||
/md5/md5cmp
|
|
||||||
/rdjpgcom
|
|
||||||
/test_enc_*
|
|
||||||
/tjbench
|
|
||||||
/tjbenchtest
|
|
||||||
/tjunittest
|
|
||||||
/wrjpgcom
|
|
||||||
/yuvjpeg
|
|
||||||
865
BUILDING.md
@@ -1,865 +0,0 @@
|
|||||||
Building on Un*x Platforms (including Cygwin and OS X)
|
|
||||||
=======================================================
|
|
||||||
|
|
||||||
|
|
||||||
Build Requirements
|
|
||||||
------------------
|
|
||||||
|
|
||||||
- autoconf 2.56 or later
|
|
||||||
- automake 1.7 or later
|
|
||||||
- libtool 1.4 or later
|
|
||||||
* If using Xcode 4.3 or later on OS X, autoconf and automake are no longer
|
|
||||||
provided. The easiest way to obtain them is from
|
|
||||||
[MacPorts](http://www.MacPorts.org).
|
|
||||||
|
|
||||||
- NASM or YASM (if building x86 or x86-64 SIMD extensions)
|
|
||||||
* If using NASM, 0.98, or 2.01 or later is required for an x86 build (0.99
|
|
||||||
and 2.00 do not work properly with libjpeg-turbo's x86 SIMD code.)
|
|
||||||
* If using NASM, 2.00 or later is required for an x86-64 build.
|
|
||||||
* If using NASM, 2.07 or later (except 2.11.08) is required for an x86-64
|
|
||||||
Mac build (2.11.08 does not work properly with libjpeg-turbo's x86-64 SIMD
|
|
||||||
code when building macho64 objects.) NASM or YASM can be obtained from
|
|
||||||
[MacPorts](http://www.macports.org/).
|
|
||||||
|
|
||||||
The binary RPMs released by the NASM project do not work on older Linux
|
|
||||||
systems, such as Red Hat Enterprise Linux 4. On such systems, you can
|
|
||||||
easily build and install NASM from a source RPM by downloading one of the
|
|
||||||
SRPMs from
|
|
||||||
|
|
||||||
<http://www.nasm.us/pub/nasm/releasebuilds>
|
|
||||||
|
|
||||||
and executing the following as root:
|
|
||||||
|
|
||||||
ARCH=`uname -m`
|
|
||||||
rpmbuild --rebuild nasm-{version}.src.rpm
|
|
||||||
rpm -Uvh /usr/src/redhat/RPMS/$ARCH/nasm-{version}.$ARCH.rpm
|
|
||||||
|
|
||||||
NOTE: the NASM build will fail if texinfo is not installed.
|
|
||||||
|
|
||||||
- GCC v4.1 (or later) or clang recommended for best performance
|
|
||||||
|
|
||||||
- If building the TurboJPEG Java wrapper, JDK or OpenJDK 1.5 or later is
|
|
||||||
required. Some systems, such as Solaris 10 and later and Red Hat Enterprise
|
|
||||||
Linux 5 and later, have this pre-installed. On OS X 10.5 and 10.6, it will
|
|
||||||
be necessary to install the Java Developer Package, which can be downloaded
|
|
||||||
from <http://developer.apple.com/downloads> (Apple ID required.) For other
|
|
||||||
systems, you can obtain the Oracle Java Development Kit from
|
|
||||||
<http://www.java.com>.
|
|
||||||
|
|
||||||
|
|
||||||
Out-of-Tree Builds
|
|
||||||
------------------
|
|
||||||
|
|
||||||
Binary objects, libraries, and executables are generated in the same directory
|
|
||||||
from which `configure` was executed (the "binary directory"), and this
|
|
||||||
directory need not necessarily be the same as the libjpeg-turbo source
|
|
||||||
directory. You can create multiple independent binary directories, in which
|
|
||||||
different versions of libjpeg-turbo can be built from the same source tree
|
|
||||||
using different compilers or settings. In the sections below,
|
|
||||||
*{build_directory}* refers to the binary directory, whereas
|
|
||||||
*{source_directory}* refers to the libjpeg-turbo source directory. For in-tree
|
|
||||||
builds, these directories are the same.
|
|
||||||
|
|
||||||
|
|
||||||
Building libjpeg-turbo
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
The following procedure will build libjpeg-turbo on Linux, FreeBSD, Cygwin, and
|
|
||||||
Solaris/x86 systems (on Solaris, this generates a 32-bit library. See below
|
|
||||||
for 64-bit build instructions.)
|
|
||||||
|
|
||||||
cd {source_directory}
|
|
||||||
autoreconf -fiv
|
|
||||||
cd {build_directory}
|
|
||||||
sh {source_directory}/configure [additional configure flags]
|
|
||||||
make
|
|
||||||
|
|
||||||
NOTE: Running autoreconf in the source directory is not necessary if building
|
|
||||||
libjpeg-turbo from one of the official release tarballs.
|
|
||||||
|
|
||||||
This will generate the following files under .libs/:
|
|
||||||
|
|
||||||
**libjpeg.a**
|
|
||||||
Static link library for the libjpeg API
|
|
||||||
|
|
||||||
**libjpeg.so.{version}** (Linux, Unix)
|
|
||||||
**libjpeg.{version}.dylib** (OS X)
|
|
||||||
**cygjpeg-{version}.dll** (Cygwin)
|
|
||||||
Shared library for the libjpeg API
|
|
||||||
|
|
||||||
By default, *{version}* is 62.1.0, 7.1.0, or 8.0.2, depending on whether
|
|
||||||
libjpeg v6b (default), v7, or v8 emulation is enabled. If using Cygwin,
|
|
||||||
*{version}* is 62, 7, or 8.
|
|
||||||
|
|
||||||
**libjpeg.so** (Linux, Unix)
|
|
||||||
**libjpeg.dylib** (OS X)
|
|
||||||
Development symlink for the libjpeg API
|
|
||||||
|
|
||||||
**libjpeg.dll.a** (Cygwin)
|
|
||||||
Import library for the libjpeg API
|
|
||||||
|
|
||||||
**libturbojpeg.a**
|
|
||||||
Static link library for the TurboJPEG API
|
|
||||||
|
|
||||||
**libturbojpeg.so.0.1.0** (Linux, Unix)
|
|
||||||
**libturbojpeg.0.1.0.dylib** (OS X)
|
|
||||||
**cygturbojpeg-0.dll** (Cygwin)
|
|
||||||
Shared library for the TurboJPEG API
|
|
||||||
|
|
||||||
**libturbojpeg.so** (Linux, Unix)
|
|
||||||
**libturbojpeg.dylib** (OS X)
|
|
||||||
Development symlink for the TurboJPEG API
|
|
||||||
|
|
||||||
**libturbojpeg.dll.a** (Cygwin)
|
|
||||||
Import library for the TurboJPEG API
|
|
||||||
|
|
||||||
|
|
||||||
### libjpeg v7 or v8 API/ABI Emulation
|
|
||||||
|
|
||||||
Add `--with-jpeg7` to the `configure` command line to build a version of
|
|
||||||
libjpeg-turbo that is API/ABI-compatible with libjpeg v7. Add `--with-jpeg8`
|
|
||||||
to the `configure` command to build a version of libjpeg-turbo that is
|
|
||||||
API/ABI-compatible with libjpeg v8. See [README.md](README.md) for more
|
|
||||||
information on libjpeg v7 and v8 emulation.
|
|
||||||
|
|
||||||
|
|
||||||
### In-Memory Source/Destination Managers
|
|
||||||
|
|
||||||
When using libjpeg v6b or v7 API/ABI emulation, add `--without-mem-srcdst` to
|
|
||||||
the `configure` command line to build a version of libjpeg-turbo that lacks the
|
|
||||||
`jpeg_mem_src()` and `jpeg_mem_dest()` functions. These functions were not
|
|
||||||
part of the original libjpeg v6b and v7 APIs, so removing them ensures strict
|
|
||||||
conformance with those APIs. See [README.md](README.md) for more information.
|
|
||||||
|
|
||||||
|
|
||||||
### Arithmetic Coding Support
|
|
||||||
|
|
||||||
Since the patent on arithmetic coding has expired, this functionality has been
|
|
||||||
included in this release of libjpeg-turbo. libjpeg-turbo's implementation is
|
|
||||||
based on the implementation in libjpeg v8, but it works when emulating libjpeg
|
|
||||||
v7 or v6b as well. The default is to enable both arithmetic encoding and
|
|
||||||
decoding, but those who have philosophical objections to arithmetic coding can
|
|
||||||
add `--without-arith-enc` or `--without-arith-dec` to the `configure` command
|
|
||||||
line to disable encoding or decoding (respectively.)
|
|
||||||
|
|
||||||
|
|
||||||
### TurboJPEG Java Wrapper
|
|
||||||
|
|
||||||
Add `--with-java` to the `configure` command line to incorporate an optional
|
|
||||||
Java Native Interface wrapper into the TurboJPEG shared library and build the
|
|
||||||
Java front-end classes to support it. This allows the TurboJPEG shared library
|
|
||||||
to be used directly from Java applications. See [java/README](java/README) for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You can set the `JAVAC`, `JAR`, and `JAVA` configure variables to specify
|
|
||||||
alternate commands for javac, jar, and java (respectively.) You can also
|
|
||||||
set the `JAVACFLAGS` configure variable to specify arguments that should be
|
|
||||||
passed to the Java compiler when building the front-end classes, and
|
|
||||||
`JNI_CFLAGS` to specify arguments that should be passed to the C compiler when
|
|
||||||
building the JNI wrapper. Run `configure --help` for more details.
|
|
||||||
|
|
||||||
|
|
||||||
Installing libjpeg-turbo
|
|
||||||
------------------------
|
|
||||||
|
|
||||||
If you intend to install these libraries and the associated header files, then
|
|
||||||
replace 'make' in the instructions above with
|
|
||||||
|
|
||||||
make install prefix={base dir} libdir={library directory}
|
|
||||||
|
|
||||||
For example,
|
|
||||||
|
|
||||||
make install prefix=/usr/local libdir=/usr/local/lib64
|
|
||||||
|
|
||||||
will install the header files in /usr/local/include and the library files in
|
|
||||||
/usr/local/lib64. If `prefix` and `libdir` are not specified, then the default
|
|
||||||
is to install the header files in /opt/libjpeg-turbo/include and the library
|
|
||||||
files in /opt/libjpeg-turbo/lib32 (32-bit) or /opt/libjpeg-turbo/lib64
|
|
||||||
(64-bit.)
|
|
||||||
|
|
||||||
NOTE: You can specify a prefix of /usr and a libdir of, for instance,
|
|
||||||
/usr/lib64 to overwrite the system's version of libjpeg. If you do this,
|
|
||||||
however, then be sure to BACK UP YOUR SYSTEM'S INSTALLATION OF LIBJPEG before
|
|
||||||
overwriting it. It is recommended that you instead install libjpeg-turbo into
|
|
||||||
a non-system directory and manipulate the `LD_LIBRARY_PATH` or create symlinks
|
|
||||||
to force applications to use libjpeg-turbo instead of libjpeg. See
|
|
||||||
[README.md](README.md) for more information.
|
|
||||||
|
|
||||||
|
|
||||||
Build Recipes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
|
|
||||||
### 32-bit Build on 64-bit Linux
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
--host i686-pc-linux-gnu CFLAGS='-O3 -m32' LDFLAGS=-m32
|
|
||||||
|
|
||||||
to the `configure` command line.
|
|
||||||
|
|
||||||
|
|
||||||
### 64-bit Build on 64-bit OS X
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
--host x86_64-apple-darwin NASM=/opt/local/bin/nasm
|
|
||||||
|
|
||||||
to the `configure` command line. NASM 2.07 or later from MacPorts must be
|
|
||||||
installed.
|
|
||||||
|
|
||||||
|
|
||||||
### 32-bit Build on 64-bit OS X
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
--host i686-apple-darwin CFLAGS='-O3 -m32' LDFLAGS=-m32
|
|
||||||
|
|
||||||
to the `configure` command line.
|
|
||||||
|
|
||||||
|
|
||||||
### 64-bit Backward-Compatible Build on 64-bit OS X
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
--host x86_64-apple-darwin NASM=/opt/local/bin/nasm \
|
|
||||||
CFLAGS='-mmacosx-version-min=10.5 -O3' \
|
|
||||||
LDFLAGS='-mmacosx-version-min=10.5'
|
|
||||||
|
|
||||||
to the `configure` command line. NASM 2.07 or later from MacPorts must be
|
|
||||||
installed.
|
|
||||||
|
|
||||||
|
|
||||||
### 32-bit Backward-Compatible Build on OS X
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
--host i686-apple-darwin \
|
|
||||||
CFLAGS='-mmacosx-version-min=10.5 -O3 -m32' \
|
|
||||||
LDFLAGS='-mmacosx-version-min=10.5 -m32'
|
|
||||||
|
|
||||||
to the `configure` command line.
|
|
||||||
|
|
||||||
|
|
||||||
### 64-bit Build on 64-bit Solaris
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
--host x86_64-pc-solaris CFLAGS='-O3 -m64' LDFLAGS=-m64
|
|
||||||
|
|
||||||
to the `configure` command line.
|
|
||||||
|
|
||||||
|
|
||||||
### 32-bit Build on 64-bit FreeBSD
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
--host i386-unknown-freebsd CC='gcc -B /usr/lib32' CFLAGS='-O3 -m32' \
|
|
||||||
LDFLAGS='-B/usr/lib32'
|
|
||||||
|
|
||||||
to the `configure` command line. NASM 2.07 or later from FreeBSD ports must be
|
|
||||||
installed.
|
|
||||||
|
|
||||||
|
|
||||||
### Oracle Solaris Studio
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
CC=cc
|
|
||||||
|
|
||||||
to the `configure` command line. libjpeg-turbo will automatically be built
|
|
||||||
with the maximum optimization level (-xO5) unless you override `CFLAGS`.
|
|
||||||
|
|
||||||
To build a 64-bit version of libjpeg-turbo using Oracle Solaris Studio, add
|
|
||||||
|
|
||||||
--host x86_64-pc-solaris CC=cc CFLAGS='-xO5 -m64' LDFLAGS=-m64
|
|
||||||
|
|
||||||
to the `configure` command line.
|
|
||||||
|
|
||||||
|
|
||||||
### MinGW Build on Cygwin
|
|
||||||
|
|
||||||
Use CMake (see recipes below)
|
|
||||||
|
|
||||||
|
|
||||||
ARM Support
|
|
||||||
-----------
|
|
||||||
|
|
||||||
This release of libjpeg-turbo can use ARM NEON SIMD instructions to accelerate
|
|
||||||
JPEG compression/decompression by approximately 2-4x on ARMv7 and later
|
|
||||||
platforms. If libjpeg-turbo is configured on an ARM Linux platform, then the
|
|
||||||
build system will automatically include the NEON SIMD routines, if they are
|
|
||||||
supported. Build instructions for other ARM-based platforms follow.
|
|
||||||
|
|
||||||
|
|
||||||
### Building libjpeg-turbo for iOS
|
|
||||||
|
|
||||||
iOS platforms, such as the iPhone and iPad, use ARM processors, some of which
|
|
||||||
support NEON instructions. Additional steps are required in order to build
|
|
||||||
libjpeg-turbo for these platforms.
|
|
||||||
|
|
||||||
|
|
||||||
#### Additional build requirements
|
|
||||||
|
|
||||||
- [gas-preprocessor.pl]
|
|
||||||
(https://raw.githubusercontent.com/libjpeg-turbo/gas-preprocessor/master/gas-preprocessor.pl)
|
|
||||||
should be installed in your `PATH`.
|
|
||||||
|
|
||||||
|
|
||||||
#### ARM 32-bit Build (Xcode 4.6.x and earlier, LLVM-GCC)
|
|
||||||
|
|
||||||
Set the following shell variables for simplicity:
|
|
||||||
|
|
||||||
*Xcode 4.2 and earlier*
|
|
||||||
|
|
||||||
IOS_PLATFORMDIR=/Developer/Platforms/iPhoneOS.platform`
|
|
||||||
|
|
||||||
*Xcode 4.3 and later*
|
|
||||||
|
|
||||||
IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
|
|
||||||
|
|
||||||
*All Xcode versions*
|
|
||||||
|
|
||||||
IOS_SYSROOT=$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS*.sdk
|
|
||||||
IOS_GCC=$IOS_PLATFORMDIR/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
|
|
||||||
|
|
||||||
*ARMv6 (code will run on all iOS devices, not SIMD-accelerated)*
|
|
||||||
[NOTE: Requires Xcode 4.4.x or earlier]
|
|
||||||
|
|
||||||
IOS_CFLAGS="-march=armv6 -mcpu=arm1176jzf-s -mfpu=vfp"
|
|
||||||
|
|
||||||
*ARMv7 (code will run on iPhone 3GS-4S/iPad 1st-3rd Generation and newer)*
|
|
||||||
|
|
||||||
IOS_CFLAGS="-march=armv7 -mcpu=cortex-a8 -mtune=cortex-a8 -mfpu=neon"
|
|
||||||
|
|
||||||
*ARMv7s (code will run on iPhone 5/iPad 4th Generation and newer)*
|
|
||||||
[NOTE: Requires Xcode 4.5 or later]
|
|
||||||
|
|
||||||
IOS_CFLAGS="-march=armv7s -mcpu=swift -mtune=swift -mfpu=neon"
|
|
||||||
|
|
||||||
Follow the procedure under "Building libjpeg-turbo" above, adding
|
|
||||||
|
|
||||||
--host arm-apple-darwin10 \
|
|
||||||
CC="$IOS_GCC" LD="$IOS_GCC" \
|
|
||||||
CFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT -O3 $IOS_CFLAGS" \
|
|
||||||
LDFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT $IOS_CFLAGS"
|
|
||||||
|
|
||||||
to the `configure` command line.
|
|
||||||
|
|
||||||
|
|
||||||
#### ARM 32-bit Build (Xcode 5.0.x and later, Clang)
|
|
||||||
|
|
||||||
Set the following shell variables for simplicity:
|
|
||||||
|
|
||||||
IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
|
|
||||||
IOS_SYSROOT=$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS*.sdk
|
|
||||||
IOS_GCC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
|
|
||||||
|
|
||||||
*ARMv7 (code will run on iPhone 3GS-4S/iPad 1st-3rd Generation and newer)*
|
|
||||||
|
|
||||||
IOS_CFLAGS="-arch armv7"
|
|
||||||
|
|
||||||
*ARMv7s (code will run on iPhone 5/iPad 4th Generation and newer)*
|
|
||||||
|
|
||||||
IOS_CFLAGS="-arch armv7s"
|
|
||||||
|
|
||||||
Follow the procedure under "Building libjpeg-turbo" above, adding
|
|
||||||
|
|
||||||
--host arm-apple-darwin10 \
|
|
||||||
CC="$IOS_GCC" LD="$IOS_GCC" \
|
|
||||||
CFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT -O3 $IOS_CFLAGS" \
|
|
||||||
LDFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT $IOS_CFLAGS" \
|
|
||||||
CCASFLAGS="-no-integrated-as $IOS_CFLAGS"
|
|
||||||
|
|
||||||
to the `configure` command line.
|
|
||||||
|
|
||||||
|
|
||||||
#### ARMv8 64-bit Build (Xcode 5.0.x and later, Clang)
|
|
||||||
|
|
||||||
Code will run on iPhone 5S/iPad Mini 2/iPad Air and newer.
|
|
||||||
|
|
||||||
Set the following shell variables for simplicity:
|
|
||||||
|
|
||||||
IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
|
|
||||||
IOS_SYSROOT=$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS*.sdk
|
|
||||||
IOS_GCC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
|
|
||||||
IOS_CFLAGS="-arch arm64"
|
|
||||||
|
|
||||||
Follow the procedure under "Building libjpeg-turbo" above, adding
|
|
||||||
|
|
||||||
--host aarch64-apple-darwin \
|
|
||||||
CC="$IOS_GCC" LD="$IOS_GCC" \
|
|
||||||
CFLAGS="-isysroot $IOS_SYSROOT -O3 $IOS_CFLAGS" \
|
|
||||||
LDFLAGS="-isysroot $IOS_SYSROOT $IOS_CFLAGS"
|
|
||||||
|
|
||||||
to the `configure` command line.
|
|
||||||
|
|
||||||
|
|
||||||
NOTE: You can also add `-miphoneos-version-min={version}` to `$IOS_CFLAGS`
|
|
||||||
above in order to support older versions of iOS than the default version
|
|
||||||
supported by the SDK.
|
|
||||||
|
|
||||||
Once built, lipo can be used to combine the ARMv6, v7, v7s, and/or v8 variants
|
|
||||||
into a universal library.
|
|
||||||
|
|
||||||
|
|
||||||
### Building libjpeg-turbo for Android
|
|
||||||
|
|
||||||
Building libjpeg-turbo for Android platforms requires the
|
|
||||||
{Android NDK}(https://developer.android.com/tools/sdk/ndk)
|
|
||||||
and autotools. The following is a general recipe script that can be modified for your specific needs.
|
|
||||||
|
|
||||||
# Set these variables to suit your needs
|
|
||||||
NDK_PATH={full path to the "ndk" directory-- for example, /opt/android/ndk}
|
|
||||||
BUILD_PLATFORM={the platform name for the NDK package you installed--
|
|
||||||
for example, "windows-x86" or "linux-x86_64" or "darwin-x86_64"}
|
|
||||||
TOOLCHAIN_VERSION={"4.8", "4.9", "clang3.5", etc. This corresponds to a
|
|
||||||
toolchain directory under ${NDK_PATH}/toolchains/.}
|
|
||||||
ANDROID_VERSION={The minimum version of Android to support-- for example,
|
|
||||||
"16", "19", etc. "21" or later is required for a 64-bit build.}
|
|
||||||
|
|
||||||
# 32-bit ARMv7 build
|
|
||||||
HOST=arm-linux-androideabi
|
|
||||||
SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-arm
|
|
||||||
ANDROID_CFLAGS="-march=armv7-a -mfloat-abi=softfp -fprefetch-loop-arrays \
|
|
||||||
--sysroot=${SYSROOT}"
|
|
||||||
|
|
||||||
# 64-bit ARMv8 build
|
|
||||||
HOST=aarch64-linux-android
|
|
||||||
SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-arm64
|
|
||||||
ANDROID_CFLAGS="--sysroot=${SYSROOT}"
|
|
||||||
|
|
||||||
TOOLCHAIN=${NDK_PATH}/toolchains/${HOST}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}
|
|
||||||
ANDROID_INCLUDES="-I${SYSROOT}/usr/include -I${TOOLCHAIN}/include"
|
|
||||||
export CPP=${TOOLCHAIN}/bin/${HOST}-cpp
|
|
||||||
export AR=${TOOLCHAIN}/bin/${HOST}-ar
|
|
||||||
export AS=${TOOLCHAIN}/bin/${HOST}-as
|
|
||||||
export NM=${TOOLCHAIN}/bin/${HOST}-nm
|
|
||||||
export CC=${TOOLCHAIN}/bin/${HOST}-gcc
|
|
||||||
export LD=${TOOLCHAIN}/bin/${HOST}-ld
|
|
||||||
export RANLIB=${TOOLCHAIN}/bin/${HOST}-ranlib
|
|
||||||
export OBJDUMP=${TOOLCHAIN}/bin/${HOST}-objdump
|
|
||||||
export STRIP=${TOOLCHAIN}/bin/${HOST}-strip
|
|
||||||
cd {build_directory}
|
|
||||||
sh {source_directory}/configure --host=${HOST} \
|
|
||||||
CFLAGS="${ANDROID_INCLUDES} ${ANDROID_CFLAGS} -O3 -fPIE" \
|
|
||||||
CPPFLAGS="${ANDROID_INCLUDES} ${ANDROID_CFLAGS}" \
|
|
||||||
LDFLAGS="${ANDROID_CFLAGS} -pie" --with-simd ${1+"$@"}
|
|
||||||
make
|
|
||||||
|
|
||||||
If building for Android 4.0.x (API level < 16) or earlier, remove `-fPIE` from
|
|
||||||
`CFLAGS` and `-pie` from `LDFLAGS`.
|
|
||||||
|
|
||||||
|
|
||||||
Building on Windows (Visual C++ or MinGW)
|
|
||||||
=========================================
|
|
||||||
|
|
||||||
|
|
||||||
Build Requirements
|
|
||||||
------------------
|
|
||||||
|
|
||||||
- [CMake](http://www.cmake.org) v2.8.11 or later
|
|
||||||
|
|
||||||
- [NASM](http://www.nasm.us) or [YASM](http://yasm.tortall.net)
|
|
||||||
* If using NASM, 0.98 or later is required for an x86 build.
|
|
||||||
* If using NASM, 2.05 or later is required for an x86-64 build.
|
|
||||||
* nasm.exe/yasm.exe should be in your `PATH`.
|
|
||||||
|
|
||||||
- Microsoft Visual C++ 2005 or later
|
|
||||||
|
|
||||||
If you don't already have Visual C++, then the easiest way to get it is by
|
|
||||||
installing the
|
|
||||||
[Windows SDK](http://msdn.microsoft.com/en-us/windows/bb980924.aspx).
|
|
||||||
The Windows SDK includes both 32-bit and 64-bit Visual C++ compilers and
|
|
||||||
everything necessary to build libjpeg-turbo.
|
|
||||||
|
|
||||||
* You can also use Microsoft Visual Studio Express/Community Edition, which
|
|
||||||
is a free download. (NOTE: versions prior to 2012 can only be used to
|
|
||||||
build 32-bit code.)
|
|
||||||
* If you intend to build libjpeg-turbo from the command line, then add the
|
|
||||||
appropriate compiler and SDK directories to the `INCLUDE`, `LIB`, and
|
|
||||||
`PATH` environment variables. This is generally accomplished by
|
|
||||||
executing `vcvars32.bat` or `vcvars64.bat` and `SetEnv.cmd`.
|
|
||||||
`vcvars32.bat` and `vcvars64.bat` are part of Visual C++ and are located in
|
|
||||||
the same directory as the compiler. `SetEnv.cmd` is part of the Windows
|
|
||||||
SDK. You can pass optional arguments to `SetEnv.cmd` to specify a 32-bit
|
|
||||||
or 64-bit build environment.
|
|
||||||
|
|
||||||
... OR ...
|
|
||||||
|
|
||||||
- MinGW
|
|
||||||
|
|
||||||
[MinGW-builds](http://sourceforge.net/projects/mingwbuilds/) or
|
|
||||||
[tdm-gcc](http://tdm-gcc.tdragon.net/) recommended if building on a Windows
|
|
||||||
machine. Both distributions install a Start Menu link that can be used to
|
|
||||||
launch a command prompt with the appropriate compiler paths automatically
|
|
||||||
set.
|
|
||||||
|
|
||||||
- If building the TurboJPEG Java wrapper, JDK 1.5 or later is required. This
|
|
||||||
can be downloaded from <http://www.java.com>.
|
|
||||||
|
|
||||||
|
|
||||||
Out-of-Tree Builds
|
|
||||||
------------------
|
|
||||||
|
|
||||||
Binary objects, libraries, and executables are generated in the same directory
|
|
||||||
from which `cmake` was executed (the "binary directory"), and this directory
|
|
||||||
need not necessarily be the same as the libjpeg-turbo source directory. You
|
|
||||||
can create multiple independent binary directories, in which different versions
|
|
||||||
of libjpeg-turbo can be built from the same source tree using different
|
|
||||||
compilers or settings. In the sections below, *{build_directory}* refers to
|
|
||||||
the binary directory, whereas *{source_directory}* refers to the libjpeg-turbo
|
|
||||||
source directory. For in-tree builds, these directories are the same.
|
|
||||||
|
|
||||||
|
|
||||||
Building libjpeg-turbo
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
|
|
||||||
### Visual C++ (Command Line)
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release {source_directory}
|
|
||||||
nmake
|
|
||||||
|
|
||||||
This will build either a 32-bit or a 64-bit version of libjpeg-turbo, depending
|
|
||||||
on which version of cl.exe is in the `PATH`.
|
|
||||||
|
|
||||||
The following files will be generated under *{build_directory}*:
|
|
||||||
|
|
||||||
**jpeg-static.lib**
|
|
||||||
Static link library for the libjpeg API
|
|
||||||
|
|
||||||
**sharedlib/jpeg{version}.dll**
|
|
||||||
DLL for the libjpeg API
|
|
||||||
|
|
||||||
**sharedlib/jpeg.lib**
|
|
||||||
Import library for the libjpeg API
|
|
||||||
|
|
||||||
**turbojpeg-static.lib**
|
|
||||||
Static link library for the TurboJPEG API
|
|
||||||
|
|
||||||
**turbojpeg.dll**
|
|
||||||
DLL for the TurboJPEG API
|
|
||||||
|
|
||||||
**turbojpeg.lib**
|
|
||||||
Import library for the TurboJPEG API
|
|
||||||
|
|
||||||
*{version}* is 62, 7, or 8, depending on whether libjpeg v6b (default), v7, or
|
|
||||||
v8 emulation is enabled.
|
|
||||||
|
|
||||||
|
|
||||||
### Visual C++ (IDE)
|
|
||||||
|
|
||||||
Choose the appropriate CMake generator option for your version of Visual Studio
|
|
||||||
(run `cmake` with no arguments for a list of available generators.) For
|
|
||||||
instance:
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
cmake -G "Visual Studio 10" {source_directory}
|
|
||||||
|
|
||||||
NOTE: Add "Win64" to the generator name (for example, "Visual Studio 10
|
|
||||||
Win64") to build a 64-bit version of libjpeg-turbo. Recent versions of CMake
|
|
||||||
no longer document that. A separate build directory must be used for 32-bit
|
|
||||||
and 64-bit builds.
|
|
||||||
|
|
||||||
You can then open ALL_BUILD.vcproj in Visual Studio and build one of the
|
|
||||||
configurations in that project ("Debug", "Release", etc.) to generate a full
|
|
||||||
build of libjpeg-turbo.
|
|
||||||
|
|
||||||
This will generate the following files under *{build_directory}*:
|
|
||||||
|
|
||||||
**{configuration}/jpeg-static.lib**
|
|
||||||
Static link library for the libjpeg API
|
|
||||||
|
|
||||||
**sharedlib/{configuration}/jpeg{version}.dll**
|
|
||||||
DLL for the libjpeg API
|
|
||||||
|
|
||||||
**sharedlib/{configuration}/jpeg.lib**
|
|
||||||
Import library for the libjpeg API
|
|
||||||
|
|
||||||
**{configuration}/turbojpeg-static.lib**
|
|
||||||
Static link library for the TurboJPEG API
|
|
||||||
|
|
||||||
**{configuration}/turbojpeg.dll**
|
|
||||||
DLL for the TurboJPEG API
|
|
||||||
|
|
||||||
**{configuration}/turbojpeg.lib**
|
|
||||||
Import library for the TurboJPEG API
|
|
||||||
|
|
||||||
*{configuration}* is Debug, Release, RelWithDebInfo, or MinSizeRel, depending
|
|
||||||
on the configuration you built in the IDE, and *{version}* is 62, 7, or 8,
|
|
||||||
depending on whether libjpeg v6b (default), v7, or v8 emulation is enabled.
|
|
||||||
|
|
||||||
|
|
||||||
### MinGW
|
|
||||||
|
|
||||||
NOTE: This assumes that you are building on a Windows machine. If you are
|
|
||||||
cross-compiling on a Linux/Unix machine, then see "Build Recipes" below.
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
cmake -G "MinGW Makefiles" {source_directory}
|
|
||||||
mingw32-make
|
|
||||||
|
|
||||||
This will generate the following files under *{build_directory}*:
|
|
||||||
|
|
||||||
**libjpeg.a**
|
|
||||||
Static link library for the libjpeg API
|
|
||||||
|
|
||||||
**sharedlib/libjpeg-{version}.dll**
|
|
||||||
DLL for the libjpeg API
|
|
||||||
|
|
||||||
**sharedlib/libjpeg.dll.a**
|
|
||||||
Import library for the libjpeg API
|
|
||||||
|
|
||||||
**libturbojpeg.a**
|
|
||||||
Static link library for the TurboJPEG API
|
|
||||||
|
|
||||||
**libturbojpeg.dll**
|
|
||||||
DLL for the TurboJPEG API
|
|
||||||
|
|
||||||
**libturbojpeg.dll.a**
|
|
||||||
Import library for the TurboJPEG API
|
|
||||||
|
|
||||||
*{version}* is 62, 7, or 8, depending on whether libjpeg v6b (default), v7, or
|
|
||||||
v8 emulation is enabled.
|
|
||||||
|
|
||||||
|
|
||||||
### Debug Build
|
|
||||||
|
|
||||||
Add `-DCMAKE_BUILD_TYPE=Debug` to the `cmake` command line. Or, if building
|
|
||||||
with NMake, remove `-DCMAKE_BUILD_TYPE=Release` (Debug builds are the default
|
|
||||||
with NMake.)
|
|
||||||
|
|
||||||
|
|
||||||
### libjpeg v7 or v8 API/ABI Emulation
|
|
||||||
|
|
||||||
Add `-DWITH_JPEG7=1` to the `cmake` command line to build a version of
|
|
||||||
libjpeg-turbo that is API/ABI-compatible with libjpeg v7. Add `-DWITH_JPEG8=1`
|
|
||||||
to the `cmake` command line to build a version of libjpeg-turbo that is
|
|
||||||
API/ABI-compatible with libjpeg v8. See [README.md](README.md) for more
|
|
||||||
information on libjpeg v7 and v8 emulation.
|
|
||||||
|
|
||||||
|
|
||||||
### In-Memory Source/Destination Managers
|
|
||||||
|
|
||||||
When using libjpeg v6b or v7 API/ABI emulation, add `-DWITH_MEM_SRCDST=0` to
|
|
||||||
the `cmake` command line to build a version of libjpeg-turbo that lacks the
|
|
||||||
`jpeg_mem_src()` and `jpeg_mem_dest()` functions. These functions were not
|
|
||||||
part of the original libjpeg v6b and v7 APIs, so removing them ensures strict
|
|
||||||
conformance with those APIs. See [README.md](README.md) for more information.
|
|
||||||
|
|
||||||
|
|
||||||
### Arithmetic Coding Support
|
|
||||||
|
|
||||||
Since the patent on arithmetic coding has expired, this functionality has been
|
|
||||||
included in this release of libjpeg-turbo. libjpeg-turbo's implementation is
|
|
||||||
based on the implementation in libjpeg v8, but it works when emulating libjpeg
|
|
||||||
v7 or v6b as well. The default is to enable both arithmetic encoding and
|
|
||||||
decoding, but those who have philosophical objections to arithmetic coding can
|
|
||||||
add `-DWITH_ARITH_ENC=0` or `-DWITH_ARITH_DEC=0` to the `cmake` command line to
|
|
||||||
disable encoding or decoding (respectively.)
|
|
||||||
|
|
||||||
|
|
||||||
### TurboJPEG Java Wrapper
|
|
||||||
|
|
||||||
Add `-DWITH_JAVA=1` to the `cmake` command line to incorporate an optional Java
|
|
||||||
Native Interface wrapper into the TurboJPEG shared library and build the Java
|
|
||||||
front-end classes to support it. This allows the TurboJPEG shared library to
|
|
||||||
be used directly from Java applications. See [java/README](java/README) for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You can set the `Java_JAVAC_EXECUTABLE`, `Java_JAVA_EXECUTABLE`, and
|
|
||||||
`Java_JAR_EXECUTABLE` CMake variables to specify alternate commands or
|
|
||||||
locations for javac, jar, and java (respectively.) You can also set the
|
|
||||||
`JAVACFLAGS` CMake variable to specify arguments that should be passed to the
|
|
||||||
Java compiler when building the front-end classes.
|
|
||||||
|
|
||||||
|
|
||||||
Installing libjpeg-turbo
|
|
||||||
------------------------
|
|
||||||
|
|
||||||
You can use the build system to install libjpeg-turbo into a directory of your
|
|
||||||
choosing (as opposed to creating an installer.) To do this, add:
|
|
||||||
|
|
||||||
-DCMAKE_INSTALL_PREFIX={install_directory}
|
|
||||||
|
|
||||||
to the cmake command line.
|
|
||||||
|
|
||||||
For example,
|
|
||||||
|
|
||||||
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=c:\libjpeg-turbo {source_directory}
|
|
||||||
nmake install
|
|
||||||
|
|
||||||
will install the header files in c:\libjpeg-turbo\include, the library files
|
|
||||||
in c:\libjpeg-turbo\lib, the DLL's in c:\libjpeg-turbo\bin, and the
|
|
||||||
documentation in c:\libjpeg-turbo\doc.
|
|
||||||
|
|
||||||
|
|
||||||
Build Recipes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
|
|
||||||
### 64-bit MinGW Build on Cygwin
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
CC=/usr/bin/x86_64-w64-mingw32-gcc \
|
|
||||||
cmake -G "Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows \
|
|
||||||
-DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres.exe \
|
|
||||||
{source_directory}
|
|
||||||
make
|
|
||||||
|
|
||||||
This produces a 64-bit build of libjpeg-turbo that does not depend on
|
|
||||||
cygwin1.dll or other Cygwin DLL's. The mingw64-x86\_64-gcc-core and
|
|
||||||
mingw64-x86\_64-gcc-g++ packages (and their dependencies) must be installed.
|
|
||||||
|
|
||||||
|
|
||||||
### 32-bit MinGW Build on Cygwin
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
CC=/usr/bin/i686-w64-mingw32-gcc \
|
|
||||||
cmake -G "Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows \
|
|
||||||
-DCMAKE_RC_COMPILER=/usr/bin/i686-w64-mingw32-windres.exe \
|
|
||||||
{source_directory}
|
|
||||||
make
|
|
||||||
|
|
||||||
This produces a 32-bit build of libjpeg-turbo that does not depend on
|
|
||||||
cygwin1.dll or other Cygwin DLL's. The mingw64-i686-gcc-core and
|
|
||||||
mingw64-i686-gcc-g++ packages (and their dependencies) must be installed.
|
|
||||||
|
|
||||||
|
|
||||||
### MinGW Build on Linux
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
CC={mingw_binary_path}/i686-pc-mingw32-gcc \
|
|
||||||
cmake -G "Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows \
|
|
||||||
-DCMAKE_RC_COMPILER={mingw_binary_path}/i686-pc-mingw32-windres \
|
|
||||||
-DCMAKE_AR={mingw_binary_path}/i686-pc-mingw32-ar \
|
|
||||||
-DCMAKE_RANLIB={mingw_binary_path}/i686-pc-mingw32-ranlib \
|
|
||||||
{source_directory}
|
|
||||||
make
|
|
||||||
|
|
||||||
|
|
||||||
Creating Release Packages
|
|
||||||
=========================
|
|
||||||
|
|
||||||
The following commands can be used to create various types of release packages:
|
|
||||||
|
|
||||||
|
|
||||||
Unix/Linux
|
|
||||||
----------
|
|
||||||
|
|
||||||
make rpm
|
|
||||||
|
|
||||||
Create Red Hat-style binary RPM package. Requires RPM v4 or later.
|
|
||||||
|
|
||||||
make srpm
|
|
||||||
|
|
||||||
This runs `make dist` to create a pristine source tarball, then creates a
|
|
||||||
Red Hat-style source RPM package from the tarball. Requires RPM v4 or later.
|
|
||||||
|
|
||||||
make deb
|
|
||||||
|
|
||||||
Create Debian-style binary package. Requires dpkg.
|
|
||||||
|
|
||||||
make dmg
|
|
||||||
|
|
||||||
Create Macintosh package/disk image. This requires pkgbuild and
|
|
||||||
productbuild, which are installed by default on OS X 10.7 and later and which
|
|
||||||
can be obtained by installing Xcode 3.2.6 (with the "Unix Development"
|
|
||||||
option) on OS X 10.6. Packages built in this manner can be installed on OS X
|
|
||||||
10.5 and later, but they must be built on OS X 10.6 or later.
|
|
||||||
|
|
||||||
make udmg [BUILDDIR32={32-bit build directory}]
|
|
||||||
|
|
||||||
On 64-bit OS X systems, this creates a Macintosh package and disk image that
|
|
||||||
contains universal i386/x86-64 binaries. You should first configure a 32-bit
|
|
||||||
out-of-tree build of libjpeg-turbo, then configure a 64-bit out-of-tree
|
|
||||||
build, then run `make udmg` from the 64-bit build directory. The build
|
|
||||||
system will look for the 32-bit build under *{source_directory}*/osxx86 by
|
|
||||||
default, but you can override this by setting the `BUILDDIR32` variable on the
|
|
||||||
make command line as shown above.
|
|
||||||
|
|
||||||
make iosdmg [BUILDDIR32={32-bit build directory}] \
|
|
||||||
[BUILDDIRARMV6={ARMv6 build directory}] \
|
|
||||||
[BUILDDIRARMV7={ARMv7 build directory}] \
|
|
||||||
[BUILDDIRARMV7S={ARMv7s build directory}] \
|
|
||||||
[BUILDDIRARMV8={ARMv8 build directory}]
|
|
||||||
|
|
||||||
On OS X systems, this creates a Macintosh package and disk image in which the
|
|
||||||
libjpeg-turbo static libraries contain ARM architectures necessary to build
|
|
||||||
iOS applications. If building on an x86-64 system, the binaries will also
|
|
||||||
contain the i386 architecture, as with `make udmg` above. You should first
|
|
||||||
configure ARMv6, ARMv7, ARMv7s, and/or ARMv8 out-of-tree builds of
|
|
||||||
libjpeg-turbo (see "Building libjpeg-turbo for iOS" above.) If you are
|
|
||||||
building an x86-64 version of libjpeg-turbo, you should configure a 32-bit
|
|
||||||
out-of-tree build as well. Next, build libjpeg-turbo as you would normally,
|
|
||||||
using an out-of-tree build. When it is built, run `make iosdmg` from the
|
|
||||||
build directory. The build system will look for the ARMv6 build under
|
|
||||||
*{source_directory}*/iosarmv6 by default, the ARMv7 build under
|
|
||||||
*{source_directory}*/iosarmv7 by default, the ARMv7s build under
|
|
||||||
*{source_directory}*/iosarmv7s by default, the ARMv8 build under
|
|
||||||
*{source_directory}*/iosarmv8 by default, and (if applicable) the 32-bit build
|
|
||||||
under *{source_directory}*/osxx86 by default, but you can override this by
|
|
||||||
setting the `BUILDDIR32`, `BUILDDIRARMV6`, `BUILDDIRARMV7`, `BUILDDIRARMV7S`,
|
|
||||||
and/or `BUILDDIRARMV8` variables on the `make` command line as shown above.
|
|
||||||
|
|
||||||
NOTE: If including an ARMv8 build in the package, then you may need to use
|
|
||||||
Xcode's version of lipo instead of the operating system's. To do this, pass
|
|
||||||
an argument of `LIPO="xcrun lipo"` on the make command line.
|
|
||||||
|
|
||||||
make cygwinpkg
|
|
||||||
|
|
||||||
Build a Cygwin binary package.
|
|
||||||
|
|
||||||
|
|
||||||
Windows
|
|
||||||
-------
|
|
||||||
|
|
||||||
If using NMake:
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
nmake installer
|
|
||||||
|
|
||||||
If using MinGW:
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
make installer
|
|
||||||
|
|
||||||
If using the Visual Studio IDE, build the "installer" project.
|
|
||||||
|
|
||||||
The installer package (libjpeg-turbo[-gcc][64].exe) will be located under
|
|
||||||
*{build_directory}*. If building using the Visual Studio IDE, then the
|
|
||||||
installer package will be located in a subdirectory with the same name as the
|
|
||||||
configuration you built (such as *{build_directory}*\Debug\ or
|
|
||||||
*{build_directory}*\Release\).
|
|
||||||
|
|
||||||
Building a Windows installer requires the Nullsoft Install System
|
|
||||||
(http://nsis.sourceforge.net/.) makensis.exe should be in your `PATH`.
|
|
||||||
|
|
||||||
|
|
||||||
Regression testing
|
|
||||||
==================
|
|
||||||
|
|
||||||
The most common way to test libjpeg-turbo is by invoking `make test` on
|
|
||||||
Unix/Linux platforms or `ctest` on Windows platforms, once the build has
|
|
||||||
completed. This runs a series of tests to ensure that mathematical
|
|
||||||
compatibility has been maintained between libjpeg-turbo and libjpeg v6b. This
|
|
||||||
also invokes the TurboJPEG unit tests, which ensure that the colorspace
|
|
||||||
extensions, YUV encoding, decompression scaling, and other features of the
|
|
||||||
TurboJPEG C and Java APIs are working properly (and, by extension, that the
|
|
||||||
equivalent features of the underlying libjpeg API are also working.)
|
|
||||||
|
|
||||||
Invoking `make testclean` or `nmake testclean` (if using NMake) or building
|
|
||||||
the 'testclean' target (if using the Visual Studio IDE) will clean up the
|
|
||||||
output images generated by `make test`.
|
|
||||||
|
|
||||||
On Unix/Linux platforms, more extensive tests of the TurboJPEG C and Java
|
|
||||||
wrappers can be run by invoking `make tjtest`. These extended TurboJPEG tests
|
|
||||||
essentially iterate through all of the available features of the TurboJPEG APIs
|
|
||||||
that are not covered by the TurboJPEG unit tests (this includes the lossless
|
|
||||||
transform options) and compare the images generated by each feature to images
|
|
||||||
generated using the equivalent feature in the libjpeg API. The extended
|
|
||||||
TurboJPEG tests are meant to test for regressions in the TurboJPEG wrappers,
|
|
||||||
not in the underlying libjpeg API library.
|
|
||||||
902
BUILDING.txt
@@ -1,902 +0,0 @@
|
|||||||
*******************************************************************************
|
|
||||||
** Building on Un*x Platforms (including Cygwin and OS X)
|
|
||||||
*******************************************************************************
|
|
||||||
|
|
||||||
|
|
||||||
==================
|
|
||||||
Build Requirements
|
|
||||||
==================
|
|
||||||
|
|
||||||
-- pkg-config
|
|
||||||
-- autoconf 2.56 or later
|
|
||||||
-- automake 1.7 or later
|
|
||||||
-- libtool 1.4 or later
|
|
||||||
* If using Xcode 4.3 or later on OS X, autoconf and automake are no longer
|
|
||||||
provided. The easiest way to obtain them is from MacPorts
|
|
||||||
(http://www.macports.org/).
|
|
||||||
|
|
||||||
-- NASM or YASM (if building x86 or x86-64 SIMD extensions)
|
|
||||||
* NASM 0.98, or 2.01 or later is required for an x86 build (0.99 and 2.00 do
|
|
||||||
not work properly with libjpeg-turbo's x86 SIMD code.)
|
|
||||||
* NASM 2.00 or later is required for an x86-64 build.
|
|
||||||
* NASM 2.07, or 2.11.09 or later is required for an x86-64 Mac build
|
|
||||||
(2.11.08 does not work properly with libjpeg-turbo's x86-64 SIMD code when
|
|
||||||
building macho64 objects.) NASM or YASM can be obtained from MacPorts
|
|
||||||
(http://www.macports.org/).
|
|
||||||
|
|
||||||
The binary RPMs released by the NASM project do not work on older Linux
|
|
||||||
systems, such as Red Hat Enterprise Linux 4. On such systems, you can
|
|
||||||
easily build and install NASM from a source RPM by downloading one of the
|
|
||||||
SRPMs from
|
|
||||||
|
|
||||||
http://www.nasm.us/pub/nasm/releasebuilds
|
|
||||||
|
|
||||||
and executing the following as root:
|
|
||||||
|
|
||||||
ARCH=`uname -m`
|
|
||||||
rpmbuild --rebuild nasm-{version}.src.rpm
|
|
||||||
rpm -Uvh /usr/src/redhat/RPMS/$ARCH/nasm-{version}.$ARCH.rpm
|
|
||||||
|
|
||||||
NOTE: the NASM build will fail if texinfo is not installed.
|
|
||||||
|
|
||||||
-- GCC v4.1 or later recommended for best performance
|
|
||||||
* Beginning with Xcode 4, Apple stopped distributing GCC and switched to
|
|
||||||
the LLVM compiler. Xcode v4.0 through v4.6 provides a GCC front end
|
|
||||||
called LLVM-GCC. Unfortunately, as of this writing, neither LLVM-GCC nor
|
|
||||||
the LLVM (clang) compiler produces optimal performance with libjpeg-turbo.
|
|
||||||
Building mozjpeg with LLVM-GCC v4.2 results in a 10% performance
|
|
||||||
degradation when compressing using 64-bit code, relative to building
|
|
||||||
libjpeg-turbo with GCC v4.2. Building libjpeg-turbo with LLVM (clang)
|
|
||||||
results in a 20% performance degradation when compressing using 64-bit
|
|
||||||
code, relative to building libjpeg-turbo with GCC v4.2. If you are
|
|
||||||
running Snow Leopard or earlier, it is suggested that you continue to use
|
|
||||||
Xcode v3.2.6, which provides GCC v4.2. If you are using Lion or later, it
|
|
||||||
is suggested that you install Apple GCC v4.2 or GCC v5 through MacPorts.
|
|
||||||
|
|
||||||
-- If building the TurboJPEG Java wrapper, JDK or OpenJDK 1.5 or later is
|
|
||||||
required. Some systems, such as Solaris 10 and later and Red Hat Enterprise
|
|
||||||
Linux 5 and later, have this pre-installed. On OS X 10.5 and later, it will
|
|
||||||
be necessary to install the Java Developer Package, which can be downloaded
|
|
||||||
from http://developer.apple.com/downloads (Apple ID required.) For systems
|
|
||||||
that do not have a JDK installed, you can obtain the Oracle Java Development
|
|
||||||
Kit from http://www.java.com.
|
|
||||||
|
|
||||||
|
|
||||||
==================
|
|
||||||
Out-of-Tree Builds
|
|
||||||
==================
|
|
||||||
|
|
||||||
Binary objects, libraries, and executables are generated in the same directory
|
|
||||||
from which configure was executed (the "binary directory"), and this directory
|
|
||||||
need not necessarily be the same as the mozjpeg source directory. You
|
|
||||||
can create multiple independent binary directories, in which different versions
|
|
||||||
of mozjpeg can be built from the same source tree using different
|
|
||||||
compilers or settings. In the sections below, {build_directory} refers to the
|
|
||||||
binary directory, whereas {source_directory} refers to the mozjpeg source
|
|
||||||
directory. For in-tree builds, these directories are the same.
|
|
||||||
|
|
||||||
|
|
||||||
================
|
|
||||||
Building mozjpeg
|
|
||||||
================
|
|
||||||
|
|
||||||
The following procedure will build mozjpeg on Linux, FreeBSD, Cygwin, and
|
|
||||||
Solaris/x86 systems (on Solaris, this generates a 32-bit library. See below
|
|
||||||
for 64-bit build instructions.)
|
|
||||||
|
|
||||||
Simple Release tar.gz Source Build
|
|
||||||
----------------------------------
|
|
||||||
|
|
||||||
cd {source_directory}
|
|
||||||
./configure [additional configure flags]
|
|
||||||
make
|
|
||||||
|
|
||||||
Non-Release Source Build (e.g. GitHub clone)
|
|
||||||
--------------------------------------------
|
|
||||||
|
|
||||||
cd {source_directory}
|
|
||||||
autoreconf -fiv
|
|
||||||
cd {build_directory}
|
|
||||||
sh {source_directory}/configure [additional configure flags]
|
|
||||||
make
|
|
||||||
|
|
||||||
NOTE: Running autoreconf in the source directory is not necessary if building
|
|
||||||
mozjpeg from one of the official release tarballs.
|
|
||||||
|
|
||||||
This will generate the following files under .libs/
|
|
||||||
|
|
||||||
libjpeg.a
|
|
||||||
Static link library for the libjpeg API
|
|
||||||
|
|
||||||
libjpeg.so.{version} (Linux, Unix)
|
|
||||||
libjpeg.{version}.dylib (OS X)
|
|
||||||
cygjpeg-{version}.dll (Cygwin)
|
|
||||||
Shared library for the libjpeg API
|
|
||||||
|
|
||||||
By default, {version} is 62.2.0, 7.2.0, or 8.1.2, depending on whether
|
|
||||||
libjpeg v6b (default), v7, or v8 emulation is enabled. If using Cygwin,
|
|
||||||
{version} is 62, 7, or 8.
|
|
||||||
|
|
||||||
libjpeg.so (Linux, Unix)
|
|
||||||
libjpeg.dylib (OS X)
|
|
||||||
Development symlink for the libjpeg API
|
|
||||||
|
|
||||||
libjpeg.dll.a (Cygwin)
|
|
||||||
Import library for the libjpeg API
|
|
||||||
|
|
||||||
libturbojpeg.a
|
|
||||||
Static link library for the TurboJPEG API
|
|
||||||
|
|
||||||
libturbojpeg.so.0.1.0 (Linux, Unix)
|
|
||||||
libturbojpeg.0.1.0.dylib (OS X)
|
|
||||||
cygturbojpeg-0.dll (Cygwin)
|
|
||||||
Shared library for the TurboJPEG API
|
|
||||||
|
|
||||||
libturbojpeg.so (Linux, Unix)
|
|
||||||
libturbojpeg.dylib (OS X)
|
|
||||||
Development symlink for the TurboJPEG API
|
|
||||||
|
|
||||||
libturbojpeg.dll.a (Cygwin)
|
|
||||||
Import library for the TurboJPEG API
|
|
||||||
|
|
||||||
|
|
||||||
libjpeg v7 or v8 API/ABI Emulation
|
|
||||||
----------------------------------
|
|
||||||
|
|
||||||
Add --with-jpeg7 to the configure command line to build a version of
|
|
||||||
mozjpeg that is API/ABI-compatible with libjpeg v7. Add --with-jpeg8 to
|
|
||||||
the configure command to build a version of mozjpeg that is
|
|
||||||
API/ABI-compatible with libjpeg v8. See README-turbo.txt for more information
|
|
||||||
on libjpeg v7 and v8 emulation.
|
|
||||||
|
|
||||||
|
|
||||||
In-Memory Source/Destination Managers
|
|
||||||
-------------------------------------
|
|
||||||
|
|
||||||
When using libjpeg v6b or v7 API/ABI emulation, add --without-mem-srcdst to the
|
|
||||||
configure command line to build a version of mozjpeg that lacks the
|
|
||||||
jpeg_mem_src() and jpeg_mem_dest() functions. These functions were not part of
|
|
||||||
the original libjpeg v6b and v7 APIs, so removing them ensures strict
|
|
||||||
conformance with those APIs. See README-turbo.txt for more information.
|
|
||||||
|
|
||||||
|
|
||||||
Arithmetic Coding Support
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
Since the patent on arithmetic coding has expired, this functionality has been
|
|
||||||
included in this release of mozjpeg. mozjpeg's implementation is
|
|
||||||
based on the implementation in libjpeg v8, but it works when emulating libjpeg
|
|
||||||
v7 or v6b as well. The default is to enable both arithmetic encoding and
|
|
||||||
decoding, but those who have philosophical objections to arithmetic coding can
|
|
||||||
add --without-arith-enc or --without-arith-dec to the configure command line to
|
|
||||||
disable encoding or decoding (respectively.)
|
|
||||||
|
|
||||||
|
|
||||||
TurboJPEG Java Wrapper
|
|
||||||
----------------------
|
|
||||||
Add --with-java to the configure command line to incorporate an optional Java
|
|
||||||
Native Interface wrapper into the TurboJPEG shared library and build the Java
|
|
||||||
front-end classes to support it. This allows the TurboJPEG shared library to
|
|
||||||
be used directly from Java applications. See java/README for more details.
|
|
||||||
|
|
||||||
You can set the JAVAC, JAR, and JAVA configure variables to specify
|
|
||||||
alternate commands for javac, jar, and java (respectively.) You can also
|
|
||||||
set the JAVACFLAGS configure variable to specify arguments that should be
|
|
||||||
passed to the Java compiler when building the front-end classes, and JNI_CFLAGS
|
|
||||||
to specify arguments that should be passed to the C compiler when building the
|
|
||||||
JNI wrapper. Run 'configure --help' for more details.
|
|
||||||
|
|
||||||
|
|
||||||
==================
|
|
||||||
Installing mozjpeg
|
|
||||||
==================
|
|
||||||
|
|
||||||
If you intend to install these libraries and the associated header files, then
|
|
||||||
replace 'make' in the instructions above with
|
|
||||||
|
|
||||||
make install prefix={base dir} libdir={library directory}
|
|
||||||
|
|
||||||
For example,
|
|
||||||
|
|
||||||
make install prefix=/usr/local libdir=/usr/local/lib64
|
|
||||||
|
|
||||||
will install the header files in /usr/local/include and the library files in
|
|
||||||
/usr/local/lib64. If 'prefix' and 'libdir' are not specified, then the default
|
|
||||||
is to install the header files in /opt/mozjpeg/include and the library
|
|
||||||
files in /opt/mozjpeg/lib32 (32-bit) or /opt/mozjpeg/lib64
|
|
||||||
(64-bit.)
|
|
||||||
|
|
||||||
NOTE: You can specify a prefix of /usr and a libdir of, for instance,
|
|
||||||
/usr/lib64 to overwrite the system's version of libjpeg. If you do this,
|
|
||||||
however, then be sure to BACK UP YOUR SYSTEM'S INSTALLATION OF LIBJPEG before
|
|
||||||
overwriting it. It is recommended that you instead install mozjpeg into
|
|
||||||
a non-system directory and manipulate the LD_LIBRARY_PATH or create symlinks
|
|
||||||
to force applications to use mozjpeg instead of libjpeg. See
|
|
||||||
README-turbo.txt for more information.
|
|
||||||
|
|
||||||
|
|
||||||
=============
|
|
||||||
Build Recipes
|
|
||||||
=============
|
|
||||||
|
|
||||||
|
|
||||||
32-bit Build on 64-bit Linux
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
--host i686-pc-linux-gnu CFLAGS='-O3 -m32' LDFLAGS=-m32
|
|
||||||
|
|
||||||
to the configure command line.
|
|
||||||
|
|
||||||
|
|
||||||
64-bit Build on 64-bit OS X
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
--host x86_64-apple-darwin NASM=/opt/local/bin/nasm
|
|
||||||
|
|
||||||
to the configure command line. NASM 2.07 or later from MacPorts must be
|
|
||||||
installed.
|
|
||||||
|
|
||||||
|
|
||||||
32-bit Build on 64-bit OS X
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
--host i686-apple-darwin CFLAGS='-O3 -m32' LDFLAGS=-m32
|
|
||||||
|
|
||||||
to the configure command line.
|
|
||||||
|
|
||||||
|
|
||||||
64-bit Backward-Compatible Build on 64-bit OS X
|
|
||||||
-----------------------------------------------
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
--host x86_64-apple-darwin NASM=/opt/local/bin/nasm \
|
|
||||||
CFLAGS='-isysroot /Developer/SDKs/MacOSX10.5.sdk \
|
|
||||||
-mmacosx-version-min=10.5 -O3' \
|
|
||||||
LDFLAGS='-isysroot /Developer/SDKs/MacOSX10.5.sdk \
|
|
||||||
-mmacosx-version-min=10.5'
|
|
||||||
|
|
||||||
to the configure command line. The OS X 10.5 SDK, and NASM 2.07 or later from
|
|
||||||
MacPorts, must be installed.
|
|
||||||
|
|
||||||
|
|
||||||
32-bit Backward-Compatible Build on OS X
|
|
||||||
----------------------------------------
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
--host i686-apple-darwin \
|
|
||||||
CFLAGS='-isysroot /Developer/SDKs/MacOSX10.5.sdk \
|
|
||||||
-mmacosx-version-min=10.5 -O3 -m32' \
|
|
||||||
LDFLAGS='-isysroot /Developer/SDKs/MacOSX10.5.sdk \
|
|
||||||
-mmacosx-version-min=10.5 -m32'
|
|
||||||
|
|
||||||
to the configure command line. The OS X 10.5 SDK must be installed.
|
|
||||||
|
|
||||||
|
|
||||||
64-bit Library Build on 64-bit Solaris
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
--host x86_64-pc-solaris CFLAGS='-O3 -m64' LDFLAGS=-m64
|
|
||||||
|
|
||||||
to the configure command line.
|
|
||||||
|
|
||||||
|
|
||||||
32-bit Build on 64-bit FreeBSD
|
|
||||||
------------------------------
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
--host i386-unknown-freebsd CC='gcc -B /usr/lib32' CFLAGS='-O3 -m32' \
|
|
||||||
LDFLAGS='-B/usr/lib32'
|
|
||||||
|
|
||||||
to the configure command line. NASM 2.07 or later from FreeBSD ports must be
|
|
||||||
installed.
|
|
||||||
|
|
||||||
|
|
||||||
Oracle Solaris Studio
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
CC=cc
|
|
||||||
|
|
||||||
to the configure command line. mozjpeg will automatically be built with
|
|
||||||
the maximum optimization level (-xO5) unless you override CFLAGS.
|
|
||||||
|
|
||||||
To build a 64-bit version of mozjpeg using Oracle Solaris Studio, add
|
|
||||||
|
|
||||||
--host x86_64-pc-solaris CC=cc CFLAGS='-xO5 -m64' LDFLAGS=-m64
|
|
||||||
|
|
||||||
to the configure command line.
|
|
||||||
|
|
||||||
|
|
||||||
MinGW Build on Cygwin
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
Use CMake (see recipes below)
|
|
||||||
|
|
||||||
|
|
||||||
===========
|
|
||||||
ARM Support
|
|
||||||
===========
|
|
||||||
|
|
||||||
This release of mozjpeg can use ARM NEON SIMD instructions to accelerate
|
|
||||||
JPEG compression/decompression by approximately 2-4x on ARMv7 and later
|
|
||||||
platforms. If mozjpeg is configured on an ARM Linux platform, then the
|
|
||||||
build system will automatically include the NEON SIMD routines, if they are
|
|
||||||
supported. Build instructions for other ARM-based platforms follow.
|
|
||||||
|
|
||||||
|
|
||||||
Building mozjpeg for iOS
|
|
||||||
------------------------
|
|
||||||
|
|
||||||
iOS platforms, such as the iPhone and iPad, use ARM processors, some of which
|
|
||||||
support NEON instructions. Additional steps are required in order to build
|
|
||||||
mozjpeg for these platforms.
|
|
||||||
|
|
||||||
Additional build requirements:
|
|
||||||
|
|
||||||
gas-preprocessor.pl
|
|
||||||
(https://raw.githubusercontent.com/libjpeg-turbo/gas-preprocessor/master/gas-preprocessor.pl)
|
|
||||||
should be installed in your PATH.
|
|
||||||
|
|
||||||
|
|
||||||
ARM 32-bit Build (Xcode 4.6.x and earlier, LLVM-GCC):
|
|
||||||
|
|
||||||
Set the following shell variables for simplicity:
|
|
||||||
|
|
||||||
Xcode 4.2 and earlier:
|
|
||||||
IOS_PLATFORMDIR=/Developer/Platforms/iPhoneOS.platform
|
|
||||||
Xcode 4.3 and later:
|
|
||||||
IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
|
|
||||||
|
|
||||||
IOS_SYSROOT=$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS*.sdk
|
|
||||||
IOS_GCC=$IOS_PLATFORMDIR/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
|
|
||||||
|
|
||||||
ARMv6 (code will run on all iOS devices, not SIMD-accelerated):
|
|
||||||
[NOTE: Requires Xcode 4.4.x or earlier]
|
|
||||||
IOS_CFLAGS="-march=armv6 -mcpu=arm1176jzf-s -mfpu=vfp"
|
|
||||||
|
|
||||||
ARMv7 (code will run on iPhone 3GS-4S/iPad 1st-3rd Generation and newer):
|
|
||||||
IOS_CFLAGS="-march=armv7 -mcpu=cortex-a8 -mtune=cortex-a8 -mfpu=neon"
|
|
||||||
|
|
||||||
ARMv7s (code will run on iPhone 5/iPad 4th Generation and newer):
|
|
||||||
[NOTE: Requires Xcode 4.5 or later]
|
|
||||||
IOS_CFLAGS="-march=armv7s -mcpu=swift -mtune=swift -mfpu=neon"
|
|
||||||
|
|
||||||
Follow the procedure under "Building mozjpeg" above, adding
|
|
||||||
|
|
||||||
--host arm-apple-darwin10 \
|
|
||||||
CC="$IOS_GCC" LD="$IOS_GCC" \
|
|
||||||
CFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT -O3 $IOS_CFLAGS" \
|
|
||||||
LDFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT $IOS_CFLAGS"
|
|
||||||
|
|
||||||
to the configure command line.
|
|
||||||
|
|
||||||
|
|
||||||
ARM 32-bit Build (Xcode 5.0.x and later, Clang):
|
|
||||||
|
|
||||||
Set the following shell variables for simplicity:
|
|
||||||
|
|
||||||
IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
|
|
||||||
IOS_SYSROOT=$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS*.sdk
|
|
||||||
IOS_GCC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
|
|
||||||
|
|
||||||
ARMv7 (code will run on iPhone 3GS-4S/iPad 1st-3rd Generation and newer):
|
|
||||||
IOS_CFLAGS="-arch armv7"
|
|
||||||
|
|
||||||
ARMv7s (code will run on iPhone 5/iPad 4th Generation and newer):
|
|
||||||
IOS_CFLAGS="-arch armv7s"
|
|
||||||
|
|
||||||
Follow the procedure under "Building libjpeg-turbo" above, adding
|
|
||||||
|
|
||||||
--host arm-apple-darwin10 \
|
|
||||||
CC="$IOS_GCC" LD="$IOS_GCC" \
|
|
||||||
CFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT -O3 $IOS_CFLAGS" \
|
|
||||||
LDFLAGS="-mfloat-abi=softfp -isysroot $IOS_SYSROOT $IOS_CFLAGS" \
|
|
||||||
CCASFLAGS="-no-integrated-as $IOS_CFLAGS"
|
|
||||||
|
|
||||||
to the configure command line.
|
|
||||||
|
|
||||||
|
|
||||||
ARMv8 64-bit Build (Xcode 5.0.x and later, Clang):
|
|
||||||
|
|
||||||
Code will run on iPhone 5S/iPad Mini 2/iPad Air and newer.
|
|
||||||
|
|
||||||
Set the following shell variables for simplicity:
|
|
||||||
|
|
||||||
IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
|
|
||||||
IOS_SYSROOT=$IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS*.sdk
|
|
||||||
IOS_GCC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
|
|
||||||
IOS_CFLAGS="-arch arm64"
|
|
||||||
|
|
||||||
Follow the procedure under "Building libjpeg-turbo" above, adding
|
|
||||||
|
|
||||||
--host aarch64-apple-darwin \
|
|
||||||
CC="$IOS_GCC" LD="$IOS_GCC" \
|
|
||||||
CFLAGS="-isysroot $IOS_SYSROOT -O3 $IOS_CFLAGS" \
|
|
||||||
LDFLAGS="-isysroot $IOS_SYSROOT $IOS_CFLAGS"
|
|
||||||
|
|
||||||
to the configure command line.
|
|
||||||
|
|
||||||
|
|
||||||
NOTE: You can also add -miphoneos-version-min={version} to $IOS_CFLAGS above
|
|
||||||
in order to support older versions of iOS than the default version supported by
|
|
||||||
the SDK.
|
|
||||||
|
|
||||||
Once built, lipo can be used to combine the ARMv6, v7, v7s, and/or v8 variants
|
|
||||||
into a universal library.
|
|
||||||
|
|
||||||
|
|
||||||
Building libjpeg-turbo for Android
|
|
||||||
----------------------------------
|
|
||||||
|
|
||||||
Building libjpeg-turbo for Android platforms requires the Android NDK
|
|
||||||
(https://developer.android.com/tools/sdk/ndk) and autotools. The following is
|
|
||||||
a general recipe script that can be modified for your specific needs.
|
|
||||||
|
|
||||||
# Set these variables to suit your needs
|
|
||||||
NDK_PATH={full path to the "ndk" directory-- for example, /opt/android/ndk}
|
|
||||||
BUILD_PLATFORM={the platform name for the NDK package you installed--
|
|
||||||
for example, "windows-x86" or "linux-x86_64" or "darwin-x86_64"}
|
|
||||||
TOOLCHAIN_VERSION={"4.8", "4.9", "clang3.5", etc. This corresponds to a
|
|
||||||
toolchain directory under ${NDK_PATH}/toolchains/.}
|
|
||||||
ANDROID_VERSION={The minimum version of Android to support-- for example,
|
|
||||||
"16", "19", etc. "21" or later is required for a 64-bit build.}
|
|
||||||
|
|
||||||
# 32-bit ARMv7 build
|
|
||||||
HOST=arm-linux-androideabi
|
|
||||||
SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-arm
|
|
||||||
ANDROID_CFLAGS="-march=armv7-a -mfloat-abi=softfp -fprefetch-loop-arrays \
|
|
||||||
--sysroot=${SYSROOT}"
|
|
||||||
|
|
||||||
# 64-bit ARMv8 build
|
|
||||||
HOST=aarch64-linux-android
|
|
||||||
SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-arm64
|
|
||||||
ANDROID_CFLAGS="--sysroot=${SYSROOT}"
|
|
||||||
|
|
||||||
TOOLCHAIN=${NDK_PATH}/toolchains/${HOST}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}
|
|
||||||
ANDROID_INCLUDES="-I${SYSROOT}/usr/include -I${TOOLCHAIN}/include"
|
|
||||||
export CPP=${TOOLCHAIN}/bin/${HOST}-cpp
|
|
||||||
export AR=${TOOLCHAIN}/bin/${HOST}-ar
|
|
||||||
export AS=${TOOLCHAIN}/bin/${HOST}-as
|
|
||||||
export NM=${TOOLCHAIN}/bin/${HOST}-nm
|
|
||||||
export CC=${TOOLCHAIN}/bin/${HOST}-gcc
|
|
||||||
export LD=${TOOLCHAIN}/bin/${HOST}-ld
|
|
||||||
export RANLIB=${TOOLCHAIN}/bin/${HOST}-ranlib
|
|
||||||
export OBJDUMP=${TOOLCHAIN}/bin/${HOST}-objdump
|
|
||||||
export STRIP=${TOOLCHAIN}/bin/${HOST}-strip
|
|
||||||
cd {build_directory}
|
|
||||||
sh {source_directory}/configure --host=${HOST} \
|
|
||||||
CFLAGS="${ANDROID_INCLUDES} ${ANDROID_CFLAGS} -O3 -fPIE" \
|
|
||||||
CPPFLAGS="${ANDROID_INCLUDES} ${ANDROID_CFLAGS}" \
|
|
||||||
LDFLAGS="${ANDROID_CFLAGS} -pie" --with-simd ${1+"$@"}
|
|
||||||
make
|
|
||||||
|
|
||||||
If building for Android 4.0.x (API level < 16) or earlier, remove -fPIE from
|
|
||||||
CFLAGS and -pie from LDFLAGS.
|
|
||||||
|
|
||||||
|
|
||||||
*******************************************************************************
|
|
||||||
** Building on Windows (Visual C++ or MinGW)
|
|
||||||
*******************************************************************************
|
|
||||||
|
|
||||||
|
|
||||||
==================
|
|
||||||
Build Requirements
|
|
||||||
==================
|
|
||||||
|
|
||||||
-- CMake (http://www.cmake.org) v2.8.8 or later
|
|
||||||
|
|
||||||
-- Microsoft Visual C++ 2005 or later
|
|
||||||
|
|
||||||
If you don't already have Visual C++, then the easiest way to get it is by
|
|
||||||
installing the Windows SDK:
|
|
||||||
|
|
||||||
http://msdn.microsoft.com/en-us/windows/bb980924.aspx
|
|
||||||
|
|
||||||
The Windows SDK includes both 32-bit and 64-bit Visual C++ compilers and
|
|
||||||
everything necessary to build mozjpeg.
|
|
||||||
|
|
||||||
* You can also use Microsoft Visual Studio Express Edition, which is a free
|
|
||||||
download. (NOTE: versions prior to 2012 can only be used to build 32-bit
|
|
||||||
code.)
|
|
||||||
* If you intend to build mozjpeg from the command line, then add the
|
|
||||||
appropriate compiler and SDK directories to the INCLUDE, LIB, and PATH
|
|
||||||
environment variables. This is generally accomplished by executing
|
|
||||||
vcvars32.bat or vcvars64.bat and SetEnv.cmd. vcvars32.bat and
|
|
||||||
vcvars64.bat are part of Visual C++ and are located in the same directory
|
|
||||||
as the compiler. SetEnv.cmd is part of the Windows SDK. You can pass
|
|
||||||
optional arguments to SetEnv.cmd to specify a 32-bit or 64-bit build
|
|
||||||
environment.
|
|
||||||
|
|
||||||
... OR ...
|
|
||||||
|
|
||||||
-- MinGW
|
|
||||||
|
|
||||||
MinGW-builds (http://sourceforge.net/projects/mingwbuilds/) or
|
|
||||||
tdm-gcc (http://tdm-gcc.tdragon.net/) recommended if building on a Windows
|
|
||||||
machine. Both distributions install a Start Menu link that can be used to
|
|
||||||
launch a command prompt with the appropriate compiler paths automatically
|
|
||||||
set.
|
|
||||||
|
|
||||||
-- NASM (http://www.nasm.us/) 0.98 or later (NASM 2.05 or later is required for
|
|
||||||
a 64-bit build)
|
|
||||||
|
|
||||||
-- If building the TurboJPEG Java wrapper, JDK 1.5 or later is required. This
|
|
||||||
can be downloaded from http://www.java.com.
|
|
||||||
|
|
||||||
|
|
||||||
==================
|
|
||||||
Out-of-Tree Builds
|
|
||||||
==================
|
|
||||||
|
|
||||||
Binary objects, libraries, and executables are generated in the same directory
|
|
||||||
from which cmake was executed (the "binary directory"), and this directory need
|
|
||||||
not necessarily be the same as the mozjpeg source directory. You can
|
|
||||||
create multiple independent binary directories, in which different versions of
|
|
||||||
mozjpeg can be built from the same source tree using different compilers
|
|
||||||
or settings. In the sections below, {build_directory} refers to the binary
|
|
||||||
directory, whereas {source_directory} refers to the mozjpeg source
|
|
||||||
directory. For in-tree builds, these directories are the same.
|
|
||||||
|
|
||||||
|
|
||||||
================
|
|
||||||
Building mozjpeg
|
|
||||||
================
|
|
||||||
|
|
||||||
|
|
||||||
Visual C++ (Command Line)
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release {source_directory}
|
|
||||||
nmake
|
|
||||||
|
|
||||||
This will build either a 32-bit or a 64-bit version of mozjpeg, depending
|
|
||||||
on which version of cl.exe is in the PATH.
|
|
||||||
|
|
||||||
The following files will be generated under {build_directory}:
|
|
||||||
|
|
||||||
jpeg-static.lib
|
|
||||||
Static link library for the libjpeg API
|
|
||||||
sharedlib/jpeg{version}.dll
|
|
||||||
DLL for the libjpeg API
|
|
||||||
sharedlib/jpeg.lib
|
|
||||||
Import library for the libjpeg API
|
|
||||||
turbojpeg-static.lib
|
|
||||||
Static link library for the TurboJPEG API
|
|
||||||
turbojpeg.dll
|
|
||||||
DLL for the TurboJPEG API
|
|
||||||
turbojpeg.lib
|
|
||||||
Import library for the TurboJPEG API
|
|
||||||
|
|
||||||
{version} is 62, 7, or 8, depending on whether libjpeg v6b (default), v7, or
|
|
||||||
v8 emulation is enabled.
|
|
||||||
|
|
||||||
|
|
||||||
Visual C++ (IDE)
|
|
||||||
----------------
|
|
||||||
|
|
||||||
Choose the appropriate CMake generator option for your version of Visual Studio
|
|
||||||
(run "cmake" with no arguments for a list of available generators.) For
|
|
||||||
instance:
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
cmake -G "Visual Studio 10" {source_directory}
|
|
||||||
|
|
||||||
NOTE: Add "Win64" to the generator name (for example, "Visual Studio 10
|
|
||||||
Win64") to build a 64-bit version of libjpeg-turbo. Recent versions of CMake
|
|
||||||
no longer document that. A separate build directory must be used for 32-bit
|
|
||||||
and 64-bit builds.
|
|
||||||
|
|
||||||
You can then open ALL_BUILD.vcproj in Visual Studio and build one of the
|
|
||||||
configurations in that project ("Debug", "Release", etc.) to generate a full
|
|
||||||
build of mozjpeg.
|
|
||||||
|
|
||||||
This will generate the following files under {build_directory}:
|
|
||||||
|
|
||||||
{configuration}/jpeg-static.lib
|
|
||||||
Static link library for the libjpeg API
|
|
||||||
sharedlib/{configuration}/jpeg{version}.dll
|
|
||||||
DLL for the libjpeg API
|
|
||||||
sharedlib/{configuration}/jpeg.lib
|
|
||||||
Import library for the libjpeg API
|
|
||||||
{configuration}/turbojpeg-static.lib
|
|
||||||
Static link library for the TurboJPEG API
|
|
||||||
{configuration}/turbojpeg.dll
|
|
||||||
DLL for the TurboJPEG API
|
|
||||||
{configuration}/turbojpeg.lib
|
|
||||||
Import library for the TurboJPEG API
|
|
||||||
|
|
||||||
{configuration} is Debug, Release, RelWithDebInfo, or MinSizeRel, depending on
|
|
||||||
the configuration you built in the IDE, and {version} is 62, 7, or 8,
|
|
||||||
depending on whether libjpeg v6b (default), v7, or v8 emulation is enabled.
|
|
||||||
|
|
||||||
|
|
||||||
MinGW
|
|
||||||
-----
|
|
||||||
|
|
||||||
NOTE: This assumes that you are building on a Windows machine. If you are
|
|
||||||
cross-compiling on a Linux/Unix machine, then see "Build Recipes" below.
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
cmake -G "MinGW Makefiles" {source_directory}
|
|
||||||
mingw32-make
|
|
||||||
|
|
||||||
This will generate the following files under {build_directory}
|
|
||||||
|
|
||||||
libjpeg.a
|
|
||||||
Static link library for the libjpeg API
|
|
||||||
sharedlib/libjpeg-{version}.dll
|
|
||||||
DLL for the libjpeg API
|
|
||||||
sharedlib/libjpeg.dll.a
|
|
||||||
Import library for the libjpeg API
|
|
||||||
libturbojpeg.a
|
|
||||||
Static link library for the TurboJPEG API
|
|
||||||
libturbojpeg.dll
|
|
||||||
DLL for the TurboJPEG API
|
|
||||||
libturbojpeg.dll.a
|
|
||||||
Import library for the TurboJPEG API
|
|
||||||
|
|
||||||
{version} is 62, 7, or 8, depending on whether libjpeg v6b (default), v7, or
|
|
||||||
v8 emulation is enabled.
|
|
||||||
|
|
||||||
|
|
||||||
Debug Build
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Add "-DCMAKE_BUILD_TYPE=Debug" to the cmake command line. Or, if building with
|
|
||||||
NMake, remove "-DCMAKE_BUILD_TYPE=Release" (Debug builds are the default with
|
|
||||||
NMake.)
|
|
||||||
|
|
||||||
|
|
||||||
libjpeg v7 or v8 API/ABI Emulation
|
|
||||||
-----------------------------------
|
|
||||||
|
|
||||||
Add "-DWITH_JPEG7=1" to the cmake command line to build a version of
|
|
||||||
mozjpeg that is API/ABI-compatible with libjpeg v7. Add "-DWITH_JPEG8=1"
|
|
||||||
to the cmake command to build a version of mozjpeg that is
|
|
||||||
API/ABI-compatible with libjpeg v8. See README-turbo.txt for more information
|
|
||||||
on libjpeg v7 and v8 emulation.
|
|
||||||
|
|
||||||
|
|
||||||
In-Memory Source/Destination Managers
|
|
||||||
-------------------------------------
|
|
||||||
|
|
||||||
When using libjpeg v6b or v7 API/ABI emulation, add -DWITH_MEM_SRCDST=0 to the
|
|
||||||
CMake command line to build a version of mozjpeg that lacks the
|
|
||||||
jpeg_mem_src() and jpeg_mem_dest() functions. These functions were not part of
|
|
||||||
the original libjpeg v6b and v7 APIs, so removing them ensures strict
|
|
||||||
conformance with those APIs. See README-turbo.txt for more information.
|
|
||||||
|
|
||||||
|
|
||||||
Arithmetic Coding Support
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
Since the patent on arithmetic coding has expired, this functionality has been
|
|
||||||
included in this release of mozjpeg. mozjpeg's implementation is
|
|
||||||
based on the implementation in libjpeg v8, but it works when emulating libjpeg
|
|
||||||
v7 or v6b as well. The default is to enable both arithmetic encoding and
|
|
||||||
decoding, but those who have philosophical objections to arithmetic coding can
|
|
||||||
add "-DWITH_ARITH_ENC=0" or "-DWITH_ARITH_DEC=0" to the cmake command line to
|
|
||||||
disable encoding or decoding (respectively.)
|
|
||||||
|
|
||||||
|
|
||||||
TurboJPEG Java Wrapper
|
|
||||||
----------------------
|
|
||||||
Add "-DWITH_JAVA=1" to the cmake command line to incorporate an optional Java
|
|
||||||
Native Interface wrapper into the TurboJPEG shared library and build the Java
|
|
||||||
front-end classes to support it. This allows the TurboJPEG shared library to
|
|
||||||
be used directly from Java applications. See java/README for more details.
|
|
||||||
|
|
||||||
If you are using CMake 2.8, you can set the Java_JAVAC_EXECUTABLE,
|
|
||||||
Java_JAVA_EXECUTABLE, and Java_JAR_EXECUTABLE CMake variables to specify
|
|
||||||
alternate commands or locations for javac, jar, and java (respectively.) If
|
|
||||||
you are using CMake 2.6, set JAVA_COMPILE, JAVA_RUNTIME, and JAVA_ARCHIVE
|
|
||||||
instead. You can also set the JAVACFLAGS CMake variable to specify arguments
|
|
||||||
that should be passed to the Java compiler when building the front-end classes.
|
|
||||||
|
|
||||||
|
|
||||||
==================
|
|
||||||
Installing mozjpeg
|
|
||||||
==================
|
|
||||||
|
|
||||||
You can use the build system to install mozjpeg into a directory of your
|
|
||||||
choosing (as opposed to creating an installer.) To do this, add:
|
|
||||||
|
|
||||||
-DCMAKE_INSTALL_PREFIX={install_directory}
|
|
||||||
|
|
||||||
to the cmake command line.
|
|
||||||
|
|
||||||
For example,
|
|
||||||
|
|
||||||
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=c:\mozjpeg {source_directory}
|
|
||||||
nmake install
|
|
||||||
|
|
||||||
will install the header files in c:\mozjpeg\include, the library files
|
|
||||||
in c:\mozjpeg\lib, the DLL's in c:\mozjpeg\bin, and the
|
|
||||||
documentation in c:\mozjpeg\doc.
|
|
||||||
|
|
||||||
|
|
||||||
=============
|
|
||||||
Build Recipes
|
|
||||||
=============
|
|
||||||
|
|
||||||
|
|
||||||
64-bit MinGW Build on Cygwin
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
CC=/usr/bin/x86_64-w64-mingw32-gcc \
|
|
||||||
cmake -G "Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows \
|
|
||||||
-DCMAKE_RC_COMPILER=/usr/bin/x86_64-w64-mingw32-windres.exe \
|
|
||||||
{source_directory}
|
|
||||||
make
|
|
||||||
|
|
||||||
This produces a 64-bit build of mozjpeg that does not depend on
|
|
||||||
cygwin1.dll or other Cygwin DLL's. The mingw64-x86_64-gcc-core and
|
|
||||||
mingw64-x86_64-gcc-g++ packages (and their dependencies) must be installed.
|
|
||||||
|
|
||||||
|
|
||||||
32-bit MinGW Build on Cygwin
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
CC=/usr/bin/i686-w64-mingw32-gcc \
|
|
||||||
cmake -G "Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows \
|
|
||||||
-DCMAKE_RC_COMPILER=/usr/bin/i686-w64-mingw32-windres.exe \
|
|
||||||
{source_directory}
|
|
||||||
make
|
|
||||||
|
|
||||||
This produces a 32-bit build of mozjpeg that does not depend on
|
|
||||||
cygwin1.dll or other Cygwin DLL's. The mingw64-i686-gcc-core and
|
|
||||||
mingw64-i686-gcc-g++ packages (and their dependencies) must be installed.
|
|
||||||
|
|
||||||
|
|
||||||
MinGW Build on Linux
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
CC={mingw_binary_path}/i386-mingw32-gcc \
|
|
||||||
cmake -G "Unix Makefiles" -DCMAKE_SYSTEM_NAME=Windows \
|
|
||||||
-DCMAKE_AR={mingw_binary_path}/i386-mingw32-ar \
|
|
||||||
-DCMAKE_RANLIB={mingw_binary_path}/i386-mingw32-ranlib \
|
|
||||||
{source_directory}
|
|
||||||
make
|
|
||||||
|
|
||||||
|
|
||||||
*******************************************************************************
|
|
||||||
** Creating Release Packages
|
|
||||||
*******************************************************************************
|
|
||||||
|
|
||||||
The following commands can be used to create various types of release packages:
|
|
||||||
|
|
||||||
|
|
||||||
Unix/Linux
|
|
||||||
----------
|
|
||||||
|
|
||||||
make rpm
|
|
||||||
|
|
||||||
Create Red Hat-style binary RPM package. Requires RPM v4 or later.
|
|
||||||
|
|
||||||
make srpm
|
|
||||||
|
|
||||||
This runs 'make dist' to create a pristine source tarball, then creates a
|
|
||||||
Red Hat-style source RPM package from the tarball. Requires RPM v4 or later.
|
|
||||||
|
|
||||||
make deb
|
|
||||||
|
|
||||||
Create Debian-style binary package. Requires dpkg.
|
|
||||||
|
|
||||||
make dmg
|
|
||||||
|
|
||||||
Create Macintosh package/disk image. This requires pkgbuild and
|
|
||||||
productbuild, which are installed by default on OS X 10.7 and later and which
|
|
||||||
can be obtained by installing Xcode 3.2.6 (with the "Unix Development"
|
|
||||||
option) on OS X 10.6. Packages built in this manner can be installed on OS X
|
|
||||||
10.5 and later, but they must be built on OS X 10.6 or later.
|
|
||||||
|
|
||||||
make udmg [BUILDDIR32={32-bit build directory}]
|
|
||||||
|
|
||||||
On 64-bit OS X systems, this creates a Macintosh package and disk image that
|
|
||||||
contains universal i386/x86-64 binaries. You should first configure a 32-bit
|
|
||||||
out-of-tree build of mozjpeg, then configure a 64-bit out-of-tree
|
|
||||||
build, then run 'make udmg' from the 64-bit build directory. The build
|
|
||||||
system will look for the 32-bit build under {source_directory}/osxx86 by
|
|
||||||
default, but you can override this by setting the BUILDDIR32 variable on the
|
|
||||||
make command line as shown above.
|
|
||||||
|
|
||||||
make iosdmg [BUILDDIR32={32-bit build directory}] \
|
|
||||||
[BUILDDIRARMV6={ARMv6 build directory}] \
|
|
||||||
[BUILDDIRARMV7={ARMv7 build directory}] \
|
|
||||||
[BUILDDIRARMV7S={ARMv7s build directory}] \
|
|
||||||
[BUILDDIRARMV8={ARMv8 build directory}]
|
|
||||||
|
|
||||||
On OS X systems, this creates a Macintosh package and disk image in which the
|
|
||||||
mozjpeg static libraries contain ARM architectures necessary to build
|
|
||||||
iOS applications. If building on an x86-64 system, the binaries will also
|
|
||||||
contain the i386 architecture, as with 'make udmg' above. You should first
|
|
||||||
configure ARMv6, ARMv7, ARMv7s, and/or ARMv8 out-of-tree builds of
|
|
||||||
mozjpeg (see "Building mozjpeg for iOS" above.) If you are
|
|
||||||
building an x86-64 version of mozjpeg, you should configure a 32-bit
|
|
||||||
out-of-tree build as well. Next, build mozjpeg as you would normally,
|
|
||||||
using an out-of-tree build. When it is built, run 'make iosdmg' from the
|
|
||||||
build directory. The build system will look for the ARMv6 build under
|
|
||||||
{source_directory}/iosarmv6 by default, the ARMv7 build under
|
|
||||||
{source_directory}/iosarmv7 by default, the ARMv7s build under
|
|
||||||
{source_directory}/iosarmv7s by default, the ARMv8 build under
|
|
||||||
{source_directory}/iosarmv8 by default, and (if applicable) the 32-bit build
|
|
||||||
under {source_directory}/osxx86 by default, but you can override this by
|
|
||||||
setting the BUILDDIR32, BUILDDIRARMV6, BUILDDIRARMV7, BUILDDIRARMV7S, and/or
|
|
||||||
BUILDDIRARMV8 variables on the make command line as shown above.
|
|
||||||
|
|
||||||
NOTE: If including an ARMv8 build in the package, then you may need to use
|
|
||||||
Xcode's version of lipo instead of the operating system's. To do this, pass
|
|
||||||
an argument of LIPO="xcrun lipo" on the make command line.
|
|
||||||
|
|
||||||
make cygwinpkg
|
|
||||||
|
|
||||||
Build a Cygwin binary package.
|
|
||||||
|
|
||||||
|
|
||||||
Windows
|
|
||||||
-------
|
|
||||||
|
|
||||||
If using NMake:
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
nmake installer
|
|
||||||
|
|
||||||
If using MinGW:
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
make installer
|
|
||||||
|
|
||||||
If using the Visual Studio IDE, build the "installer" project.
|
|
||||||
|
|
||||||
The installer package (mozjpeg[-gcc][64].exe) will be located under
|
|
||||||
{build_directory}. If building using the Visual Studio IDE, then the installer
|
|
||||||
package will be located in a subdirectory with the same name as the
|
|
||||||
configuration you built (such as {build_directory}\Debug\ or
|
|
||||||
{build_directory}\Release\).
|
|
||||||
|
|
||||||
Building a Windows installer requires the Nullsoft Install System
|
|
||||||
(http://nsis.sourceforge.net/.) makensis.exe should be in your PATH.
|
|
||||||
|
|
||||||
|
|
||||||
*******************************************************************************
|
|
||||||
** Regression testing
|
|
||||||
*******************************************************************************
|
|
||||||
|
|
||||||
The most common way to test mozjpeg is by invoking 'make test' on
|
|
||||||
Unix/Linux platforms or 'ctest' on Windows platforms, once the build has
|
|
||||||
completed. This runs a series of tests to ensure that mathematical
|
|
||||||
compatibility has been maintained. This also invokes the TurboJPEG unit tests,
|
|
||||||
which ensure that the colorspace extensions, YUV encoding, decompression
|
|
||||||
scaling, and other features of the TurboJPEG C and Java APIs are working
|
|
||||||
properly (and, by extension, that the equivalent features of the underlying
|
|
||||||
libjpeg API are also working.)
|
|
||||||
|
|
||||||
Invoking 'make testclean' or 'nmake testclean' (if using NMake) or building
|
|
||||||
the 'testclean' target (if using the Visual Studio IDE) will clean up the
|
|
||||||
output images generated by 'make test'.
|
|
||||||
|
|
||||||
On Unix/Linux platforms, more extensive tests of the TurboJPEG C and Java
|
|
||||||
wrappers can be run by invoking 'make tjtest'. These extended TurboJPEG tests
|
|
||||||
essentially iterate through all of the available features of the TurboJPEG APIs
|
|
||||||
that are not covered by the TurboJPEG unit tests (this includes the lossless
|
|
||||||
transform options) and compare the images generated by each feature to images
|
|
||||||
generated using the equivalent feature in the libjpeg API. The extended
|
|
||||||
TurboJPEG tests are meant to test for regressions in the TurboJPEG wrappers,
|
|
||||||
not in the underlying libjpeg API library.
|
|
||||||
917
CMakeLists.txt
@@ -1,917 +0,0 @@
|
|||||||
#
|
|
||||||
# Setup
|
|
||||||
#
|
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 2.8.11)
|
|
||||||
# Use LINK_INTERFACE_LIBRARIES instead of INTERFACE_LINK_LIBRARIES
|
|
||||||
if(POLICY CMP0022)
|
|
||||||
cmake_policy(SET CMP0022 OLD)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
project(mozjpeg C)
|
|
||||||
set(VERSION 3.2)
|
|
||||||
|
|
||||||
if(NOT WIN32)
|
|
||||||
message(FATAL_ERROR "Platform not supported by this build system. Use autotools instead.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
string(TIMESTAMP BUILD "%Y%m%d")
|
|
||||||
|
|
||||||
# This does nothing except when using MinGW. CMAKE_BUILD_TYPE has no meaning
|
|
||||||
# in Visual Studio, and it always defaults to Debug when using NMake.
|
|
||||||
if(NOT CMAKE_BUILD_TYPE)
|
|
||||||
set(CMAKE_BUILD_TYPE Release)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
message(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
|
|
||||||
|
|
||||||
# This only works if building from the command line. There is currently no way
|
|
||||||
# to set a variable's value based on the build type when using Visual Studio.
|
|
||||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
||||||
set(BUILD "${BUILD}d")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
message(STATUS "VERSION = ${VERSION}, BUILD = ${BUILD}")
|
|
||||||
|
|
||||||
option(WITH_SIMD "Include SIMD extensions" TRUE)
|
|
||||||
option(WITH_ARITH_ENC "Include arithmetic encoding support" TRUE)
|
|
||||||
option(WITH_ARITH_DEC "Include arithmetic decoding support" TRUE)
|
|
||||||
option(WITH_JPEG7 "Emulate libjpeg v7 API/ABI (this makes mozjpeg backward incompatible with libjpeg v6b)" FALSE)
|
|
||||||
option(WITH_JPEG8 "Emulate libjpeg v8 API/ABI (this makes mozjpeg backward incompatible with libjpeg v6b)" FALSE)
|
|
||||||
option(WITH_MEM_SRCDST "Include in-memory source/destination manager functions when emulating the libjpeg v6b or v7 API/ABI" TRUE)
|
|
||||||
option(WITH_TURBOJPEG "Include the TurboJPEG wrapper library and associated test programs" TRUE)
|
|
||||||
option(WITH_JAVA "Build Java wrapper for the TurboJPEG library" FALSE)
|
|
||||||
option(WITH_12BIT "Encode/decode JPEG images with 12-bit samples (implies WITH_SIMD=0 WITH_TURBOJPEG=0 WITH_ARITH_ENC=0 WITH_ARITH_DEC=0)" FALSE)
|
|
||||||
option(ENABLE_STATIC "Build static libraries" TRUE)
|
|
||||||
option(ENABLE_SHARED "Build shared libraries" TRUE)
|
|
||||||
|
|
||||||
if(WITH_12BIT)
|
|
||||||
set(WITH_SIMD FALSE)
|
|
||||||
set(WITH_TURBOJPEG FALSE)
|
|
||||||
set(WITH_JAVA FALSE)
|
|
||||||
set(WITH_ARITH_ENC FALSE)
|
|
||||||
set(WITH_ARITH_DEC FALSE)
|
|
||||||
set(BITS_IN_JSAMPLE 12)
|
|
||||||
message(STATUS "12-bit JPEG support enabled")
|
|
||||||
else()
|
|
||||||
set(BITS_IN_JSAMPLE 8)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_JPEG8 OR WITH_JPEG7)
|
|
||||||
set(WITH_ARITH_ENC 1)
|
|
||||||
set(WITH_ARITH_DEC 1)
|
|
||||||
endif()
|
|
||||||
if(WITH_JPEG8)
|
|
||||||
set(WITH_MEM_SRCDST 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_ARITH_ENC)
|
|
||||||
set(C_ARITH_CODING_SUPPORTED 1)
|
|
||||||
message(STATUS "Arithmetic encoding support enabled")
|
|
||||||
else()
|
|
||||||
message(STATUS "Arithmetic encoding support disabled")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_ARITH_DEC)
|
|
||||||
set(D_ARITH_CODING_SUPPORTED 1)
|
|
||||||
message(STATUS "Arithmetic decoding support enabled")
|
|
||||||
else()
|
|
||||||
message(STATUS "Arithmetic decoding support disabled")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_TURBOJPEG)
|
|
||||||
message(STATUS "TurboJPEG C wrapper enabled")
|
|
||||||
else()
|
|
||||||
message(STATUS "TurboJPEG C wrapper disabled")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_JAVA)
|
|
||||||
message(STATUS "TurboJPEG Java wrapper enabled")
|
|
||||||
else()
|
|
||||||
message(STATUS "TurboJPEG Java wrapper disabled")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(SO_AGE 0)
|
|
||||||
if(WITH_MEM_SRCDST)
|
|
||||||
set(SO_AGE 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(JPEG_LIB_VERSION 62)
|
|
||||||
set(DLL_VERSION ${JPEG_LIB_VERSION})
|
|
||||||
set(FULLVERSION ${DLL_VERSION}.${SO_AGE}.0)
|
|
||||||
if(WITH_JPEG8)
|
|
||||||
set(JPEG_LIB_VERSION 80)
|
|
||||||
set(DLL_VERSION 8)
|
|
||||||
set(FULLVERSION ${DLL_VERSION}.0.2)
|
|
||||||
message(STATUS "Emulating libjpeg v8 API/ABI")
|
|
||||||
elseif(WITH_JPEG7)
|
|
||||||
set(JPEG_LIB_VERSION 70)
|
|
||||||
set(DLL_VERSION 7)
|
|
||||||
set(FULLVERSION ${DLL_VERSION}.${SO_AGE}.0)
|
|
||||||
message(STATUS "Emulating libjpeg v7 API/ABI")
|
|
||||||
endif(WITH_JPEG8)
|
|
||||||
|
|
||||||
if(WITH_MEM_SRCDST)
|
|
||||||
set(MEM_SRCDST_SUPPORTED 1)
|
|
||||||
message(STATUS "In-memory source/destination managers enabled")
|
|
||||||
else()
|
|
||||||
message(STATUS "In-memory source/destination managers disabled")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(MSVC)
|
|
||||||
option(WITH_CRT_DLL
|
|
||||||
"Link all libjpeg-turbo libraries and executables with the C run-time DLL (msvcr*.dll) instead of the static C run-time library (libcmt*.lib.) The default is to use the C run-time DLL only with the libraries and executables that need it."
|
|
||||||
FALSE)
|
|
||||||
if(NOT WITH_CRT_DLL)
|
|
||||||
# Use the static C library for all build types
|
|
||||||
foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
|
|
||||||
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
|
|
||||||
if(${var} MATCHES "/MD")
|
|
||||||
string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
endif()
|
|
||||||
add_definitions(-W3 -wd4996)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Detect whether compiler is 64-bit
|
|
||||||
if(MSVC AND CMAKE_CL_64)
|
|
||||||
set(SIMD_X86_64 1)
|
|
||||||
set(64BIT 1)
|
|
||||||
elseif(CMAKE_SIZEOF_VOID_P MATCHES 8)
|
|
||||||
set(SIMD_X86_64 1)
|
|
||||||
set(64BIT 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(64BIT)
|
|
||||||
message(STATUS "64-bit build")
|
|
||||||
else()
|
|
||||||
message(STATUS "32-bit build")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
|
||||||
if(MSVC)
|
|
||||||
set(CMAKE_INSTALL_PREFIX_DEFAULT ${CMAKE_PROJECT_NAME})
|
|
||||||
else()
|
|
||||||
set(CMAKE_INSTALL_PREFIX_DEFAULT ${CMAKE_PROJECT_NAME}-gcc)
|
|
||||||
endif()
|
|
||||||
if(64BIT)
|
|
||||||
set(CMAKE_INSTALL_PREFIX_DEFAULT ${CMAKE_INSTALL_PREFIX_DEFAULT}64)
|
|
||||||
endif()
|
|
||||||
set(CMAKE_INSTALL_PREFIX "c:/${CMAKE_INSTALL_PREFIX_DEFAULT}" CACHE PATH
|
|
||||||
"Directory into which to install mozjpeg (default: c:/${CMAKE_INSTALL_PREFIX_DEFAULT})"
|
|
||||||
FORCE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
message(STATUS "Install directory = ${CMAKE_INSTALL_PREFIX}")
|
|
||||||
|
|
||||||
configure_file(win/jconfig.h.in jconfig.h)
|
|
||||||
configure_file(win/jconfigint.h.in jconfigint.h)
|
|
||||||
|
|
||||||
include_directories("${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_SOURCE_DIR}")
|
|
||||||
|
|
||||||
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
|
|
||||||
|
|
||||||
set(EFFECTIVE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
|
|
||||||
message(STATUS "Compiler flags = ${EFFECTIVE_C_FLAGS}")
|
|
||||||
|
|
||||||
set(EFFECTIVE_LD_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
|
|
||||||
message(STATUS "Linker flags = ${EFFECTIVE_LD_FLAGS}")
|
|
||||||
|
|
||||||
if(WITH_JAVA)
|
|
||||||
find_package(Java)
|
|
||||||
find_package(JNI)
|
|
||||||
if(DEFINED JAVACFLAGS)
|
|
||||||
message(STATUS "Java compiler flags = ${JAVACFLAGS}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Targets
|
|
||||||
#
|
|
||||||
|
|
||||||
set(JPEG_SOURCES jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jcext.c
|
|
||||||
jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c jcomapi.c jcparam.c
|
|
||||||
jcphuff.c jcprepct.c jcsample.c jctrans.c jdapimin.c jdapistd.c jdatadst.c
|
|
||||||
jdatasrc.c jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c jdinput.c jdmainct.c
|
|
||||||
jdmarker.c jdmaster.c jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c
|
|
||||||
jerror.c jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c
|
|
||||||
jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c)
|
|
||||||
|
|
||||||
if(WITH_ARITH_ENC OR WITH_ARITH_DEC)
|
|
||||||
set(JPEG_SOURCES ${JPEG_SOURCES} jaricom.c)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_ARITH_ENC)
|
|
||||||
set(JPEG_SOURCES ${JPEG_SOURCES} jcarith.c)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_ARITH_DEC)
|
|
||||||
set(JPEG_SOURCES ${JPEG_SOURCES} jdarith.c)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_SIMD)
|
|
||||||
add_definitions(-DWITH_SIMD)
|
|
||||||
add_subdirectory(simd)
|
|
||||||
if(SIMD_X86_64)
|
|
||||||
set(JPEG_SOURCES ${JPEG_SOURCES} simd/jsimd_x86_64.c)
|
|
||||||
else()
|
|
||||||
set(JPEG_SOURCES ${JPEG_SOURCES} simd/jsimd_i386.c)
|
|
||||||
endif()
|
|
||||||
# This tells CMake that the "source" files haven't been generated yet
|
|
||||||
set_source_files_properties(${SIMD_OBJS} PROPERTIES GENERATED 1)
|
|
||||||
else()
|
|
||||||
set(JPEG_SOURCES ${JPEG_SOURCES} jsimd_none.c)
|
|
||||||
message(STATUS "Not using SIMD acceleration")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_JAVA)
|
|
||||||
add_subdirectory(java)
|
|
||||||
set(ENABLE_SHARED TRUE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(ENABLE_SHARED)
|
|
||||||
add_subdirectory(sharedlib)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(ENABLE_STATIC OR WITH_TURBOJPEG)
|
|
||||||
add_library(jpeg-static STATIC ${JPEG_SOURCES} ${SIMD_OBJS})
|
|
||||||
if(NOT MSVC)
|
|
||||||
set_target_properties(jpeg-static PROPERTIES OUTPUT_NAME jpeg)
|
|
||||||
endif()
|
|
||||||
if(WITH_SIMD)
|
|
||||||
add_dependencies(jpeg-static simd)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_TURBOJPEG)
|
|
||||||
set(TURBOJPEG_SOURCES turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c)
|
|
||||||
if(WITH_JAVA)
|
|
||||||
set(TURBOJPEG_SOURCES ${TURBOJPEG_SOURCES} turbojpeg-jni.c)
|
|
||||||
include_directories(${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(ENABLE_SHARED)
|
|
||||||
add_library(turbojpeg SHARED ${TURBOJPEG_SOURCES})
|
|
||||||
set_target_properties(turbojpeg PROPERTIES DEFINE_SYMBOL DLLDEFINE)
|
|
||||||
if(MINGW)
|
|
||||||
set_target_properties(turbojpeg PROPERTIES LINK_FLAGS -Wl,--kill-at)
|
|
||||||
endif()
|
|
||||||
target_link_libraries(turbojpeg jpeg-static)
|
|
||||||
set_target_properties(turbojpeg PROPERTIES LINK_INTERFACE_LIBRARIES "")
|
|
||||||
|
|
||||||
add_executable(tjunittest tjunittest.c tjutil.c)
|
|
||||||
target_link_libraries(tjunittest turbojpeg)
|
|
||||||
|
|
||||||
add_executable(tjbench tjbench.c bmp.c tjutil.c rdbmp.c rdppm.c wrbmp.c
|
|
||||||
wrppm.c)
|
|
||||||
target_link_libraries(tjbench turbojpeg jpeg-static)
|
|
||||||
set_property(TARGET tjbench PROPERTY COMPILE_FLAGS
|
|
||||||
"-DBMP_SUPPORTED -DPPM_SUPPORTED")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(ENABLE_STATIC)
|
|
||||||
add_library(turbojpeg-static STATIC ${JPEG_SOURCES} ${SIMD_OBJS}
|
|
||||||
turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c)
|
|
||||||
if(NOT MSVC)
|
|
||||||
set_target_properties(turbojpeg-static PROPERTIES OUTPUT_NAME turbojpeg)
|
|
||||||
endif()
|
|
||||||
if(WITH_SIMD)
|
|
||||||
add_dependencies(turbojpeg-static simd)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_executable(tjunittest-static tjunittest.c tjutil.c)
|
|
||||||
target_link_libraries(tjunittest-static turbojpeg-static)
|
|
||||||
|
|
||||||
add_executable(tjbench-static tjbench.c bmp.c tjutil.c rdbmp.c rdppm.c
|
|
||||||
wrbmp.c wrppm.c)
|
|
||||||
target_link_libraries(tjbench-static turbojpeg-static jpeg-static)
|
|
||||||
set_property(TARGET tjbench-static PROPERTY COMPILE_FLAGS
|
|
||||||
"-DBMP_SUPPORTED -DPPM_SUPPORTED")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_12BIT)
|
|
||||||
set(COMPILE_FLAGS "-DGIF_SUPPORTED -DPPM_SUPPORTED -DUSE_SETMODE")
|
|
||||||
else()
|
|
||||||
set(COMPILE_FLAGS "-DBMP_SUPPORTED -DGIF_SUPPORTED -DPPM_SUPPORTED -DTARGA_SUPPORTED -DUSE_SETMODE")
|
|
||||||
set(CJPEG_BMP_SOURCES rdbmp.c rdtarga.c)
|
|
||||||
set(DJPEG_BMP_SOURCES wrbmp.c wrtarga.c)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(ENABLE_STATIC)
|
|
||||||
add_executable(cjpeg-static cjpeg.c cdjpeg.c rdgif.c rdppm.c rdjpeg.c rdswitch.c
|
|
||||||
${CJPEG_BMP_SOURCES})
|
|
||||||
set_property(TARGET cjpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
|
|
||||||
target_link_libraries(cjpeg-static jpeg-static)
|
|
||||||
|
|
||||||
add_executable(djpeg-static djpeg.c cdjpeg.c rdcolmap.c rdswitch.c wrgif.c
|
|
||||||
wrppm.c ${DJPEG_BMP_SOURCES})
|
|
||||||
set_property(TARGET djpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
|
|
||||||
target_link_libraries(djpeg-static jpeg-static)
|
|
||||||
|
|
||||||
add_executable(jpegtran-static jpegtran.c cdjpeg.c rdswitch.c transupp.c)
|
|
||||||
target_link_libraries(jpegtran-static jpeg-static)
|
|
||||||
set_property(TARGET jpegtran-static PROPERTY COMPILE_FLAGS "-DUSE_SETMODE")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_executable(rdjpgcom rdjpgcom.c)
|
|
||||||
|
|
||||||
add_executable(wrjpgcom wrjpgcom.c)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Tests
|
|
||||||
#
|
|
||||||
|
|
||||||
add_subdirectory(md5)
|
|
||||||
|
|
||||||
if(MSVC_IDE)
|
|
||||||
set(OBJDIR "\${CTEST_CONFIGURATION_TYPE}/")
|
|
||||||
else()
|
|
||||||
set(OBJDIR "")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
enable_testing()
|
|
||||||
|
|
||||||
if(WITH_12BIT)
|
|
||||||
set(TESTORIG testorig12.jpg)
|
|
||||||
set(MD5_JPEG_RGB_ISLOW 9620f424569594bb9242b48498ad801f)
|
|
||||||
set(MD5_PPM_RGB_ISLOW f3301d2219783b8b3d942b7239fa50c0)
|
|
||||||
set(MD5_JPEG_422_IFAST_OPT 7322e3bd2f127f7de4b40d4480ce60e4)
|
|
||||||
set(MD5_PPM_422_IFAST 79807fa552899e66a04708f533e16950)
|
|
||||||
set(MD5_PPM_422M_IFAST 07737bfe8a7c1c87aaa393a0098d16b0)
|
|
||||||
set(MD5_JPEG_420_IFAST_Q100_PROG a1da220b5604081863a504297ed59e55)
|
|
||||||
set(MD5_PPM_420_Q100_IFAST 1b3730122709f53d007255e8dfd3305e)
|
|
||||||
set(MD5_PPM_420M_Q100_IFAST 980a1a3c5bf9510022869d30b7d26566)
|
|
||||||
set(MD5_JPEG_GRAY_ISLOW 235c90707b16e2e069f37c888b2636d9)
|
|
||||||
set(MD5_PPM_GRAY_ISLOW 7213c10af507ad467da5578ca5ee1fca)
|
|
||||||
set(MD5_PPM_GRAY_ISLOW_RGB e96ee81c30a6ed422d466338bd3de65d)
|
|
||||||
set(MD5_JPEG_420S_IFAST_OPT 7af8e60be4d9c227ec63ac9b6630855e)
|
|
||||||
set(MD5_JPEG_3x2_FLOAT_PROG a8c17daf77b457725ec929e215b603f8)
|
|
||||||
set(MD5_PPM_3x2_FLOAT 42876ab9e5c2f76a87d08db5fbd57956)
|
|
||||||
set(MD5_PPM_420M_ISLOW_2_1 4ca6be2a6f326ff9eaab63e70a8259c0)
|
|
||||||
set(MD5_PPM_420M_ISLOW_15_8 12aa9f9534c1b3d7ba047322226365eb)
|
|
||||||
set(MD5_PPM_420M_ISLOW_13_8 f7e22817c7b25e1393e4ec101e9d4e96)
|
|
||||||
set(MD5_PPM_420M_ISLOW_11_8 800a16f9f4dc9b293197bfe11be10a82)
|
|
||||||
set(MD5_PPM_420M_ISLOW_9_8 06b7a92a9bc69f4dc36ec40f1937d55c)
|
|
||||||
set(MD5_PPM_420M_ISLOW_7_8 3ec444a14a4ab4eab88ffc49c48eca43)
|
|
||||||
set(MD5_PPM_420M_ISLOW_3_4 3e726b7ea872445b19437d1c1d4f0d93)
|
|
||||||
set(MD5_PPM_420M_ISLOW_5_8 a8a771abdc94301d20ffac119b2caccd)
|
|
||||||
set(MD5_PPM_420M_ISLOW_1_2 b419124dd5568b085787234866102866)
|
|
||||||
set(MD5_PPM_420M_ISLOW_3_8 343d19015531b7bbe746124127244fa8)
|
|
||||||
set(MD5_PPM_420M_ISLOW_1_4 35fd59d866e44659edfa3c18db2a3edb)
|
|
||||||
set(MD5_PPM_420M_ISLOW_1_8 ccaed48ac0aedefda5d4abe4013f4ad7)
|
|
||||||
set(MD5_PPM_420_ISLOW_SKIP15_31 86664cd9dc956536409e44e244d20a97)
|
|
||||||
set(MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 452a21656115a163029cfba5c04fa76a)
|
|
||||||
set(MD5_PPM_444_ISLOW_SKIP1_6 ef63901f71ef7a75cd78253fc0914f84)
|
|
||||||
set(MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 15b173fb5872d9575572fbcc1b05956f)
|
|
||||||
set(MD5_JPEG_CROP cdb35ff4b4519392690ea040c56ea99c)
|
|
||||||
else()
|
|
||||||
set(TESTORIG testorig.jpg)
|
|
||||||
set(MD5_JPEG_RGB_ISLOW 768e970dd57b340ff1b83c9d3d47c77b)
|
|
||||||
set(MD5_PPM_RGB_ISLOW 00a257f5393fef8821f2b88ac7421291)
|
|
||||||
set(MD5_BMP_RGB_ISLOW_565 f07d2e75073e4bb10f6c6f4d36e2e3be)
|
|
||||||
set(MD5_BMP_RGB_ISLOW_565D 4cfa0928ef3e6bb626d7728c924cfda4)
|
|
||||||
set(MD5_JPEG_422_IFAST_OPT 2540287b79d913f91665e660303ab2c8)
|
|
||||||
set(MD5_PPM_422_IFAST 35bd6b3f833bad23de82acea847129fa)
|
|
||||||
set(MD5_PPM_422M_IFAST 8dbc65323d62cca7c91ba02dd1cfa81d)
|
|
||||||
set(MD5_BMP_422M_IFAST_565 3294bd4d9a1f2b3d08ea6020d0db7065)
|
|
||||||
set(MD5_BMP_422M_IFAST_565D da98c9c7b6039511be4a79a878a9abc1)
|
|
||||||
set(MD5_JPEG_420_IFAST_Q100_PROG 990cbe0329c882420a2094da7e5adade)
|
|
||||||
set(MD5_PPM_420_Q100_IFAST 5a732542015c278ff43635e473a8a294)
|
|
||||||
set(MD5_PPM_420M_Q100_IFAST ff692ee9323a3b424894862557c092f1)
|
|
||||||
set(MD5_JPEG_GRAY_ISLOW 72b51f894b8f4a10b3ee3066770aa38d)
|
|
||||||
set(MD5_PPM_GRAY_ISLOW 8d3596c56eace32f205deccc229aa5ed)
|
|
||||||
set(MD5_PPM_GRAY_ISLOW_RGB 116424ac07b79e5e801f00508eab48ec)
|
|
||||||
set(MD5_BMP_GRAY_ISLOW_565 12f78118e56a2f48b966f792fedf23cc)
|
|
||||||
set(MD5_BMP_GRAY_ISLOW_565D bdbbd616441a24354c98553df5dc82db)
|
|
||||||
set(MD5_JPEG_420S_IFAST_OPT 388708217ac46273ca33086b22827ed8)
|
|
||||||
if(WITH_SIMD)
|
|
||||||
set(MD5_JPEG_3x2_FLOAT_PROG 343e3f8caf8af5986ebaf0bdc13b5c71)
|
|
||||||
set(MD5_PPM_3x2_FLOAT 1a75f36e5904d6fc3a85a43da9ad89bb)
|
|
||||||
else()
|
|
||||||
set(MD5_JPEG_3x2_FLOAT_PROG 9bca803d2042bd1eb03819e2bf92b3e5)
|
|
||||||
set(MD5_PPM_3x2_FLOAT f6bfab038438ed8f5522fbd33595dcdc)
|
|
||||||
endif()
|
|
||||||
set(MD5_JPEG_420_ISLOW_ARI e986fb0a637a8d833d96e8a6d6d84ea1)
|
|
||||||
set(MD5_JPEG_444_ISLOW_PROGARI 0a8f1c8f66e113c3cf635df0a475a617)
|
|
||||||
set(MD5_PPM_420M_IFAST_ARI 72b59a99bcf1de24c5b27d151bde2437)
|
|
||||||
set(MD5_JPEG_420_ISLOW 9a68f56bc76e466aa7e52f415d0f4a5f)
|
|
||||||
set(MD5_PPM_420M_ISLOW_2_1 9f9de8c0612f8d06869b960b05abf9c9)
|
|
||||||
set(MD5_PPM_420M_ISLOW_15_8 b6875bc070720b899566cc06459b63b7)
|
|
||||||
set(MD5_PPM_420M_ISLOW_13_8 bc3452573c8152f6ae552939ee19f82f)
|
|
||||||
set(MD5_PPM_420M_ISLOW_11_8 d8cc73c0aaacd4556569b59437ba00a5)
|
|
||||||
set(MD5_PPM_420M_ISLOW_9_8 d25e61bc7eac0002f5b393aa223747b6)
|
|
||||||
set(MD5_PPM_420M_ISLOW_7_8 ddb564b7c74a09494016d6cd7502a946)
|
|
||||||
set(MD5_PPM_420M_ISLOW_3_4 8ed8e68808c3fbc4ea764fc9d2968646)
|
|
||||||
set(MD5_PPM_420M_ISLOW_5_8 a3363274999da2366a024efae6d16c9b)
|
|
||||||
set(MD5_PPM_420M_ISLOW_1_2 e692a315cea26b988c8e8b29a5dbcd81)
|
|
||||||
set(MD5_PPM_420M_ISLOW_3_8 79eca9175652ced755155c90e785a996)
|
|
||||||
set(MD5_PPM_420M_ISLOW_1_4 79cd778f8bf1a117690052cacdd54eca)
|
|
||||||
set(MD5_PPM_420M_ISLOW_1_8 391b3d4aca640c8567d6f8745eb2142f)
|
|
||||||
set(MD5_BMP_420_ISLOW_256 4980185e3776e89bd931736e1cddeee6)
|
|
||||||
set(MD5_BMP_420_ISLOW_565 bf9d13e16c4923b92e1faa604d7922cb)
|
|
||||||
set(MD5_BMP_420_ISLOW_565D 6bde71526acc44bcff76f696df8638d2)
|
|
||||||
set(MD5_BMP_420M_ISLOW_565 8dc0185245353cfa32ad97027342216f)
|
|
||||||
set(MD5_BMP_420M_ISLOW_565D d1be3a3339166255e76fa50a0d70d73e)
|
|
||||||
set(MD5_PPM_420_ISLOW_SKIP15_31 c4c65c1e43d7275cd50328a61e6534f0)
|
|
||||||
set(MD5_PPM_420_ISLOW_ARI_SKIP16_139 087c6b123db16ac00cb88c5b590bb74a)
|
|
||||||
set(MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 26eb36ccc7d1f0cb80cdabb0ac8b5d99)
|
|
||||||
set(MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4 886c6775af22370257122f8b16207e6d)
|
|
||||||
set(MD5_PPM_444_ISLOW_SKIP1_6 5606f86874cf26b8fcee1117a0a436a6)
|
|
||||||
set(MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 db87dc7ce26bcdc7a6b56239ce2b9d6c)
|
|
||||||
set(MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0 cb57b32bd6d03e35432362f7bf184b6d)
|
|
||||||
set(MD5_JPEG_CROP b4197f377e621c4e9b1d20471432610d)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_JAVA)
|
|
||||||
add_test(TJUnitTest
|
|
||||||
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
|
|
||||||
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
|
|
||||||
TJUnitTest)
|
|
||||||
add_test(TJUnitTest-yuv
|
|
||||||
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
|
|
||||||
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
|
|
||||||
TJUnitTest -yuv)
|
|
||||||
add_test(TJUnitTest-yuv-nopad
|
|
||||||
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
|
|
||||||
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
|
|
||||||
TJUnitTest -yuv -noyuvpad)
|
|
||||||
add_test(TJUnitTest-bi
|
|
||||||
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
|
|
||||||
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
|
|
||||||
TJUnitTest -bi)
|
|
||||||
add_test(TJUnitTest-bi-yuv
|
|
||||||
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
|
|
||||||
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
|
|
||||||
TJUnitTest -bi -yuv)
|
|
||||||
add_test(TJUnitTest-bi-yuv-nopad
|
|
||||||
${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
|
|
||||||
-Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
|
|
||||||
TJUnitTest -bi -yuv -noyuvpad)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(TEST_LIBTYPES "")
|
|
||||||
if(ENABLE_SHARED)
|
|
||||||
set(TEST_LIBTYPES ${TEST_LIBTYPES} shared)
|
|
||||||
endif()
|
|
||||||
if(ENABLE_STATIC)
|
|
||||||
set(TEST_LIBTYPES ${TEST_LIBTYPES} static)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(TESTIMAGES ${CMAKE_SOURCE_DIR}/testimages)
|
|
||||||
set(MD5CMP ${CMAKE_CURRENT_BINARY_DIR}/md5/md5cmp)
|
|
||||||
if(CMAKE_CROSSCOMPILING)
|
|
||||||
file(RELATIVE_PATH TESTIMAGES ${CMAKE_CURRENT_BINARY_DIR} ${TESTIMAGES})
|
|
||||||
file(RELATIVE_PATH MD5CMP ${CMAKE_CURRENT_BINARY_DIR} ${MD5CMP})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
foreach(libtype ${TEST_LIBTYPES})
|
|
||||||
if(libtype STREQUAL "shared")
|
|
||||||
set(dir sharedlib/)
|
|
||||||
else()
|
|
||||||
set(dir "")
|
|
||||||
set(suffix -static)
|
|
||||||
endif()
|
|
||||||
if(WITH_TURBOJPEG)
|
|
||||||
add_test(tjunittest${suffix} tjunittest${suffix})
|
|
||||||
add_test(tjunittest${suffix}-alloc tjunittest${suffix} -alloc)
|
|
||||||
add_test(tjunittest${suffix}-yuv tjunittest${suffix} -yuv)
|
|
||||||
add_test(tjunittest${suffix}-yuv-alloc tjunittest${suffix} -yuv -alloc)
|
|
||||||
add_test(tjunittest${suffix}-yuv-nopad tjunittest${suffix} -yuv -noyuvpad)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# These tests are carefully chosen to provide full coverage of as many of the
|
|
||||||
# underlying algorithms as possible (including all of the SIMD-accelerated
|
|
||||||
# ones.)
|
|
||||||
|
|
||||||
# CC: null SAMP: fullsize FDCT: islow ENT: huff
|
|
||||||
add_test(cjpeg${suffix}-rgb-islow
|
|
||||||
${dir}cjpeg${suffix} -revert -rgb -dct int
|
|
||||||
-outfile testout_rgb_islow.jpg ${TESTIMAGES}/testorig.ppm)
|
|
||||||
add_test(cjpeg${suffix}-rgb-islow-cmp
|
|
||||||
${MD5CMP} ${MD5_JPEG_RGB_ISLOW} testout_rgb_islow.jpg)
|
|
||||||
|
|
||||||
# CC: null SAMP: fullsize IDCT: islow ENT: huff
|
|
||||||
add_test(djpeg${suffix}-rgb-islow
|
|
||||||
${dir}djpeg${suffix} -dct int -ppm
|
|
||||||
-outfile testout_rgb_islow.ppm testout_rgb_islow.jpg)
|
|
||||||
add_test(djpeg${suffix}-rgb-islow-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_RGB_ISLOW} testout_rgb_islow.ppm)
|
|
||||||
|
|
||||||
if(NOT WITH_12BIT)
|
|
||||||
# CC: RGB->RGB565 SAMP: fullsize IDCT: islow ENT: huff
|
|
||||||
add_test(djpeg${suffix}-rgb-islow-565
|
|
||||||
${dir}djpeg${suffix} -dct int -rgb565 -dither none -bmp
|
|
||||||
-outfile testout_rgb_islow_565.bmp testout_rgb_islow.jpg)
|
|
||||||
add_test(djpeg${suffix}-rgb-islow-565-cmp
|
|
||||||
${MD5CMP} ${MD5_BMP_RGB_ISLOW_565} testout_rgb_islow_565.bmp)
|
|
||||||
|
|
||||||
# CC: RGB->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
|
|
||||||
add_test(djpeg${suffix}-rgb-islow-565D
|
|
||||||
${dir}djpeg${suffix} -dct int -rgb565 -bmp
|
|
||||||
-outfile testout_rgb_islow_565D.bmp testout_rgb_islow.jpg)
|
|
||||||
add_test(djpeg${suffix}-rgb-islow-565D-cmp
|
|
||||||
${MD5CMP} ${MD5_BMP_RGB_ISLOW_565D} testout_rgb_islow_565D.bmp)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# CC: RGB->YCC SAMP: fullsize/h2v1 FDCT: ifast ENT: 2-pass huff
|
|
||||||
add_test(cjpeg${suffix}-422-ifast-opt
|
|
||||||
${dir}cjpeg${suffix} -revert -sample 2x1 -dct fast -opt
|
|
||||||
-outfile testout_422_ifast_opt.jpg ${TESTIMAGES}/testorig.ppm)
|
|
||||||
add_test(cjpeg${suffix}-422-ifast-opt-cmp
|
|
||||||
${MD5CMP} ${MD5_JPEG_422_IFAST_OPT} testout_422_ifast_opt.jpg)
|
|
||||||
|
|
||||||
# CC: YCC->RGB SAMP: fullsize/h2v1 fancy IDCT: ifast ENT: huff
|
|
||||||
add_test(djpeg${suffix}-422-ifast
|
|
||||||
${dir}djpeg${suffix} -dct fast
|
|
||||||
-outfile testout_422_ifast.ppm testout_422_ifast_opt.jpg)
|
|
||||||
add_test(djpeg${suffix}-422-ifast-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_422_IFAST} testout_422_ifast.ppm)
|
|
||||||
|
|
||||||
# CC: YCC->RGB SAMP: h2v1 merged IDCT: ifast ENT: huff
|
|
||||||
add_test(djpeg${suffix}-422m-ifast
|
|
||||||
${dir}djpeg${suffix} -dct fast -nosmooth
|
|
||||||
-outfile testout_422m_ifast.ppm testout_422_ifast_opt.jpg)
|
|
||||||
add_test(djpeg${suffix}-422m-ifast-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_422M_IFAST} testout_422m_ifast.ppm)
|
|
||||||
|
|
||||||
if(NOT WITH_12BIT)
|
|
||||||
# CC: YCC->RGB565 SAMP: h2v1 merged IDCT: ifast ENT: huff
|
|
||||||
add_test(djpeg${suffix}-422m-ifast-565
|
|
||||||
${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -dither none -bmp
|
|
||||||
-outfile testout_422m_ifast_565.bmp testout_422_ifast_opt.jpg)
|
|
||||||
add_test(djpeg${suffix}-422m-ifast-565-cmp
|
|
||||||
${MD5CMP} ${MD5_BMP_422M_IFAST_565} testout_422m_ifast_565.bmp)
|
|
||||||
|
|
||||||
# CC: YCC->RGB565 (dithered) SAMP: h2v1 merged IDCT: ifast ENT: huff
|
|
||||||
add_test(djpeg${suffix}-422m-ifast-565D
|
|
||||||
${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -bmp
|
|
||||||
-outfile testout_422m_ifast_565D.bmp testout_422_ifast_opt.jpg)
|
|
||||||
add_test(djpeg${suffix}-422m-ifast-565D-cmp
|
|
||||||
${MD5CMP} ${MD5_BMP_422M_IFAST_565D} testout_422m_ifast_565D.bmp)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# CC: RGB->YCC SAMP: fullsize/h2v2 FDCT: ifast ENT: prog huff
|
|
||||||
add_test(cjpeg${suffix}-420-q100-ifast-prog
|
|
||||||
${dir}cjpeg${suffix} -revert -sample 2x2 -quality 100 -dct fast -prog
|
|
||||||
-outfile testout_420_q100_ifast_prog.jpg ${TESTIMAGES}/testorig.ppm)
|
|
||||||
add_test(cjpeg${suffix}-420-q100-ifast-prog-cmp
|
|
||||||
${MD5CMP} ${MD5_JPEG_420_IFAST_Q100_PROG} testout_420_q100_ifast_prog.jpg)
|
|
||||||
|
|
||||||
# CC: YCC->RGB SAMP: fullsize/h2v2 fancy IDCT: ifast ENT: prog huff
|
|
||||||
add_test(djpeg${suffix}-420-q100-ifast-prog
|
|
||||||
${dir}djpeg${suffix} -dct fast
|
|
||||||
-outfile testout_420_q100_ifast.ppm testout_420_q100_ifast_prog.jpg)
|
|
||||||
add_test(djpeg${suffix}-420-q100-ifast-prog-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_420_Q100_IFAST} testout_420_q100_ifast.ppm)
|
|
||||||
|
|
||||||
# CC: YCC->RGB SAMP: h2v2 merged IDCT: ifast ENT: prog huff
|
|
||||||
add_test(djpeg${suffix}-420m-q100-ifast-prog
|
|
||||||
${dir}djpeg${suffix} -dct fast -nosmooth
|
|
||||||
-outfile testout_420m_q100_ifast.ppm testout_420_q100_ifast_prog.jpg)
|
|
||||||
add_test(djpeg${suffix}-420m-q100-ifast-prog-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_420M_Q100_IFAST} testout_420m_q100_ifast.ppm)
|
|
||||||
|
|
||||||
# CC: RGB->Gray SAMP: fullsize FDCT: islow ENT: huff
|
|
||||||
add_test(cjpeg${suffix}-gray-islow
|
|
||||||
${dir}cjpeg${suffix} -revert -gray -dct int
|
|
||||||
-outfile testout_gray_islow.jpg ${TESTIMAGES}/testorig.ppm)
|
|
||||||
add_test(cjpeg${suffix}-gray-islow-cmp
|
|
||||||
${MD5CMP} ${MD5_JPEG_GRAY_ISLOW} testout_gray_islow.jpg)
|
|
||||||
|
|
||||||
# CC: Gray->Gray SAMP: fullsize IDCT: islow ENT: huff
|
|
||||||
add_test(djpeg${suffix}-gray-islow
|
|
||||||
${dir}djpeg${suffix} -dct int
|
|
||||||
-outfile testout_gray_islow.ppm testout_gray_islow.jpg)
|
|
||||||
add_test(djpeg${suffix}-gray-islow-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_GRAY_ISLOW} testout_gray_islow.ppm)
|
|
||||||
|
|
||||||
# CC: Gray->RGB SAMP: fullsize IDCT: islow ENT: huff
|
|
||||||
add_test(djpeg${suffix}-gray-islow-rgb
|
|
||||||
${dir}djpeg${suffix} -dct int -rgb
|
|
||||||
-outfile testout_gray_islow_rgb.ppm testout_gray_islow.jpg)
|
|
||||||
add_test(djpeg${suffix}-gray-islow-rgb-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_GRAY_ISLOW_RGB} testout_gray_islow_rgb.ppm)
|
|
||||||
|
|
||||||
if(NOT WITH_12BIT)
|
|
||||||
# CC: Gray->RGB565 SAMP: fullsize IDCT: islow ENT: huff
|
|
||||||
add_test(djpeg${suffix}-gray-islow-565
|
|
||||||
${dir}djpeg${suffix} -dct int -rgb565 -dither none -bmp
|
|
||||||
-outfile testout_gray_islow_565.bmp testout_gray_islow.jpg)
|
|
||||||
add_test(djpeg${suffix}-gray-islow-565-cmp
|
|
||||||
${MD5CMP} ${MD5_BMP_GRAY_ISLOW_565} testout_gray_islow_565.bmp)
|
|
||||||
|
|
||||||
# CC: Gray->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
|
|
||||||
add_test(djpeg${suffix}-gray-islow-565D
|
|
||||||
${dir}djpeg${suffix} -dct int -rgb565 -bmp
|
|
||||||
-outfile testout_gray_islow_565D.bmp testout_gray_islow.jpg)
|
|
||||||
add_test(djpeg${suffix}-gray-islow-565D-cmp
|
|
||||||
${MD5CMP} ${MD5_BMP_GRAY_ISLOW_565D} testout_gray_islow_565D.bmp)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# CC: RGB->YCC SAMP: fullsize smooth/h2v2 smooth FDCT: islow
|
|
||||||
# ENT: 2-pass huff
|
|
||||||
add_test(cjpeg${suffix}-420s-ifast-opt
|
|
||||||
${dir}cjpeg${suffix} -sample 2x2 -smooth 1 -dct int -opt
|
|
||||||
-outfile testout_420s_ifast_opt.jpg ${TESTIMAGES}/testorig.ppm)
|
|
||||||
add_test(cjpeg${suffix}-420s-ifast-opt-cmp
|
|
||||||
${MD5CMP} ${MD5_JPEG_420S_IFAST_OPT} testout_420s_ifast_opt.jpg)
|
|
||||||
|
|
||||||
# CC: RGB->YCC SAMP: fullsize/int FDCT: float ENT: prog huff
|
|
||||||
add_test(cjpeg${suffix}-3x2-float-prog
|
|
||||||
${dir}cjpeg${suffix} -revert -sample 3x2 -dct float -prog
|
|
||||||
-outfile testout_3x2_float_prog.jpg ${TESTIMAGES}/testorig.ppm)
|
|
||||||
add_test(cjpeg${suffix}-3x2-float-prog-cmp
|
|
||||||
${MD5CMP} ${MD5_JPEG_3x2_FLOAT_PROG} testout_3x2_float_prog.jpg)
|
|
||||||
|
|
||||||
# CC: YCC->RGB SAMP: fullsize/int IDCT: float ENT: prog huff
|
|
||||||
add_test(djpeg${suffix}-3x2-float-prog
|
|
||||||
${dir}djpeg${suffix} -dct float
|
|
||||||
-outfile testout_3x2_float.ppm testout_3x2_float_prog.jpg)
|
|
||||||
add_test(djpeg${suffix}-3x2-float-prog-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_3x2_FLOAT} testout_3x2_float.ppm)
|
|
||||||
|
|
||||||
if(WITH_ARITH_ENC)
|
|
||||||
# CC: YCC->RGB SAMP: fullsize/h2v2 FDCT: islow ENT: arith
|
|
||||||
add_test(cjpeg${suffix}-420-islow-ari
|
|
||||||
${dir}cjpeg${suffix} -revert -dct int -arithmetic
|
|
||||||
-outfile testout_420_islow_ari.jpg ${TESTIMAGES}/testorig.ppm)
|
|
||||||
add_test(cjpeg${suffix}-420-islow-ari-cmp
|
|
||||||
${MD5CMP} ${MD5_JPEG_420_ISLOW_ARI} testout_420_islow_ari.jpg)
|
|
||||||
|
|
||||||
add_test(jpegtran${suffix}-420-islow-ari
|
|
||||||
${dir}jpegtran${suffix} -revert -arithmetic
|
|
||||||
-outfile testout_420_islow_ari.jpg ${TESTIMAGES}/testimgint.jpg)
|
|
||||||
add_test(jpegtran${suffix}-420-islow-ari-cmp
|
|
||||||
${MD5CMP} ${MD5_JPEG_420_ISLOW_ARI} testout_420_islow_ari.jpg)
|
|
||||||
|
|
||||||
# CC: YCC->RGB SAMP: fullsize FDCT: islow ENT: prog arith
|
|
||||||
add_test(cjpeg${suffix}-444-islow-progari
|
|
||||||
${dir}cjpeg${suffix} -revert -sample 1x1 -dct int -prog -arithmetic
|
|
||||||
-outfile testout_444_islow_progari.jpg ${TESTIMAGES}/testorig.ppm)
|
|
||||||
add_test(cjpeg${suffix}-444-islow-progari-cmp
|
|
||||||
${MD5CMP} ${MD5_JPEG_444_ISLOW_PROGARI} testout_444_islow_progari.jpg)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_ARITH_DEC)
|
|
||||||
# CC: RGB->YCC SAMP: h2v2 merged IDCT: ifast ENT: arith
|
|
||||||
add_test(djpeg${suffix}-420m-ifast-ari
|
|
||||||
${dir}djpeg${suffix} -fast -ppm
|
|
||||||
-outfile testout_420m_ifast_ari.ppm ${TESTIMAGES}/testimgari.jpg)
|
|
||||||
add_test(djpeg${suffix}-420m-ifast-ari-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_420M_IFAST_ARI} testout_420m_ifast_ari.ppm)
|
|
||||||
|
|
||||||
add_test(jpegtran${suffix}-420-islow
|
|
||||||
${dir}jpegtran${suffix} -revert
|
|
||||||
-outfile testout_420_islow.jpg ${TESTIMAGES}/testimgari.jpg)
|
|
||||||
add_test(jpegtran${suffix}-420-islow-cmp
|
|
||||||
${MD5CMP} ${MD5_JPEG_420_ISLOW} testout_420_islow.jpg)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# 2/1-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 16x16 islow ENT: huff
|
|
||||||
# 15/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 15x15 islow ENT: huff
|
|
||||||
# 13/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 13x13 islow ENT: huff
|
|
||||||
# 11/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 11x11 islow ENT: huff
|
|
||||||
# 9/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 9x9 islow ENT: huff
|
|
||||||
# 7/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 7x7 islow/14x14 islow
|
|
||||||
# ENT: huff
|
|
||||||
# 3/4-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 6x6 islow/12x12 islow
|
|
||||||
# ENT: huff
|
|
||||||
# 5/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 5x5 islow/10x10 islow
|
|
||||||
# ENT: huff
|
|
||||||
# 1/2-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 4x4 islow/8x8 islow
|
|
||||||
# ENT: huff
|
|
||||||
# 3/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 3x3 islow/6x6 islow
|
|
||||||
# ENT: huff
|
|
||||||
# 1/4-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 2x2 islow/4x4 islow
|
|
||||||
# ENT: huff
|
|
||||||
# 1/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 1x1 islow/2x2 islow
|
|
||||||
# ENT: huff
|
|
||||||
foreach(scale 2_1 15_8 13_8 11_8 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8)
|
|
||||||
string(REGEX REPLACE "_" "/" scalearg ${scale})
|
|
||||||
add_test(djpeg${suffix}-420m-islow-${scale}
|
|
||||||
${dir}djpeg${suffix} -dct int -scale ${scalearg} -nosmooth -ppm
|
|
||||||
-outfile testout_420m_islow_${scale}.ppm ${TESTIMAGES}/${TESTORIG})
|
|
||||||
add_test(djpeg${suffix}-420m-islow-${scale}-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_420M_ISLOW_${scale}} testout_420m_islow_${scale}.ppm)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
if(NOT WITH_12BIT)
|
|
||||||
# CC: YCC->RGB (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
|
|
||||||
add_test(djpeg${suffix}-420-islow-256
|
|
||||||
${dir}djpeg${suffix} -dct int -colors 256 -bmp
|
|
||||||
-outfile testout_420_islow_256.bmp ${TESTIMAGES}/${TESTORIG})
|
|
||||||
add_test(djpeg${suffix}-420-islow-256-cmp
|
|
||||||
${MD5CMP} ${MD5_BMP_420_ISLOW_256} testout_420_islow_256.bmp)
|
|
||||||
|
|
||||||
# CC: YCC->RGB565 SAMP: h2v2 fancy IDCT: islow ENT: huff
|
|
||||||
add_test(djpeg${suffix}-420-islow-565
|
|
||||||
${dir}djpeg${suffix} -dct int -rgb565 -dither none -bmp
|
|
||||||
-outfile testout_420_islow_565.bmp ${TESTIMAGES}/${TESTORIG})
|
|
||||||
add_test(djpeg${suffix}-420-islow-565-cmp
|
|
||||||
${MD5CMP} ${MD5_BMP_420_ISLOW_565} testout_420_islow_565.bmp)
|
|
||||||
|
|
||||||
# CC: YCC->RGB565 (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
|
|
||||||
add_test(djpeg${suffix}-420-islow-565D
|
|
||||||
${dir}djpeg${suffix} -dct int -rgb565 -bmp
|
|
||||||
-outfile testout_420_islow_565D.bmp ${TESTIMAGES}/${TESTORIG})
|
|
||||||
add_test(djpeg${suffix}-420-islow-565D-cmp
|
|
||||||
${MD5CMP} ${MD5_BMP_420_ISLOW_565D} testout_420_islow_565D.bmp)
|
|
||||||
|
|
||||||
# CC: YCC->RGB565 SAMP: h2v2 merged IDCT: islow ENT: huff
|
|
||||||
add_test(djpeg${suffix}-420m-islow-565
|
|
||||||
${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -dither none -bmp
|
|
||||||
-outfile testout_420m_islow_565.bmp ${TESTIMAGES}/${TESTORIG})
|
|
||||||
add_test(djpeg${suffix}-420m-islow-565-cmp
|
|
||||||
${MD5CMP} ${MD5_BMP_420M_ISLOW_565} testout_420m_islow_565.bmp)
|
|
||||||
|
|
||||||
# CC: YCC->RGB565 (dithered) SAMP: h2v2 merged IDCT: islow ENT: huff
|
|
||||||
add_test(djpeg${suffix}-420m-islow-565D
|
|
||||||
${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -bmp
|
|
||||||
-outfile testout_420m_islow_565D.bmp ${TESTIMAGES}/${TESTORIG})
|
|
||||||
add_test(djpeg${suffix}-420m-islow-565D-cmp
|
|
||||||
${MD5CMP} ${MD5_BMP_420M_ISLOW_565D} testout_420m_islow_565D.bmp)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Partial decode tests. These tests are designed to cover all of the
|
|
||||||
# possible code paths in jpeg_skip_scanlines().
|
|
||||||
|
|
||||||
# Context rows: Yes Intra-iMCU row: Yes iMCU row prefetch: No ENT: huff
|
|
||||||
add_test(djpeg${suffix}-420-islow-skip15_31
|
|
||||||
${dir}djpeg${suffix} -dct int -skip 15,31 -ppm
|
|
||||||
-outfile testout_420_islow_skip15,31.ppm ${TESTIMAGES}/${TESTORIG})
|
|
||||||
add_test(djpeg${suffix}-420-islow-skip15_31-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_420_ISLOW_SKIP15_31} testout_420_islow_skip15,31.ppm)
|
|
||||||
|
|
||||||
# Context rows: Yes Intra-iMCU row: No iMCU row prefetch: Yes ENT: arith
|
|
||||||
if(WITH_ARITH_DEC)
|
|
||||||
add_test(djpeg${suffix}-420-islow-ari-skip16_139
|
|
||||||
${dir}djpeg${suffix} -dct int -skip 16,139 -ppm
|
|
||||||
-outfile testout_420_islow_ari_skip16,139.ppm
|
|
||||||
${TESTIMAGES}/testimgari.jpg)
|
|
||||||
add_test(djpeg${suffix}-420-islow-ari_skip16_139-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_420_ISLOW_ARI_SKIP16_139}
|
|
||||||
testout_420_islow_ari_skip16,139.ppm)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Context rows: Yes Intra-iMCU row: No iMCU row prefetch: No ENT: prog huff
|
|
||||||
add_test(cjpeg${suffix}-420-islow-prog
|
|
||||||
${dir}cjpeg${suffix} -dct int -prog
|
|
||||||
-outfile testout_420_islow_prog.jpg ${TESTIMAGES}/testorig.ppm)
|
|
||||||
add_test(djpeg${suffix}-420-islow-prog-crop62x62_71_71
|
|
||||||
${dir}djpeg${suffix} -dct int -crop 62x62+71+71 -ppm
|
|
||||||
-outfile testout_420_islow_prog_crop62x62,71,71.ppm
|
|
||||||
testout_420_islow_prog.jpg)
|
|
||||||
add_test(djpeg${suffix}-420-islow-prog-crop62x62_71_71-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71}
|
|
||||||
testout_420_islow_prog_crop62x62,71,71.ppm)
|
|
||||||
|
|
||||||
# Context rows: Yes Intra-iMCU row: No iMCU row prefetch: No ENT: arith
|
|
||||||
if(WITH_ARITH_DEC)
|
|
||||||
add_test(djpeg${suffix}-420-islow-ari-crop53x53_4_4
|
|
||||||
${dir}djpeg${suffix} -dct int -crop 53x53+4+4 -ppm
|
|
||||||
-outfile testout_420_islow_ari_crop53x53,4,4.ppm
|
|
||||||
${TESTIMAGES}/testimgari.jpg)
|
|
||||||
add_test(djpeg${suffix}-420-islow-ari-crop53x53_4_4-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4}
|
|
||||||
testout_420_islow_ari_crop53x53,4,4.ppm)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Context rows: No Intra-iMCU row: Yes ENT: huff
|
|
||||||
add_test(cjpeg${suffix}-444-islow
|
|
||||||
${dir}cjpeg${suffix} -dct int -sample 1x1
|
|
||||||
-outfile testout_444_islow.jpg ${TESTIMAGES}/testorig.ppm)
|
|
||||||
add_test(djpeg${suffix}-444-islow-skip1_6
|
|
||||||
${dir}djpeg${suffix} -dct int -skip 1,6 -ppm
|
|
||||||
-outfile testout_444_islow_skip1,6.ppm testout_444_islow.jpg)
|
|
||||||
add_test(djpeg${suffix}-444-islow-skip1_6-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_444_ISLOW_SKIP1_6} testout_444_islow_skip1,6.ppm)
|
|
||||||
|
|
||||||
# Context rows: No Intra-iMCU row: No ENT: prog huff
|
|
||||||
add_test(cjpeg${suffix}-444-islow-prog
|
|
||||||
${dir}cjpeg${suffix} -dct int -prog -sample 1x1
|
|
||||||
-outfile testout_444_islow_prog.jpg ${TESTIMAGES}/testorig.ppm)
|
|
||||||
add_test(djpeg${suffix}-444-islow-prog-crop98x98_13_13
|
|
||||||
${dir}djpeg${suffix} -dct int -crop 98x98+13+13 -ppm
|
|
||||||
-outfile testout_444_islow_prog_crop98x98,13,13.ppm
|
|
||||||
testout_444_islow_prog.jpg)
|
|
||||||
add_test(djpeg${suffix}-444-islow-prog_crop98x98_13_13-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13}
|
|
||||||
testout_444_islow_prog_crop98x98,13,13.ppm)
|
|
||||||
|
|
||||||
# Context rows: No Intra-iMCU row: No ENT: arith
|
|
||||||
if(WITH_ARITH_ENC)
|
|
||||||
add_test(cjpeg${suffix}-444-islow-ari
|
|
||||||
${dir}cjpeg${suffix} -dct int -arithmetic -sample 1x1
|
|
||||||
-outfile testout_444_islow_ari.jpg ${TESTIMAGES}/testorig.ppm)
|
|
||||||
if(WITH_ARITH_DEC)
|
|
||||||
add_test(djpeg${suffix}-444-islow-ari-crop37x37_0_0
|
|
||||||
${dir}djpeg${suffix} -dct int -crop 37x37+0+0 -ppm
|
|
||||||
-outfile testout_444_islow_ari_crop37x37,0,0.ppm
|
|
||||||
testout_444_islow_ari.jpg)
|
|
||||||
add_test(djpeg${suffix}-444-islow-ari-crop37x37_0_0-cmp
|
|
||||||
${MD5CMP} ${MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0}
|
|
||||||
testout_444_islow_ari_crop37x37,0,0.ppm)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_test(jpegtran${suffix}-crop
|
|
||||||
${dir}jpegtran${suffix} -revert -crop 120x90+20+50 -transpose -perfect
|
|
||||||
-outfile testout_crop.jpg ${TESTIMAGES}/${TESTORIG})
|
|
||||||
add_test(jpegtran${suffix}-crop-cmp
|
|
||||||
${MD5CMP} ${MD5_JPEG_CROP} testout_crop.jpg)
|
|
||||||
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
add_custom_target(testclean COMMAND ${MD5CMP} -P
|
|
||||||
${CMAKE_SOURCE_DIR}/cmakescripts/testclean.cmake)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Installer
|
|
||||||
#
|
|
||||||
|
|
||||||
if(MSVC)
|
|
||||||
set(INST_PLATFORM "Visual C++")
|
|
||||||
set(INST_NAME ${CMAKE_PROJECT_NAME}-${VERSION}-vc)
|
|
||||||
set(INST_REG_NAME ${CMAKE_PROJECT_NAME})
|
|
||||||
elseif(MINGW)
|
|
||||||
set(INST_PLATFORM GCC)
|
|
||||||
set(INST_NAME ${CMAKE_PROJECT_NAME}-${VERSION}-gcc)
|
|
||||||
set(INST_REG_NAME ${CMAKE_PROJECT_NAME}-gcc)
|
|
||||||
set(INST_DEFS -DGCC)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(64BIT)
|
|
||||||
set(INST_PLATFORM "${INST_PLATFORM} 64-bit")
|
|
||||||
set(INST_NAME ${INST_NAME}64)
|
|
||||||
set(INST_REG_NAME "${INST_DIR}64")
|
|
||||||
set(INST_DEFS ${INST_DEFS} -DWIN64)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_JAVA)
|
|
||||||
set(INST_DEFS ${INST_DEFS} -DJAVA)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(MSVC_IDE)
|
|
||||||
set(INST_DEFS ${INST_DEFS} "-DBUILDDIR=${CMAKE_CFG_INTDIR}\\")
|
|
||||||
else()
|
|
||||||
set(INST_DEFS ${INST_DEFS} "-DBUILDDIR=")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
STRING(REGEX REPLACE "/" "\\\\" INST_DIR "${CMAKE_INSTALL_PREFIX}")
|
|
||||||
|
|
||||||
configure_file(release/mozjpeg.nsi.in mozjpeg.nsi @ONLY)
|
|
||||||
|
|
||||||
if(WITH_JAVA)
|
|
||||||
set(JAVA_DEPEND java)
|
|
||||||
endif()
|
|
||||||
add_custom_target(installer
|
|
||||||
makensis -nocd ${INST_DEFS} mozjpeg.nsi
|
|
||||||
DEPENDS jpeg jpeg-static turbojpeg turbojpeg-static rdjpgcom wrjpgcom
|
|
||||||
cjpeg djpeg jpegtran tjbench ${JAVA_DEPEND}
|
|
||||||
SOURCES mozjpeg.nsi)
|
|
||||||
|
|
||||||
if(WITH_TURBOJPEG)
|
|
||||||
if(ENABLE_SHARED)
|
|
||||||
install(TARGETS turbojpeg tjbench
|
|
||||||
ARCHIVE DESTINATION lib
|
|
||||||
LIBRARY DESTINATION lib
|
|
||||||
RUNTIME DESTINATION bin)
|
|
||||||
endif()
|
|
||||||
if(ENABLE_STATIC)
|
|
||||||
install(TARGETS turbojpeg-static ARCHIVE DESTINATION lib)
|
|
||||||
if(NOT ENABLE_SHARED)
|
|
||||||
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/tjbench-static.exe
|
|
||||||
DESTINATION bin RENAME tjbench.exe)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
install(FILES ${CMAKE_SOURCE_DIR}/turbojpeg.h DESTINATION include)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(ENABLE_STATIC)
|
|
||||||
install(TARGETS jpeg-static ARCHIVE DESTINATION lib)
|
|
||||||
if(NOT ENABLE_SHARED)
|
|
||||||
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/cjpeg-static.exe
|
|
||||||
DESTINATION bin RENAME cjpeg.exe)
|
|
||||||
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/djpeg-static.exe
|
|
||||||
DESTINATION bin RENAME djpeg.exe)
|
|
||||||
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/jpegtran-static.exe
|
|
||||||
DESTINATION bin RENAME jpegtran.exe)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
install(TARGETS rdjpgcom wrjpgcom RUNTIME DESTINATION bin)
|
|
||||||
|
|
||||||
install(FILES ${CMAKE_SOURCE_DIR}/README.ijg ${CMAKE_SOURCE_DIR}/README-mozilla.txt
|
|
||||||
${CMAKE_SOURCE_DIR}/example.c ${CMAKE_SOURCE_DIR}/libjpeg.txt
|
|
||||||
${CMAKE_SOURCE_DIR}/structure.txt ${CMAKE_SOURCE_DIR}/usage.txt
|
|
||||||
${CMAKE_SOURCE_DIR}/wizard.txt
|
|
||||||
DESTINATION doc)
|
|
||||||
|
|
||||||
install(FILES ${CMAKE_BINARY_DIR}/jconfig.h ${CMAKE_SOURCE_DIR}/jerror.h
|
|
||||||
${CMAKE_SOURCE_DIR}/jmorecfg.h ${CMAKE_SOURCE_DIR}/jpeglib.h
|
|
||||||
DESTINATION include)
|
|
||||||
945
ChangeLog.md
@@ -1,945 +0,0 @@
|
|||||||
1.5.0
|
|
||||||
=====
|
|
||||||
|
|
||||||
### Significant changes relative to 1.5 beta1:
|
|
||||||
|
|
||||||
1. Fixed an issue whereby a malformed motion-JPEG frame could cause the "fast
|
|
||||||
path" of libjpeg-turbo's Huffman decoder to read from uninitialized memory.
|
|
||||||
|
|
||||||
2. Added libjpeg-turbo version and build information to the global string table
|
|
||||||
of the libjpeg and TurboJPEG API libraries. This is a common practice in other
|
|
||||||
infrastructure libraries, such as OpenSSL and libpng, because it makes it easy
|
|
||||||
to examine an application binary and determine which version of the library the
|
|
||||||
application was linked against.
|
|
||||||
|
|
||||||
3. Fixed a couple of issues in the PPM reader that would cause buffer overruns
|
|
||||||
in cjpeg if one of the values in a binary PPM/PGM input file exceeded the
|
|
||||||
maximum value defined in the file's header. libjpeg-turbo 1.4.2 already
|
|
||||||
included a similar fix for ASCII PPM/PGM files. Note that these issues were
|
|
||||||
not security bugs, since they were confined to the cjpeg program and did not
|
|
||||||
affect any of the libjpeg-turbo libraries.
|
|
||||||
|
|
||||||
4. Fixed an issue whereby attempting to decompress a JPEG file with a corrupt
|
|
||||||
header using the `tjDecompressToYUV2()` function would cause the function to
|
|
||||||
abort without returning an error and, under certain circumstances, corrupt the
|
|
||||||
stack. This only occurred if `tjDecompressToYUV2()` was called prior to
|
|
||||||
calling `tjDecompressHeader3()`, or if the return value from
|
|
||||||
`tjDecompressHeader3()` was ignored (both cases represent incorrect usage of
|
|
||||||
the TurboJPEG API.)
|
|
||||||
|
|
||||||
5. Fixed an issue in the ARM 32-bit SIMD-accelerated Huffman encoder that
|
|
||||||
prevented the code from assembling properly with clang.
|
|
||||||
|
|
||||||
6. The `jpeg_stdio_src()`, `jpeg_mem_src()`, `jpeg_stdio_dest()`, and
|
|
||||||
`jpeg_mem_dest()` functions in the libjpeg API will now throw an error if a
|
|
||||||
source/destination manager has already been assigned to the compress or
|
|
||||||
decompress object by a different function or by the calling program. This
|
|
||||||
prevents these functions from attempting to reuse a source/destination manager
|
|
||||||
structure that was allocated elsewhere, because there is no way to ensure that
|
|
||||||
it would be big enough to accommodate the new source/destination manager.
|
|
||||||
|
|
||||||
|
|
||||||
1.4.90 (1.5 beta1)
|
|
||||||
==================
|
|
||||||
|
|
||||||
### Significant changes relative to 1.4.2:
|
|
||||||
|
|
||||||
1. Added full SIMD acceleration for PowerPC platforms using AltiVec VMX
|
|
||||||
(128-bit SIMD) instructions. Although the performance of libjpeg-turbo on
|
|
||||||
PowerPC was already good, due to the increased number of registers available
|
|
||||||
to the compiler vs. x86, it was still possible to speed up compression by about
|
|
||||||
3-4x and decompression by about 2-2.5x (relative to libjpeg v6b) through the
|
|
||||||
use of AltiVec instructions.
|
|
||||||
|
|
||||||
2. Added two new libjpeg API functions (`jpeg_skip_scanlines()` and
|
|
||||||
`jpeg_crop_scanline()`) that can be used to partially decode a JPEG image. See
|
|
||||||
[libjpeg.txt](libjpeg.txt) for more details.
|
|
||||||
|
|
||||||
3. The TJCompressor and TJDecompressor classes in the TurboJPEG Java API now
|
|
||||||
implement the Closeable interface, so those classes can be used with a
|
|
||||||
try-with-resources statement.
|
|
||||||
|
|
||||||
4. The TurboJPEG Java classes now throw unchecked idiomatic exceptions
|
|
||||||
(IllegalArgumentException, IllegalStateException) for unrecoverable errors
|
|
||||||
caused by incorrect API usage, and those classes throw a new checked exception
|
|
||||||
type (TJException) for errors that are passed through from the C library.
|
|
||||||
|
|
||||||
5. Source buffers for the TurboJPEG C API functions, as well as the
|
|
||||||
`jpeg_mem_src()` function in the libjpeg API, are now declared as const
|
|
||||||
pointers. This facilitates passing read-only buffers to those functions and
|
|
||||||
ensures the caller that the source buffer will not be modified. This should
|
|
||||||
not create any backward API or ABI incompatibilities with prior libjpeg-turbo
|
|
||||||
releases.
|
|
||||||
|
|
||||||
6. The MIPS DSPr2 SIMD code can now be compiled to support either FR=0 or FR=1
|
|
||||||
FPUs.
|
|
||||||
|
|
||||||
7. Fixed additional negative left shifts and other issues reported by the GCC
|
|
||||||
and Clang undefined behavior sanitizers. Most of these issues affected only
|
|
||||||
32-bit code, and none of them was known to pose a security threat, but removing
|
|
||||||
the warnings makes it easier to detect actual security issues, should they
|
|
||||||
arise in the future.
|
|
||||||
|
|
||||||
8. Removed the unnecessary `.arch` directive from the ARM64 NEON SIMD code.
|
|
||||||
This directive was preventing the code from assembling using the clang
|
|
||||||
integrated assembler.
|
|
||||||
|
|
||||||
9. Fixed a regression caused by 1.4.1[6] that prevented 32-bit and 64-bit
|
|
||||||
libjpeg-turbo RPMs from being installed simultaneously on recent Red Hat/Fedora
|
|
||||||
distributions. This was due to the addition of a macro in jconfig.h that
|
|
||||||
allows the Huffman codec to determine the word size at compile time. Since
|
|
||||||
that macro differs between 32-bit and 64-bit builds, this caused a conflict
|
|
||||||
between the i386 and x86_64 RPMs (any differing files, other than executables,
|
|
||||||
are not allowed when 32-bit and 64-bit RPMs are installed simultaneously.)
|
|
||||||
Since the macro is used only internally, it has been moved into jconfigint.h.
|
|
||||||
|
|
||||||
10. The x86-64 SIMD code can now be disabled at run time by setting the
|
|
||||||
`JSIMD_FORCENONE` environment variable to `1` (the other SIMD implementations
|
|
||||||
already had this capability.)
|
|
||||||
|
|
||||||
11. Added a new command-line argument to TJBench (`-nowrite`) that prevents the
|
|
||||||
benchmark from outputting any images. This removes any potential operating
|
|
||||||
system overhead that might be caused by lazy writes to disk and thus improves
|
|
||||||
the consistency of the performance measurements.
|
|
||||||
|
|
||||||
12. Added SIMD acceleration for Huffman encoding on SSE2-capable x86 and x86-64
|
|
||||||
platforms. This speeds up the compression of full-color JPEGs by about 10-15%
|
|
||||||
on average (relative to libjpeg-turbo 1.4.x) when using modern Intel and AMD
|
|
||||||
CPUs. Additionally, this works around an issue in the clang optimizer that
|
|
||||||
prevents it (as of this writing) from achieving the same performance as GCC
|
|
||||||
when compiling the C version of the Huffman encoder
|
|
||||||
(<https://llvm.org/bugs/show_bug.cgi?id=16035>). For the purposes of
|
|
||||||
benchmarking or regression testing, SIMD-accelerated Huffman encoding can be
|
|
||||||
disabled by setting the `JSIMD_NOHUFFENC` environment variable to `1`.
|
|
||||||
|
|
||||||
13. Added ARM 64-bit (ARMv8) NEON SIMD implementations of the commonly-used
|
|
||||||
compression algorithms (including the slow integer forward DCT and h2v2 & h2v1
|
|
||||||
downsampling algorithms, which are not accelerated in the 32-bit NEON
|
|
||||||
implementation.) This speeds up the compression of full-color JPEGs by about
|
|
||||||
75% on average on a Cavium ThunderX processor and by about 2-2.5x on average on
|
|
||||||
Cortex-A53 and Cortex-A57 cores.
|
|
||||||
|
|
||||||
14. Added SIMD acceleration for Huffman encoding on NEON-capable ARM 32-bit
|
|
||||||
and 64-bit platforms.
|
|
||||||
|
|
||||||
For 32-bit code, this speeds up the compression of full-color JPEGs by
|
|
||||||
about 30% on average on a typical iOS device (iPhone 4S, Cortex-A9) and by
|
|
||||||
about 6-7% on average on a typical Android device (Nexus 5X, Cortex-A53 and
|
|
||||||
Cortex-A57), relative to libjpeg-turbo 1.4.x. Note that the larger speedup
|
|
||||||
under iOS is due to the fact that iOS builds use LLVM, which does not optimize
|
|
||||||
the C Huffman encoder as well as GCC does.
|
|
||||||
|
|
||||||
For 64-bit code, NEON-accelerated Huffman encoding speeds up the
|
|
||||||
compression of full-color JPEGs by about 40% on average on a typical iOS device
|
|
||||||
(iPhone 5S, Apple A7) and by about 7-8% on average on a typical Android device
|
|
||||||
(Nexus 5X, Cortex-A53 and Cortex-A57), in addition to the speedup described in
|
|
||||||
[13] above.
|
|
||||||
|
|
||||||
For the purposes of benchmarking or regression testing, SIMD-accelerated
|
|
||||||
Huffman encoding can be disabled by setting the `JSIMD_NOHUFFENC` environment
|
|
||||||
variable to `1`.
|
|
||||||
|
|
||||||
15. pkg-config (.pc) scripts are now included for both the libjpeg and
|
|
||||||
TurboJPEG API libraries on Un*x systems. Note that if a project's build system
|
|
||||||
relies on these scripts, then it will not be possible to build that project
|
|
||||||
with libjpeg or with a prior version of libjpeg-turbo.
|
|
||||||
|
|
||||||
16. Optimized the ARM 64-bit (ARMv8) NEON SIMD decompression routines to
|
|
||||||
improve performance on CPUs with in-order pipelines. This speeds up the
|
|
||||||
decompression of full-color JPEGs by nearly 2x on average on a Cavium ThunderX
|
|
||||||
processor and by about 15% on average on a Cortex-A53 core.
|
|
||||||
|
|
||||||
17. Fixed an issue in the accelerated Huffman decoder that could have caused
|
|
||||||
the decoder to read past the end of the input buffer when a malformed,
|
|
||||||
specially-crafted JPEG image was being decompressed. In prior versions of
|
|
||||||
libjpeg-turbo, the accelerated Huffman decoder was invoked (in most cases) only
|
|
||||||
if there were > 128 bytes of data in the input buffer. However, it is possible
|
|
||||||
to construct a JPEG image in which a single Huffman block is over 430 bytes
|
|
||||||
long, so this version of libjpeg-turbo activates the accelerated Huffman
|
|
||||||
decoder only if there are > 512 bytes of data in the input buffer.
|
|
||||||
|
|
||||||
18. Fixed a memory leak in tjunittest encountered when running the program
|
|
||||||
with the `-yuv` option.
|
|
||||||
|
|
||||||
|
|
||||||
1.4.2
|
|
||||||
=====
|
|
||||||
|
|
||||||
### Significant changes relative to 1.4.1:
|
|
||||||
|
|
||||||
1. Fixed an issue whereby cjpeg would segfault if a Windows bitmap with a
|
|
||||||
negative width or height was used as an input image (Windows bitmaps can have
|
|
||||||
a negative height if they are stored in top-down order, but such files are
|
|
||||||
rare and not supported by libjpeg-turbo.)
|
|
||||||
|
|
||||||
2. Fixed an issue whereby, under certain circumstances, libjpeg-turbo would
|
|
||||||
incorrectly encode certain JPEG images when quality=100 and the fast integer
|
|
||||||
forward DCT were used. This was known to cause `make test` to fail when the
|
|
||||||
library was built with `-march=haswell` on x86 systems.
|
|
||||||
|
|
||||||
3. Fixed an issue whereby libjpeg-turbo would crash when built with the latest
|
|
||||||
& greatest development version of the Clang/LLVM compiler. This was caused by
|
|
||||||
an x86-64 ABI conformance issue in some of libjpeg-turbo's 64-bit SSE2 SIMD
|
|
||||||
routines. Those routines were incorrectly using a 64-bit `mov` instruction to
|
|
||||||
transfer a 32-bit JDIMENSION argument, whereas the x86-64 ABI allows the upper
|
|
||||||
(unused) 32 bits of a 32-bit argument's register to be undefined. The new
|
|
||||||
Clang/LLVM optimizer uses load combining to transfer multiple adjacent 32-bit
|
|
||||||
structure members into a single 64-bit register, and this exposed the ABI
|
|
||||||
conformance issue.
|
|
||||||
|
|
||||||
4. Fixed a bug in the MIPS DSPr2 4:2:0 "plain" (non-fancy and non-merged)
|
|
||||||
upsampling routine that caused a buffer overflow (and subsequent segfault) when
|
|
||||||
decompressing a 4:2:0 JPEG image whose scaled output width was less than 16
|
|
||||||
pixels. The "plain" upsampling routines are normally only used when
|
|
||||||
decompressing a non-YCbCr JPEG image, but they are also used when decompressing
|
|
||||||
a JPEG image whose scaled output height is 1.
|
|
||||||
|
|
||||||
5. Fixed various negative left shifts and other issues reported by the GCC and
|
|
||||||
Clang undefined behavior sanitizers. None of these was known to pose a
|
|
||||||
security threat, but removing the warnings makes it easier to detect actual
|
|
||||||
security issues, should they arise in the future.
|
|
||||||
|
|
||||||
|
|
||||||
1.4.1
|
|
||||||
=====
|
|
||||||
|
|
||||||
### Significant changes relative to 1.4.0:
|
|
||||||
|
|
||||||
1. tjbench now properly handles CMYK/YCCK JPEG files. Passing an argument of
|
|
||||||
`-cmyk` (instead of, for instance, `-rgb`) will cause tjbench to internally
|
|
||||||
convert the source bitmap to CMYK prior to compression, to generate YCCK JPEG
|
|
||||||
files, and to internally convert the decompressed CMYK pixels back to RGB after
|
|
||||||
decompression (the latter is done automatically if a CMYK or YCCK JPEG is
|
|
||||||
passed to tjbench as a source image.) The CMYK<->RGB conversion operation is
|
|
||||||
not benchmarked. NOTE: The quick & dirty CMYK<->RGB conversions that tjbench
|
|
||||||
uses are suitable for testing only. Proper conversion between CMYK and RGB
|
|
||||||
requires a color management system.
|
|
||||||
|
|
||||||
2. `make test` now performs additional bitwise regression tests using tjbench,
|
|
||||||
mainly for the purpose of testing compression from/decompression to a subregion
|
|
||||||
of a larger image buffer.
|
|
||||||
|
|
||||||
3. `make test` no longer tests the regression of the floating point DCT/IDCT
|
|
||||||
by default, since the results of those tests can vary if the algorithms in
|
|
||||||
question are not implemented using SIMD instructions on a particular platform.
|
|
||||||
See the comments in [Makefile.am](Makefile.am) for information on how to
|
|
||||||
re-enable the tests and to specify an expected result for them based on the
|
|
||||||
particulars of your platform.
|
|
||||||
|
|
||||||
4. The NULL color conversion routines have been significantly optimized,
|
|
||||||
which speeds up the compression of RGB and CMYK JPEGs by 5-20% when using
|
|
||||||
64-bit code and 0-3% when using 32-bit code, and the decompression of those
|
|
||||||
images by 10-30% when using 64-bit code and 3-12% when using 32-bit code.
|
|
||||||
|
|
||||||
5. Fixed an "illegal instruction" error that occurred when djpeg from a
|
|
||||||
SIMD-enabled libjpeg-turbo MIPS build was executed with the `-nosmooth` option
|
|
||||||
on a MIPS machine that lacked DSPr2 support. The MIPS SIMD routines for h2v1
|
|
||||||
and h2v2 merged upsampling were not properly checking for the existence of
|
|
||||||
DSPr2.
|
|
||||||
|
|
||||||
6. Performance has been improved significantly on 64-bit non-Linux and
|
|
||||||
non-Windows platforms (generally 10-20% faster compression and 5-10% faster
|
|
||||||
decompression.) Due to an oversight, the 64-bit version of the accelerated
|
|
||||||
Huffman codec was not being compiled in when libjpeg-turbo was built on
|
|
||||||
platforms other than Windows or Linux. Oops.
|
|
||||||
|
|
||||||
7. Fixed an extremely rare bug in the Huffman encoder that caused 64-bit
|
|
||||||
builds of libjpeg-turbo to incorrectly encode a few specific test images when
|
|
||||||
quality=98, an optimized Huffman table, and the slow integer forward DCT were
|
|
||||||
used.
|
|
||||||
|
|
||||||
8. The Windows (CMake) build system now supports building only static or only
|
|
||||||
shared libraries. This is accomplished by adding either `-DENABLE_STATIC=0` or
|
|
||||||
`-DENABLE_SHARED=0` to the CMake command line.
|
|
||||||
|
|
||||||
9. TurboJPEG API functions will now return an error code if a warning is
|
|
||||||
triggered in the underlying libjpeg API. For instance, if a JPEG file is
|
|
||||||
corrupt, the TurboJPEG decompression functions will attempt to decompress
|
|
||||||
as much of the image as possible, but those functions will now return -1 to
|
|
||||||
indicate that the decompression was not entirely successful.
|
|
||||||
|
|
||||||
10. Fixed a bug in the MIPS DSPr2 4:2:2 fancy upsampling routine that caused a
|
|
||||||
buffer overflow (and subsequent segfault) when decompressing a 4:2:2 JPEG image
|
|
||||||
in which the right-most MCU was 5 or 6 pixels wide.
|
|
||||||
|
|
||||||
|
|
||||||
1.4.0
|
|
||||||
=====
|
|
||||||
|
|
||||||
### Significant changes relative to 1.4 beta1:
|
|
||||||
|
|
||||||
1. Fixed a build issue on OS X PowerPC platforms (md5cmp failed to build
|
|
||||||
because OS X does not provide the `le32toh()` and `htole32()` functions.)
|
|
||||||
|
|
||||||
2. The non-SIMD RGB565 color conversion code did not work correctly on big
|
|
||||||
endian machines. This has been fixed.
|
|
||||||
|
|
||||||
3. Fixed an issue in `tjPlaneSizeYUV()` whereby it would erroneously return 1
|
|
||||||
instead of -1 if `componentID` was > 0 and `subsamp` was `TJSAMP_GRAY`.
|
|
||||||
|
|
||||||
3. Fixed an issue in `tjBufSizeYUV2()` whereby it would erroneously return 0
|
|
||||||
instead of -1 if `width` was < 1.
|
|
||||||
|
|
||||||
5. The Huffman encoder now uses `clz` and `bsr` instructions for bit counting
|
|
||||||
on ARM64 platforms (see 1.4 beta1[5].)
|
|
||||||
|
|
||||||
6. The `close()` method in the TJCompressor and TJDecompressor Java classes is
|
|
||||||
now idempotent. Previously, that method would call the native `tjDestroy()`
|
|
||||||
function even if the TurboJPEG instance had already been destroyed. This
|
|
||||||
caused an exception to be thrown during finalization, if the `close()` method
|
|
||||||
had already been called. The exception was caught, but it was still an
|
|
||||||
expensive operation.
|
|
||||||
|
|
||||||
7. The TurboJPEG API previously generated an error (`Could not determine
|
|
||||||
subsampling type for JPEG image`) when attempting to decompress grayscale JPEG
|
|
||||||
images that were compressed with a sampling factor other than 1 (for instance,
|
|
||||||
with `cjpeg -grayscale -sample 2x2`). Subsampling technically has no meaning
|
|
||||||
with grayscale JPEGs, and thus the horizontal and vertical sampling factors
|
|
||||||
for such images are ignored by the decompressor. However, the TurboJPEG API
|
|
||||||
was being too rigid and was expecting the sampling factors to be equal to 1
|
|
||||||
before it treated the image as a grayscale JPEG.
|
|
||||||
|
|
||||||
8. cjpeg, djpeg, and jpegtran now accept an argument of `-version`, which will
|
|
||||||
print the library version and exit.
|
|
||||||
|
|
||||||
9. Referring to 1.4 beta1[15], another extremely rare circumstance was
|
|
||||||
discovered under which the Huffman encoder's local buffer can be overrun
|
|
||||||
when a buffered destination manager is being used and an
|
|
||||||
extremely-high-frequency block (basically junk image data) is being encoded.
|
|
||||||
Even though the Huffman local buffer was increased from 128 bytes to 136 bytes
|
|
||||||
to address the previous issue, the new issue caused even the larger buffer to
|
|
||||||
be overrun. Further analysis reveals that, in the absolute worst case (such as
|
|
||||||
setting alternating AC coefficients to 32767 and -32768 in the JPEG scanning
|
|
||||||
order), the Huffman encoder can produce encoded blocks that approach double the
|
|
||||||
size of the unencoded blocks. Thus, the Huffman local buffer was increased to
|
|
||||||
256 bytes, which should prevent any such issue from re-occurring in the future.
|
|
||||||
|
|
||||||
10. The new `tjPlaneSizeYUV()`, `tjPlaneWidth()`, and `tjPlaneHeight()`
|
|
||||||
functions were not actually usable on any platform except OS X and Windows,
|
|
||||||
because those functions were not included in the libturbojpeg mapfile. This
|
|
||||||
has been fixed.
|
|
||||||
|
|
||||||
11. Restored the `JPP()`, `JMETHOD()`, and `FAR` macros in the libjpeg-turbo
|
|
||||||
header files. The `JPP()` and `JMETHOD()` macros were originally implemented
|
|
||||||
in libjpeg as a way of supporting non-ANSI compilers that lacked support for
|
|
||||||
prototype parameters. libjpeg-turbo has never supported such compilers, but
|
|
||||||
some software packages still use the macros to define their own prototypes.
|
|
||||||
Similarly, libjpeg-turbo has never supported MS-DOS and other platforms that
|
|
||||||
have far symbols, but some software packages still use the `FAR` macro. A
|
|
||||||
pretty good argument can be made that this is a bad practice on the part of the
|
|
||||||
software in question, but since this affects more than one package, it's just
|
|
||||||
easier to fix it here.
|
|
||||||
|
|
||||||
12. Fixed issues that were preventing the ARM 64-bit SIMD code from compiling
|
|
||||||
for iOS, and included an ARMv8 architecture in all of the binaries installed by
|
|
||||||
the "official" libjpeg-turbo SDK for OS X.
|
|
||||||
|
|
||||||
|
|
||||||
1.3.90 (1.4 beta1)
|
|
||||||
==================
|
|
||||||
|
|
||||||
### Significant changes relative to 1.3.1:
|
|
||||||
|
|
||||||
1. New features in the TurboJPEG API:
|
|
||||||
|
|
||||||
- YUV planar images can now be generated with an arbitrary line padding
|
|
||||||
(previously only 4-byte padding, which was compatible with X Video, was
|
|
||||||
supported.)
|
|
||||||
- The decompress-to-YUV function has been extended to support image
|
|
||||||
scaling.
|
|
||||||
- JPEG images can now be compressed from YUV planar source images.
|
|
||||||
- YUV planar images can now be decoded into RGB or grayscale images.
|
|
||||||
- 4:1:1 subsampling is now supported. This is mainly included for
|
|
||||||
compatibility, since 4:1:1 is not fully accelerated in libjpeg-turbo and has no
|
|
||||||
significant advantages relative to 4:2:0.
|
|
||||||
- CMYK images are now supported. This feature allows CMYK source images
|
|
||||||
to be compressed to YCCK JPEGs and YCCK or CMYK JPEGs to be decompressed to
|
|
||||||
CMYK destination images. Conversion between CMYK/YCCK and RGB or YUV images is
|
|
||||||
not supported. Such conversion requires a color management system and is thus
|
|
||||||
out of scope for a codec library.
|
|
||||||
- The handling of YUV images in the Java API has been significantly
|
|
||||||
refactored and should now be much more intuitive.
|
|
||||||
- The Java API now supports encoding a YUV image from an arbitrary
|
|
||||||
position in a large image buffer.
|
|
||||||
- All of the YUV functions now have a corresponding function that operates
|
|
||||||
on separate image planes instead of a unified image buffer. This allows for
|
|
||||||
compressing/decoding from or decompressing/encoding to a subregion of a larger
|
|
||||||
YUV image. It also allows for handling YUV formats that swap the order of the
|
|
||||||
U and V planes.
|
|
||||||
|
|
||||||
2. Added SIMD acceleration for DSPr2-capable MIPS platforms. This speeds up
|
|
||||||
the compression of full-color JPEGs by 70-80% on such platforms and
|
|
||||||
decompression by 25-35%.
|
|
||||||
|
|
||||||
3. If an application attempts to decompress a Huffman-coded JPEG image whose
|
|
||||||
header does not contain Huffman tables, libjpeg-turbo will now insert the
|
|
||||||
default Huffman tables. In order to save space, many motion JPEG video frames
|
|
||||||
are encoded without the default Huffman tables, so these frames can now be
|
|
||||||
successfully decompressed by libjpeg-turbo without additional work on the part
|
|
||||||
of the application. An application can still override the Huffman tables, for
|
|
||||||
instance to re-use tables from a previous frame of the same video.
|
|
||||||
|
|
||||||
4. The Mac packaging system now uses pkgbuild and productbuild rather than
|
|
||||||
PackageMaker (which is obsolete and no longer supported.) This means that
|
|
||||||
OS X 10.6 "Snow Leopard" or later must be used when packaging libjpeg-turbo,
|
|
||||||
although the packages produced can be installed on OS X 10.5 "Leopard" or
|
|
||||||
later. OS X 10.4 "Tiger" is no longer supported.
|
|
||||||
|
|
||||||
5. The Huffman encoder now uses `clz` and `bsr` instructions for bit counting
|
|
||||||
on ARM platforms rather than a lookup table. This reduces the memory footprint
|
|
||||||
by 64k, which may be important for some mobile applications. Out of four
|
|
||||||
Android devices that were tested, two demonstrated a small overall performance
|
|
||||||
loss (~3-4% on average) with ARMv6 code and a small gain (also ~3-4%) with
|
|
||||||
ARMv7 code when enabling this new feature, but the other two devices
|
|
||||||
demonstrated a significant overall performance gain with both ARMv6 and ARMv7
|
|
||||||
code (~10-20%) when enabling the feature. Actual mileage may vary.
|
|
||||||
|
|
||||||
6. Worked around an issue with Visual C++ 2010 and later that caused incorrect
|
|
||||||
pixels to be generated when decompressing a JPEG image to a 256-color bitmap,
|
|
||||||
if compiler optimization was enabled when libjpeg-turbo was built. This caused
|
|
||||||
the regression tests to fail when doing a release build under Visual C++ 2010
|
|
||||||
and later.
|
|
||||||
|
|
||||||
7. Improved the accuracy and performance of the non-SIMD implementation of the
|
|
||||||
floating point inverse DCT (using code borrowed from libjpeg v8a and later.)
|
|
||||||
The accuracy of this implementation now matches the accuracy of the SSE/SSE2
|
|
||||||
implementation. Note, however, that the floating point DCT/IDCT algorithms are
|
|
||||||
mainly a legacy feature. They generally do not produce significantly better
|
|
||||||
accuracy than the slow integer DCT/IDCT algorithms, and they are quite a bit
|
|
||||||
slower.
|
|
||||||
|
|
||||||
8. Added a new output colorspace (`JCS_RGB565`) to the libjpeg API that allows
|
|
||||||
for decompressing JPEG images into RGB565 (16-bit) pixels. If dithering is not
|
|
||||||
used, then this code path is SIMD-accelerated on ARM platforms.
|
|
||||||
|
|
||||||
9. Numerous obsolete features, such as support for non-ANSI compilers and
|
|
||||||
support for the MS-DOS memory model, were removed from the libjpeg code,
|
|
||||||
greatly improving its readability and making it easier to maintain and extend.
|
|
||||||
|
|
||||||
10. Fixed a segfault that occurred when calling `output_message()` with
|
|
||||||
`msg_code` set to `JMSG_COPYRIGHT`.
|
|
||||||
|
|
||||||
11. Fixed an issue whereby wrjpgcom was allowing comments longer than 65k
|
|
||||||
characters to be passed on the command line, which was causing it to generate
|
|
||||||
incorrect JPEG files.
|
|
||||||
|
|
||||||
12. Fixed a bug in the build system that was causing the Windows version of
|
|
||||||
wrjpgcom to be built using the rdjpgcom source code.
|
|
||||||
|
|
||||||
13. Restored 12-bit-per-component JPEG support. A 12-bit version of
|
|
||||||
libjpeg-turbo can now be built by passing an argument of `--with-12bit` to
|
|
||||||
configure (Unix) or `-DWITH_12BIT=1` to cmake (Windows.) 12-bit JPEG support
|
|
||||||
is included only for convenience. Enabling this feature disables all of the
|
|
||||||
performance features in libjpeg-turbo, as well as arithmetic coding and the
|
|
||||||
TurboJPEG API. The resulting library still contains the other libjpeg-turbo
|
|
||||||
features (such as the colorspace extensions), but in general, it performs no
|
|
||||||
faster than libjpeg v6b.
|
|
||||||
|
|
||||||
14. Added ARM 64-bit SIMD acceleration for the YCC-to-RGB color conversion
|
|
||||||
and IDCT algorithms (both are used during JPEG decompression.) For unknown
|
|
||||||
reasons (probably related to clang), this code cannot currently be compiled for
|
|
||||||
iOS.
|
|
||||||
|
|
||||||
15. Fixed an extremely rare bug that could cause the Huffman encoder's local
|
|
||||||
buffer to overrun when a very high-frequency MCU is compressed using quality
|
|
||||||
100 and no subsampling, and when the JPEG output buffer is being dynamically
|
|
||||||
resized by the destination manager. This issue was so rare that, even with a
|
|
||||||
test program specifically designed to make the bug occur (by injecting random
|
|
||||||
high-frequency YUV data into the compressor), it was reproducible only once in
|
|
||||||
about every 25 million iterations.
|
|
||||||
|
|
||||||
16. Fixed an oversight in the TurboJPEG C wrapper: if any of the JPEG
|
|
||||||
compression functions was called repeatedly with the same
|
|
||||||
automatically-allocated destination buffer, then TurboJPEG would erroneously
|
|
||||||
assume that the `jpegSize` parameter was equal to the size of the buffer, when
|
|
||||||
in fact that parameter was probably equal to the size of the most recently
|
|
||||||
compressed JPEG image. If the size of the previous JPEG image was not as large
|
|
||||||
as the current JPEG image, then TurboJPEG would unnecessarily reallocate the
|
|
||||||
destination buffer.
|
|
||||||
|
|
||||||
|
|
||||||
1.3.1
|
|
||||||
=====
|
|
||||||
|
|
||||||
### Significant changes relative to 1.3.0:
|
|
||||||
|
|
||||||
1. On Un*x systems, `make install` now installs the libjpeg-turbo libraries
|
|
||||||
into /opt/libjpeg-turbo/lib32 by default on any 32-bit system, not just x86,
|
|
||||||
and into /opt/libjpeg-turbo/lib64 by default on any 64-bit system, not just
|
|
||||||
x86-64. You can override this by overriding either the `prefix` or `libdir`
|
|
||||||
configure variables.
|
|
||||||
|
|
||||||
2. The Windows installer now places a copy of the TurboJPEG DLLs in the same
|
|
||||||
directory as the rest of the libjpeg-turbo binaries. This was mainly done
|
|
||||||
to support TurboVNC 1.3, which bundles the DLLs in its Windows installation.
|
|
||||||
When using a 32-bit version of CMake on 64-bit Windows, it is impossible to
|
|
||||||
access the c:\WINDOWS\system32 directory, which made it impossible for the
|
|
||||||
TurboVNC build scripts to bundle the 64-bit TurboJPEG DLL.
|
|
||||||
|
|
||||||
3. Fixed a bug whereby attempting to encode a progressive JPEG with arithmetic
|
|
||||||
entropy coding (by passing arguments of `-progressive -arithmetic` to cjpeg or
|
|
||||||
jpegtran, for instance) would result in an error, `Requested feature was
|
|
||||||
omitted at compile time`.
|
|
||||||
|
|
||||||
4. Fixed a couple of issues whereby malformed JPEG images would cause
|
|
||||||
libjpeg-turbo to use uninitialized memory during decompression.
|
|
||||||
|
|
||||||
5. Fixed an error (`Buffer passed to JPEG library is too small`) that occurred
|
|
||||||
when calling the TurboJPEG YUV encoding function with a very small (< 5x5)
|
|
||||||
source image, and added a unit test to check for this error.
|
|
||||||
|
|
||||||
6. The Java classes should now build properly under Visual Studio 2010 and
|
|
||||||
later.
|
|
||||||
|
|
||||||
7. Fixed an issue that prevented SRPMs generated using the in-tree packaging
|
|
||||||
tools from being rebuilt on certain newer Linux distributions.
|
|
||||||
|
|
||||||
8. Numerous minor fixes to eliminate compilation and build/packaging system
|
|
||||||
warnings, fix cosmetic issues, improve documentation clarity, and other general
|
|
||||||
source cleanup.
|
|
||||||
|
|
||||||
|
|
||||||
1.3.0
|
|
||||||
=====
|
|
||||||
|
|
||||||
### Significant changes relative to 1.3 beta1:
|
|
||||||
|
|
||||||
1. `make test` now works properly on FreeBSD, and it no longer requires the
|
|
||||||
md5sum executable to be present on other Un*x platforms.
|
|
||||||
|
|
||||||
2. Overhauled the packaging system:
|
|
||||||
|
|
||||||
- To avoid conflict with vendor-supplied libjpeg-turbo packages, the
|
|
||||||
official RPMs and DEBs for libjpeg-turbo have been renamed to
|
|
||||||
"libjpeg-turbo-official".
|
|
||||||
- The TurboJPEG libraries are now located under /opt/libjpeg-turbo in the
|
|
||||||
official Linux and Mac packages, to avoid conflict with vendor-supplied
|
|
||||||
packages and also to streamline the packaging system.
|
|
||||||
- Release packages are now created with the directory structure defined
|
|
||||||
by the configure variables `prefix`, `bindir`, `libdir`, etc. (Un\*x) or by the
|
|
||||||
`CMAKE_INSTALL_PREFIX` variable (Windows.) The exception is that the docs are
|
|
||||||
always located under the system default documentation directory on Un\*x and
|
|
||||||
Mac systems, and on Windows, the TurboJPEG DLL is always located in the Windows
|
|
||||||
system directory.
|
|
||||||
- To avoid confusion, official libjpeg-turbo packages on Linux/Unix
|
|
||||||
platforms (except for Mac) will always install the 32-bit libraries in
|
|
||||||
/opt/libjpeg-turbo/lib32 and the 64-bit libraries in /opt/libjpeg-turbo/lib64.
|
|
||||||
- Fixed an issue whereby, in some cases, the libjpeg-turbo executables on
|
|
||||||
Un*x systems were not properly linking with the shared libraries installed by
|
|
||||||
the same package.
|
|
||||||
- Fixed an issue whereby building the "installer" target on Windows when
|
|
||||||
`WITH_JAVA=1` would fail if the TurboJPEG JAR had not been previously built.
|
|
||||||
- Building the "install" target on Windows now installs files into the
|
|
||||||
same places that the installer does.
|
|
||||||
|
|
||||||
3. Fixed a Huffman encoder bug that prevented I/O suspension from working
|
|
||||||
properly.
|
|
||||||
|
|
||||||
|
|
||||||
1.2.90 (1.3 beta1)
|
|
||||||
==================
|
|
||||||
|
|
||||||
### Significant changes relative to 1.2.1:
|
|
||||||
|
|
||||||
1. Added support for additional scaling factors (3/8, 5/8, 3/4, 7/8, 9/8, 5/4,
|
|
||||||
11/8, 3/2, 13/8, 7/4, 15/8, and 2) when decompressing. Note that the IDCT will
|
|
||||||
not be SIMD-accelerated when using any of these new scaling factors.
|
|
||||||
|
|
||||||
2. The TurboJPEG dynamic library is now versioned. It was not strictly
|
|
||||||
necessary to do so, because TurboJPEG uses versioned symbols, and if a function
|
|
||||||
changes in an ABI-incompatible way, that function is renamed and a legacy
|
|
||||||
function is provided to maintain backward compatibility. However, certain
|
|
||||||
Linux distro maintainers have a policy against accepting any library that isn't
|
|
||||||
versioned.
|
|
||||||
|
|
||||||
3. Extended the TurboJPEG Java API so that it can be used to compress a JPEG
|
|
||||||
image from and decompress a JPEG image to an arbitrary position in a large
|
|
||||||
image buffer.
|
|
||||||
|
|
||||||
4. The `tjDecompressToYUV()` function now supports the `TJFLAG_FASTDCT` flag.
|
|
||||||
|
|
||||||
5. The 32-bit supplementary package for amd64 Debian systems now provides
|
|
||||||
symlinks in /usr/lib/i386-linux-gnu for the TurboJPEG libraries in /usr/lib32.
|
|
||||||
This allows those libraries to be used on MultiArch-compatible systems (such as
|
|
||||||
Ubuntu 11 and later) without setting the linker path.
|
|
||||||
|
|
||||||
6. The TurboJPEG Java wrapper should now find the JNI library on Mac systems
|
|
||||||
without having to pass `-Djava.library.path=/usr/lib` to java.
|
|
||||||
|
|
||||||
7. TJBench has been ported to Java to provide a convenient way of validating
|
|
||||||
the performance of the TurboJPEG Java API. It can be run with
|
|
||||||
`java -cp turbojpeg.jar TJBench`.
|
|
||||||
|
|
||||||
8. cjpeg can now be used to generate JPEG files with the RGB colorspace
|
|
||||||
(feature ported from jpeg-8d.)
|
|
||||||
|
|
||||||
9. The width and height in the `-crop` argument passed to jpegtran can now be
|
|
||||||
suffixed with `f` to indicate that, when the upper left corner of the cropping
|
|
||||||
region is automatically moved to the nearest iMCU boundary, the bottom right
|
|
||||||
corner should be moved by the same amount. In other words, this feature causes
|
|
||||||
jpegtran to strictly honor the specified width/height rather than the specified
|
|
||||||
bottom right corner (feature ported from jpeg-8d.)
|
|
||||||
|
|
||||||
10. JPEG files using the RGB colorspace can now be decompressed into grayscale
|
|
||||||
images (feature ported from jpeg-8d.)
|
|
||||||
|
|
||||||
11. Fixed a regression caused by 1.2.1[7] whereby the build would fail with
|
|
||||||
multiple "Mismatch in operand sizes" errors when attempting to build the x86
|
|
||||||
SIMD code with NASM 0.98.
|
|
||||||
|
|
||||||
12. The in-memory source/destination managers (`jpeg_mem_src()` and
|
|
||||||
`jpeg_mem_dest()`) are now included by default when building libjpeg-turbo with
|
|
||||||
libjpeg v6b or v7 emulation, so that programs can take advantage of these
|
|
||||||
functions without requiring the use of the backward-incompatible libjpeg v8
|
|
||||||
ABI. The "age number" of the libjpeg-turbo library on Un*x systems has been
|
|
||||||
incremented by 1 to reflect this. You can disable this feature with a
|
|
||||||
configure/CMake switch in order to retain strict API/ABI compatibility with the
|
|
||||||
libjpeg v6b or v7 API/ABI (or with previous versions of libjpeg-turbo.) See
|
|
||||||
[README.md](README.md) for more details.
|
|
||||||
|
|
||||||
13. Added ARMv7s architecture to libjpeg.a and libturbojpeg.a in the official
|
|
||||||
libjpeg-turbo binary package for OS X, so that those libraries can be used to
|
|
||||||
build applications that leverage the faster CPUs in the iPhone 5 and iPad 4.
|
|
||||||
|
|
||||||
|
|
||||||
1.2.1
|
|
||||||
=====
|
|
||||||
|
|
||||||
### Significant changes relative to 1.2.0:
|
|
||||||
|
|
||||||
1. Creating or decoding a JPEG file that uses the RGB colorspace should now
|
|
||||||
properly work when the input or output colorspace is one of the libjpeg-turbo
|
|
||||||
colorspace extensions.
|
|
||||||
|
|
||||||
2. When libjpeg-turbo was built without SIMD support and merged (non-fancy)
|
|
||||||
upsampling was used along with an alpha-enabled colorspace during
|
|
||||||
decompression, the unused byte of the decompressed pixels was not being set to
|
|
||||||
0xFF. This has been fixed. TJUnitTest has also been extended to test for the
|
|
||||||
correct behavior of the colorspace extensions when merged upsampling is used.
|
|
||||||
|
|
||||||
3. Fixed a bug whereby the libjpeg-turbo SSE2 SIMD code would not preserve the
|
|
||||||
upper 64 bits of xmm6 and xmm7 on Win64 platforms, which violated the Win64
|
|
||||||
calling conventions.
|
|
||||||
|
|
||||||
4. Fixed a regression caused by 1.2.0[6] whereby decompressing corrupt JPEG
|
|
||||||
images (specifically, images in which the component count was erroneously set
|
|
||||||
to a large value) would cause libjpeg-turbo to segfault.
|
|
||||||
|
|
||||||
5. Worked around a severe performance issue with "Bobcat" (AMD Embedded APU)
|
|
||||||
processors. The `MASKMOVDQU` instruction, which was used by the libjpeg-turbo
|
|
||||||
SSE2 SIMD code, is apparently implemented in microcode on AMD processors, and
|
|
||||||
it is painfully slow on Bobcat processors in particular. Eliminating the use
|
|
||||||
of this instruction improved performance by an order of magnitude on Bobcat
|
|
||||||
processors and by a small amount (typically 5%) on AMD desktop processors.
|
|
||||||
|
|
||||||
6. Added SIMD acceleration for performing 4:2:2 upsampling on NEON-capable ARM
|
|
||||||
platforms. This speeds up the decompression of 4:2:2 JPEGs by 20-25% on such
|
|
||||||
platforms.
|
|
||||||
|
|
||||||
7. Fixed a regression caused by 1.2.0[2] whereby, on Linux/x86 platforms
|
|
||||||
running the 32-bit SSE2 SIMD code in libjpeg-turbo, decompressing a 4:2:0 or
|
|
||||||
4:2:2 JPEG image into a 32-bit (RGBX, BGRX, etc.) buffer without using fancy
|
|
||||||
upsampling would produce several incorrect columns of pixels at the right-hand
|
|
||||||
side of the output image if each row in the output image was not evenly
|
|
||||||
divisible by 16 bytes.
|
|
||||||
|
|
||||||
8. Fixed an issue whereby attempting to build the SIMD extensions with Xcode
|
|
||||||
4.3 on OS X platforms would cause NASM to return numerous errors of the form
|
|
||||||
"'%define' expects a macro identifier".
|
|
||||||
|
|
||||||
9. Added flags to the TurboJPEG API that allow the caller to force the use of
|
|
||||||
either the fast or the accurate DCT/IDCT algorithms in the underlying codec.
|
|
||||||
|
|
||||||
|
|
||||||
1.2.0
|
|
||||||
=====
|
|
||||||
|
|
||||||
### Significant changes relative to 1.2 beta1:
|
|
||||||
|
|
||||||
1. Fixed build issue with YASM on Unix systems (the libjpeg-turbo build system
|
|
||||||
was not adding the current directory to the assembler include path, so YASM
|
|
||||||
was not able to find jsimdcfg.inc.)
|
|
||||||
|
|
||||||
2. Fixed out-of-bounds read in SSE2 SIMD code that occurred when decompressing
|
|
||||||
a JPEG image to a bitmap buffer whose size was not a multiple of 16 bytes.
|
|
||||||
This was more of an annoyance than an actual bug, since it did not cause any
|
|
||||||
actual run-time problems, but the issue showed up when running libjpeg-turbo in
|
|
||||||
valgrind. See <http://crbug.com/72399> for more information.
|
|
||||||
|
|
||||||
3. Added a compile-time macro (`LIBJPEG_TURBO_VERSION`) that can be used to
|
|
||||||
check the version of libjpeg-turbo against which an application was compiled.
|
|
||||||
|
|
||||||
4. Added new RGBA/BGRA/ABGR/ARGB colorspace extension constants (libjpeg API)
|
|
||||||
and pixel formats (TurboJPEG API), which allow applications to specify that,
|
|
||||||
when decompressing to a 4-component RGB buffer, the unused byte should be set
|
|
||||||
to 0xFF so that it can be interpreted as an opaque alpha channel.
|
|
||||||
|
|
||||||
5. Fixed regression issue whereby DevIL failed to build against libjpeg-turbo
|
|
||||||
because libjpeg-turbo's distributed version of jconfig.h contained an `INLINE`
|
|
||||||
macro, which conflicted with a similar macro in DevIL. This macro is used only
|
|
||||||
internally when building libjpeg-turbo, so it was moved into config.h.
|
|
||||||
|
|
||||||
6. libjpeg-turbo will now correctly decompress erroneous CMYK/YCCK JPEGs whose
|
|
||||||
K component is assigned a component ID of 1 instead of 4. Although these files
|
|
||||||
are in violation of the spec, other JPEG implementations handle them
|
|
||||||
correctly.
|
|
||||||
|
|
||||||
7. Added ARMv6 and ARMv7 architectures to libjpeg.a and libturbojpeg.a in
|
|
||||||
the official libjpeg-turbo binary package for OS X, so that those libraries can
|
|
||||||
be used to build both OS X and iOS applications.
|
|
||||||
|
|
||||||
|
|
||||||
1.1.90 (1.2 beta1)
|
|
||||||
==================
|
|
||||||
|
|
||||||
### Significant changes relative to 1.1.1:
|
|
||||||
|
|
||||||
1. Added a Java wrapper for the TurboJPEG API. See [java/README](java/README)
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
2. The TurboJPEG API can now be used to scale down images during
|
|
||||||
decompression.
|
|
||||||
|
|
||||||
3. Added SIMD routines for RGB-to-grayscale color conversion, which
|
|
||||||
significantly improves the performance of grayscale JPEG compression from an
|
|
||||||
RGB source image.
|
|
||||||
|
|
||||||
4. Improved the performance of the C color conversion routines, which are used
|
|
||||||
on platforms for which SIMD acceleration is not available.
|
|
||||||
|
|
||||||
5. Added a function to the TurboJPEG API that performs lossless transforms.
|
|
||||||
This function is implemented using the same back end as jpegtran, but it
|
|
||||||
performs transcoding entirely in memory and allows multiple transforms and/or
|
|
||||||
crop operations to be batched together, so the source coefficients only need to
|
|
||||||
be read once. This is useful when generating image tiles from a single source
|
|
||||||
JPEG.
|
|
||||||
|
|
||||||
6. Added tests for the new TurboJPEG scaled decompression and lossless
|
|
||||||
transform features to tjbench (the TurboJPEG benchmark, formerly called
|
|
||||||
"jpgtest".)
|
|
||||||
|
|
||||||
7. Added support for 4:4:0 (transposed 4:2:2) subsampling in TurboJPEG, which
|
|
||||||
was necessary in order for it to read 4:2:2 JPEG files that had been losslessly
|
|
||||||
transposed or rotated 90 degrees.
|
|
||||||
|
|
||||||
8. All legacy VirtualGL code has been re-factored, and this has allowed
|
|
||||||
libjpeg-turbo, in its entirety, to be re-licensed under a BSD-style license.
|
|
||||||
|
|
||||||
9. libjpeg-turbo can now be built with YASM.
|
|
||||||
|
|
||||||
10. Added SIMD acceleration for ARM Linux and iOS platforms that support
|
|
||||||
NEON instructions.
|
|
||||||
|
|
||||||
11. Refactored the TurboJPEG C API and documented it using Doxygen. The
|
|
||||||
TurboJPEG 1.2 API uses pixel formats to define the size and component order of
|
|
||||||
the uncompressed source/destination images, and it includes a more efficient
|
|
||||||
version of `TJBUFSIZE()` that computes a worst-case JPEG size based on the
|
|
||||||
level of chrominance subsampling. The refactored implementation of the
|
|
||||||
TurboJPEG API now uses the libjpeg memory source and destination managers,
|
|
||||||
which allows the TurboJPEG compressor to grow the JPEG buffer as necessary.
|
|
||||||
|
|
||||||
12. Eliminated errors in the output of jpegtran on Windows that occurred when
|
|
||||||
the application was invoked using I/O redirection
|
|
||||||
(`jpegtran <input.jpg >output.jpg`.)
|
|
||||||
|
|
||||||
13. The inclusion of libjpeg v7 and v8 emulation as well as arithmetic coding
|
|
||||||
support in libjpeg-turbo v1.1.0 introduced several new error constants in
|
|
||||||
jerror.h, and these were mistakenly enabled for all emulation modes, causing
|
|
||||||
the error enum in libjpeg-turbo to sometimes have different values than the
|
|
||||||
same enum in libjpeg. This represents an ABI incompatibility, and it caused
|
|
||||||
problems with rare applications that took specific action based on a particular
|
|
||||||
error value. The fix was to include the new error constants conditionally
|
|
||||||
based on whether libjpeg v7 or v8 emulation was enabled.
|
|
||||||
|
|
||||||
14. Fixed an issue whereby Windows applications that used libjpeg-turbo would
|
|
||||||
fail to compile if the Windows system headers were included before jpeglib.h.
|
|
||||||
This issue was caused by a conflict in the definition of the INT32 type.
|
|
||||||
|
|
||||||
15. Fixed 32-bit supplementary package for amd64 Debian systems, which was
|
|
||||||
broken by enhancements to the packaging system in 1.1.
|
|
||||||
|
|
||||||
16. When decompressing a JPEG image using an output colorspace of
|
|
||||||
`JCS_EXT_RGBX`, `JCS_EXT_BGRX`, `JCS_EXT_XBGR`, or `JCS_EXT_XRGB`,
|
|
||||||
libjpeg-turbo will now set the unused byte to 0xFF, which allows applications
|
|
||||||
to interpret that byte as an alpha channel (0xFF = opaque).
|
|
||||||
|
|
||||||
|
|
||||||
1.1.1
|
|
||||||
=====
|
|
||||||
|
|
||||||
### Significant changes relative to 1.1.0:
|
|
||||||
|
|
||||||
1. Fixed a 1-pixel error in row 0, column 21 of the luminance plane generated
|
|
||||||
by `tjEncodeYUV()`.
|
|
||||||
|
|
||||||
2. libjpeg-turbo's accelerated Huffman decoder previously ignored unexpected
|
|
||||||
markers found in the middle of the JPEG data stream during decompression. It
|
|
||||||
will now hand off decoding of a particular block to the unaccelerated Huffman
|
|
||||||
decoder if an unexpected marker is found, so that the unaccelerated Huffman
|
|
||||||
decoder can generate an appropriate warning.
|
|
||||||
|
|
||||||
3. Older versions of MinGW64 prefixed symbol names with underscores by
|
|
||||||
default, which differed from the behavior of 64-bit Visual C++. MinGW64 1.0
|
|
||||||
has adopted the behavior of 64-bit Visual C++ as the default, so to accommodate
|
|
||||||
this, the libjpeg-turbo SIMD function names are no longer prefixed with an
|
|
||||||
underscore when building with MinGW64. This means that, when building
|
|
||||||
libjpeg-turbo with older versions of MinGW64, you will now have to add
|
|
||||||
`-fno-leading-underscore` to the `CFLAGS`.
|
|
||||||
|
|
||||||
4. Fixed a regression bug in the NSIS script that caused the Windows installer
|
|
||||||
build to fail when using the Visual Studio IDE.
|
|
||||||
|
|
||||||
5. Fixed a bug in `jpeg_read_coefficients()` whereby it would not initialize
|
|
||||||
`cinfo->image_width` and `cinfo->image_height` if libjpeg v7 or v8 emulation
|
|
||||||
was enabled. This specifically caused the jpegoptim program to fail if it was
|
|
||||||
linked against a version of libjpeg-turbo that was built with libjpeg v7 or v8
|
|
||||||
emulation.
|
|
||||||
|
|
||||||
6. Eliminated excessive I/O overhead that occurred when reading BMP files in
|
|
||||||
cjpeg.
|
|
||||||
|
|
||||||
7. Eliminated errors in the output of cjpeg on Windows that occurred when the
|
|
||||||
application was invoked using I/O redirection (`cjpeg <inputfile >output.jpg`.)
|
|
||||||
|
|
||||||
|
|
||||||
1.1.0
|
|
||||||
=====
|
|
||||||
|
|
||||||
### Significant changes relative to 1.1 beta1:
|
|
||||||
|
|
||||||
1. The algorithm used by the SIMD quantization function cannot produce correct
|
|
||||||
results when the JPEG quality is >= 98 and the fast integer forward DCT is
|
|
||||||
used. Thus, the non-SIMD quantization function is now used for those cases,
|
|
||||||
and libjpeg-turbo should now produce identical output to libjpeg v6b in all
|
|
||||||
cases.
|
|
||||||
|
|
||||||
2. Despite the above, the fast integer forward DCT still degrades somewhat for
|
|
||||||
JPEG qualities greater than 95, so the TurboJPEG wrapper will now automatically
|
|
||||||
use the slow integer forward DCT when generating JPEG images of quality 96 or
|
|
||||||
greater. This reduces compression performance by as much as 15% for these
|
|
||||||
high-quality images but is necessary to ensure that the images are perceptually
|
|
||||||
lossless. It also ensures that the library can avoid the performance pitfall
|
|
||||||
created by [1].
|
|
||||||
|
|
||||||
3. Ported jpgtest.cxx to pure C to avoid the need for a C++ compiler.
|
|
||||||
|
|
||||||
4. Fixed visual artifacts in grayscale JPEG compression caused by a typo in
|
|
||||||
the RGB-to-luminance lookup tables.
|
|
||||||
|
|
||||||
5. The Windows distribution packages now include the libjpeg run-time programs
|
|
||||||
(cjpeg, etc.)
|
|
||||||
|
|
||||||
6. All packages now include jpgtest.
|
|
||||||
|
|
||||||
7. The TurboJPEG dynamic library now uses versioned symbols.
|
|
||||||
|
|
||||||
8. Added two new TurboJPEG API functions, `tjEncodeYUV()` and
|
|
||||||
`tjDecompressToYUV()`, to replace the somewhat hackish `TJ_YUV` flag.
|
|
||||||
|
|
||||||
|
|
||||||
1.0.90 (1.1 beta1)
|
|
||||||
==================
|
|
||||||
|
|
||||||
### Significant changes relative to 1.0.1:
|
|
||||||
|
|
||||||
1. Added emulation of the libjpeg v7 and v8 APIs and ABIs. See
|
|
||||||
[README.md](README.md) for more details. This feature was sponsored by
|
|
||||||
CamTrace SAS.
|
|
||||||
|
|
||||||
2. Created a new CMake-based build system for the Visual C++ and MinGW builds.
|
|
||||||
|
|
||||||
3. Grayscale bitmaps can now be compressed from/decompressed to using the
|
|
||||||
TurboJPEG API.
|
|
||||||
|
|
||||||
4. jpgtest can now be used to test decompression performance with existing
|
|
||||||
JPEG images.
|
|
||||||
|
|
||||||
5. If the default install prefix (/opt/libjpeg-turbo) is used, then
|
|
||||||
`make install` now creates /opt/libjpeg-turbo/lib32 and
|
|
||||||
/opt/libjpeg-turbo/lib64 sym links to duplicate the behavior of the binary
|
|
||||||
packages.
|
|
||||||
|
|
||||||
6. All symbols in the libjpeg-turbo dynamic library are now versioned, even
|
|
||||||
when the library is built with libjpeg v6b emulation.
|
|
||||||
|
|
||||||
7. Added arithmetic encoding and decoding support (can be disabled with
|
|
||||||
configure or CMake options)
|
|
||||||
|
|
||||||
8. Added a `TJ_YUV` flag to the TurboJPEG API, which causes both the compressor
|
|
||||||
and decompressor to output planar YUV images.
|
|
||||||
|
|
||||||
9. Added an extended version of `tjDecompressHeader()` to the TurboJPEG API,
|
|
||||||
which allows the caller to determine the type of subsampling used in a JPEG
|
|
||||||
image.
|
|
||||||
|
|
||||||
10. Added further protections against invalid Huffman codes.
|
|
||||||
|
|
||||||
|
|
||||||
1.0.1
|
|
||||||
=====
|
|
||||||
|
|
||||||
### Significant changes relative to 1.0.0:
|
|
||||||
|
|
||||||
1. The Huffman decoder will now handle erroneous Huffman codes (for instance,
|
|
||||||
from a corrupt JPEG image.) Previously, these would cause libjpeg-turbo to
|
|
||||||
crash under certain circumstances.
|
|
||||||
|
|
||||||
2. Fixed typo in SIMD dispatch routines that was causing 4:2:2 upsampling to
|
|
||||||
be used instead of 4:2:0 when decompressing JPEG images using SSE2 code.
|
|
||||||
|
|
||||||
3. The configure script will now automatically determine whether the
|
|
||||||
`INCOMPLETE_TYPES_BROKEN` macro should be defined.
|
|
||||||
|
|
||||||
|
|
||||||
1.0.0
|
|
||||||
=====
|
|
||||||
|
|
||||||
### Significant changes relative to 0.0.93:
|
|
||||||
|
|
||||||
1. 2983700: Further FreeBSD build tweaks (no longer necessary to specify
|
|
||||||
`--host` when configuring on a 64-bit system)
|
|
||||||
|
|
||||||
2. Created symlinks in the Unix/Linux packages so that the TurboJPEG
|
|
||||||
include file can always be found in /opt/libjpeg-turbo/include, the 32-bit
|
|
||||||
static libraries can always be found in /opt/libjpeg-turbo/lib32, and the
|
|
||||||
64-bit static libraries can always be found in /opt/libjpeg-turbo/lib64.
|
|
||||||
|
|
||||||
3. The Unix/Linux distribution packages now include the libjpeg run-time
|
|
||||||
programs (cjpeg, etc.) and man pages.
|
|
||||||
|
|
||||||
4. Created a 32-bit supplementary package for amd64 Debian systems, which
|
|
||||||
contains just the 32-bit libjpeg-turbo libraries.
|
|
||||||
|
|
||||||
5. Moved the libraries from */lib32 to */lib in the i386 Debian package.
|
|
||||||
|
|
||||||
6. Include distribution package for Cygwin
|
|
||||||
|
|
||||||
7. No longer necessary to specify `--without-simd` on non-x86 architectures,
|
|
||||||
and unit tests now work on those architectures.
|
|
||||||
|
|
||||||
|
|
||||||
0.0.93
|
|
||||||
======
|
|
||||||
|
|
||||||
### Significant changes since 0.0.91:
|
|
||||||
|
|
||||||
1. 2982659: Fixed x86-64 build on FreeBSD systems
|
|
||||||
|
|
||||||
2. 2988188: Added support for Windows 64-bit systems
|
|
||||||
|
|
||||||
|
|
||||||
0.0.91
|
|
||||||
======
|
|
||||||
|
|
||||||
### Significant changes relative to 0.0.90:
|
|
||||||
|
|
||||||
1. Added documentation to .deb packages
|
|
||||||
|
|
||||||
2. 2968313: Fixed data corruption issues when decompressing large JPEG images
|
|
||||||
and/or using buffered I/O with the libjpeg-turbo decompressor
|
|
||||||
|
|
||||||
|
|
||||||
0.0.90
|
|
||||||
======
|
|
||||||
|
|
||||||
Initial release
|
|
||||||
88
LICENSE.md
@@ -1,88 +0,0 @@
|
|||||||
libjpeg-turbo Licenses
|
|
||||||
======================
|
|
||||||
|
|
||||||
libjpeg-turbo is covered by three compatible BSD-style open source licenses:
|
|
||||||
|
|
||||||
- The IJG (Independent JPEG Group) License, which is listed in
|
|
||||||
[README.ijg](README.ijg)
|
|
||||||
|
|
||||||
This license applies to the libjpeg API library and associated programs
|
|
||||||
(any code inherited from libjpeg, and any modifications to that code.)
|
|
||||||
|
|
||||||
- The Modified (3-clause) BSD License, which is listed in
|
|
||||||
[turbojpeg.c](turbojpeg.c)
|
|
||||||
|
|
||||||
This license covers the TurboJPEG API library and associated programs.
|
|
||||||
|
|
||||||
- The zlib License, which is listed in [simd/jsimdext.inc](simd/jsimdext.inc)
|
|
||||||
|
|
||||||
This license is a subset of the other two, and it covers the libjpeg-turbo
|
|
||||||
SIMD extensions.
|
|
||||||
|
|
||||||
|
|
||||||
Complying with the libjpeg-turbo Licenses
|
|
||||||
=========================================
|
|
||||||
|
|
||||||
This section provides a roll-up of the libjpeg-turbo licensing terms, to the
|
|
||||||
best of our understanding.
|
|
||||||
|
|
||||||
1. If you are distributing a modified version of the libjpeg-turbo source,
|
|
||||||
then:
|
|
||||||
|
|
||||||
1. You cannot alter or remove any existing copyright or license notices
|
|
||||||
from the source.
|
|
||||||
|
|
||||||
**Origin**
|
|
||||||
- Clause 1 of the IJG License
|
|
||||||
- Clause 1 of the Modified BSD License
|
|
||||||
- Clauses 1 and 3 of the zlib License
|
|
||||||
|
|
||||||
2. You must add your own copyright notice to the header of each source
|
|
||||||
file you modified, so others can tell that you modified that file (if
|
|
||||||
there is not an existing copyright header in that file, then you can
|
|
||||||
simply add a notice stating that you modified the file.)
|
|
||||||
|
|
||||||
**Origin**
|
|
||||||
- Clause 1 of the IJG License
|
|
||||||
- Clause 2 of the zlib License
|
|
||||||
|
|
||||||
3. You must include the IJG README file, and you must not alter any of the
|
|
||||||
copyright or license text in that file.
|
|
||||||
|
|
||||||
**Origin**
|
|
||||||
- Clause 1 of the IJG License
|
|
||||||
|
|
||||||
2. If you are distributing only libjpeg-turbo binaries without the source, or
|
|
||||||
if you are distributing an application that statically links with
|
|
||||||
libjpeg-turbo, then:
|
|
||||||
|
|
||||||
1. Your product documentation must include a message stating:
|
|
||||||
|
|
||||||
This software is based in part on the work of the Independent JPEG
|
|
||||||
Group.
|
|
||||||
|
|
||||||
**Origin**
|
|
||||||
- Clause 2 of the IJG license
|
|
||||||
|
|
||||||
2. If your binary distribution includes or uses the TurboJPEG API, then
|
|
||||||
your product documentation must include the text of the Modified BSD
|
|
||||||
License.
|
|
||||||
|
|
||||||
**Origin**
|
|
||||||
- Clause 2 of the Modified BSD License
|
|
||||||
|
|
||||||
3. You cannot use the name of the IJG or The libjpeg-turbo Project or the
|
|
||||||
contributors thereof in advertising, publicity, etc.
|
|
||||||
|
|
||||||
**Origin**
|
|
||||||
- IJG License
|
|
||||||
- Clause 3 of the Modified BSD License
|
|
||||||
|
|
||||||
4. The IJG and The libjpeg-turbo Project do not warrant libjpeg-turbo to be
|
|
||||||
free of defects, nor do we accept any liability for undesirable
|
|
||||||
consequences resulting from your use of the software.
|
|
||||||
|
|
||||||
**Origin**
|
|
||||||
- IJG License
|
|
||||||
- Modified BSD License
|
|
||||||
- zlib License
|
|
||||||
894
Makefile.am
@@ -1,792 +1,138 @@
|
|||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
#
|
||||||
|
# Automake Makefile for the JPEG library
|
||||||
|
#
|
||||||
|
# This file is written by Bob Friesenhahn, Guido Vollbeding
|
||||||
|
#
|
||||||
|
|
||||||
|
# Sources to build library
|
||||||
|
LIBSOURCES = jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \
|
||||||
|
jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \
|
||||||
|
jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \
|
||||||
|
jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \
|
||||||
|
jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \
|
||||||
|
jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \
|
||||||
|
jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \
|
||||||
|
jquant2.c jutils.c jmemmgr.c @MEMORYMGR@.c
|
||||||
|
|
||||||
|
# System dependent sources
|
||||||
|
SYSDEPSOURCES = jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c
|
||||||
|
|
||||||
|
# Headers which are installed to support the library
|
||||||
|
INSTINCLUDES = jerror.h jmorecfg.h jpeglib.h
|
||||||
|
|
||||||
|
# Headers which are not installed
|
||||||
|
OTHERINCLUDES = cderror.h cdjpeg.h jdct.h jinclude.h jmemsys.h jpegint.h \
|
||||||
|
jversion.h transupp.h
|
||||||
|
|
||||||
|
# Manual pages (Automake uses 'MANS' for itself)
|
||||||
|
DISTMANS= cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 wrjpgcom.1
|
||||||
|
|
||||||
|
# Other documentation files
|
||||||
|
DOCS= README install.txt usage.txt wizard.txt example.c libjpeg.txt \
|
||||||
|
structure.txt coderules.txt filelist.txt change.log
|
||||||
|
|
||||||
|
# Makefiles for various systems
|
||||||
|
MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.b32 \
|
||||||
|
makefile.bcc makefile.mc6 makefile.dj makefile.wat makefile.vc \
|
||||||
|
makefile.vs makejdsw.vc6 makeadsw.vc6 makejdep.vc6 makejdsp.vc6 \
|
||||||
|
makejmak.vc6 makecdep.vc6 makecdsp.vc6 makecmak.vc6 makeddep.vc6 \
|
||||||
|
makeddsp.vc6 makedmak.vc6 maketdep.vc6 maketdsp.vc6 maketmak.vc6 \
|
||||||
|
makerdep.vc6 makerdsp.vc6 makermak.vc6 makewdep.vc6 makewdsp.vc6 \
|
||||||
|
makewmak.vc6 makejsln.v15 makeasln.v15 makejvcx.v15 makejfil.v15 \
|
||||||
|
makecvcx.v15 makecfil.v15 makedvcx.v15 makedfil.v15 maketvcx.v15 \
|
||||||
|
maketfil.v15 makervcx.v15 makerfil.v15 makewvcx.v15 makewfil.v15 \
|
||||||
|
makeproj.mac makcjpeg.st makdjpeg.st makljpeg.st maktjpeg.st \
|
||||||
|
makefile.manx makefile.sas makefile.mms makefile.vms makvms.opt
|
||||||
|
|
||||||
|
# Configuration files
|
||||||
|
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
|
||||||
|
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
|
||||||
|
jconfig.vms
|
||||||
|
|
||||||
|
# Support scripts for configure
|
||||||
|
CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp \
|
||||||
|
missing ar-lib
|
||||||
|
|
||||||
|
# Miscellaneous support files
|
||||||
|
OTHERFILES= jconfig.txt ckconfig.c jmemdosa.asm libjpeg.map libjpeg.pc.in
|
||||||
|
|
||||||
|
# Test support files
|
||||||
|
TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \
|
||||||
|
testimgp.jpg
|
||||||
|
|
||||||
|
# libtool libraries to build
|
||||||
lib_LTLIBRARIES = libjpeg.la
|
lib_LTLIBRARIES = libjpeg.la
|
||||||
libjpeg_la_LDFLAGS = -version-info ${LIBTOOL_CURRENT}:${SO_MINOR_VERSION}:${SO_AGE} -no-undefined
|
|
||||||
include_HEADERS = jerror.h jmorecfg.h jpeglib.h
|
|
||||||
|
|
||||||
if WITH_TURBOJPEG
|
# Library sources for libjpeg.la
|
||||||
lib_LTLIBRARIES += libturbojpeg.la
|
libjpeg_la_SOURCES = $(LIBSOURCES)
|
||||||
libturbojpeg_la_LDFLAGS = -version-info 1:0:1 -no-undefined
|
|
||||||
include_HEADERS += turbojpeg.h
|
# LDFLAGS for libjpeg.la
|
||||||
|
libjpeg_la_LDFLAGS = -no-undefined \
|
||||||
|
-version-info $(JPEG_LIB_VERSION)
|
||||||
|
|
||||||
|
if HAVE_LD_VERSION_SCRIPT
|
||||||
|
libjpeg_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libjpeg.map
|
||||||
endif
|
endif
|
||||||
|
|
||||||
nodist_include_HEADERS = jconfig.h
|
# Executables to build
|
||||||
|
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
|
||||||
pkgconfig_DATA = pkgscripts/libjpeg.pc pkgscripts/libturbojpeg.pc
|
|
||||||
|
|
||||||
HDRS = jchuff.h jcmaster.h jdct.h jdhuff.h jerror.h jinclude.h jmemsys.h \
|
|
||||||
jmorecfg.h jpegint.h jpeglib.h jversion.h jsimd.h jsimddct.h jpegcomp.h \
|
|
||||||
jpeg_nbits_table.h
|
|
||||||
|
|
||||||
libjpeg_la_SOURCES = $(HDRS) jcapimin.c jcapistd.c jccoefct.c jccolor.c \
|
|
||||||
jcdctmgr.c jcext.c jchuff.c jcinit.c jcmainct.c jcmarker.c \
|
|
||||||
jcmaster.c jcomapi.c jcparam.c jcphuff.c jcprepct.c jcsample.c \
|
|
||||||
jctrans.c jdapimin.c jdapistd.c jdatadst.c jdatasrc.c jdcoefct.c \
|
|
||||||
jdcolor.c jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c \
|
|
||||||
jdmaster.c jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c \
|
|
||||||
jerror.c jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c \
|
|
||||||
jidctint.c jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c
|
|
||||||
|
|
||||||
if WITH_ARITH
|
|
||||||
libjpeg_la_SOURCES += jaricom.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
if WITH_ARITH_ENC
|
|
||||||
libjpeg_la_SOURCES += jcarith.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
if WITH_ARITH_DEC
|
|
||||||
libjpeg_la_SOURCES += jdarith.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
SUBDIRS = java
|
|
||||||
|
|
||||||
|
|
||||||
if WITH_TURBOJPEG
|
|
||||||
|
|
||||||
libturbojpeg_la_SOURCES = $(libjpeg_la_SOURCES) turbojpeg.c turbojpeg.h \
|
|
||||||
transupp.c transupp.h jdatadst-tj.c jdatasrc-tj.c
|
|
||||||
|
|
||||||
if WITH_JAVA
|
|
||||||
|
|
||||||
libturbojpeg_la_SOURCES += turbojpeg-jni.c
|
|
||||||
libturbojpeg_la_CFLAGS = ${JNI_CFLAGS}
|
|
||||||
TJMAPFILE = turbojpeg-mapfile.jni
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
TJMAPFILE = turbojpeg-mapfile
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
libturbojpeg_la_SOURCES += $(TJMAPFILE)
|
|
||||||
|
|
||||||
if VERSION_SCRIPT
|
|
||||||
libturbojpeg_la_LDFLAGS += $(VERSION_SCRIPT_FLAG)$(srcdir)/$(TJMAPFILE)
|
|
||||||
endif
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
if VERSION_SCRIPT
|
|
||||||
libjpeg_la_LDFLAGS += $(VERSION_SCRIPT_FLAG)libjpeg.map
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
if WITH_SIMD
|
|
||||||
|
|
||||||
SUBDIRS += simd
|
|
||||||
libjpeg_la_LIBADD = simd/libsimd.la
|
|
||||||
libturbojpeg_la_LIBADD = simd/libsimd.la
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
libjpeg_la_SOURCES += jsimd_none.c
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
bin_PROGRAMS = cjpeg djpeg jpegtran rdjpgcom wrjpgcom
|
bin_PROGRAMS = cjpeg djpeg jpegtran rdjpgcom wrjpgcom
|
||||||
noinst_PROGRAMS = jcstest jpegyuv yuvjpeg
|
|
||||||
|
|
||||||
|
|
||||||
if WITH_TURBOJPEG
|
|
||||||
|
|
||||||
bin_PROGRAMS += tjbench
|
|
||||||
|
|
||||||
noinst_PROGRAMS += tjunittest
|
|
||||||
|
|
||||||
tjbench_SOURCES = tjbench.c bmp.h bmp.c tjutil.h tjutil.c rdbmp.c rdppm.c \
|
|
||||||
wrbmp.c wrppm.c
|
|
||||||
|
|
||||||
tjbench_LDADD = libturbojpeg.la libjpeg.la -lm
|
|
||||||
|
|
||||||
tjbench_CFLAGS = -DBMP_SUPPORTED -DPPM_SUPPORTED
|
|
||||||
|
|
||||||
tjunittest_SOURCES = tjunittest.c tjutil.h tjutil.c
|
|
||||||
|
|
||||||
tjunittest_LDADD = libturbojpeg.la
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
cjpeg_SOURCES = cdjpeg.h cderror.h cdjpeg.c cjpeg.c rdgif.c rdppm.c rdswitch.c rdjpeg.c
|
|
||||||
if WITH_12BIT
|
|
||||||
else
|
|
||||||
cjpeg_SOURCES += rdbmp.c rdtarga.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
cjpeg_LDADD = libjpeg.la
|
|
||||||
|
|
||||||
cjpeg_CFLAGS = -DGIF_SUPPORTED -DPPM_SUPPORTED
|
|
||||||
if WITH_12BIT
|
|
||||||
else
|
|
||||||
cjpeg_CFLAGS += -DBMP_SUPPORTED -DTARGA_SUPPORTED
|
|
||||||
endif
|
|
||||||
|
|
||||||
if HAVE_LIBPNG
|
|
||||||
cjpeg_CFLAGS += -DPNG_SUPPORTED $(libpng_CFLAGS)
|
|
||||||
cjpeg_LDADD += $(libpng_LIBS)
|
|
||||||
cjpeg_SOURCES += rdpng.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
djpeg_SOURCES = cdjpeg.h cderror.h cdjpeg.c djpeg.c rdcolmap.c rdswitch.c \
|
|
||||||
wrgif.c wrppm.c
|
|
||||||
if WITH_12BIT
|
|
||||||
else
|
|
||||||
djpeg_SOURCES += wrbmp.c wrtarga.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
djpeg_LDADD = libjpeg.la
|
|
||||||
|
|
||||||
djpeg_CFLAGS = -DGIF_SUPPORTED -DPPM_SUPPORTED
|
|
||||||
if WITH_12BIT
|
|
||||||
else
|
|
||||||
djpeg_CFLAGS += -DBMP_SUPPORTED -DTARGA_SUPPORTED
|
|
||||||
endif
|
|
||||||
|
|
||||||
jpegtran_SOURCES = jpegtran.c rdswitch.c cdjpeg.c transupp.c transupp.h
|
|
||||||
|
|
||||||
jpegtran_LDADD = libjpeg.la
|
|
||||||
|
|
||||||
|
# Executable sources & libs
|
||||||
|
cjpeg_SOURCES = cjpeg.c rdppm.c rdgif.c rdtarga.c rdrle.c rdbmp.c \
|
||||||
|
rdswitch.c cdjpeg.c
|
||||||
|
cjpeg_LDADD = libjpeg.la
|
||||||
|
djpeg_SOURCES = djpeg.c wrppm.c wrgif.c wrtarga.c wrrle.c wrbmp.c \
|
||||||
|
rdcolmap.c cdjpeg.c
|
||||||
|
djpeg_LDADD = libjpeg.la
|
||||||
|
jpegtran_SOURCES = jpegtran.c rdswitch.c cdjpeg.c transupp.c
|
||||||
|
jpegtran_LDADD = libjpeg.la
|
||||||
rdjpgcom_SOURCES = rdjpgcom.c
|
rdjpgcom_SOURCES = rdjpgcom.c
|
||||||
|
|
||||||
rdjpgcom_LDADD = libjpeg.la
|
|
||||||
|
|
||||||
wrjpgcom_SOURCES = wrjpgcom.c
|
wrjpgcom_SOURCES = wrjpgcom.c
|
||||||
|
|
||||||
wrjpgcom_LDADD = libjpeg.la
|
# Manual pages to install
|
||||||
|
man_MANS = $(DISTMANS)
|
||||||
|
|
||||||
jcstest_SOURCES = jcstest.c
|
# Headers to install
|
||||||
|
include_HEADERS = $(INSTINCLUDES)
|
||||||
|
|
||||||
jcstest_LDADD = libjpeg.la
|
# Other distributed headers
|
||||||
|
noinst_HEADERS = $(OTHERINCLUDES)
|
||||||
|
|
||||||
jpegyuv_SOURCES = jpegyuv.c
|
# Other distributed files
|
||||||
|
EXTRA_DIST = $(DOCS) $(DISTMANS) $(MKFILES) $(CONFIGFILES) $(SYSDEPSOURCES) \
|
||||||
|
$(OTHERFILES) $(TESTFILES)
|
||||||
|
|
||||||
jpegyuv_LDADD = libjpeg.la
|
# pkg-config file
|
||||||
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
|
nodist_pkgconfig_DATA = libjpeg.pc
|
||||||
|
|
||||||
yuvjpeg_SOURCES = yuvjpeg.c
|
# Files to be cleaned
|
||||||
|
CLEANFILES = testout.ppm testout.bmp testout.jpg testoutp.ppm testoutp.jpg \
|
||||||
|
testoutt.jpg
|
||||||
|
|
||||||
yuvjpeg_LDADD = libjpeg.la
|
# Install jconfig.h
|
||||||
|
install-data-local:
|
||||||
|
$(mkinstalldirs) $(DESTDIR)$(includedir)
|
||||||
|
$(INSTALL_HEADER) jconfig.h $(DESTDIR)$(includedir)/jconfig.h
|
||||||
|
|
||||||
dist_man1_MANS = cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 wrjpgcom.1
|
# Uninstall jconfig.h
|
||||||
|
uninstall-local:
|
||||||
|
rm -f $(DESTDIR)$(includedir)/jconfig.h
|
||||||
|
|
||||||
DOCS= coderules.txt jconfig.txt change.log rdrle.c wrrle.c BUILDING.md \
|
# Run tests
|
||||||
ChangeLog.md
|
test: check-local
|
||||||
|
check-local:
|
||||||
dist_doc_DATA = README.ijg README.md libjpeg.txt structure.txt usage.txt \
|
|
||||||
wizard.txt LICENSE.md
|
|
||||||
|
|
||||||
exampledir = $(docdir)
|
|
||||||
dist_example_DATA = example.c
|
|
||||||
|
|
||||||
|
|
||||||
EXTRA_DIST = win release $(DOCS) testimages CMakeLists.txt \
|
|
||||||
sharedlib/CMakeLists.txt cmakescripts libjpeg.map.in doc doxygen.config \
|
|
||||||
doxygen-extra.css jccolext.c jdcolext.c jdcol565.c jdmrgext.c jdmrg565.c \
|
|
||||||
jstdhuff.c jdcoefct.h jdmainct.h jdmaster.h jdsample.h wrppm.h \
|
|
||||||
md5/CMakeLists.txt
|
|
||||||
|
|
||||||
dist-hook:
|
|
||||||
rm -rf `find $(distdir) -name .svn`
|
|
||||||
|
|
||||||
|
|
||||||
SUBDIRS += md5
|
|
||||||
|
|
||||||
if WITH_12BIT
|
|
||||||
|
|
||||||
TESTORIG = testorig12.jpg
|
|
||||||
MD5_JPEG_RGB_ISLOW = 9620f424569594bb9242b48498ad801f
|
|
||||||
MD5_PPM_RGB_ISLOW = f3301d2219783b8b3d942b7239fa50c0
|
|
||||||
MD5_JPEG_422_IFAST_OPT = 7322e3bd2f127f7de4b40d4480ce60e4
|
|
||||||
MD5_PPM_422_IFAST = 79807fa552899e66a04708f533e16950
|
|
||||||
MD5_PPM_422M_IFAST = 07737bfe8a7c1c87aaa393a0098d16b0
|
|
||||||
MD5_JPEG_420_IFAST_Q100_PROG = a1da220b5604081863a504297ed59e55
|
|
||||||
MD5_PPM_420_Q100_IFAST = 1b3730122709f53d007255e8dfd3305e
|
|
||||||
MD5_PPM_420M_Q100_IFAST = 980a1a3c5bf9510022869d30b7d26566
|
|
||||||
MD5_JPEG_GRAY_ISLOW = 235c90707b16e2e069f37c888b2636d9
|
|
||||||
MD5_PPM_GRAY_ISLOW = 7213c10af507ad467da5578ca5ee1fca
|
|
||||||
MD5_PPM_GRAY_ISLOW_RGB = e96ee81c30a6ed422d466338bd3de65d
|
|
||||||
MD5_JPEG_420S_IFAST_OPT = 7af8e60be4d9c227ec63ac9b6630855e
|
|
||||||
MD5_JPEG_3x2_FLOAT_PROG_SSE = a8c17daf77b457725ec929e215b603f8
|
|
||||||
MD5_PPM_3x2_FLOAT_SSE = 42876ab9e5c2f76a87d08db5fbd57956
|
|
||||||
MD5_JPEG_3x2_FLOAT_PROG_32BIT = a8c17daf77b457725ec929e215b603f8
|
|
||||||
MD5_PPM_3x2_FLOAT_32BIT = 42876ab9e5c2f76a87d08db5fbd57956
|
|
||||||
MD5_PPM_3x2_FLOAT_64BIT = d6fbc71153b3d8ded484dbc17c7b9cf4
|
|
||||||
MD5_JPEG_3x2_IFAST_PROG = 1396cc2b7185cfe943d408c9d305339e
|
|
||||||
MD5_PPM_3x2_IFAST = 3975985ef6eeb0a2cdc58daa651ccc00
|
|
||||||
MD5_PPM_420M_ISLOW_2_1 = 4ca6be2a6f326ff9eaab63e70a8259c0
|
|
||||||
MD5_PPM_420M_ISLOW_15_8 = 12aa9f9534c1b3d7ba047322226365eb
|
|
||||||
MD5_PPM_420M_ISLOW_13_8 = f7e22817c7b25e1393e4ec101e9d4e96
|
|
||||||
MD5_PPM_420M_ISLOW_11_8 = 800a16f9f4dc9b293197bfe11be10a82
|
|
||||||
MD5_PPM_420M_ISLOW_9_8 = 06b7a92a9bc69f4dc36ec40f1937d55c
|
|
||||||
MD5_PPM_420M_ISLOW_7_8 = 3ec444a14a4ab4eab88ffc49c48eca43
|
|
||||||
MD5_PPM_420M_ISLOW_3_4 = 3e726b7ea872445b19437d1c1d4f0d93
|
|
||||||
MD5_PPM_420M_ISLOW_5_8 = a8a771abdc94301d20ffac119b2caccd
|
|
||||||
MD5_PPM_420M_ISLOW_1_2 = b419124dd5568b085787234866102866
|
|
||||||
MD5_PPM_420M_ISLOW_3_8 = 343d19015531b7bbe746124127244fa8
|
|
||||||
MD5_PPM_420M_ISLOW_1_4 = 35fd59d866e44659edfa3c18db2a3edb
|
|
||||||
MD5_PPM_420M_ISLOW_1_8 = ccaed48ac0aedefda5d4abe4013f4ad7
|
|
||||||
MD5_PPM_420_ISLOW_SKIP15_31 = 86664cd9dc956536409e44e244d20a97
|
|
||||||
MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 = 452a21656115a163029cfba5c04fa76a
|
|
||||||
MD5_PPM_444_ISLOW_SKIP1_6 = ef63901f71ef7a75cd78253fc0914f84
|
|
||||||
MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 = 15b173fb5872d9575572fbcc1b05956f
|
|
||||||
MD5_JPEG_CROP = cdb35ff4b4519392690ea040c56ea99c
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
TESTORIG = testorig.jpg
|
|
||||||
MD5_JPEG_RGB_ISLOW = 768e970dd57b340ff1b83c9d3d47c77b
|
|
||||||
MD5_PPM_RGB_ISLOW = 00a257f5393fef8821f2b88ac7421291
|
|
||||||
MD5_BMP_RGB_ISLOW_565 = f07d2e75073e4bb10f6c6f4d36e2e3be
|
|
||||||
MD5_BMP_RGB_ISLOW_565D = 4cfa0928ef3e6bb626d7728c924cfda4
|
|
||||||
MD5_JPEG_422_IFAST_OPT = 2540287b79d913f91665e660303ab2c8
|
|
||||||
MD5_PPM_422_IFAST = 35bd6b3f833bad23de82acea847129fa
|
|
||||||
MD5_PPM_422M_IFAST = 8dbc65323d62cca7c91ba02dd1cfa81d
|
|
||||||
MD5_BMP_422M_IFAST_565 = 3294bd4d9a1f2b3d08ea6020d0db7065
|
|
||||||
MD5_BMP_422M_IFAST_565D = da98c9c7b6039511be4a79a878a9abc1
|
|
||||||
MD5_JPEG_420_IFAST_Q100_PROG = 990cbe0329c882420a2094da7e5adade
|
|
||||||
MD5_PPM_420_Q100_IFAST = 5a732542015c278ff43635e473a8a294
|
|
||||||
MD5_PPM_420M_Q100_IFAST = ff692ee9323a3b424894862557c092f1
|
|
||||||
MD5_JPEG_GRAY_ISLOW = 72b51f894b8f4a10b3ee3066770aa38d
|
|
||||||
MD5_PPM_GRAY_ISLOW = 8d3596c56eace32f205deccc229aa5ed
|
|
||||||
MD5_PPM_GRAY_ISLOW_RGB = 116424ac07b79e5e801f00508eab48ec
|
|
||||||
MD5_BMP_GRAY_ISLOW_565 = 12f78118e56a2f48b966f792fedf23cc
|
|
||||||
MD5_BMP_GRAY_ISLOW_565D = bdbbd616441a24354c98553df5dc82db
|
|
||||||
MD5_JPEG_420S_IFAST_OPT = 388708217ac46273ca33086b22827ed8
|
|
||||||
# See README.md for more details on why this next bit is necessary.
|
|
||||||
MD5_JPEG_3x2_FLOAT_PROG_SSE = 343e3f8caf8af5986ebaf0bdc13b5c71
|
|
||||||
MD5_PPM_3x2_FLOAT_SSE = 1a75f36e5904d6fc3a85a43da9ad89bb
|
|
||||||
MD5_JPEG_3x2_FLOAT_PROG_32BIT = 9bca803d2042bd1eb03819e2bf92b3e5
|
|
||||||
MD5_PPM_3x2_FLOAT_32BIT = f6bfab038438ed8f5522fbd33595dcdc
|
|
||||||
MD5_PPM_3x2_FLOAT_64BIT = 0e917a34193ef976b679a6b069b1be26
|
|
||||||
MD5_JPEG_3x2_IFAST_PROG = 1ee5d2c1a77f2da495f993c8c7cceca5
|
|
||||||
MD5_PPM_3x2_IFAST = fd283664b3b49127984af0a7f118fccd
|
|
||||||
MD5_JPEG_420_ISLOW_ARI = e986fb0a637a8d833d96e8a6d6d84ea1
|
|
||||||
MD5_JPEG_444_ISLOW_PROGARI = 0a8f1c8f66e113c3cf635df0a475a617
|
|
||||||
MD5_PPM_420M_IFAST_ARI = 72b59a99bcf1de24c5b27d151bde2437
|
|
||||||
MD5_JPEG_420_ISLOW = 9a68f56bc76e466aa7e52f415d0f4a5f
|
|
||||||
MD5_PPM_420M_ISLOW_2_1 = 9f9de8c0612f8d06869b960b05abf9c9
|
|
||||||
MD5_PPM_420M_ISLOW_15_8 = b6875bc070720b899566cc06459b63b7
|
|
||||||
MD5_PPM_420M_ISLOW_13_8 = bc3452573c8152f6ae552939ee19f82f
|
|
||||||
MD5_PPM_420M_ISLOW_11_8 = d8cc73c0aaacd4556569b59437ba00a5
|
|
||||||
MD5_PPM_420M_ISLOW_9_8 = d25e61bc7eac0002f5b393aa223747b6
|
|
||||||
MD5_PPM_420M_ISLOW_7_8 = ddb564b7c74a09494016d6cd7502a946
|
|
||||||
MD5_PPM_420M_ISLOW_3_4 = 8ed8e68808c3fbc4ea764fc9d2968646
|
|
||||||
MD5_PPM_420M_ISLOW_5_8 = a3363274999da2366a024efae6d16c9b
|
|
||||||
MD5_PPM_420M_ISLOW_1_2 = e692a315cea26b988c8e8b29a5dbcd81
|
|
||||||
MD5_PPM_420M_ISLOW_3_8 = 79eca9175652ced755155c90e785a996
|
|
||||||
MD5_PPM_420M_ISLOW_1_4 = 79cd778f8bf1a117690052cacdd54eca
|
|
||||||
MD5_PPM_420M_ISLOW_1_8 = 391b3d4aca640c8567d6f8745eb2142f
|
|
||||||
MD5_BMP_420_ISLOW_256 = 4980185e3776e89bd931736e1cddeee6
|
|
||||||
MD5_BMP_420_ISLOW_565 = bf9d13e16c4923b92e1faa604d7922cb
|
|
||||||
MD5_BMP_420_ISLOW_565D = 6bde71526acc44bcff76f696df8638d2
|
|
||||||
MD5_BMP_420M_ISLOW_565 = 8dc0185245353cfa32ad97027342216f
|
|
||||||
MD5_BMP_420M_ISLOW_565D =d1be3a3339166255e76fa50a0d70d73e
|
|
||||||
MD5_PPM_420_ISLOW_SKIP15_31 = c4c65c1e43d7275cd50328a61e6534f0
|
|
||||||
MD5_PPM_420_ISLOW_ARI_SKIP16_139 = 087c6b123db16ac00cb88c5b590bb74a
|
|
||||||
MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 = 26eb36ccc7d1f0cb80cdabb0ac8b5d99
|
|
||||||
MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4 = 886c6775af22370257122f8b16207e6d
|
|
||||||
MD5_PPM_444_ISLOW_SKIP1_6 = 5606f86874cf26b8fcee1117a0a436a6
|
|
||||||
MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 = db87dc7ce26bcdc7a6b56239ce2b9d6c
|
|
||||||
MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0 = cb57b32bd6d03e35432362f7bf184b6d
|
|
||||||
MD5_JPEG_CROP = b4197f377e621c4e9b1d20471432610d
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
.PHONY: test
|
|
||||||
test: tjquicktest tjbittest bittest
|
|
||||||
|
|
||||||
if CROSS_COMPILING
|
|
||||||
tjquicktest: testclean
|
|
||||||
else
|
|
||||||
tjquicktest: testclean all
|
|
||||||
endif
|
|
||||||
|
|
||||||
if WITH_TURBOJPEG
|
|
||||||
if WITH_JAVA
|
|
||||||
$(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest
|
|
||||||
$(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -bi
|
|
||||||
$(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -yuv
|
|
||||||
$(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -yuv -noyuvpad
|
|
||||||
$(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -yuv -bi
|
|
||||||
$(JAVA) -cp java/turbojpeg.jar -Djava.library.path=.libs TJUnitTest -yuv -bi -noyuvpad
|
|
||||||
endif
|
|
||||||
./tjunittest
|
|
||||||
./tjunittest -alloc
|
|
||||||
./tjunittest -yuv
|
|
||||||
./tjunittest -yuv -alloc
|
|
||||||
./tjunittest -yuv -noyuvpad
|
|
||||||
endif
|
|
||||||
echo GREAT SUCCESS!
|
|
||||||
|
|
||||||
if CROSS_COMPILING
|
|
||||||
tjbittest: testclean
|
|
||||||
else
|
|
||||||
tjbittest: testclean all
|
|
||||||
endif
|
|
||||||
|
|
||||||
if WITH_TURBOJPEG
|
|
||||||
|
|
||||||
MD5_PPM_GRAY_TILE = 89d3ca21213d9d864b50b4e4e7de4ca6
|
|
||||||
MD5_PPM_420_8x8_TILE = 847fceab15c5b7b911cb986cf0f71de3
|
|
||||||
MD5_PPM_420_16x16_TILE = ca45552a93687e078f7137cc4126a7b0
|
|
||||||
MD5_PPM_420_32x32_TILE = d8676f1d6b68df358353bba9844f4a00
|
|
||||||
MD5_PPM_420_64x64_TILE = 4e4c1a3d7ea4bace4f868bcbe83b7050
|
|
||||||
MD5_PPM_420_128x128_TILE = f24c3429c52265832beab9df72a0ceae
|
|
||||||
MD5_PPM_420M_8x8_TILE = bc25320e1f4c31ce2e610e43e9fd173c
|
|
||||||
MD5_PPM_420M_TILE = 75ffdf14602258c5c189522af57fa605
|
|
||||||
MD5_PPM_422_8x8_TILE = d83dacd9fc73b0a6f10c09acad64eb1e
|
|
||||||
MD5_PPM_422_16x16_TILE = 35077fb610d72dd743b1eb0cbcfe10fb
|
|
||||||
MD5_PPM_422_32x32_TILE = e6902ed8a449ecc0f0d6f2bf945f65f7
|
|
||||||
MD5_PPM_422_64x64_TILE = 2b4502a8f316cedbde1da7bce3d2231e
|
|
||||||
MD5_PPM_422_128x128_TILE = f0b5617d578f5e13c8eee215d64d4877
|
|
||||||
MD5_PPM_422M_8x8_TILE = 828941d7f41cd6283abd6beffb7fd51d
|
|
||||||
MD5_PPM_422M_TILE = e877ae1324c4a280b95376f7f018172f
|
|
||||||
MD5_PPM_444_TILE = 7964e41e67cfb8d0a587c0aa4798f9c3
|
|
||||||
|
|
||||||
# Test compressing from/decompressing to an arbitrary subregion of a larger
|
|
||||||
# image buffer
|
|
||||||
cp $(srcdir)/testimages/testorig.ppm testout_tile.ppm
|
|
||||||
TJ_REVERT=1 ./tjbench testout_tile.ppm 95 -rgb -quiet -tile -benchtime 0.01 >/dev/null 2>&1
|
|
||||||
for i in 8 16 32 64 128; do \
|
|
||||||
md5/md5cmp $(MD5_PPM_GRAY_TILE) testout_tile_GRAY_Q95_$$i\x$$i.ppm; \
|
|
||||||
done
|
|
||||||
md5/md5cmp $(MD5_PPM_420_8x8_TILE) testout_tile_420_Q95_8x8.ppm
|
|
||||||
md5/md5cmp $(MD5_PPM_420_16x16_TILE) testout_tile_420_Q95_16x16.ppm
|
|
||||||
md5/md5cmp $(MD5_PPM_420_32x32_TILE) testout_tile_420_Q95_32x32.ppm
|
|
||||||
md5/md5cmp $(MD5_PPM_420_64x64_TILE) testout_tile_420_Q95_64x64.ppm
|
|
||||||
md5/md5cmp $(MD5_PPM_420_128x128_TILE) testout_tile_420_Q95_128x128.ppm
|
|
||||||
md5/md5cmp $(MD5_PPM_422_8x8_TILE) testout_tile_422_Q95_8x8.ppm
|
|
||||||
md5/md5cmp $(MD5_PPM_422_16x16_TILE) testout_tile_422_Q95_16x16.ppm
|
|
||||||
md5/md5cmp $(MD5_PPM_422_32x32_TILE) testout_tile_422_Q95_32x32.ppm
|
|
||||||
md5/md5cmp $(MD5_PPM_422_64x64_TILE) testout_tile_422_Q95_64x64.ppm
|
|
||||||
md5/md5cmp $(MD5_PPM_422_128x128_TILE) testout_tile_422_Q95_128x128.ppm
|
|
||||||
for i in 8 16 32 64 128; do \
|
|
||||||
md5/md5cmp $(MD5_PPM_444_TILE) testout_tile_444_Q95_$$i\x$$i.ppm; \
|
|
||||||
done
|
|
||||||
rm -f testout_tile_GRAY_* testout_tile_420_* testout_tile_422_* testout_tile_444_*
|
|
||||||
|
|
||||||
TJ_REVERT=1 ./tjbench testout_tile.ppm 95 -rgb -fastupsample -quiet -tile -benchtime 0.01 >/dev/null 2>&1
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_8x8_TILE) testout_tile_420_Q95_8x8.ppm
|
|
||||||
for i in 16 32 64 128; do \
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_TILE) testout_tile_420_Q95_$$i\x$$i.ppm; \
|
|
||||||
done
|
|
||||||
md5/md5cmp $(MD5_PPM_422M_8x8_TILE) testout_tile_422_Q95_8x8.ppm
|
|
||||||
for i in 16 32 64 128; do \
|
|
||||||
md5/md5cmp $(MD5_PPM_422M_TILE) testout_tile_422_Q95_$$i\x$$i.ppm; \
|
|
||||||
done
|
|
||||||
rm -f testout_tile_GRAY_* testout_tile_420_* testout_tile_422_* testout_tile_444_* testout_tile.ppm
|
|
||||||
echo GREAT SUCCESS!
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
if CROSS_COMPILING
|
|
||||||
bittest: testclean
|
|
||||||
else
|
|
||||||
bittest: testclean all
|
|
||||||
endif
|
|
||||||
|
|
||||||
# These tests are carefully crafted to provide full coverage of as many of the
|
|
||||||
# underlying algorithms as possible (including all of the SIMD-accelerated
|
|
||||||
# ones.)
|
|
||||||
|
|
||||||
# CC: null SAMP: fullsize FDCT: islow ENT: huff
|
|
||||||
./cjpeg -revert -rgb -dct int -outfile testout_rgb_islow.jpg $(srcdir)/testimages/testorig.ppm
|
|
||||||
md5/md5cmp $(MD5_JPEG_RGB_ISLOW) testout_rgb_islow.jpg
|
|
||||||
# CC: null SAMP: fullsize IDCT: islow ENT: huff
|
|
||||||
./djpeg -dct int -ppm -outfile testout_rgb_islow.ppm testout_rgb_islow.jpg
|
|
||||||
md5/md5cmp $(MD5_PPM_RGB_ISLOW) testout_rgb_islow.ppm
|
|
||||||
rm -f testout_rgb_islow.ppm
|
|
||||||
if WITH_12BIT
|
|
||||||
rm -f testout_rgb_islow.jpg
|
|
||||||
else
|
|
||||||
# CC: RGB->RGB565 SAMP: fullsize IDCT: islow ENT: huff
|
|
||||||
./djpeg -dct int -rgb565 -dither none -bmp -outfile testout_rgb_islow_565.bmp testout_rgb_islow.jpg
|
|
||||||
md5/md5cmp $(MD5_BMP_RGB_ISLOW_565) testout_rgb_islow_565.bmp
|
|
||||||
rm -f testout_rgb_islow_565.bmp
|
|
||||||
# CC: RGB->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
|
|
||||||
./djpeg -dct int -rgb565 -bmp -outfile testout_rgb_islow_565D.bmp testout_rgb_islow.jpg
|
|
||||||
md5/md5cmp $(MD5_BMP_RGB_ISLOW_565D) testout_rgb_islow_565D.bmp
|
|
||||||
rm -f testout_rgb_islow_565D.bmp testout_rgb_islow.jpg
|
|
||||||
endif
|
|
||||||
|
|
||||||
# CC: RGB->YCC SAMP: fullsize/h2v1 FDCT: ifast ENT: 2-pass huff
|
|
||||||
./cjpeg -revert -sample 2x1 -dct fast -opt -outfile testout_422_ifast_opt.jpg $(srcdir)/testimages/testorig.ppm
|
|
||||||
md5/md5cmp $(MD5_JPEG_422_IFAST_OPT) testout_422_ifast_opt.jpg
|
|
||||||
# CC: YCC->RGB SAMP: fullsize/h2v1 fancy IDCT: ifast ENT: huff
|
|
||||||
./djpeg -dct fast -outfile testout_422_ifast.ppm testout_422_ifast_opt.jpg
|
|
||||||
md5/md5cmp $(MD5_PPM_422_IFAST) testout_422_ifast.ppm
|
|
||||||
rm -f testout_422_ifast.ppm
|
|
||||||
# CC: YCC->RGB SAMP: h2v1 merged IDCT: ifast ENT: huff
|
|
||||||
./djpeg -dct fast -nosmooth -outfile testout_422m_ifast.ppm testout_422_ifast_opt.jpg
|
|
||||||
md5/md5cmp $(MD5_PPM_422M_IFAST) testout_422m_ifast.ppm
|
|
||||||
rm -f testout_422m_ifast.ppm
|
|
||||||
if WITH_12BIT
|
|
||||||
rm -f testout_422_ifast_opt.jpg
|
|
||||||
else
|
|
||||||
# CC: YCC->RGB565 SAMP: h2v1 merged IDCT: ifast ENT: huff
|
|
||||||
./djpeg -dct int -nosmooth -rgb565 -dither none -bmp -outfile testout_422m_ifast_565.bmp testout_422_ifast_opt.jpg
|
|
||||||
md5/md5cmp $(MD5_BMP_422M_IFAST_565) testout_422m_ifast_565.bmp
|
|
||||||
rm -f testout_422m_ifast_565.bmp
|
|
||||||
# CC: YCC->RGB565 (dithered) SAMP: h2v1 merged IDCT: ifast ENT: huff
|
|
||||||
./djpeg -dct int -nosmooth -rgb565 -bmp -outfile testout_422m_ifast_565D.bmp testout_422_ifast_opt.jpg
|
|
||||||
md5/md5cmp $(MD5_BMP_422M_IFAST_565D) testout_422m_ifast_565D.bmp
|
|
||||||
rm -f testout_422m_ifast_565D.bmp testout_422_ifast_opt.jpg
|
|
||||||
endif
|
|
||||||
|
|
||||||
# CC: RGB->YCC SAMP: fullsize/h2v2 FDCT: ifast ENT: prog huff
|
|
||||||
./cjpeg -revert -sample 2x2 -quality 100 -dct fast -prog -outfile testout_420_q100_ifast_prog.jpg $(srcdir)/testimages/testorig.ppm
|
|
||||||
md5/md5cmp $(MD5_JPEG_420_IFAST_Q100_PROG) testout_420_q100_ifast_prog.jpg
|
|
||||||
# CC: YCC->RGB SAMP: fullsize/h2v2 fancy IDCT: ifast ENT: prog huff
|
|
||||||
./djpeg -dct fast -outfile testout_420_q100_ifast.ppm testout_420_q100_ifast_prog.jpg
|
|
||||||
md5/md5cmp $(MD5_PPM_420_Q100_IFAST) testout_420_q100_ifast.ppm
|
|
||||||
rm -f testout_420_q100_ifast.ppm
|
|
||||||
# CC: YCC->RGB SAMP: h2v2 merged IDCT: ifast ENT: prog huff
|
|
||||||
./djpeg -dct fast -nosmooth -outfile testout_420m_q100_ifast.ppm testout_420_q100_ifast_prog.jpg
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_Q100_IFAST) testout_420m_q100_ifast.ppm
|
|
||||||
rm -f testout_420m_q100_ifast.ppm testout_420_q100_ifast_prog.jpg
|
|
||||||
|
|
||||||
# CC: RGB->Gray SAMP: fullsize FDCT: islow ENT: huff
|
|
||||||
./cjpeg -revert -gray -dct int -outfile testout_gray_islow.jpg $(srcdir)/testimages/testorig.ppm
|
|
||||||
md5/md5cmp $(MD5_JPEG_GRAY_ISLOW) testout_gray_islow.jpg
|
|
||||||
# CC: Gray->Gray SAMP: fullsize IDCT: islow ENT: huff
|
|
||||||
./djpeg -dct int -outfile testout_gray_islow.ppm testout_gray_islow.jpg
|
|
||||||
md5/md5cmp $(MD5_PPM_GRAY_ISLOW) testout_gray_islow.ppm
|
|
||||||
rm -f testout_gray_islow.ppm
|
|
||||||
# CC: Gray->RGB SAMP: fullsize IDCT: islow ENT: huff
|
|
||||||
./djpeg -dct int -rgb -outfile testout_gray_islow_rgb.ppm testout_gray_islow.jpg
|
|
||||||
md5/md5cmp $(MD5_PPM_GRAY_ISLOW_RGB) testout_gray_islow_rgb.ppm
|
|
||||||
rm -f testout_gray_islow_rgb.ppm
|
|
||||||
if WITH_12BIT
|
|
||||||
rm -f testout_gray_islow.jpg
|
|
||||||
else
|
|
||||||
# CC: Gray->RGB565 SAMP: fullsize IDCT: islow ENT: huff
|
|
||||||
./djpeg -dct int -rgb565 -dither none -bmp -outfile testout_gray_islow_565.bmp testout_gray_islow.jpg
|
|
||||||
md5/md5cmp $(MD5_BMP_GRAY_ISLOW_565) testout_gray_islow_565.bmp
|
|
||||||
rm -f testout_gray_islow_565.bmp
|
|
||||||
# CC: Gray->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
|
|
||||||
./djpeg -dct int -rgb565 -bmp -outfile testout_gray_islow_565D.bmp testout_gray_islow.jpg
|
|
||||||
md5/md5cmp $(MD5_BMP_GRAY_ISLOW_565D) testout_gray_islow_565D.bmp
|
|
||||||
rm -f testout_gray_islow_565D.bmp testout_gray_islow.jpg
|
|
||||||
endif
|
|
||||||
|
|
||||||
# CC: RGB->YCC SAMP: fullsize smooth/h2v2 smooth FDCT: islow
|
|
||||||
# ENT: 2-pass huff
|
|
||||||
./cjpeg -revert -sample 2x2 -smooth 1 -dct int -opt -outfile testout_420s_ifast_opt.jpg $(srcdir)/testimages/testorig.ppm
|
|
||||||
md5/md5cmp $(MD5_JPEG_420S_IFAST_OPT) testout_420s_ifast_opt.jpg
|
|
||||||
rm -f testout_420s_ifast_opt.jpg
|
|
||||||
|
|
||||||
# The output of the floating point tests is not validated by default, because
|
|
||||||
# the output differs depending on the type of floating point math used, and
|
|
||||||
# this is only deterministic if the DCT/IDCT are implemented using SIMD
|
|
||||||
# instructions on a particular platform. Pass one of the following on the make
|
|
||||||
# command line to validate the floating point tests against one of the expected
|
|
||||||
# results:
|
|
||||||
#
|
|
||||||
# FLOATTEST=sse validate against the expected results from the libjpeg-turbo
|
|
||||||
# SSE SIMD extensions
|
|
||||||
# FLOATTEST=32bit validate against the expected results from the C code
|
|
||||||
# when running on a 32-bit FPU (or when SSE is being used for
|
|
||||||
# floating point math, which is generally the default with
|
|
||||||
# x86-64 compilers)
|
|
||||||
# FLOATTEST=64bit validate against the exepected results from the C code
|
|
||||||
# when running on a 64-bit FPU
|
|
||||||
|
|
||||||
# CC: RGB->YCC SAMP: fullsize/int FDCT: float ENT: prog huff
|
|
||||||
./cjpeg -revert -sample 3x2 -dct float -prog -outfile testout_3x2_float_prog.jpg $(srcdir)/testimages/testorig.ppm
|
|
||||||
if [ "${FLOATTEST}" = "sse" ]; then \
|
|
||||||
md5/md5cmp $(MD5_JPEG_3x2_FLOAT_PROG_SSE) testout_3x2_float_prog.jpg; \
|
|
||||||
elif [ "${FLOATTEST}" = "32bit" -o "${FLOATTEST}" = "64bit" ]; then \
|
|
||||||
md5/md5cmp $(MD5_JPEG_3x2_FLOAT_PROG_32BIT) testout_3x2_float_prog.jpg; \
|
|
||||||
fi
|
|
||||||
# CC: YCC->RGB SAMP: fullsize/int IDCT: float ENT: prog huff
|
|
||||||
./djpeg -dct float -outfile testout_3x2_float.ppm testout_3x2_float_prog.jpg
|
|
||||||
if [ "${FLOATTEST}" = "sse" ]; then \
|
|
||||||
md5/md5cmp $(MD5_PPM_3x2_FLOAT_SSE) testout_3x2_float.ppm; \
|
|
||||||
elif [ "${FLOATTEST}" = "32bit" ]; then \
|
|
||||||
md5/md5cmp $(MD5_PPM_3x2_FLOAT_32BIT) testout_3x2_float.ppm; \
|
|
||||||
elif [ "${FLOATTEST}" = "64bit" ]; then \
|
|
||||||
md5/md5cmp $(MD5_PPM_3x2_FLOAT_64BIT) testout_3x2_float.ppm; \
|
|
||||||
fi
|
|
||||||
rm -f testout_3x2_float.ppm testout_3x2_float_prog.jpg
|
|
||||||
|
|
||||||
# CC: RGB->YCC SAMP: fullsize/int FDCT: ifast ENT: prog huff
|
|
||||||
./cjpeg -revert -sample 3x2 -dct fast -prog -outfile testout_3x2_ifast_prog.jpg $(srcdir)/testimages/testorig.ppm
|
|
||||||
md5/md5cmp $(MD5_JPEG_3x2_IFAST_PROG) testout_3x2_ifast_prog.jpg
|
|
||||||
# CC: YCC->RGB SAMP: fullsize/int IDCT: ifast ENT: prog huff
|
|
||||||
./djpeg -dct fast -outfile testout_3x2_ifast.ppm testout_3x2_ifast_prog.jpg
|
|
||||||
md5/md5cmp $(MD5_PPM_3x2_IFAST) testout_3x2_ifast.ppm
|
|
||||||
rm -f testout_3x2_ifast.ppm testout_3x2_ifast_prog.jpg
|
|
||||||
|
|
||||||
if WITH_ARITH_ENC
|
|
||||||
# CC: YCC->RGB SAMP: fullsize/h2v2 FDCT: islow ENT: arith
|
|
||||||
./cjpeg -revert -dct int -arithmetic -outfile testout_420_islow_ari.jpg $(srcdir)/testimages/testorig.ppm
|
|
||||||
md5/md5cmp $(MD5_JPEG_420_ISLOW_ARI) testout_420_islow_ari.jpg
|
|
||||||
rm -f testout_420_islow_ari.jpg
|
|
||||||
./jpegtran -revert -arithmetic -outfile testout_420_islow_ari.jpg $(srcdir)/testimages/testimgint.jpg
|
|
||||||
md5/md5cmp $(MD5_JPEG_420_ISLOW_ARI) testout_420_islow_ari.jpg
|
|
||||||
rm -f testout_420_islow_ari.jpg
|
|
||||||
# CC: YCC->RGB SAMP: fullsize FDCT: islow ENT: prog arith
|
|
||||||
./cjpeg -revert -sample 1x1 -dct int -prog -arithmetic -outfile testout_444_islow_progari.jpg $(srcdir)/testimages/testorig.ppm
|
|
||||||
md5/md5cmp $(MD5_JPEG_444_ISLOW_PROGARI) testout_444_islow_progari.jpg
|
|
||||||
rm -f testout_444_islow_progari.jpg
|
|
||||||
endif
|
|
||||||
if WITH_ARITH_DEC
|
|
||||||
# CC: RGB->YCC SAMP: h2v2 merged IDCT: ifast ENT: arith
|
|
||||||
./djpeg -fast -ppm -outfile testout_420m_ifast_ari.ppm $(srcdir)/testimages/testimgari.jpg
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_IFAST_ARI) testout_420m_ifast_ari.ppm
|
|
||||||
rm -f testout_420m_ifast_ari.ppm
|
|
||||||
./jpegtran -revert -outfile testout_420_islow.jpg $(srcdir)/testimages/testimgari.jpg
|
|
||||||
md5/md5cmp $(MD5_JPEG_420_ISLOW) testout_420_islow.jpg
|
|
||||||
rm -f testout_420_islow.jpg
|
|
||||||
endif
|
|
||||||
|
|
||||||
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 16x16 islow ENT: huff
|
|
||||||
./djpeg -dct int -scale 2/1 -nosmooth -ppm -outfile testout_420m_islow_2_1.ppm $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_ISLOW_2_1) testout_420m_islow_2_1.ppm
|
|
||||||
rm -f testout_420m_islow_2_1.ppm
|
|
||||||
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 15x15 islow ENT: huff
|
|
||||||
./djpeg -dct int -scale 15/8 -nosmooth -ppm -outfile testout_420m_islow_15_8.ppm $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_ISLOW_15_8) testout_420m_islow_15_8.ppm
|
|
||||||
rm -f testout_420m_islow_15_8.ppm
|
|
||||||
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 13x13 islow ENT: huff
|
|
||||||
./djpeg -dct int -scale 13/8 -nosmooth -ppm -outfile testout_420m_islow_13_8.ppm $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_ISLOW_13_8) testout_420m_islow_13_8.ppm
|
|
||||||
rm -f testout_420m_islow_13_8.ppm
|
|
||||||
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 11x11 islow ENT: huff
|
|
||||||
./djpeg -dct int -scale 11/8 -nosmooth -ppm -outfile testout_420m_islow_11_8.ppm $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_ISLOW_11_8) testout_420m_islow_11_8.ppm
|
|
||||||
rm -f testout_420m_islow_11_8.ppm
|
|
||||||
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 9x9 islow ENT: huff
|
|
||||||
./djpeg -dct int -scale 9/8 -nosmooth -ppm -outfile testout_420m_islow_9_8.ppm $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_ISLOW_9_8) testout_420m_islow_9_8.ppm
|
|
||||||
rm -f testout_420m_islow_9_8.ppm
|
|
||||||
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 7x7 islow/14x14 islow ENT: huff
|
|
||||||
./djpeg -dct int -scale 7/8 -nosmooth -ppm -outfile testout_420m_islow_7_8.ppm $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_ISLOW_7_8) testout_420m_islow_7_8.ppm
|
|
||||||
rm -f testout_420m_islow_7_8.ppm
|
|
||||||
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 6x6 islow/12x12 islow ENT: huff
|
|
||||||
./djpeg -dct int -scale 3/4 -nosmooth -ppm -outfile testout_420m_islow_3_4.ppm $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_ISLOW_3_4) testout_420m_islow_3_4.ppm
|
|
||||||
rm -f testout_420m_islow_3_4.ppm
|
|
||||||
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 5x5 islow/10x10 islow ENT: huff
|
|
||||||
./djpeg -dct int -scale 5/8 -nosmooth -ppm -outfile testout_420m_islow_5_8.ppm $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_ISLOW_5_8) testout_420m_islow_5_8.ppm
|
|
||||||
rm -f testout_420m_islow_5_8.ppm
|
|
||||||
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 4x4 islow/8x8 islow ENT: huff
|
|
||||||
./djpeg -dct int -scale 1/2 -nosmooth -ppm -outfile testout_420m_islow_1_2.ppm $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_ISLOW_1_2) testout_420m_islow_1_2.ppm
|
|
||||||
rm -f testout_420m_islow_1_2.ppm
|
|
||||||
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 3x3 islow/6x6 islow ENT: huff
|
|
||||||
./djpeg -dct int -scale 3/8 -nosmooth -ppm -outfile testout_420m_islow_3_8.ppm $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_ISLOW_3_8) testout_420m_islow_3_8.ppm
|
|
||||||
rm -f testout_420m_islow_3_8.ppm
|
|
||||||
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 2x2 islow/4x4 islow ENT: huff
|
|
||||||
./djpeg -dct int -scale 1/4 -nosmooth -ppm -outfile testout_420m_islow_1_4.ppm $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_ISLOW_1_4) testout_420m_islow_1_4.ppm
|
|
||||||
rm -f testout_420m_islow_1_4.ppm
|
|
||||||
# CC: YCC->RGB SAMP: h2v2 merged IDCT: 1x1 islow/2x2 islow ENT: huff
|
|
||||||
./djpeg -dct int -scale 1/8 -nosmooth -ppm -outfile testout_420m_islow_1_8.ppm $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_PPM_420M_ISLOW_1_8) testout_420m_islow_1_8.ppm
|
|
||||||
rm -f testout_420m_islow_1_8.ppm
|
|
||||||
if WITH_12BIT
|
|
||||||
else
|
|
||||||
# CC: YCC->RGB (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
|
|
||||||
./djpeg -dct int -colors 256 -bmp -outfile testout_420_islow_256.bmp $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_BMP_420_ISLOW_256) testout_420_islow_256.bmp
|
|
||||||
rm -f testout_420_islow_256.bmp
|
|
||||||
# CC: YCC->RGB565 SAMP: h2v2 fancy IDCT: islow ENT: huff
|
|
||||||
./djpeg -dct int -rgb565 -dither none -bmp -outfile testout_420_islow_565.bmp $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_BMP_420_ISLOW_565) testout_420_islow_565.bmp
|
|
||||||
rm -f testout_420_islow_565.bmp
|
|
||||||
# CC: YCC->RGB565 (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
|
|
||||||
./djpeg -dct int -rgb565 -bmp -outfile testout_420_islow_565D.bmp $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_BMP_420_ISLOW_565D) testout_420_islow_565D.bmp
|
|
||||||
rm -f testout_420_islow_565D.bmp
|
|
||||||
# CC: YCC->RGB565 SAMP: h2v2 merged IDCT: islow ENT: huff
|
|
||||||
./djpeg -dct int -nosmooth -rgb565 -dither none -bmp -outfile testout_420m_islow_565.bmp $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_BMP_420M_ISLOW_565) testout_420m_islow_565.bmp
|
|
||||||
rm -f testout_420m_islow_565.bmp
|
|
||||||
# CC: YCC->RGB565 (dithered) SAMP: h2v2 merged IDCT: islow ENT: huff
|
|
||||||
./djpeg -dct int -nosmooth -rgb565 -bmp -outfile testout_420m_islow_565D.bmp $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_BMP_420M_ISLOW_565D) testout_420m_islow_565D.bmp
|
|
||||||
rm -f testout_420m_islow_565D.bmp
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Partial decode tests. These tests are designed to cover all of the possible
|
|
||||||
# code paths in jpeg_skip_scanlines().
|
|
||||||
|
|
||||||
# Context rows: Yes Intra-iMCU row: Yes iMCU row prefetch: No ENT: huff
|
|
||||||
./djpeg -dct int -skip 15,31 -ppm -outfile testout_420_islow_skip15,31.ppm $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_PPM_420_ISLOW_SKIP15_31) testout_420_islow_skip15,31.ppm
|
|
||||||
rm -f testout_420_islow_skip15,31.ppm
|
|
||||||
# Context rows: Yes Intra-iMCU row: No iMCU row prefetch: Yes ENT: arith
|
|
||||||
if WITH_ARITH_DEC
|
|
||||||
./djpeg -dct int -skip 16,139 -ppm -outfile testout_420_islow_ari_skip16,139.ppm $(srcdir)/testimages/testimgari.jpg
|
|
||||||
md5/md5cmp $(MD5_PPM_420_ISLOW_ARI_SKIP16_139) testout_420_islow_ari_skip16,139.ppm
|
|
||||||
rm -f testout_420_islow_ari_skip16,139.ppm
|
|
||||||
endif
|
|
||||||
# Context rows: Yes Intra-iMCU row: No iMCU row prefetch: No ENT: prog huff
|
|
||||||
./cjpeg -revert -dct int -prog -outfile testout_420_islow_prog.jpg $(srcdir)/testimages/testorig.ppm
|
|
||||||
./djpeg -dct int -crop 62x62+71+71 -ppm -outfile testout_420_islow_prog_crop62x62,71,71.ppm testout_420_islow_prog.jpg
|
|
||||||
md5/md5cmp $(MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71) testout_420_islow_prog_crop62x62,71,71.ppm
|
|
||||||
rm -f testout_420_islow_prog_crop62x62,71,71.ppm testout_420_islow_prog.jpg
|
|
||||||
# Context rows: Yes Intra-iMCU row: No iMCU row prefetch: No ENT: arith
|
|
||||||
if WITH_ARITH_DEC
|
|
||||||
./djpeg -dct int -crop 53x53+4+4 -ppm -outfile testout_420_islow_ari_crop53x53,4,4.ppm $(srcdir)/testimages/testimgari.jpg
|
|
||||||
md5/md5cmp $(MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4) testout_420_islow_ari_crop53x53,4,4.ppm
|
|
||||||
rm -f testout_420_islow_ari_crop53x53,4,4.ppm
|
|
||||||
endif
|
|
||||||
# Context rows: No Intra-iMCU row: Yes ENT: huff
|
|
||||||
./cjpeg -revert -dct int -sample 1x1 -outfile testout_444_islow.jpg $(srcdir)/testimages/testorig.ppm
|
|
||||||
./djpeg -dct int -skip 1,6 -ppm -outfile testout_444_islow_skip1,6.ppm testout_444_islow.jpg
|
|
||||||
md5/md5cmp $(MD5_PPM_444_ISLOW_SKIP1_6) testout_444_islow_skip1,6.ppm
|
|
||||||
rm -f testout_444_islow_skip1,6.ppm testout_444_islow.jpg
|
|
||||||
# Context rows: No Intra-iMCU row: No ENT: prog huff
|
|
||||||
./cjpeg -revert -dct int -prog -sample 1x1 -outfile testout_444_islow_prog.jpg $(srcdir)/testimages/testorig.ppm
|
|
||||||
./djpeg -dct int -crop 98x98+13+13 -ppm -outfile testout_444_islow_prog_crop98x98,13,13.ppm testout_444_islow_prog.jpg
|
|
||||||
md5/md5cmp $(MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13) testout_444_islow_prog_crop98x98,13,13.ppm
|
|
||||||
rm -f testout_444_islow_prog_crop98x98,13,13.ppm testout_444_islow_prog.jpg
|
|
||||||
# Context rows: No Intra-iMCU row: No ENT: arith
|
|
||||||
if WITH_ARITH_ENC
|
|
||||||
./cjpeg -revert -dct int -arithmetic -sample 1x1 -outfile testout_444_islow_ari.jpg $(srcdir)/testimages/testorig.ppm
|
|
||||||
if WITH_ARITH_DEC
|
|
||||||
./djpeg -dct int -crop 37x37+0+0 -ppm -outfile testout_444_islow_ari_crop37x37,0,0.ppm testout_444_islow_ari.jpg
|
|
||||||
md5/md5cmp $(MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0) testout_444_islow_ari_crop37x37,0,0.ppm
|
|
||||||
rm -f testout_444_islow_ari_crop37x37,0,0.ppm
|
|
||||||
endif
|
|
||||||
rm -f testout_444_islow_ari.jpg
|
|
||||||
endif
|
|
||||||
|
|
||||||
./jpegtran -revert -crop 120x90+20+50 -transpose -perfect -outfile testout_crop.jpg $(srcdir)/testimages/$(TESTORIG)
|
|
||||||
md5/md5cmp $(MD5_JPEG_CROP) testout_crop.jpg
|
|
||||||
rm -f testout_crop.jpg
|
|
||||||
echo GREAT SUCCESS!
|
|
||||||
|
|
||||||
|
|
||||||
testclean:
|
|
||||||
rm -f testout*
|
rm -f testout*
|
||||||
rm -f *_GRAY_*.bmp
|
./djpeg -dct int -ppm -outfile testout.ppm $(srcdir)/testorig.jpg
|
||||||
rm -f *_GRAY_*.png
|
./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testorig.jpg
|
||||||
rm -f *_GRAY_*.ppm
|
./cjpeg -dct int -outfile testout.jpg $(srcdir)/testimg.ppm
|
||||||
rm -f *_GRAY_*.jpg
|
./djpeg -dct int -ppm -outfile testoutp.ppm $(srcdir)/testprog.jpg
|
||||||
rm -f *_GRAY.yuv
|
./cjpeg -dct int -progressive -opt -outfile testoutp.jpg $(srcdir)/testimg.ppm
|
||||||
rm -f *_420_*.bmp
|
./jpegtran -outfile testoutt.jpg $(srcdir)/testprog.jpg
|
||||||
rm -f *_420_*.png
|
cmp $(srcdir)/testimg.ppm testout.ppm
|
||||||
rm -f *_420_*.ppm
|
cmp $(srcdir)/testimg.bmp testout.bmp
|
||||||
rm -f *_420_*.jpg
|
cmp $(srcdir)/testimg.jpg testout.jpg
|
||||||
rm -f *_420.yuv
|
cmp $(srcdir)/testimg.ppm testoutp.ppm
|
||||||
rm -f *_422_*.bmp
|
cmp $(srcdir)/testimgp.jpg testoutp.jpg
|
||||||
rm -f *_422_*.png
|
cmp $(srcdir)/testorig.jpg testoutt.jpg
|
||||||
rm -f *_422_*.ppm
|
|
||||||
rm -f *_422_*.jpg
|
|
||||||
rm -f *_422.yuv
|
|
||||||
rm -f *_444_*.bmp
|
|
||||||
rm -f *_444_*.png
|
|
||||||
rm -f *_444_*.ppm
|
|
||||||
rm -f *_444_*.jpg
|
|
||||||
rm -f *_444.yuv
|
|
||||||
rm -f *_440_*.bmp
|
|
||||||
rm -f *_440_*.png
|
|
||||||
rm -f *_440_*.ppm
|
|
||||||
rm -f *_440_*.jpg
|
|
||||||
rm -f *_440.yuv
|
|
||||||
rm -f *_411_*.bmp
|
|
||||||
rm -f *_411_*.png
|
|
||||||
rm -f *_411_*.ppm
|
|
||||||
rm -f *_411_*.jpg
|
|
||||||
rm -f *_411.yuv
|
|
||||||
|
|
||||||
|
|
||||||
tjtest:
|
|
||||||
sh ./tjbenchtest
|
|
||||||
sh ./tjbenchtest -alloc
|
|
||||||
sh ./tjbenchtest -yuv
|
|
||||||
sh ./tjbenchtest -yuv -alloc
|
|
||||||
if WITH_JAVA
|
|
||||||
sh ./tjbenchtest.java
|
|
||||||
sh ./tjbenchtest.java -yuv
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
pkgscripts/mozjpeg.spec: pkgscripts/mozjpeg.spec.tmpl
|
|
||||||
cat pkgscripts/mozjpeg.spec.tmpl | sed s@%{__prefix}@$(prefix)@g | \
|
|
||||||
sed s@%{__bindir}@$(bindir)@g | sed s@%{__datadir}@$(datadir)@g | \
|
|
||||||
sed s@%{__docdir}@$(docdir)@g | sed s@%{__includedir}@$(includedir)@g | \
|
|
||||||
sed s@%{__libdir}@$(libdir)@g | sed s@%{__mandir}@$(mandir)@g \
|
|
||||||
> pkgscripts/mozjpeg.spec
|
|
||||||
|
|
||||||
rpm: all pkgscripts/mozjpeg.spec
|
|
||||||
TMPDIR=`mktemp -d /tmp/${PACKAGE_NAME}-build.XXXXXX`; \
|
|
||||||
mkdir -p $$TMPDIR/RPMS; \
|
|
||||||
ln -fs `pwd` $$TMPDIR/BUILD; \
|
|
||||||
rm -f ${PKGNAME}-${VERSION}.${RPMARCH}.rpm; \
|
|
||||||
rpmbuild -bb --define "_blddir $$TMPDIR/buildroot" \
|
|
||||||
--define "_topdir $$TMPDIR" \
|
|
||||||
--target ${RPMARCH} pkgscripts/mozjpeg.spec; \
|
|
||||||
cp $$TMPDIR/RPMS/${RPMARCH}/${PKGNAME}-${VERSION}-${BUILD}.${RPMARCH}.rpm \
|
|
||||||
${PKGNAME}-${VERSION}.${RPMARCH}.rpm; \
|
|
||||||
rm -rf $$TMPDIR
|
|
||||||
|
|
||||||
srpm: dist-gzip pkgscripts/mozjpeg.spec
|
|
||||||
TMPDIR=`mktemp -d /tmp/${PACKAGE_NAME}-build.XXXXXX`; \
|
|
||||||
mkdir -p $$TMPDIR/RPMS; \
|
|
||||||
mkdir -p $$TMPDIR/SRPMS; \
|
|
||||||
mkdir -p $$TMPDIR/BUILD; \
|
|
||||||
mkdir -p $$TMPDIR/SOURCES; \
|
|
||||||
mkdir -p $$TMPDIR/SPECS; \
|
|
||||||
rm -f ${PKGNAME}-${VERSION}.src.rpm; \
|
|
||||||
cp ${PACKAGE_NAME}-${VERSION}.tar.gz $$TMPDIR/SOURCES; \
|
|
||||||
cat pkgscripts/mozjpeg.spec | sed s/%{_blddir}/%{_tmppath}/g \
|
|
||||||
| sed s/#--\>//g \
|
|
||||||
> $$TMPDIR/SPECS/mozjpeg.spec; \
|
|
||||||
rpmbuild -bs --define "_topdir $$TMPDIR" $$TMPDIR/SPECS/mozjpeg.spec; \
|
|
||||||
cp $$TMPDIR/SRPMS/${PKGNAME}-${VERSION}-${BUILD}.src.rpm \
|
|
||||||
${PKGNAME}-${VERSION}.src.rpm; \
|
|
||||||
rm -rf $$TMPDIR
|
|
||||||
|
|
||||||
pkgscripts/makedpkg: pkgscripts/makedpkg.tmpl
|
|
||||||
cat pkgscripts/makedpkg.tmpl | sed s@%{__prefix}@$(prefix)@g | \
|
|
||||||
sed s@%{__docdir}@$(docdir)@g | sed s@%{__libdir}@$(libdir)@g \
|
|
||||||
> pkgscripts/makedpkg
|
|
||||||
|
|
||||||
deb: all pkgscripts/makedpkg
|
|
||||||
sh pkgscripts/makedpkg
|
|
||||||
|
|
||||||
pkgscripts/uninstall: pkgscripts/uninstall.tmpl
|
|
||||||
cat pkgscripts/uninstall.tmpl | sed s@%{__prefix}@$(prefix)@g | \
|
|
||||||
sed s@%{__bindir}@$(bindir)@g | sed s@%{__datadir}@$(datadir)@g | \
|
|
||||||
sed s@%{__includedir}@$(includedir)@g | sed s@%{__libdir}@$(libdir)@g | \
|
|
||||||
sed s@%{__mandir}@$(mandir)@g > pkgscripts/uninstall
|
|
||||||
|
|
||||||
pkgscripts/makemacpkg: pkgscripts/makemacpkg.tmpl
|
|
||||||
cat pkgscripts/makemacpkg.tmpl | sed s@%{__prefix}@$(prefix)@g | \
|
|
||||||
sed s@%{__bindir}@$(bindir)@g | sed s@%{__docdir}@$(docdir)@g | \
|
|
||||||
sed s@%{__libdir}@$(libdir)@g > pkgscripts/makemacpkg
|
|
||||||
|
|
||||||
if X86_64
|
|
||||||
|
|
||||||
udmg: all pkgscripts/makemacpkg pkgscripts/uninstall
|
|
||||||
sh pkgscripts/makemacpkg -build32 ${BUILDDIR32}
|
|
||||||
|
|
||||||
iosdmg: all pkgscripts/makemacpkg pkgscripts/uninstall
|
|
||||||
sh pkgscripts/makemacpkg -build32 ${BUILDDIR32} -buildarmv6 ${BUILDDIRARMV6} -buildarmv7 ${BUILDDIRARMV7} -buildarmv7s ${BUILDDIRARMV7S} -buildarmv8 ${BUILDDIRARMV8} -lipo "${LIPO}"
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
iosdmg: all pkgscripts/makemacpkg pkgscripts/uninstall
|
|
||||||
sh pkgscripts/makemacpkg -buildarmv6 ${BUILDDIRARMV6} -buildarmv7 ${BUILDDIRARMV7} -buildarmv7s ${BUILDDIRARMV7S} -buildarmv8 ${BUILDDIRARMV8} -lipo "${LIPO}"
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
dmg: all pkgscripts/makemacpkg pkgscripts/uninstall
|
|
||||||
sh pkgscripts/makemacpkg
|
|
||||||
|
|
||||||
pkgscripts/makecygwinpkg: pkgscripts/makecygwinpkg.tmpl
|
|
||||||
cat pkgscripts/makecygwinpkg.tmpl | sed s@%{__prefix}@$(prefix)@g | \
|
|
||||||
sed s@%{__docdir}@$(docdir)@g | sed s@%{__libdir}@$(libdir)@g \
|
|
||||||
> pkgscripts/makecygwinpkg
|
|
||||||
|
|
||||||
cygwinpkg: all pkgscripts/makecygwinpkg
|
|
||||||
sh pkgscripts/makecygwinpkg
|
|
||||||
|
|||||||
1072
Makefile.in
Normal file
@@ -1,16 +1,12 @@
|
|||||||
libjpeg-turbo note: This file has been modified by The libjpeg-turbo Project
|
|
||||||
to include only information relevant to libjpeg-turbo, to wordsmith certain
|
|
||||||
sections, and to remove impolitic language that existed in the libjpeg v8
|
|
||||||
README. It is included only for reference. Please see README.md for
|
|
||||||
information specific to libjpeg-turbo.
|
|
||||||
|
|
||||||
|
|
||||||
The Independent JPEG Group's JPEG software
|
The Independent JPEG Group's JPEG software
|
||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
This distribution contains a release of the Independent JPEG Group's free JPEG
|
README for release 9c of 14-Jan-2018
|
||||||
software. You are welcome to redistribute this software and to use it for any
|
====================================
|
||||||
purpose, subject to the conditions under LEGAL ISSUES, below.
|
|
||||||
|
This distribution contains the ninth public release of the Independent JPEG
|
||||||
|
Group's free JPEG software. You are welcome to redistribute this software and
|
||||||
|
to use it for any purpose, subject to the conditions under LEGAL ISSUES, below.
|
||||||
|
|
||||||
This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone,
|
This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone,
|
||||||
Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson,
|
Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson,
|
||||||
@@ -18,7 +14,7 @@ Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers,
|
|||||||
and other members of the Independent JPEG Group.
|
and other members of the Independent JPEG Group.
|
||||||
|
|
||||||
IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee
|
IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee
|
||||||
(also known as JPEG, together with ITU-T SG16).
|
(previously known as JPEG, together with ITU-T SG16).
|
||||||
|
|
||||||
|
|
||||||
DOCUMENTATION ROADMAP
|
DOCUMENTATION ROADMAP
|
||||||
@@ -30,12 +26,14 @@ OVERVIEW General description of JPEG and the IJG software.
|
|||||||
LEGAL ISSUES Copyright, lack of warranty, terms of distribution.
|
LEGAL ISSUES Copyright, lack of warranty, terms of distribution.
|
||||||
REFERENCES Where to learn more about JPEG.
|
REFERENCES Where to learn more about JPEG.
|
||||||
ARCHIVE LOCATIONS Where to find newer versions of this software.
|
ARCHIVE LOCATIONS Where to find newer versions of this software.
|
||||||
|
ACKNOWLEDGMENTS Special thanks.
|
||||||
FILE FORMAT WARS Software *not* to get.
|
FILE FORMAT WARS Software *not* to get.
|
||||||
TO DO Plans for future IJG releases.
|
TO DO Plans for future IJG releases.
|
||||||
|
|
||||||
Other documentation files in the distribution are:
|
Other documentation files in the distribution are:
|
||||||
|
|
||||||
User documentation:
|
User documentation:
|
||||||
|
install.txt How to configure and install the IJG software.
|
||||||
usage.txt Usage instructions for cjpeg, djpeg, jpegtran,
|
usage.txt Usage instructions for cjpeg, djpeg, jpegtran,
|
||||||
rdjpgcom, and wrjpgcom.
|
rdjpgcom, and wrjpgcom.
|
||||||
*.1 Unix-style man pages for programs (same info as usage.txt).
|
*.1 Unix-style man pages for programs (same info as usage.txt).
|
||||||
@@ -45,11 +43,12 @@ Programmer and internal documentation:
|
|||||||
libjpeg.txt How to use the JPEG library in your own programs.
|
libjpeg.txt How to use the JPEG library in your own programs.
|
||||||
example.c Sample code for calling the JPEG library.
|
example.c Sample code for calling the JPEG library.
|
||||||
structure.txt Overview of the JPEG library's internal structure.
|
structure.txt Overview of the JPEG library's internal structure.
|
||||||
|
filelist.txt Road map of IJG files.
|
||||||
coderules.txt Coding style rules --- please read if you contribute code.
|
coderules.txt Coding style rules --- please read if you contribute code.
|
||||||
|
|
||||||
Please read at least usage.txt. Some information can also be found in the JPEG
|
Please read at least the files install.txt and usage.txt. Some information
|
||||||
FAQ (Frequently Asked Questions) article. See ARCHIVE LOCATIONS below to find
|
can also be found in the JPEG FAQ (Frequently Asked Questions) article. See
|
||||||
out where to obtain the FAQ article.
|
ARCHIVE LOCATIONS below to find out where to obtain the FAQ article.
|
||||||
|
|
||||||
If you want to understand how the JPEG code works, we suggest reading one or
|
If you want to understand how the JPEG code works, we suggest reading one or
|
||||||
more of the REFERENCES, then looking at the documentation files (in roughly
|
more of the REFERENCES, then looking at the documentation files (in roughly
|
||||||
@@ -61,19 +60,7 @@ OVERVIEW
|
|||||||
|
|
||||||
This package contains C software to implement JPEG image encoding, decoding,
|
This package contains C software to implement JPEG image encoding, decoding,
|
||||||
and transcoding. JPEG (pronounced "jay-peg") is a standardized compression
|
and transcoding. JPEG (pronounced "jay-peg") is a standardized compression
|
||||||
method for full-color and grayscale images. JPEG's strong suit is compressing
|
method for full-color and grayscale images.
|
||||||
photographic images or other types of images that have smooth color and
|
|
||||||
brightness transitions between neighboring pixels. Images with sharp lines or
|
|
||||||
other abrupt features may not compress well with JPEG, and a higher JPEG
|
|
||||||
quality may have to be used to avoid visible compression artifacts with such
|
|
||||||
images.
|
|
||||||
|
|
||||||
JPEG is lossy, meaning that the output pixels are not necessarily identical to
|
|
||||||
the input pixels. However, on photographic content and other "smooth" images,
|
|
||||||
very good compression ratios can be obtained with no visible compression
|
|
||||||
artifacts, and extremely high compression ratios are possible if you are
|
|
||||||
willing to sacrifice image quality (by reducing the "quality" setting in the
|
|
||||||
compressor.)
|
|
||||||
|
|
||||||
This software implements JPEG baseline, extended-sequential, and progressive
|
This software implements JPEG baseline, extended-sequential, and progressive
|
||||||
compression processes. Provision is made for supporting all variants of these
|
compression processes. Provision is made for supporting all variants of these
|
||||||
@@ -128,7 +115,7 @@ with respect to this software, its quality, accuracy, merchantability, or
|
|||||||
fitness for a particular purpose. This software is provided "AS IS", and you,
|
fitness for a particular purpose. This software is provided "AS IS", and you,
|
||||||
its user, assume the entire risk as to its quality and accuracy.
|
its user, assume the entire risk as to its quality and accuracy.
|
||||||
|
|
||||||
This software is copyright (C) 1991-2016, Thomas G. Lane, Guido Vollbeding.
|
This software is copyright (C) 1991-2018, Thomas G. Lane, Guido Vollbeding.
|
||||||
All Rights Reserved except as specified below.
|
All Rights Reserved except as specified below.
|
||||||
|
|
||||||
Permission is hereby granted to use, copy, modify, and distribute this
|
Permission is hereby granted to use, copy, modify, and distribute this
|
||||||
@@ -172,11 +159,6 @@ to produce "uncompressed GIFs". This technique does not use the LZW
|
|||||||
algorithm; the resulting GIF files are larger than usual, but are readable
|
algorithm; the resulting GIF files are larger than usual, but are readable
|
||||||
by all standard GIF decoders.
|
by all standard GIF decoders.
|
||||||
|
|
||||||
We are required to state that
|
|
||||||
"The Graphics Interchange Format(c) is the Copyright property of
|
|
||||||
CompuServe Incorporated. GIF(sm) is a Service Mark property of
|
|
||||||
CompuServe Incorporated."
|
|
||||||
|
|
||||||
|
|
||||||
REFERENCES
|
REFERENCES
|
||||||
==========
|
==========
|
||||||
@@ -210,6 +192,14 @@ Image Data Compression Standard" by William B. Pennebaker and Joan L.
|
|||||||
Mitchell, published by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1.
|
Mitchell, published by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1.
|
||||||
Price US$59.95, 638 pp. The book includes the complete text of the ISO JPEG
|
Price US$59.95, 638 pp. The book includes the complete text of the ISO JPEG
|
||||||
standards (DIS 10918-1 and draft DIS 10918-2).
|
standards (DIS 10918-1 and draft DIS 10918-2).
|
||||||
|
Although this is by far the most detailed and comprehensive exposition of
|
||||||
|
JPEG publicly available, we point out that it is still missing an explanation
|
||||||
|
of the most essential properties and algorithms of the underlying DCT
|
||||||
|
technology.
|
||||||
|
If you think that you know about DCT-based JPEG after reading this book,
|
||||||
|
then you are in delusion. The real fundamentals and corresponding potential
|
||||||
|
of DCT-based JPEG are not publicly known so far, and that is the reason for
|
||||||
|
all the mistaken developments taking place in the image coding domain.
|
||||||
|
|
||||||
The original JPEG standard is divided into two parts, Part 1 being the actual
|
The original JPEG standard is divided into two parts, Part 1 being the actual
|
||||||
specification, while Part 2 covers compliance testing methods. Part 1 is
|
specification, while Part 2 covers compliance testing methods. Part 1 is
|
||||||
@@ -218,16 +208,25 @@ Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS
|
|||||||
10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of
|
10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of
|
||||||
Continuous-tone Still Images, Part 2: Compliance testing" and has document
|
Continuous-tone Still Images, Part 2: Compliance testing" and has document
|
||||||
numbers ISO/IEC IS 10918-2, ITU-T T.83.
|
numbers ISO/IEC IS 10918-2, ITU-T T.83.
|
||||||
|
IJG JPEG 8 introduced an implementation of the JPEG SmartScale extension
|
||||||
|
which is specified in two documents: A contributed document at ITU and ISO
|
||||||
|
with title "ITU-T JPEG-Plus Proposal for Extending ITU-T T.81 for Advanced
|
||||||
|
Image Coding", April 2006, Geneva, Switzerland. The latest version of this
|
||||||
|
document is Revision 3. And a contributed document ISO/IEC JTC1/SC29/WG1 N
|
||||||
|
5799 with title "Evolution of JPEG", June/July 2011, Berlin, Germany.
|
||||||
|
IJG JPEG 9 introduces a reversible color transform for improved lossless
|
||||||
|
compression which is described in a contributed document ISO/IEC JTC1/SC29/
|
||||||
|
WG1 N 6080 with title "JPEG 9 Lossless Coding", June/July 2012, Paris,
|
||||||
|
France.
|
||||||
|
|
||||||
The JPEG standard does not specify all details of an interchangeable file
|
The JPEG standard does not specify all details of an interchangeable file
|
||||||
format. For the omitted details we follow the "JFIF" conventions, revision
|
format. For the omitted details we follow the "JFIF" conventions, version 2.
|
||||||
1.02. JFIF 1.02 has been adopted as an Ecma International Technical Report
|
JFIF version 1 has been adopted as Recommendation ITU-T T.871 (05/2011) :
|
||||||
and thus received a formal publication status. It is available as a free
|
Information technology - Digital compression and coding of continuous-tone
|
||||||
download in PDF format from
|
still images: JPEG File Interchange Format (JFIF). It is available as a
|
||||||
http://www.ecma-international.org/publications/techreports/E-TR-098.htm.
|
free download in PDF file format from http://www.itu.int/rec/T-REC-T.871.
|
||||||
A PostScript version of the JFIF document is available at
|
A PDF file of the older JFIF document is available at
|
||||||
http://www.ijg.org/files/jfif.ps.gz. There is also a plain text version at
|
http://www.w3.org/Graphics/JPEG/jfif3.pdf.
|
||||||
http://www.ijg.org/files/jfif.txt.gz, but it is missing the figures.
|
|
||||||
|
|
||||||
The TIFF 6.0 file format specification can be obtained by FTP from
|
The TIFF 6.0 file format specification can be obtained by FTP from
|
||||||
ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme
|
ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme
|
||||||
@@ -246,7 +245,9 @@ ARCHIVE LOCATIONS
|
|||||||
|
|
||||||
The "official" archive site for this software is www.ijg.org.
|
The "official" archive site for this software is www.ijg.org.
|
||||||
The most recent released version can always be found there in
|
The most recent released version can always be found there in
|
||||||
directory "files".
|
directory "files". This particular version will be archived as
|
||||||
|
http://www.ijg.org/files/jpegsrc.v9c.tar.gz, and in Windows-compatible
|
||||||
|
"zip" archive format as http://www.ijg.org/files/jpegsr9c.zip.
|
||||||
|
|
||||||
The JPEG FAQ (Frequently Asked Questions) article is a source of some
|
The JPEG FAQ (Frequently Asked Questions) article is a source of some
|
||||||
general information about JPEG.
|
general information about JPEG.
|
||||||
@@ -259,21 +260,119 @@ with body
|
|||||||
send usenet/news.answers/jpeg-faq/part2
|
send usenet/news.answers/jpeg-faq/part2
|
||||||
|
|
||||||
|
|
||||||
|
ACKNOWLEDGMENTS
|
||||||
|
===============
|
||||||
|
|
||||||
|
Thank to Juergen Bruder for providing me with a copy of the common DCT
|
||||||
|
algorithm article, only to find out that I had come to the same result
|
||||||
|
in a more direct and comprehensible way with a more generative approach.
|
||||||
|
|
||||||
|
Thank to Istvan Sebestyen and Joan L. Mitchell for inviting me to the
|
||||||
|
ITU JPEG (Study Group 16) meeting in Geneva, Switzerland.
|
||||||
|
|
||||||
|
Thank to Thomas Wiegand and Gary Sullivan for inviting me to the
|
||||||
|
Joint Video Team (MPEG & ITU) meeting in Geneva, Switzerland.
|
||||||
|
|
||||||
|
Thank to Thomas Richter and Daniel Lee for inviting me to the
|
||||||
|
ISO/IEC JTC1/SC29/WG1 (previously known as JPEG, together with ITU-T SG16)
|
||||||
|
meeting in Berlin, Germany.
|
||||||
|
|
||||||
|
Thank to John Korejwa and Massimo Ballerini for inviting me to
|
||||||
|
fruitful consultations in Boston, MA and Milan, Italy.
|
||||||
|
|
||||||
|
Thank to Hendrik Elstner, Roland Fassauer, Simone Zuck, Guenther
|
||||||
|
Maier-Gerber, Walter Stoeber, Fred Schmitz, and Norbert Braunagel
|
||||||
|
for corresponding business development.
|
||||||
|
|
||||||
|
Thank to Nico Zschach and Dirk Stelling of the technical support team
|
||||||
|
at the Digital Images company in Halle for providing me with extra
|
||||||
|
equipment for configuration tests.
|
||||||
|
|
||||||
|
Thank to Richard F. Lyon (then of Foveon Inc.) for fruitful
|
||||||
|
communication about JPEG configuration in Sigma Photo Pro software.
|
||||||
|
|
||||||
|
Thank to Andrew Finkenstadt for hosting the ijg.org site.
|
||||||
|
|
||||||
|
Thank to Thomas G. Lane for the original design and development of
|
||||||
|
this singular software package.
|
||||||
|
|
||||||
|
Thank to Lars Goehler, Andreas Heinecke, Sebastian Fuss, Yvonne Roebert,
|
||||||
|
Andrej Werner, and Ulf-Dietrich Braumann for support and public relations.
|
||||||
|
|
||||||
|
|
||||||
FILE FORMAT WARS
|
FILE FORMAT WARS
|
||||||
================
|
================
|
||||||
|
|
||||||
The ISO/IEC JTC1/SC29/WG1 standards committee (also known as JPEG, together
|
The ISO/IEC JTC1/SC29/WG1 standards committee (previously known as JPEG,
|
||||||
with ITU-T SG16) currently promotes different formats containing the name
|
together with ITU-T SG16) currently promotes different formats containing
|
||||||
"JPEG" which are incompatible with original DCT-based JPEG. IJG therefore does
|
the name "JPEG" which is misleading because these formats are incompatible
|
||||||
not support these formats (see REFERENCES). Indeed, one of the original
|
with original DCT-based JPEG and are based on faulty technologies.
|
||||||
reasons for developing this free software was to help force convergence on
|
IJG therefore does not and will not support such momentary mistakes
|
||||||
common, interoperable format standards for JPEG files.
|
(see REFERENCES).
|
||||||
|
There exist also distributions under the name "OpenJPEG" promoting such
|
||||||
|
kind of formats which is misleading because they don't support original
|
||||||
|
JPEG images.
|
||||||
|
We have no sympathy for the promotion of inferior formats. Indeed, one of
|
||||||
|
the original reasons for developing this free software was to help force
|
||||||
|
convergence on common, interoperable format standards for JPEG files.
|
||||||
Don't use an incompatible file format!
|
Don't use an incompatible file format!
|
||||||
(In any case, our decoder will remain capable of reading existing JPEG
|
(In any case, our decoder will remain capable of reading existing JPEG
|
||||||
image files indefinitely.)
|
image files indefinitely.)
|
||||||
|
|
||||||
|
The ISO committee pretends to be "responsible for the popular JPEG" in their
|
||||||
|
public reports which is not true because they don't respond to actual
|
||||||
|
requirements for the maintenance of the original JPEG specification.
|
||||||
|
Furthermore, the ISO committee pretends to "ensure interoperability" with
|
||||||
|
their standards which is not true because their "standards" support only
|
||||||
|
application-specific and proprietary use cases and contain mathematically
|
||||||
|
incorrect code.
|
||||||
|
|
||||||
|
There are currently different distributions in circulation containing the
|
||||||
|
name "libjpeg" which is misleading because they don't have the features and
|
||||||
|
are incompatible with formats supported by actual IJG libjpeg distributions.
|
||||||
|
One of those fakes is released by members of the ISO committee and just uses
|
||||||
|
the name of libjpeg for misdirection of people, similar to the abuse of the
|
||||||
|
name JPEG as described above, while having nothing in common with actual IJG
|
||||||
|
libjpeg distributions and containing mathematically incorrect code.
|
||||||
|
The other one claims to be a "derivative" or "fork" of the original libjpeg,
|
||||||
|
but violates the license conditions as described under LEGAL ISSUES above
|
||||||
|
and violates basic C programming properties.
|
||||||
|
We have no sympathy for the release of misleading, incorrect and illegal
|
||||||
|
distributions derived from obsolete code bases.
|
||||||
|
Don't use an obsolete code base!
|
||||||
|
|
||||||
|
According to the UCC (Uniform Commercial Code) law, IJG has the lawful and
|
||||||
|
legal right to foreclose on certain standardization bodies and other
|
||||||
|
institutions or corporations that knowingly perform substantial and
|
||||||
|
systematic deceptive acts and practices, fraud, theft, and damaging of the
|
||||||
|
value of the people of this planet without their knowing, willing and
|
||||||
|
intentional consent.
|
||||||
|
The titles, ownership, and rights of these institutions and all their assets
|
||||||
|
are now duly secured and held in trust for the free people of this planet.
|
||||||
|
People of the planet, on every country, may have a financial interest in
|
||||||
|
the assets of these former principals, agents, and beneficiaries of the
|
||||||
|
foreclosed institutions and corporations.
|
||||||
|
IJG asserts what is: that each man, woman, and child has unalienable value
|
||||||
|
and rights granted and deposited in them by the Creator and not any one of
|
||||||
|
the people is subordinate to any artificial principality, corporate fiction
|
||||||
|
or the special interest of another without their appropriate knowing,
|
||||||
|
willing and intentional consent made by contract or accommodation agreement.
|
||||||
|
IJG expresses that which already was.
|
||||||
|
The people have already determined and demanded that public administration
|
||||||
|
entities, national governments, and their supporting judicial systems must
|
||||||
|
be fully transparent, accountable, and liable.
|
||||||
|
IJG has secured the value for all concerned free people of the planet.
|
||||||
|
|
||||||
|
A partial list of foreclosed institutions and corporations ("Hall of Shame")
|
||||||
|
is currently prepared and will be published later.
|
||||||
|
|
||||||
|
|
||||||
TO DO
|
TO DO
|
||||||
=====
|
=====
|
||||||
|
|
||||||
|
Version 9 is the second release of a new generation JPEG standard
|
||||||
|
to overcome the limitations of the original JPEG specification,
|
||||||
|
and is the first true source reference JPEG codec.
|
||||||
|
More features are being prepared for coming releases...
|
||||||
|
|
||||||
Please send bug reports, offers of help, etc. to jpeg-info@jpegclub.org.
|
Please send bug reports, offers of help, etc. to jpeg-info@jpegclub.org.
|
||||||
@@ -1,194 +0,0 @@
|
|||||||
Mozilla JPEG Encoder Project
|
|
||||||
============================
|
|
||||||
|
|
||||||
mozjpeg is a fork of libjpeg-turbo that aims to speed up load times of web
|
|
||||||
pages by reducing the size (and, by extension, the transmission time) of JPEG
|
|
||||||
files. It accomplishes this by enabling optimized Huffman trees and
|
|
||||||
progressive entropy coding by default in the JPEG compressor, as well as
|
|
||||||
splitting the spectrum of DCT coefficients into separate scans and using
|
|
||||||
Trellis quantisation.
|
|
||||||
|
|
||||||
Although it is based on libjpeg-turbo, mozjpeg is not intended to be a
|
|
||||||
general-purpose or high-performance JPEG library. Its performance is highly
|
|
||||||
"asymmetric". That is, the JPEG files it generates require much more time to
|
|
||||||
compress than to decompress. When the default settings are used, mozjpeg is
|
|
||||||
considerably slower than libjpeg-turbo or even libjpeg at compressing images.
|
|
||||||
Thus, it is not generally suitable for real-time compression. It is best used
|
|
||||||
as part of a web encoding workflow.
|
|
||||||
|
|
||||||
|
|
||||||
libjpeg API Extensibility Framework
|
|
||||||
===================================
|
|
||||||
|
|
||||||
mozjpeg's implementation of the libjpeg API includes an extensibility framework
|
|
||||||
that allows new features to be added without modifying the transparent libjpeg
|
|
||||||
compress/decompress structures (which would break backward ABI compatibility.)
|
|
||||||
Extension parameters are placed into the opaque jpeg_comp_master structure, and
|
|
||||||
a set of accessor functions and globally unique tokens allows for
|
|
||||||
getting/setting those parameters without directly accessing the structure.
|
|
||||||
|
|
||||||
Currently, only the accessor functions necessary to support the mozjpeg
|
|
||||||
extensions are implemented, but the framework can be easily extended in the
|
|
||||||
future to accommodate additional simple parameter types, complex or
|
|
||||||
multi-valued parameters, or decompressor extensions.
|
|
||||||
|
|
||||||
|
|
||||||
The currently-implemented accessor functions are as follows:
|
|
||||||
|
|
||||||
boolean jpeg_c_bool_param_supported (j_compress_ptr cinfo,
|
|
||||||
J_BOOLEAN_PARAM param)
|
|
||||||
Returns TRUE if the given boolean extension parameter is supported by
|
|
||||||
this implementation of the libjpeg API, or FALSE otherwise.
|
|
||||||
|
|
||||||
void jpeg_c_set_bool_param (j_compress_ptr cinfo,
|
|
||||||
J_BOOLEAN_PARAM param, boolean value);
|
|
||||||
Set the given boolean extension parameter to the given value (TRUE or
|
|
||||||
FALSE.)
|
|
||||||
|
|
||||||
boolean jpeg_c_get_bool_param (j_compress_ptr cinfo, J_BOOLEAN_PARAM param)
|
|
||||||
Get the value of the given boolean extension parameter (TRUE or FALSE.)
|
|
||||||
|
|
||||||
boolean jpeg_c_float_param_supported (j_compress_ptr cinfo,
|
|
||||||
J_FLOAT_PARAM param)
|
|
||||||
Returns TRUE if the given floating point extension parameter is
|
|
||||||
supported by this implementation of the libjpeg API, or FALSE
|
|
||||||
otherwise.
|
|
||||||
|
|
||||||
void jpeg_c_set_float_param (j_compress_ptr cinfo, J_FLOAT_PARAM param,
|
|
||||||
float value)
|
|
||||||
Set the given floating point extension parameter to the given value.
|
|
||||||
|
|
||||||
float jpeg_c_get_float_param (j_compress_ptr cinfo, J_FLOAT_PARAM param);
|
|
||||||
Get the value of the given floating point extension parameter.
|
|
||||||
|
|
||||||
boolean jpeg_c_int_param_supported (j_compress_ptr cinfo,
|
|
||||||
J_INT_PARAM param)
|
|
||||||
Returns TRUE if the given integer extension parameter is supported by
|
|
||||||
this implementation of the libjpeg API, or FALSE otherwise.
|
|
||||||
|
|
||||||
void jpeg_c_set_int_param (j_compress_ptr cinfo, J_INT_PARAM param,
|
|
||||||
int value)
|
|
||||||
Set the given integer extension parameter to the given value.
|
|
||||||
|
|
||||||
int jpeg_c_get_int_param (j_compress_ptr cinfo, J_INT_PARAM param)
|
|
||||||
Get the value of the given integer extension parameter.
|
|
||||||
|
|
||||||
|
|
||||||
Boolean Extension Parameters Supported by mozjpeg
|
|
||||||
-------------------------------------------------
|
|
||||||
|
|
||||||
* JBOOLEAN_OPTIMIZE_SCANS (default: TRUE)
|
|
||||||
Specifies whether scan parameters should be optimized. Parameter
|
|
||||||
optimization is done as in jpgcrush. jpeg_simple_progression() should be called
|
|
||||||
after setting JBOOLEAN_OPTIMIZE_SCANS.
|
|
||||||
When disabling JBOOLEAN_OPTIMIZE_SCANS, cinfo.scan_info should additionally be
|
|
||||||
set to NULL to disable use of the progressive coding mode, if so desired.
|
|
||||||
|
|
||||||
* JBOOLEAN_TRELLIS_QUANT (default: TRUE)
|
|
||||||
Specifies whether to apply trellis quantization. For each 8x8 block, trellis
|
|
||||||
quantization determines the best tradeoff between rate and distortion.
|
|
||||||
|
|
||||||
* JBOOLEAN_TRELLIS_QUANT_DC (default: TRUE)
|
|
||||||
Specifies whether to apply trellis quantization to DC coefficients.
|
|
||||||
|
|
||||||
* JBOOLEAN_TRELLIS_EOB_OPT (default: FALSE)
|
|
||||||
Specifies whether to optimize runs of zero blocks in trellis quantization.
|
|
||||||
This is applicable only when JBOOLEAN_USE_SCANS_IN_TRELLIS is enabled.
|
|
||||||
|
|
||||||
* JBOOLEAN_USE_LAMBDA_WEIGHT_TBL currently has no effect.
|
|
||||||
|
|
||||||
* JBOOLEAN_USE_SCANS_IN_TRELLIS (default: FALSE)
|
|
||||||
Specifies whether multiple scans should be considered during trellis
|
|
||||||
quantization.
|
|
||||||
|
|
||||||
* JBOOLEAN_TRELLIS_Q_OPT (default: FALSE)
|
|
||||||
Specifies whether to optimize the quantization table after trellis
|
|
||||||
quantization. If enabled, then a revised quantization table is derived so
|
|
||||||
as to minimize the reconstruction error of the quantized coefficients.
|
|
||||||
|
|
||||||
* JBOOLEAN_OVERSHOOT_DERINGING (default: TRUE)
|
|
||||||
Specifies whether overshooting is applied to samples with extreme values
|
|
||||||
(for example, 0 and 255 for 8-bit samples). Overshooting may reduce ringing
|
|
||||||
artifacts from compression, in particular in areas where black text appears
|
|
||||||
on a white background.
|
|
||||||
|
|
||||||
|
|
||||||
Floating Point Extension Parameters Supported by mozjpeg
|
|
||||||
--------------------------------------------------------
|
|
||||||
|
|
||||||
* JFLOAT_LAMBDA_LOG_SCALE1 (default: 14.75)
|
|
||||||
JFLOAT_LAMBDA_LOG_SCALE2 (default: 16.5)
|
|
||||||
These parameters specify the lambda value used in trellis quantization. The
|
|
||||||
lambda value (Lagrange multiplier) in the
|
|
||||||
R + lambda * D
|
|
||||||
equation is derived from
|
|
||||||
lambda = 2^s1 / ((2^s2 + n) * q^2),
|
|
||||||
where s1 and s2 are the values of JFLOAT_LAMBDA_LOG_SCALE1 and
|
|
||||||
JFLOAT_LAMBDA_LOG_SCALE2, n is the average of the squared unquantized AC
|
|
||||||
coefficients within the current 8x8 block, and q is the quantization table
|
|
||||||
entry associated with the current coefficient frequency. If
|
|
||||||
JFLOAT_LAMBDA_LOG_SCALE2 is 0, then an alternate form is used that does not
|
|
||||||
rely on n:
|
|
||||||
lambda = 2^(s1-12) / q^2.
|
|
||||||
|
|
||||||
* JFLOAT_TRELLIS_DELTA_DC_WEIGHT (default: 0.0)
|
|
||||||
This parameter controls how distortion is calculated in DC trellis quantization
|
|
||||||
(enabled with JBOOLEAN_TRELLIS_QUANT_DC). It defines weighting between distortion
|
|
||||||
of the DC coefficient and distortion of the vertical gradient of DC coefficients.
|
|
||||||
The value of the parameter corresponds to the weight applied to the distortion
|
|
||||||
of the vertical gradient.
|
|
||||||
|
|
||||||
|
|
||||||
Integer Extension Parameters Supported by mozjpeg
|
|
||||||
-------------------------------------------------
|
|
||||||
|
|
||||||
* JINT_COMPRESS_PROFILE (default: JCP_MAX_COMPRESSION)
|
|
||||||
Select a compression profile, which is a set of default parameters that will
|
|
||||||
achieve a desired compression goal. This parameter controls the behavior of
|
|
||||||
the jpeg_set_defaults() function. Thus, setting JINT_COMPRESS_PROFILE does
|
|
||||||
not cause any other parameters to be modified until jpeg_set_defaults() is
|
|
||||||
called. The following compression profiles are supported:
|
|
||||||
|
|
||||||
- JCP_MAX_COMPRESSION (default)
|
|
||||||
Increase the compression ratio as much as possible, at the expense of
|
|
||||||
increased encoding time. This enables progressive entropy coding and all
|
|
||||||
mozjpeg extensions.
|
|
||||||
|
|
||||||
- JCP_FASTEST
|
|
||||||
Use the libjpeg[-turbo] defaults (baseline entropy coding, no mozjpeg
|
|
||||||
extensions enabled.)
|
|
||||||
|
|
||||||
* JINT_TRELLIS_FREQ_SPLIT (default: 8)
|
|
||||||
Specifies the position within the zigzag scan at which the split between
|
|
||||||
scans is positioned in the context of trellis quantization.
|
|
||||||
JBOOLEAN_USE_SCANS_IN_TRELLIS must be enabled for this parameter to have any
|
|
||||||
effect.
|
|
||||||
|
|
||||||
* JINT_TRELLIS_NUM_LOOPS (default: 1)
|
|
||||||
Specifies the number of trellis quantization passes. Huffman tables are
|
|
||||||
updated between passes.
|
|
||||||
|
|
||||||
* JINT_BASE_QUANT_TBL_IDX (default: 3)
|
|
||||||
Specifies which quantization table set to use. The following options are
|
|
||||||
available:
|
|
||||||
0 = Tables from JPEG Annex K
|
|
||||||
1 = Flat table
|
|
||||||
2 = Table tuned for MSSIM on Kodak image set
|
|
||||||
3 = Table from http://www.imagemagick.org/discourse-server/viewtopic.php?f=22&t=20333&p=98008#p98008
|
|
||||||
4 = Table tuned for PSNR-HVS-M on Kodak image set
|
|
||||||
5 = Table from: Relevance of Human Vision to JPEG-DCT Compression
|
|
||||||
(1992) Klein, Silverstein and Carney
|
|
||||||
6 = Table from: DCTune Perceptual Optimization of Compressed Dental X-Rays
|
|
||||||
(1997) Watson, Taylor, Borthwick
|
|
||||||
7 = Table from: A Visual Detection Model for DCT Coefficient Quantization
|
|
||||||
(12/9/93) Ahumada, Watson, Peterson
|
|
||||||
8 = Table from: An Improved Detection Model for DCT Coefficient Quantization
|
|
||||||
(1993) Peterson, Ahumada and Watson
|
|
||||||
|
|
||||||
* JINT_DC_SCAN_OPT_MODE (default: 1)
|
|
||||||
Specifies the DC scan optimization mode. The following options are
|
|
||||||
available:
|
|
||||||
0 = One scan for all components
|
|
||||||
1 = One scan per component
|
|
||||||
2 = Optimize between one scan for all components and one scan for the first
|
|
||||||
component plus one scan for the remaining components
|
|
||||||
342
README-turbo.txt
@@ -1,342 +0,0 @@
|
|||||||
Background
|
|
||||||
==========
|
|
||||||
|
|
||||||
libjpeg-turbo is a JPEG image codec that uses SIMD instructions (MMX, SSE2,
|
|
||||||
NEON, AltiVec) to accelerate baseline JPEG compression and decompression on
|
|
||||||
x86, x86-64, ARM, and PowerPC systems. On such systems, libjpeg-turbo is
|
|
||||||
generally 2-6x as fast as libjpeg, all else being equal. On other types of
|
|
||||||
systems, libjpeg-turbo can still outperform libjpeg by a significant amount, by
|
|
||||||
virtue of its highly-optimized Huffman coding routines. In many cases, the
|
|
||||||
performance of libjpeg-turbo rivals that of proprietary high-speed JPEG codecs.
|
|
||||||
|
|
||||||
libjpeg-turbo implements both the traditional libjpeg API as well as the less
|
|
||||||
powerful but more straightforward TurboJPEG API. libjpeg-turbo also features
|
|
||||||
colorspace extensions that allow it to compress from/decompress to 32-bit and
|
|
||||||
big-endian pixel buffers (RGBX, XBGR, etc.), as well as a full-featured Java
|
|
||||||
interface.
|
|
||||||
|
|
||||||
libjpeg-turbo was originally based on libjpeg/SIMD, an MMX-accelerated
|
|
||||||
derivative of libjpeg v6b developed by Miyasaka Masaru. The TigerVNC and
|
|
||||||
VirtualGL projects made numerous enhancements to the codec in 2009, and in
|
|
||||||
early 2010, libjpeg-turbo spun off into an independent project, with the goal
|
|
||||||
of making high-speed JPEG compression/decompression technology available to a
|
|
||||||
broader range of users and developers.
|
|
||||||
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
libjpeg-turbo is covered by three compatible BSD-style open source licenses.
|
|
||||||
Refer to [LICENSE.md](LICENSE.md) for a roll-up of license terms.
|
|
||||||
|
|
||||||
|
|
||||||
Building libjpeg-turbo
|
|
||||||
======================
|
|
||||||
|
|
||||||
Refer to [BUILDING.md](BUILDING.md) for complete instructions.
|
|
||||||
|
|
||||||
|
|
||||||
Using libjpeg-turbo
|
|
||||||
===================
|
|
||||||
|
|
||||||
libjpeg-turbo includes two APIs that can be used to compress and decompress
|
|
||||||
JPEG images:
|
|
||||||
|
|
||||||
- **TurboJPEG API**
|
|
||||||
This API provides an easy-to-use interface for compressing and decompressing
|
|
||||||
JPEG images in memory. It also provides some functionality that would not be
|
|
||||||
straightforward to achieve using the underlying libjpeg API, such as
|
|
||||||
generating planar YUV images and performing multiple simultaneous lossless
|
|
||||||
transforms on an image. The Java interface for libjpeg-turbo is written on
|
|
||||||
top of the TurboJPEG API.
|
|
||||||
|
|
||||||
- **libjpeg API**
|
|
||||||
This is the de facto industry-standard API for compressing and decompressing
|
|
||||||
JPEG images. It is more difficult to use than the TurboJPEG API but also
|
|
||||||
more powerful. The libjpeg API implementation in libjpeg-turbo is both
|
|
||||||
API/ABI-compatible and mathematically compatible with libjpeg v6b. It can
|
|
||||||
also optionally be configured to be API/ABI-compatible with libjpeg v7 and v8
|
|
||||||
(see below.)
|
|
||||||
|
|
||||||
There is no significant performance advantage to either API when both are used
|
|
||||||
to perform similar operations.
|
|
||||||
|
|
||||||
Colorspace Extensions
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
libjpeg-turbo includes extensions that allow JPEG images to be compressed
|
|
||||||
directly from (and decompressed directly to) buffers that use BGR, BGRX,
|
|
||||||
RGBX, XBGR, and XRGB pixel ordering. This is implemented with ten new
|
|
||||||
colorspace constants:
|
|
||||||
|
|
||||||
JCS_EXT_RGB /* red/green/blue */
|
|
||||||
JCS_EXT_RGBX /* red/green/blue/x */
|
|
||||||
JCS_EXT_BGR /* blue/green/red */
|
|
||||||
JCS_EXT_BGRX /* blue/green/red/x */
|
|
||||||
JCS_EXT_XBGR /* x/blue/green/red */
|
|
||||||
JCS_EXT_XRGB /* x/red/green/blue */
|
|
||||||
JCS_EXT_RGBA /* red/green/blue/alpha */
|
|
||||||
JCS_EXT_BGRA /* blue/green/red/alpha */
|
|
||||||
JCS_EXT_ABGR /* alpha/blue/green/red */
|
|
||||||
JCS_EXT_ARGB /* alpha/red/green/blue */
|
|
||||||
|
|
||||||
Setting `cinfo.in_color_space` (compression) or `cinfo.out_color_space`
|
|
||||||
(decompression) to one of these values will cause libjpeg-turbo to read the
|
|
||||||
red, green, and blue values from (or write them to) the appropriate position in
|
|
||||||
the pixel when compressing from/decompressing to an RGB buffer.
|
|
||||||
|
|
||||||
Your application can check for the existence of these extensions at compile
|
|
||||||
time with:
|
|
||||||
|
|
||||||
#ifdef JCS_EXTENSIONS
|
|
||||||
|
|
||||||
At run time, attempting to use these extensions with a libjpeg implementation
|
|
||||||
that does not support them will result in a "Bogus input colorspace" error.
|
|
||||||
Applications can trap this error in order to test whether run-time support is
|
|
||||||
available for the colorspace extensions.
|
|
||||||
|
|
||||||
When using the RGBX, BGRX, XBGR, and XRGB colorspaces during decompression, the
|
|
||||||
X byte is undefined, and in order to ensure the best performance, libjpeg-turbo
|
|
||||||
can set that byte to whatever value it wishes. If an application expects the X
|
|
||||||
byte to be used as an alpha channel, then it should specify `JCS_EXT_RGBA`,
|
|
||||||
`JCS_EXT_BGRA`, `JCS_EXT_ABGR`, or `JCS_EXT_ARGB`. When these colorspace
|
|
||||||
constants are used, the X byte is guaranteed to be 0xFF, which is interpreted
|
|
||||||
as opaque.
|
|
||||||
|
|
||||||
Your application can check for the existence of the alpha channel colorspace
|
|
||||||
extensions at compile time with:
|
|
||||||
|
|
||||||
#ifdef JCS_ALPHA_EXTENSIONS
|
|
||||||
|
|
||||||
[jcstest.c](jcstest.c), located in the libjpeg-turbo source tree, demonstrates
|
|
||||||
how to check for the existence of the colorspace extensions at compile time and
|
|
||||||
run time.
|
|
||||||
|
|
||||||
libjpeg v7 and v8 API/ABI Emulation
|
|
||||||
-----------------------------------
|
|
||||||
|
|
||||||
With libjpeg v7 and v8, new features were added that necessitated extending the
|
|
||||||
compression and decompression structures. Unfortunately, due to the exposed
|
|
||||||
nature of those structures, extending them also necessitated breaking backward
|
|
||||||
ABI compatibility with previous libjpeg releases. Thus, programs that were
|
|
||||||
built to use libjpeg v7 or v8 did not work with libjpeg-turbo, since it is
|
|
||||||
based on the libjpeg v6b code base. Although libjpeg v7 and v8 are not
|
|
||||||
as widely used as v6b, enough programs (including a few Linux distros) made
|
|
||||||
the switch that there was a demand to emulate the libjpeg v7 and v8 ABIs
|
|
||||||
in libjpeg-turbo. It should be noted, however, that this feature was added
|
|
||||||
primarily so that applications that had already been compiled to use libjpeg
|
|
||||||
v7+ could take advantage of accelerated baseline JPEG encoding/decoding
|
|
||||||
without recompiling. libjpeg-turbo does not claim to support all of the
|
|
||||||
libjpeg v7+ features, nor to produce identical output to libjpeg v7+ in all
|
|
||||||
cases (see below.)
|
|
||||||
|
|
||||||
By passing an argument of `--with-jpeg7` or `--with-jpeg8` to `configure`, or
|
|
||||||
an argument of `-DWITH_JPEG7=1` or `-DWITH_JPEG8=1` to `cmake`, you can build a
|
|
||||||
version of libjpeg-turbo that emulates the libjpeg v7 or v8 ABI, so that
|
|
||||||
programs that are built against libjpeg v7 or v8 can be run with libjpeg-turbo.
|
|
||||||
The following section describes which libjpeg v7+ features are supported and
|
|
||||||
which aren't.
|
|
||||||
|
|
||||||
### Support for libjpeg v7 and v8 Features
|
|
||||||
|
|
||||||
#### Fully supported
|
|
||||||
|
|
||||||
- **libjpeg: IDCT scaling extensions in decompressor**
|
|
||||||
libjpeg-turbo supports IDCT scaling with scaling factors of 1/8, 1/4, 3/8,
|
|
||||||
1/2, 5/8, 3/4, 7/8, 9/8, 5/4, 11/8, 3/2, 13/8, 7/4, 15/8, and 2/1 (only 1/4
|
|
||||||
and 1/2 are SIMD-accelerated.)
|
|
||||||
|
|
||||||
- **libjpeg: Arithmetic coding**
|
|
||||||
|
|
||||||
- **libjpeg: In-memory source and destination managers**
|
|
||||||
See notes below.
|
|
||||||
|
|
||||||
- **cjpeg: Separate quality settings for luminance and chrominance**
|
|
||||||
Note that the libpjeg v7+ API was extended to accommodate this feature only
|
|
||||||
for convenience purposes. It has always been possible to implement this
|
|
||||||
feature with libjpeg v6b (see rdswitch.c for an example.)
|
|
||||||
|
|
||||||
- **cjpeg: 32-bit BMP support**
|
|
||||||
|
|
||||||
- **cjpeg: `-rgb` option**
|
|
||||||
|
|
||||||
- **jpegtran: Lossless cropping**
|
|
||||||
|
|
||||||
- **jpegtran: `-perfect` option**
|
|
||||||
|
|
||||||
- **jpegtran: Forcing width/height when performing lossless crop**
|
|
||||||
|
|
||||||
- **rdjpgcom: `-raw` option**
|
|
||||||
|
|
||||||
- **rdjpgcom: Locale awareness**
|
|
||||||
|
|
||||||
|
|
||||||
#### Not supported
|
|
||||||
|
|
||||||
NOTE: As of this writing, extensive research has been conducted into the
|
|
||||||
usefulness of DCT scaling as a means of data reduction and SmartScale as a
|
|
||||||
means of quality improvement. The reader is invited to peruse the research at
|
|
||||||
<http://www.libjpeg-turbo.org/About/SmartScale> and draw his/her own conclusions,
|
|
||||||
but it is the general belief of our project that these features have not
|
|
||||||
demonstrated sufficient usefulness to justify inclusion in libjpeg-turbo.
|
|
||||||
|
|
||||||
- **libjpeg: DCT scaling in compressor**
|
|
||||||
`cinfo.scale_num` and `cinfo.scale_denom` are silently ignored.
|
|
||||||
There is no technical reason why DCT scaling could not be supported when
|
|
||||||
emulating the libjpeg v7+ API/ABI, but without the SmartScale extension (see
|
|
||||||
below), only scaling factors of 1/2, 8/15, 4/7, 8/13, 2/3, 8/11, 4/5, and
|
|
||||||
8/9 would be available, which is of limited usefulness.
|
|
||||||
|
|
||||||
- **libjpeg: SmartScale**
|
|
||||||
`cinfo.block_size` is silently ignored.
|
|
||||||
SmartScale is an extension to the JPEG format that allows for DCT block
|
|
||||||
sizes other than 8x8. Providing support for this new format would be
|
|
||||||
feasible (particularly without full acceleration.) However, until/unless
|
|
||||||
the format becomes either an official industry standard or, at minimum, an
|
|
||||||
accepted solution in the community, we are hesitant to implement it, as
|
|
||||||
there is no sense of whether or how it might change in the future. It is
|
|
||||||
our belief that SmartScale has not demonstrated sufficient usefulness as a
|
|
||||||
lossless format nor as a means of quality enhancement, and thus our primary
|
|
||||||
interest in providing this feature would be as a means of supporting
|
|
||||||
additional DCT scaling factors.
|
|
||||||
|
|
||||||
- **libjpeg: Fancy downsampling in compressor**
|
|
||||||
`cinfo.do_fancy_downsampling` is silently ignored.
|
|
||||||
This requires the DCT scaling feature, which is not supported.
|
|
||||||
|
|
||||||
- **jpegtran: Scaling**
|
|
||||||
This requires both the DCT scaling and SmartScale features, which are not
|
|
||||||
supported.
|
|
||||||
|
|
||||||
- **Lossless RGB JPEG files**
|
|
||||||
This requires the SmartScale feature, which is not supported.
|
|
||||||
|
|
||||||
### What About libjpeg v9?
|
|
||||||
|
|
||||||
libjpeg v9 introduced yet another field to the JPEG compression structure
|
|
||||||
(`color_transform`), thus making the ABI backward incompatible with that of
|
|
||||||
libjpeg v8. This new field was introduced solely for the purpose of supporting
|
|
||||||
lossless SmartScale encoding. Furthermore, there was actually no reason to
|
|
||||||
extend the API in this manner, as the color transform could have just as easily
|
|
||||||
been activated by way of a new JPEG colorspace constant, thus preserving
|
|
||||||
backward ABI compatibility.
|
|
||||||
|
|
||||||
Our research (see link above) has shown that lossless SmartScale does not
|
|
||||||
generally accomplish anything that can't already be accomplished better with
|
|
||||||
existing, standard lossless formats. Therefore, at this time it is our belief
|
|
||||||
that there is not sufficient technical justification for software projects to
|
|
||||||
upgrade from libjpeg v8 to libjpeg v9, and thus there is not sufficient
|
|
||||||
echnical justification for us to emulate the libjpeg v9 ABI.
|
|
||||||
|
|
||||||
In-Memory Source/Destination Managers
|
|
||||||
-------------------------------------
|
|
||||||
|
|
||||||
By default, libjpeg-turbo 1.3 and later includes the `jpeg_mem_src()` and
|
|
||||||
`jpeg_mem_dest()` functions, even when not emulating the libjpeg v8 API/ABI.
|
|
||||||
Previously, it was necessary to build libjpeg-turbo from source with libjpeg v8
|
|
||||||
API/ABI emulation in order to use the in-memory source/destination managers,
|
|
||||||
but several projects requested that those functions be included when emulating
|
|
||||||
the libjpeg v6b API/ABI as well. This allows the use of those functions by
|
|
||||||
programs that need them, without breaking ABI compatibility for programs that
|
|
||||||
don't, and it allows those functions to be provided in the "official"
|
|
||||||
libjpeg-turbo binaries.
|
|
||||||
|
|
||||||
Those who are concerned about maintaining strict conformance with the libjpeg
|
|
||||||
v6b or v7 API can pass an argument of `--without-mem-srcdst` to `configure` or
|
|
||||||
an argument of `-DWITH_MEM_SRCDST=0` to `cmake` prior to building
|
|
||||||
libjpeg-turbo. This will restore the pre-1.3 behavior, in which
|
|
||||||
`jpeg_mem_src()` and `jpeg_mem_dest()` are only included when emulating the
|
|
||||||
libjpeg v8 API/ABI.
|
|
||||||
|
|
||||||
On Un*x systems, including the in-memory source/destination managers changes
|
|
||||||
the dynamic library version from 62.0.0 to 62.1.0 if using libjpeg v6b API/ABI
|
|
||||||
emulation and from 7.0.0 to 7.1.0 if using libjpeg v7 API/ABI emulation.
|
|
||||||
|
|
||||||
Note that, on most Un*x systems, the dynamic linker will not look for a
|
|
||||||
function in a library until that function is actually used. Thus, if a program
|
|
||||||
is built against libjpeg-turbo 1.3+ and uses `jpeg_mem_src()` or
|
|
||||||
`jpeg_mem_dest()`, that program will not fail if run against an older version
|
|
||||||
of libjpeg-turbo or against libjpeg v7- until the program actually tries to
|
|
||||||
call `jpeg_mem_src()` or `jpeg_mem_dest()`. Such is not the case on Windows.
|
|
||||||
If a program is built against the libjpeg-turbo 1.3+ DLL and uses
|
|
||||||
`jpeg_mem_src()` or `jpeg_mem_dest()`, then it must use the libjpeg-turbo 1.3+
|
|
||||||
DLL at run time.
|
|
||||||
|
|
||||||
Both cjpeg and djpeg have been extended to allow testing the in-memory
|
|
||||||
source/destination manager functions. See their respective man pages for more
|
|
||||||
details.
|
|
||||||
|
|
||||||
|
|
||||||
Mathematical Compatibility
|
|
||||||
==========================
|
|
||||||
|
|
||||||
For the most part, libjpeg-turbo should produce identical output to libjpeg
|
|
||||||
v6b. The one exception to this is when using the floating point DCT/IDCT, in
|
|
||||||
which case the outputs of libjpeg v6b and libjpeg-turbo can differ for the
|
|
||||||
following reasons:
|
|
||||||
|
|
||||||
- The SSE/SSE2 floating point DCT implementation in libjpeg-turbo is ever so
|
|
||||||
slightly more accurate than the implementation in libjpeg v6b, but not by
|
|
||||||
any amount perceptible to human vision (generally in the range of 0.01 to
|
|
||||||
0.08 dB gain in PNSR.)
|
|
||||||
|
|
||||||
- When not using the SIMD extensions, libjpeg-turbo uses the more accurate
|
|
||||||
(and slightly faster) floating point IDCT algorithm introduced in libjpeg
|
|
||||||
v8a as opposed to the algorithm used in libjpeg v6b. It should be noted,
|
|
||||||
however, that this algorithm basically brings the accuracy of the floating
|
|
||||||
point IDCT in line with the accuracy of the slow integer IDCT. The floating
|
|
||||||
point DCT/IDCT algorithms are mainly a legacy feature, and they do not
|
|
||||||
produce significantly more accuracy than the slow integer algorithms (to put
|
|
||||||
numbers on this, the typical difference in PNSR between the two algorithms
|
|
||||||
is less than 0.10 dB, whereas changing the quality level by 1 in the upper
|
|
||||||
range of the quality scale is typically more like a 1.0 dB difference.)
|
|
||||||
|
|
||||||
- If the floating point algorithms in libjpeg-turbo are not implemented using
|
|
||||||
SIMD instructions on a particular platform, then the accuracy of the
|
|
||||||
floating point DCT/IDCT can depend on the compiler settings.
|
|
||||||
|
|
||||||
While libjpeg-turbo does emulate the libjpeg v8 API/ABI, under the hood it is
|
|
||||||
still using the same algorithms as libjpeg v6b, so there are several specific
|
|
||||||
cases in which libjpeg-turbo cannot be expected to produce the same output as
|
|
||||||
libjpeg v8:
|
|
||||||
|
|
||||||
- When decompressing using scaling factors of 1/2 and 1/4, because libjpeg v8
|
|
||||||
implements those scaling algorithms differently than libjpeg v6b does, and
|
|
||||||
libjpeg-turbo's SIMD extensions are based on the libjpeg v6b behavior.
|
|
||||||
|
|
||||||
- When using chrominance subsampling, because libjpeg v8 implements this
|
|
||||||
with its DCT/IDCT scaling algorithms rather than with a separate
|
|
||||||
downsampling/upsampling algorithm. In our testing, the subsampled/upsampled
|
|
||||||
output of libjpeg v8 is less accurate than that of libjpeg v6b for this
|
|
||||||
reason.
|
|
||||||
|
|
||||||
- When decompressing using a scaling factor > 1 and merged (AKA "non-fancy" or
|
|
||||||
"non-smooth") chrominance upsampling, because libjpeg v8 does not support
|
|
||||||
merged upsampling with scaling factors > 1.
|
|
||||||
|
|
||||||
|
|
||||||
Performance Pitfalls
|
|
||||||
====================
|
|
||||||
|
|
||||||
Restart Markers
|
|
||||||
---------------
|
|
||||||
|
|
||||||
The optimized Huffman decoder in libjpeg-turbo does not handle restart markers
|
|
||||||
in a way that makes the rest of the libjpeg infrastructure happy, so it is
|
|
||||||
necessary to use the slow Huffman decoder when decompressing a JPEG image that
|
|
||||||
has restart markers. This can cause the decompression performance to drop by
|
|
||||||
as much as 20%, but the performance will still be much greater than that of
|
|
||||||
libjpeg. Many consumer packages, such as PhotoShop, use restart markers when
|
|
||||||
generating JPEG images, so images generated by those programs will experience
|
|
||||||
this issue.
|
|
||||||
|
|
||||||
Fast Integer Forward DCT at High Quality Levels
|
|
||||||
-----------------------------------------------
|
|
||||||
|
|
||||||
The algorithm used by the SIMD-accelerated quantization function cannot produce
|
|
||||||
correct results whenever the fast integer forward DCT is used along with a JPEG
|
|
||||||
quality of 98-100. Thus, libjpeg-turbo must use the non-SIMD quantization
|
|
||||||
function in those cases. This causes performance to drop by as much as 40%.
|
|
||||||
It is therefore strongly advised that you use the slow integer forward DCT
|
|
||||||
whenever encoding images with a JPEG quality of 98 or higher.
|
|
||||||
|
|
||||||
23
README.md
@@ -1,23 +0,0 @@
|
|||||||
Mozilla JPEG Encoder Project
|
|
||||||
============================
|
|
||||||
|
|
||||||
MozJPEG reduces file sizes of JPEG images while retaining quality and compatibility with the vast majority of the world's deployed decoders.
|
|
||||||
|
|
||||||
MozJPEG is based on [libjpeg-turbo](https://github.com/libjpeg-turbo/libjpeg-turbo). It's compatible with libjpeg API and ABI, and can be used as a drop-in replacement for libjpeg. MozJPEG makes tradeoffs that are intended to benefit Web use cases and focuses solely on improving encoding, so it's best used as part of a Web encoding workflow.
|
|
||||||
|
|
||||||
MozJPEG is meant to be used as a library in graphics programs and image processing tools. We include a demo `cjpeg` tool, but it's not intended for serious use. We encourage authors of graphics programs to use MozJPEG's [C API](libjpeg.txt) instead.
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
* Progressive encoding with "jpegrescan" optimization. It can be applied to any JPEG file (with `jpegtran`) to losslessly reduce file size.
|
|
||||||
* Trellis quantization. When converting other formats to JPEG it maximizes quality/filesize ratio.
|
|
||||||
* Comes with new quantization table presets, e.g. tuned for high-resolution displays.
|
|
||||||
* Fully compatible with all web browsers.
|
|
||||||
* Can be seamlessly integrated into any program using libjpeg.
|
|
||||||
|
|
||||||
## Releases
|
|
||||||
|
|
||||||
* [Latest release](https://github.com/mozilla/mozjpeg/releases/latest)
|
|
||||||
* [Version 3.0 Announcement](https://boomswaggerboom.wordpress.com/2014/12/30/mozjpeg-3-0-released/) ([overview of 3.0 features](https://calendar.perfplanet.com/2014/mozjpeg-3-0/))
|
|
||||||
* [Version 2.0 Announcement](https://blog.mozilla.org/research/2014/07/15/mozilla-advances-jpeg-encoding-with-mozjpeg-2-0/)
|
|
||||||
* [Version 1.0 Announcement](https://blog.mozilla.org/research/2014/03/05/introducing-the-mozjpeg-project/)
|
|
||||||
254
acinclude.m4
@@ -1,254 +0,0 @@
|
|||||||
# AC_PROG_NASM
|
|
||||||
# --------------------------
|
|
||||||
# Check that NASM exists and determine flags
|
|
||||||
AC_DEFUN([AC_PROG_NASM],[
|
|
||||||
|
|
||||||
AC_ARG_VAR(NASM, [NASM command (used to build the x86/x86-64 SIMD code)])
|
|
||||||
if test "x$NASM" = "x"; then
|
|
||||||
AC_CHECK_PROGS(NASM, [nasm nasmw yasm])
|
|
||||||
test -z "$NASM" && AC_MSG_ERROR([no nasm (Netwide Assembler) found])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for object file format of host system])
|
|
||||||
case "$host_os" in
|
|
||||||
cygwin* | mingw* | pw32* | interix*)
|
|
||||||
case "$host_cpu" in
|
|
||||||
x86_64)
|
|
||||||
objfmt='Win64-COFF'
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
objfmt='Win32-COFF'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
msdosdjgpp* | go32*)
|
|
||||||
objfmt='COFF'
|
|
||||||
;;
|
|
||||||
os2-emx*) # not tested
|
|
||||||
objfmt='MSOMF' # obj
|
|
||||||
;;
|
|
||||||
linux*coff* | linux*oldld*)
|
|
||||||
objfmt='COFF' # ???
|
|
||||||
;;
|
|
||||||
linux*aout*)
|
|
||||||
objfmt='a.out'
|
|
||||||
;;
|
|
||||||
linux*)
|
|
||||||
case "$host_cpu" in
|
|
||||||
x86_64)
|
|
||||||
objfmt='ELF64'
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
objfmt='ELF'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
kfreebsd* | freebsd* | netbsd* | openbsd*)
|
|
||||||
if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
|
|
||||||
objfmt='BSD-a.out'
|
|
||||||
else
|
|
||||||
case "$host_cpu" in
|
|
||||||
x86_64 | amd64)
|
|
||||||
objfmt='ELF64'
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
objfmt='ELF'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
solaris* | sunos* | sysv* | sco*)
|
|
||||||
case "$host_cpu" in
|
|
||||||
x86_64)
|
|
||||||
objfmt='ELF64'
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
objfmt='ELF'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
darwin* | rhapsody* | nextstep* | openstep* | macos*)
|
|
||||||
case "$host_cpu" in
|
|
||||||
x86_64)
|
|
||||||
objfmt='Mach-O64'
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
objfmt='Mach-O'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
objfmt='ELF ?'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
AC_MSG_RESULT([$objfmt])
|
|
||||||
if test "$objfmt" = 'ELF ?'; then
|
|
||||||
objfmt='ELF'
|
|
||||||
AC_MSG_WARN([unexpected host system. assumed that the format is $objfmt.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for object file format specifier (NAFLAGS) ])
|
|
||||||
case "$objfmt" in
|
|
||||||
MSOMF) NAFLAGS='-fobj -DOBJ32';;
|
|
||||||
Win32-COFF) NAFLAGS='-fwin32 -DWIN32';;
|
|
||||||
Win64-COFF) NAFLAGS='-fwin64 -DWIN64 -D__x86_64__';;
|
|
||||||
COFF) NAFLAGS='-fcoff -DCOFF';;
|
|
||||||
a.out) NAFLAGS='-faout -DAOUT';;
|
|
||||||
BSD-a.out) NAFLAGS='-faoutb -DAOUT';;
|
|
||||||
ELF) NAFLAGS='-felf -DELF';;
|
|
||||||
ELF64) NAFLAGS='-felf64 -DELF -D__x86_64__';;
|
|
||||||
RDF) NAFLAGS='-frdf -DRDF';;
|
|
||||||
Mach-O) NAFLAGS='-fmacho -DMACHO';;
|
|
||||||
Mach-O64) NAFLAGS='-fmacho64 -DMACHO -D__x86_64__';;
|
|
||||||
esac
|
|
||||||
AC_MSG_RESULT([$NAFLAGS])
|
|
||||||
AC_SUBST([NAFLAGS])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether the assembler ($NASM $NAFLAGS) works])
|
|
||||||
cat > conftest.asm <<EOF
|
|
||||||
[%line __oline__ "configure"
|
|
||||||
section .text
|
|
||||||
global _main,main
|
|
||||||
_main:
|
|
||||||
main: xor eax,eax
|
|
||||||
ret
|
|
||||||
]EOF
|
|
||||||
try_nasm='$NASM $NAFLAGS -o conftest.o conftest.asm'
|
|
||||||
if AC_TRY_EVAL(try_nasm) && test -s conftest.o; then
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
else
|
|
||||||
echo "configure: failed program was:" >&AC_FD_CC
|
|
||||||
cat conftest.asm >&AC_FD_CC
|
|
||||||
rm -rf conftest*
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
AC_MSG_ERROR([installation or configuration problem: assembler cannot create object files.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether the linker accepts assembler output])
|
|
||||||
try_nasm='${CC-cc} -o conftest${ac_exeext} $LDFLAGS conftest.o $LIBS 1>&AC_FD_CC'
|
|
||||||
if AC_TRY_EVAL(try_nasm) && test -s conftest${ac_exeext}; then
|
|
||||||
rm -rf conftest*
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
else
|
|
||||||
rm -rf conftest*
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
AC_MSG_ERROR([configuration problem: maybe object file format mismatch.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
])
|
|
||||||
|
|
||||||
# AC_CHECK_COMPATIBLE_ARM_ASSEMBLER_IFELSE
|
|
||||||
# --------------------------
|
|
||||||
# Test whether the assembler is suitable and supports NEON instructions
|
|
||||||
AC_DEFUN([AC_CHECK_COMPATIBLE_ARM_ASSEMBLER_IFELSE],[
|
|
||||||
ac_good_gnu_arm_assembler=no
|
|
||||||
ac_save_CC="$CC"
|
|
||||||
ac_save_CFLAGS="$CFLAGS"
|
|
||||||
CFLAGS="$CCASFLAGS -x assembler-with-cpp"
|
|
||||||
CC="$CCAS"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
|
||||||
.text
|
|
||||||
.fpu neon
|
|
||||||
.arch armv7a
|
|
||||||
.object_arch armv4
|
|
||||||
.arm
|
|
||||||
pld [r0]
|
|
||||||
vmovn.u16 d0, q0]])], ac_good_gnu_arm_assembler=yes)
|
|
||||||
|
|
||||||
ac_use_gas_preprocessor=no
|
|
||||||
if test "x$ac_good_gnu_arm_assembler" = "xno" ; then
|
|
||||||
CC="gas-preprocessor.pl $CCAS"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
|
||||||
.text
|
|
||||||
.fpu neon
|
|
||||||
.arch armv7a
|
|
||||||
.object_arch armv4
|
|
||||||
.arm
|
|
||||||
pld [r0]
|
|
||||||
vmovn.u16 d0, q0]])], ac_use_gas_preprocessor=yes)
|
|
||||||
fi
|
|
||||||
CFLAGS="$ac_save_CFLAGS"
|
|
||||||
CC="$ac_save_CC"
|
|
||||||
|
|
||||||
if test "x$ac_use_gas_preprocessor" = "xyes" ; then
|
|
||||||
CCAS="gas-preprocessor.pl $CCAS"
|
|
||||||
AC_SUBST([CCAS])
|
|
||||||
ac_good_gnu_arm_assembler=yes
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$ac_good_gnu_arm_assembler" = "xyes" ; then
|
|
||||||
$1
|
|
||||||
else
|
|
||||||
$2
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
# AC_CHECK_COMPATIBLE_MIPSEL_ASSEMBLER_IFELSE
|
|
||||||
# --------------------------
|
|
||||||
# Test whether the assembler is suitable and supports MIPS instructions
|
|
||||||
AC_DEFUN([AC_CHECK_COMPATIBLE_MIPS_ASSEMBLER_IFELSE],[
|
|
||||||
have_mips_dspr2=no
|
|
||||||
ac_save_CFLAGS="$CFLAGS"
|
|
||||||
CFLAGS="$CCASFLAGS -mdspr2"
|
|
||||||
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
|
||||||
|
|
||||||
int main ()
|
|
||||||
{
|
|
||||||
int c = 0, a = 0, b = 0;
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
"precr.qb.ph %[c], %[a], %[b] \n\t"
|
|
||||||
: [c] "=r" (c)
|
|
||||||
: [a] "r" (a), [b] "r" (b)
|
|
||||||
);
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
]])], have_mips_dspr2=yes)
|
|
||||||
CFLAGS=$ac_save_CFLAGS
|
|
||||||
|
|
||||||
if test "x$have_mips_dspr2" = "xyes" ; then
|
|
||||||
$1
|
|
||||||
else
|
|
||||||
$2
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([AC_CHECK_COMPATIBLE_ARM64_ASSEMBLER_IFELSE],[
|
|
||||||
ac_good_gnu_arm_assembler=no
|
|
||||||
ac_save_CC="$CC"
|
|
||||||
ac_save_CFLAGS="$CFLAGS"
|
|
||||||
CFLAGS="$CCASFLAGS -x assembler-with-cpp"
|
|
||||||
CC="$CCAS"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
|
||||||
.text
|
|
||||||
MYVAR .req x0
|
|
||||||
movi v0.16b, #100
|
|
||||||
mov MYVAR, #100
|
|
||||||
.unreq MYVAR]])], ac_good_gnu_arm_assembler=yes)
|
|
||||||
|
|
||||||
ac_use_gas_preprocessor=no
|
|
||||||
if test "x$ac_good_gnu_arm_assembler" = "xno" ; then
|
|
||||||
CC="gas-preprocessor.pl $CCAS"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
|
||||||
.text
|
|
||||||
MYVAR .req x0
|
|
||||||
movi v0.16b, #100
|
|
||||||
mov MYVAR, #100
|
|
||||||
.unreq MYVAR]])], ac_use_gas_preprocessor=yes)
|
|
||||||
fi
|
|
||||||
CFLAGS="$ac_save_CFLAGS"
|
|
||||||
CC="$ac_save_CC"
|
|
||||||
|
|
||||||
if test "x$ac_use_gas_preprocessor" = "xyes" ; then
|
|
||||||
CCAS="gas-preprocessor.pl $CCAS"
|
|
||||||
AC_SUBST([CCAS])
|
|
||||||
ac_good_gnu_arm_assembler=yes
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$ac_good_gnu_arm_assembler" = "xyes" ; then
|
|
||||||
$1
|
|
||||||
else
|
|
||||||
$2
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
10277
aclocal.m4
vendored
Normal file
270
ar-lib
Executable file
@@ -0,0 +1,270 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# Wrapper for Microsoft lib.exe
|
||||||
|
|
||||||
|
me=ar-lib
|
||||||
|
scriptversion=2012-03-01.08; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 2010-2017 Free Software Foundation, Inc.
|
||||||
|
# Written by Peter Rosin <peda@lysator.liu.se>.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# This file is maintained in Automake, please report
|
||||||
|
# bugs to <bug-automake@gnu.org> or send patches to
|
||||||
|
# <automake-patches@gnu.org>.
|
||||||
|
|
||||||
|
|
||||||
|
# func_error message
|
||||||
|
func_error ()
|
||||||
|
{
|
||||||
|
echo "$me: $1" 1>&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
file_conv=
|
||||||
|
|
||||||
|
# func_file_conv build_file
|
||||||
|
# Convert a $build file to $host form and store it in $file
|
||||||
|
# Currently only supports Windows hosts.
|
||||||
|
func_file_conv ()
|
||||||
|
{
|
||||||
|
file=$1
|
||||||
|
case $file in
|
||||||
|
/ | /[!/]*) # absolute file, and not a UNC file
|
||||||
|
if test -z "$file_conv"; then
|
||||||
|
# lazily determine how to convert abs files
|
||||||
|
case `uname -s` in
|
||||||
|
MINGW*)
|
||||||
|
file_conv=mingw
|
||||||
|
;;
|
||||||
|
CYGWIN*)
|
||||||
|
file_conv=cygwin
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
file_conv=wine
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
case $file_conv in
|
||||||
|
mingw)
|
||||||
|
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
||||||
|
;;
|
||||||
|
cygwin)
|
||||||
|
file=`cygpath -m "$file" || echo "$file"`
|
||||||
|
;;
|
||||||
|
wine)
|
||||||
|
file=`winepath -w "$file" || echo "$file"`
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# func_at_file at_file operation archive
|
||||||
|
# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE
|
||||||
|
# for each of them.
|
||||||
|
# When interpreting the content of the @FILE, do NOT use func_file_conv,
|
||||||
|
# since the user would need to supply preconverted file names to
|
||||||
|
# binutils ar, at least for MinGW.
|
||||||
|
func_at_file ()
|
||||||
|
{
|
||||||
|
operation=$2
|
||||||
|
archive=$3
|
||||||
|
at_file_contents=`cat "$1"`
|
||||||
|
eval set x "$at_file_contents"
|
||||||
|
shift
|
||||||
|
|
||||||
|
for member
|
||||||
|
do
|
||||||
|
$AR -NOLOGO $operation:"$member" "$archive" || exit $?
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
'')
|
||||||
|
func_error "no command. Try '$0 --help' for more information."
|
||||||
|
;;
|
||||||
|
-h | --h*)
|
||||||
|
cat <<EOF
|
||||||
|
Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...]
|
||||||
|
|
||||||
|
Members may be specified in a file named with @FILE.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "$me, version $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test $# -lt 3; then
|
||||||
|
func_error "you must specify a program, an action and an archive"
|
||||||
|
fi
|
||||||
|
|
||||||
|
AR=$1
|
||||||
|
shift
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
if test $# -lt 2; then
|
||||||
|
func_error "you must specify a program, an action and an archive"
|
||||||
|
fi
|
||||||
|
case $1 in
|
||||||
|
-lib | -LIB \
|
||||||
|
| -ltcg | -LTCG \
|
||||||
|
| -machine* | -MACHINE* \
|
||||||
|
| -subsystem* | -SUBSYSTEM* \
|
||||||
|
| -verbose | -VERBOSE \
|
||||||
|
| -wx* | -WX* )
|
||||||
|
AR="$AR $1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
action=$1
|
||||||
|
shift
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
orig_archive=$1
|
||||||
|
shift
|
||||||
|
func_file_conv "$orig_archive"
|
||||||
|
archive=$file
|
||||||
|
|
||||||
|
# strip leading dash in $action
|
||||||
|
action=${action#-}
|
||||||
|
|
||||||
|
delete=
|
||||||
|
extract=
|
||||||
|
list=
|
||||||
|
quick=
|
||||||
|
replace=
|
||||||
|
index=
|
||||||
|
create=
|
||||||
|
|
||||||
|
while test -n "$action"
|
||||||
|
do
|
||||||
|
case $action in
|
||||||
|
d*) delete=yes ;;
|
||||||
|
x*) extract=yes ;;
|
||||||
|
t*) list=yes ;;
|
||||||
|
q*) quick=yes ;;
|
||||||
|
r*) replace=yes ;;
|
||||||
|
s*) index=yes ;;
|
||||||
|
S*) ;; # the index is always updated implicitly
|
||||||
|
c*) create=yes ;;
|
||||||
|
u*) ;; # TODO: don't ignore the update modifier
|
||||||
|
v*) ;; # TODO: don't ignore the verbose modifier
|
||||||
|
*)
|
||||||
|
func_error "unknown action specified"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
action=${action#?}
|
||||||
|
done
|
||||||
|
|
||||||
|
case $delete$extract$list$quick$replace,$index in
|
||||||
|
yes,* | ,yes)
|
||||||
|
;;
|
||||||
|
yesyes*)
|
||||||
|
func_error "more than one action specified"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
func_error "no action specified"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test -n "$delete"; then
|
||||||
|
if test ! -f "$orig_archive"; then
|
||||||
|
func_error "archive not found"
|
||||||
|
fi
|
||||||
|
for member
|
||||||
|
do
|
||||||
|
case $1 in
|
||||||
|
@*)
|
||||||
|
func_at_file "${1#@}" -REMOVE "$archive"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
func_file_conv "$1"
|
||||||
|
$AR -NOLOGO -REMOVE:"$file" "$archive" || exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
elif test -n "$extract"; then
|
||||||
|
if test ! -f "$orig_archive"; then
|
||||||
|
func_error "archive not found"
|
||||||
|
fi
|
||||||
|
if test $# -gt 0; then
|
||||||
|
for member
|
||||||
|
do
|
||||||
|
case $1 in
|
||||||
|
@*)
|
||||||
|
func_at_file "${1#@}" -EXTRACT "$archive"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
func_file_conv "$1"
|
||||||
|
$AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
else
|
||||||
|
$AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member
|
||||||
|
do
|
||||||
|
$AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif test -n "$quick$replace"; then
|
||||||
|
if test ! -f "$orig_archive"; then
|
||||||
|
if test -z "$create"; then
|
||||||
|
echo "$me: creating $orig_archive"
|
||||||
|
fi
|
||||||
|
orig_archive=
|
||||||
|
else
|
||||||
|
orig_archive=$archive
|
||||||
|
fi
|
||||||
|
|
||||||
|
for member
|
||||||
|
do
|
||||||
|
case $1 in
|
||||||
|
@*)
|
||||||
|
func_file_conv "${1#@}"
|
||||||
|
set x "$@" "@$file"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
func_file_conv "$1"
|
||||||
|
set x "$@" "$file"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -n "$orig_archive"; then
|
||||||
|
$AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $?
|
||||||
|
else
|
||||||
|
$AR -NOLOGO -OUT:"$archive" "$@" || exit $?
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif test -n "$list"; then
|
||||||
|
if test ! -f "$orig_archive"; then
|
||||||
|
func_error "archive not found"
|
||||||
|
fi
|
||||||
|
$AR -NOLOGO -LIST "$archive" || exit $?
|
||||||
|
fi
|
||||||
334
bmp.c
@@ -1,334 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C)2011, 2015 D. R. Commander. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* - Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
|
||||||
* and/or other materials provided with the distribution.
|
|
||||||
* - Neither the name of the libjpeg-turbo Project nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from this
|
|
||||||
* software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <setjmp.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include "cdjpeg.h"
|
|
||||||
#include <jpeglib.h>
|
|
||||||
#include <jpegint.h>
|
|
||||||
#include "tjutil.h"
|
|
||||||
#include "bmp.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* This duplicates the functionality of the VirtualGL bitmap library using
|
|
||||||
the components from cjpeg and djpeg */
|
|
||||||
|
|
||||||
|
|
||||||
/* Error handling (based on example in example.c) */
|
|
||||||
|
|
||||||
static char errStr[JMSG_LENGTH_MAX]="No error";
|
|
||||||
|
|
||||||
struct my_error_mgr
|
|
||||||
{
|
|
||||||
struct jpeg_error_mgr pub;
|
|
||||||
jmp_buf setjmp_buffer;
|
|
||||||
};
|
|
||||||
typedef struct my_error_mgr *my_error_ptr;
|
|
||||||
|
|
||||||
static void my_error_exit(j_common_ptr cinfo)
|
|
||||||
{
|
|
||||||
my_error_ptr myerr=(my_error_ptr)cinfo->err;
|
|
||||||
(*cinfo->err->output_message)(cinfo);
|
|
||||||
longjmp(myerr->setjmp_buffer, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Based on output_message() in jerror.c */
|
|
||||||
|
|
||||||
static void my_output_message(j_common_ptr cinfo)
|
|
||||||
{
|
|
||||||
(*cinfo->err->format_message)(cinfo, errStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _throw(m) {snprintf(errStr, JMSG_LENGTH_MAX, "%s", m); \
|
|
||||||
retval=-1; goto bailout;}
|
|
||||||
#define _throwunix(m) {snprintf(errStr, JMSG_LENGTH_MAX, "%s\n%s", m, \
|
|
||||||
strerror(errno)); retval=-1; goto bailout;}
|
|
||||||
|
|
||||||
|
|
||||||
static void pixelconvert(unsigned char *srcbuf, int srcpf, int srcbottomup,
|
|
||||||
unsigned char *dstbuf, int dstpf, int dstbottomup, int w, int h)
|
|
||||||
{
|
|
||||||
unsigned char *srcrowptr=srcbuf, *srccolptr;
|
|
||||||
int srcps=tjPixelSize[srcpf];
|
|
||||||
int srcstride=srcbottomup? -w*srcps:w*srcps;
|
|
||||||
unsigned char *dstrowptr=dstbuf, *dstcolptr;
|
|
||||||
int dstps=tjPixelSize[dstpf];
|
|
||||||
int dststride=dstbottomup? -w*dstps:w*dstps;
|
|
||||||
int row, col;
|
|
||||||
|
|
||||||
if(srcbottomup) srcrowptr=&srcbuf[w*srcps*(h-1)];
|
|
||||||
if(dstbottomup) dstrowptr=&dstbuf[w*dstps*(h-1)];
|
|
||||||
|
|
||||||
/* NOTE: These quick & dirty CMYK<->RGB conversion routines are for testing
|
|
||||||
purposes only. Properly converting between CMYK and RGB requires a color
|
|
||||||
management system. */
|
|
||||||
|
|
||||||
if(dstpf==TJPF_CMYK)
|
|
||||||
{
|
|
||||||
for(row=0; row<h; row++, srcrowptr+=srcstride, dstrowptr+=dststride)
|
|
||||||
{
|
|
||||||
for(col=0, srccolptr=srcrowptr, dstcolptr=dstrowptr;
|
|
||||||
col<w; col++, srccolptr+=srcps)
|
|
||||||
{
|
|
||||||
double c=1.0-((double)(srccolptr[tjRedOffset[srcpf]])/255.);
|
|
||||||
double m=1.0-((double)(srccolptr[tjGreenOffset[srcpf]])/255.);
|
|
||||||
double y=1.0-((double)(srccolptr[tjBlueOffset[srcpf]])/255.);
|
|
||||||
double k=min(min(c,m),min(y,1.0));
|
|
||||||
if(k==1.0) c=m=y=0.0;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
c=(c-k)/(1.0-k);
|
|
||||||
m=(m-k)/(1.0-k);
|
|
||||||
y=(y-k)/(1.0-k);
|
|
||||||
}
|
|
||||||
if(c>1.0) c=1.0; if(c<0.) c=0.;
|
|
||||||
if(m>1.0) m=1.0; if(m<0.) m=0.;
|
|
||||||
if(y>1.0) y=1.0; if(y<0.) y=0.;
|
|
||||||
if(k>1.0) k=1.0; if(k<0.) k=0.;
|
|
||||||
*dstcolptr++=(unsigned char)(255.0-c*255.0+0.5);
|
|
||||||
*dstcolptr++=(unsigned char)(255.0-m*255.0+0.5);
|
|
||||||
*dstcolptr++=(unsigned char)(255.0-y*255.0+0.5);
|
|
||||||
*dstcolptr++=(unsigned char)(255.0-k*255.0+0.5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(srcpf==TJPF_CMYK)
|
|
||||||
{
|
|
||||||
for(row=0; row<h; row++, srcrowptr+=srcstride, dstrowptr+=dststride)
|
|
||||||
{
|
|
||||||
for(col=0, srccolptr=srcrowptr, dstcolptr=dstrowptr;
|
|
||||||
col<w; col++, dstcolptr+=dstps)
|
|
||||||
{
|
|
||||||
double c=(double)(*srccolptr++);
|
|
||||||
double m=(double)(*srccolptr++);
|
|
||||||
double y=(double)(*srccolptr++);
|
|
||||||
double k=(double)(*srccolptr++);
|
|
||||||
double r=c*k/255.;
|
|
||||||
double g=m*k/255.;
|
|
||||||
double b=y*k/255.;
|
|
||||||
if(r>255.0) r=255.0; if(r<0.) r=0.;
|
|
||||||
if(g>255.0) g=255.0; if(g<0.) g=0.;
|
|
||||||
if(b>255.0) b=255.0; if(b<0.) b=0.;
|
|
||||||
dstcolptr[tjRedOffset[dstpf]]=(unsigned char)(r+0.5);
|
|
||||||
dstcolptr[tjGreenOffset[dstpf]]=(unsigned char)(g+0.5);
|
|
||||||
dstcolptr[tjBlueOffset[dstpf]]=(unsigned char)(b+0.5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for(row=0; row<h; row++, srcrowptr+=srcstride, dstrowptr+=dststride)
|
|
||||||
{
|
|
||||||
for(col=0, srccolptr=srcrowptr, dstcolptr=dstrowptr;
|
|
||||||
col<w; col++, srccolptr+=srcps, dstcolptr+=dstps)
|
|
||||||
{
|
|
||||||
dstcolptr[tjRedOffset[dstpf]]=srccolptr[tjRedOffset[srcpf]];
|
|
||||||
dstcolptr[tjGreenOffset[dstpf]]=srccolptr[tjGreenOffset[srcpf]];
|
|
||||||
dstcolptr[tjBlueOffset[dstpf]]=srccolptr[tjBlueOffset[srcpf]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int loadbmp(char *filename, unsigned char **buf, int *w, int *h,
|
|
||||||
int dstpf, int bottomup)
|
|
||||||
{
|
|
||||||
int retval=0, dstps, srcpf, tempc;
|
|
||||||
struct jpeg_compress_struct cinfo;
|
|
||||||
struct my_error_mgr jerr;
|
|
||||||
cjpeg_source_ptr src;
|
|
||||||
FILE *file=NULL;
|
|
||||||
|
|
||||||
memset(&cinfo, 0, sizeof(struct jpeg_compress_struct));
|
|
||||||
|
|
||||||
if(!filename || !buf || !w || !h || dstpf<0 || dstpf>=TJ_NUMPF)
|
|
||||||
_throw("loadbmp(): Invalid argument");
|
|
||||||
|
|
||||||
if((file=fopen(filename, "rb"))==NULL)
|
|
||||||
_throwunix("loadbmp(): Cannot open input file");
|
|
||||||
|
|
||||||
cinfo.err=jpeg_std_error(&jerr.pub);
|
|
||||||
jerr.pub.error_exit=my_error_exit;
|
|
||||||
jerr.pub.output_message=my_output_message;
|
|
||||||
|
|
||||||
if(setjmp(jerr.setjmp_buffer))
|
|
||||||
{
|
|
||||||
/* If we get here, the JPEG code has signaled an error. */
|
|
||||||
retval=-1; goto bailout;
|
|
||||||
}
|
|
||||||
|
|
||||||
jpeg_create_compress(&cinfo);
|
|
||||||
if((tempc=getc(file))<0 || ungetc(tempc, file)==EOF)
|
|
||||||
_throwunix("loadbmp(): Could not read input file")
|
|
||||||
else if(tempc==EOF) _throw("loadbmp(): Input file contains no data");
|
|
||||||
|
|
||||||
if(tempc=='B')
|
|
||||||
{
|
|
||||||
if((src=jinit_read_bmp(&cinfo))==NULL)
|
|
||||||
_throw("loadbmp(): Could not initialize bitmap loader");
|
|
||||||
}
|
|
||||||
else if(tempc=='P')
|
|
||||||
{
|
|
||||||
if((src=jinit_read_ppm(&cinfo))==NULL)
|
|
||||||
_throw("loadbmp(): Could not initialize bitmap loader");
|
|
||||||
}
|
|
||||||
else _throw("loadbmp(): Unsupported file type");
|
|
||||||
|
|
||||||
src->input_file=file;
|
|
||||||
(*src->start_input)(&cinfo, src);
|
|
||||||
(*cinfo.mem->realize_virt_arrays)((j_common_ptr)&cinfo);
|
|
||||||
|
|
||||||
*w=cinfo.image_width; *h=cinfo.image_height;
|
|
||||||
|
|
||||||
if(cinfo.input_components==1 && cinfo.in_color_space==JCS_RGB)
|
|
||||||
srcpf=TJPF_GRAY;
|
|
||||||
else srcpf=TJPF_RGB;
|
|
||||||
|
|
||||||
dstps=tjPixelSize[dstpf];
|
|
||||||
if((*buf=(unsigned char *)malloc((*w)*(*h)*dstps))==NULL)
|
|
||||||
_throw("loadbmp(): Memory allocation failure");
|
|
||||||
|
|
||||||
while(cinfo.next_scanline<cinfo.image_height)
|
|
||||||
{
|
|
||||||
int i, nlines=(*src->get_pixel_rows)(&cinfo, src);
|
|
||||||
for(i=0; i<nlines; i++)
|
|
||||||
{
|
|
||||||
unsigned char *outbuf; int row;
|
|
||||||
row=cinfo.next_scanline+i;
|
|
||||||
if(bottomup) outbuf=&(*buf)[((*h)-row-1)*(*w)*dstps];
|
|
||||||
else outbuf=&(*buf)[row*(*w)*dstps];
|
|
||||||
pixelconvert(src->buffer[i], srcpf, 0, outbuf, dstpf, bottomup, *w,
|
|
||||||
nlines);
|
|
||||||
}
|
|
||||||
cinfo.next_scanline+=nlines;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*src->finish_input)(&cinfo, src);
|
|
||||||
|
|
||||||
bailout:
|
|
||||||
jpeg_destroy_compress(&cinfo);
|
|
||||||
if(file) fclose(file);
|
|
||||||
if(retval<0 && buf && *buf) {free(*buf); *buf=NULL;}
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int savebmp(char *filename, unsigned char *buf, int w, int h, int srcpf,
|
|
||||||
int bottomup)
|
|
||||||
{
|
|
||||||
int retval=0, srcps, dstpf;
|
|
||||||
struct jpeg_decompress_struct dinfo;
|
|
||||||
struct my_error_mgr jerr;
|
|
||||||
djpeg_dest_ptr dst;
|
|
||||||
FILE *file=NULL;
|
|
||||||
char *ptr=NULL;
|
|
||||||
|
|
||||||
memset(&dinfo, 0, sizeof(struct jpeg_decompress_struct));
|
|
||||||
|
|
||||||
if(!filename || !buf || w<1 || h<1 || srcpf<0 || srcpf>=TJ_NUMPF)
|
|
||||||
_throw("savebmp(): Invalid argument");
|
|
||||||
|
|
||||||
if((file=fopen(filename, "wb"))==NULL)
|
|
||||||
_throwunix("savebmp(): Cannot open output file");
|
|
||||||
|
|
||||||
dinfo.err=jpeg_std_error(&jerr.pub);
|
|
||||||
jerr.pub.error_exit=my_error_exit;
|
|
||||||
jerr.pub.output_message=my_output_message;
|
|
||||||
|
|
||||||
if(setjmp(jerr.setjmp_buffer))
|
|
||||||
{
|
|
||||||
/* If we get here, the JPEG code has signaled an error. */
|
|
||||||
retval=-1; goto bailout;
|
|
||||||
}
|
|
||||||
|
|
||||||
jpeg_create_decompress(&dinfo);
|
|
||||||
if(srcpf==TJPF_GRAY)
|
|
||||||
{
|
|
||||||
dinfo.out_color_components=dinfo.output_components=1;
|
|
||||||
dinfo.out_color_space=JCS_GRAYSCALE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dinfo.out_color_components=dinfo.output_components=3;
|
|
||||||
dinfo.out_color_space=JCS_RGB;
|
|
||||||
}
|
|
||||||
dinfo.image_width=w; dinfo.image_height=h;
|
|
||||||
dinfo.global_state=DSTATE_READY;
|
|
||||||
dinfo.scale_num=dinfo.scale_denom=1;
|
|
||||||
|
|
||||||
ptr=strrchr(filename, '.');
|
|
||||||
if(ptr && !strcasecmp(ptr, ".bmp"))
|
|
||||||
{
|
|
||||||
if((dst=jinit_write_bmp(&dinfo, 0))==NULL)
|
|
||||||
_throw("savebmp(): Could not initialize bitmap writer");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if((dst=jinit_write_ppm(&dinfo))==NULL)
|
|
||||||
_throw("savebmp(): Could not initialize PPM writer");
|
|
||||||
}
|
|
||||||
|
|
||||||
dst->output_file=file;
|
|
||||||
(*dst->start_output)(&dinfo, dst);
|
|
||||||
(*dinfo.mem->realize_virt_arrays)((j_common_ptr)&dinfo);
|
|
||||||
|
|
||||||
if(srcpf==TJPF_GRAY) dstpf=srcpf;
|
|
||||||
else dstpf=TJPF_RGB;
|
|
||||||
srcps=tjPixelSize[srcpf];
|
|
||||||
|
|
||||||
while(dinfo.output_scanline<dinfo.output_height)
|
|
||||||
{
|
|
||||||
int i, nlines=dst->buffer_height;
|
|
||||||
for(i=0; i<nlines; i++)
|
|
||||||
{
|
|
||||||
unsigned char *inbuf; int row;
|
|
||||||
row=dinfo.output_scanline+i;
|
|
||||||
if(bottomup) inbuf=&buf[(h-row-1)*w*srcps];
|
|
||||||
else inbuf=&buf[row*w*srcps];
|
|
||||||
pixelconvert(inbuf, srcpf, bottomup, dst->buffer[i], dstpf, 0, w,
|
|
||||||
nlines);
|
|
||||||
}
|
|
||||||
(*dst->put_pixel_rows)(&dinfo, dst, nlines);
|
|
||||||
dinfo.output_scanline+=nlines;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*dst->finish_output)(&dinfo, dst);
|
|
||||||
|
|
||||||
bailout:
|
|
||||||
jpeg_destroy_decompress(&dinfo);
|
|
||||||
if(file) fclose(file);
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *bmpgeterr(void)
|
|
||||||
{
|
|
||||||
return errStr;
|
|
||||||
}
|
|
||||||
42
bmp.h
@@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C)2011 D. R. Commander. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* - Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
|
||||||
* and/or other materials provided with the distribution.
|
|
||||||
* - Neither the name of the libjpeg-turbo Project nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from this
|
|
||||||
* software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __BMP_H__
|
|
||||||
#define __BMP_H__
|
|
||||||
|
|
||||||
#include "./turbojpeg.h"
|
|
||||||
|
|
||||||
int loadbmp(char *filename, unsigned char **buf, int *w, int *h, int pf,
|
|
||||||
int bottomup);
|
|
||||||
|
|
||||||
int savebmp(char *filename, unsigned char *buf, int w, int h, int pf,
|
|
||||||
int bottomup);
|
|
||||||
|
|
||||||
const char *bmpgeterr(void);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
29
cderror.h
@@ -2,10 +2,9 @@
|
|||||||
* cderror.h
|
* cderror.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
* Copyright (C) 1994-1997, Thomas G. Lane.
|
||||||
* Modified 2009 by Guido Vollbeding.
|
* Modified 2009-2017 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
* file.
|
|
||||||
*
|
*
|
||||||
* This file defines the error and message codes for the cjpeg/djpeg
|
* This file defines the error and message codes for the cjpeg/djpeg
|
||||||
* applications. These strings are not needed as part of the JPEG library
|
* applications. These strings are not needed as part of the JPEG library
|
||||||
@@ -34,7 +33,7 @@
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
||||||
#define JMESSAGE(code,string) code ,
|
#define JMESSAGE(code,string) code ,
|
||||||
|
|
||||||
#endif /* JMAKE_ENUM_LIST */
|
#endif /* JMAKE_ENUM_LIST */
|
||||||
|
|
||||||
@@ -42,16 +41,16 @@ JMESSAGE(JMSG_FIRSTADDONCODE=1000, NULL) /* Must be first entry! */
|
|||||||
|
|
||||||
#ifdef BMP_SUPPORTED
|
#ifdef BMP_SUPPORTED
|
||||||
JMESSAGE(JERR_BMP_BADCMAP, "Unsupported BMP colormap format")
|
JMESSAGE(JERR_BMP_BADCMAP, "Unsupported BMP colormap format")
|
||||||
JMESSAGE(JERR_BMP_BADDEPTH, "Only 8- and 24-bit BMP files are supported")
|
JMESSAGE(JERR_BMP_BADDEPTH, "Only 8-, 24-, and 32-bit BMP files are supported")
|
||||||
JMESSAGE(JERR_BMP_BADHEADER, "Invalid BMP file: bad header length")
|
JMESSAGE(JERR_BMP_BADHEADER, "Invalid BMP file: bad header length")
|
||||||
JMESSAGE(JERR_BMP_BADPLANES, "Invalid BMP file: biPlanes not equal to 1")
|
JMESSAGE(JERR_BMP_BADPLANES, "Invalid BMP file: biPlanes not equal to 1")
|
||||||
JMESSAGE(JERR_BMP_COLORSPACE, "BMP output must be grayscale or RGB")
|
JMESSAGE(JERR_BMP_COLORSPACE, "BMP output must be grayscale or RGB")
|
||||||
JMESSAGE(JERR_BMP_COMPRESSED, "Sorry, compressed BMPs not yet supported")
|
JMESSAGE(JERR_BMP_COMPRESSED, "Sorry, compressed BMPs not yet supported")
|
||||||
JMESSAGE(JERR_BMP_EMPTY, "Empty BMP image")
|
|
||||||
JMESSAGE(JERR_BMP_NOT, "Not a BMP file - does not start with BM")
|
JMESSAGE(JERR_BMP_NOT, "Not a BMP file - does not start with BM")
|
||||||
JMESSAGE(JTRC_BMP, "%ux%u 24-bit BMP image")
|
JMESSAGE(JERR_BMP_OUTOFRANGE, "Numeric value out of range in BMP file")
|
||||||
|
JMESSAGE(JTRC_BMP, "%ux%u %d-bit BMP image")
|
||||||
JMESSAGE(JTRC_BMP_MAPPED, "%ux%u 8-bit colormapped BMP image")
|
JMESSAGE(JTRC_BMP_MAPPED, "%ux%u 8-bit colormapped BMP image")
|
||||||
JMESSAGE(JTRC_BMP_OS2, "%ux%u 24-bit OS2 BMP image")
|
JMESSAGE(JTRC_BMP_OS2, "%ux%u %d-bit OS2 BMP image")
|
||||||
JMESSAGE(JTRC_BMP_OS2_MAPPED, "%ux%u 8-bit colormapped OS2 BMP image")
|
JMESSAGE(JTRC_BMP_OS2_MAPPED, "%ux%u 8-bit colormapped OS2 BMP image")
|
||||||
#endif /* BMP_SUPPORTED */
|
#endif /* BMP_SUPPORTED */
|
||||||
|
|
||||||
@@ -63,7 +62,7 @@ JMESSAGE(JERR_GIF_IMAGENOTFOUND, "Too few images in GIF file")
|
|||||||
JMESSAGE(JERR_GIF_NOT, "Not a GIF file")
|
JMESSAGE(JERR_GIF_NOT, "Not a GIF file")
|
||||||
JMESSAGE(JTRC_GIF, "%ux%ux%d GIF image")
|
JMESSAGE(JTRC_GIF, "%ux%ux%d GIF image")
|
||||||
JMESSAGE(JTRC_GIF_BADVERSION,
|
JMESSAGE(JTRC_GIF_BADVERSION,
|
||||||
"Warning: unexpected GIF version number '%c%c%c'")
|
"Warning: unexpected GIF version number '%c%c%c'")
|
||||||
JMESSAGE(JTRC_GIF_EXTENSION, "Ignoring GIF extension block of type 0x%02x")
|
JMESSAGE(JTRC_GIF_EXTENSION, "Ignoring GIF extension block of type 0x%02x")
|
||||||
JMESSAGE(JTRC_GIF_NONSQUARE, "Caution: nonsquare pixels in input")
|
JMESSAGE(JTRC_GIF_NONSQUARE, "Caution: nonsquare pixels in input")
|
||||||
JMESSAGE(JWRN_GIF_BADDATA, "Corrupt data in GIF file")
|
JMESSAGE(JWRN_GIF_BADDATA, "Corrupt data in GIF file")
|
||||||
@@ -75,8 +74,8 @@ JMESSAGE(JWRN_GIF_NOMOREDATA, "Ran out of GIF bits")
|
|||||||
#ifdef PPM_SUPPORTED
|
#ifdef PPM_SUPPORTED
|
||||||
JMESSAGE(JERR_PPM_COLORSPACE, "PPM output must be grayscale or RGB")
|
JMESSAGE(JERR_PPM_COLORSPACE, "PPM output must be grayscale or RGB")
|
||||||
JMESSAGE(JERR_PPM_NONNUMERIC, "Nonnumeric data in PPM file")
|
JMESSAGE(JERR_PPM_NONNUMERIC, "Nonnumeric data in PPM file")
|
||||||
JMESSAGE(JERR_PPM_TOOLARGE, "Integer value too large in PPM file")
|
|
||||||
JMESSAGE(JERR_PPM_NOT, "Not a PPM/PGM file")
|
JMESSAGE(JERR_PPM_NOT, "Not a PPM/PGM file")
|
||||||
|
JMESSAGE(JERR_PPM_OUTOFRANGE, "Numeric value out of range in PPM file")
|
||||||
JMESSAGE(JTRC_PGM, "%ux%u PGM image")
|
JMESSAGE(JTRC_PGM, "%ux%u PGM image")
|
||||||
JMESSAGE(JTRC_PGM_TEXT, "%ux%u text PGM image")
|
JMESSAGE(JTRC_PGM_TEXT, "%ux%u text PGM image")
|
||||||
JMESSAGE(JTRC_PPM, "%ux%u PPM image")
|
JMESSAGE(JTRC_PPM, "%ux%u PPM image")
|
||||||
@@ -112,22 +111,18 @@ JMESSAGE(JERR_TGA_NOTCOMP, "Targa support was not compiled")
|
|||||||
#endif /* TARGA_SUPPORTED */
|
#endif /* TARGA_SUPPORTED */
|
||||||
|
|
||||||
JMESSAGE(JERR_BAD_CMAP_FILE,
|
JMESSAGE(JERR_BAD_CMAP_FILE,
|
||||||
"Color map file is invalid or of unsupported format")
|
"Color map file is invalid or of unsupported format")
|
||||||
JMESSAGE(JERR_TOO_MANY_COLORS,
|
JMESSAGE(JERR_TOO_MANY_COLORS,
|
||||||
"Output file format cannot handle %d colormap entries")
|
"Output file format cannot handle %d colormap entries")
|
||||||
JMESSAGE(JERR_UNGETC_FAILED, "ungetc failed")
|
JMESSAGE(JERR_UNGETC_FAILED, "ungetc failed")
|
||||||
#ifdef TARGA_SUPPORTED
|
#ifdef TARGA_SUPPORTED
|
||||||
JMESSAGE(JERR_UNKNOWN_FORMAT,
|
JMESSAGE(JERR_UNKNOWN_FORMAT,
|
||||||
"Unrecognized input file format --- perhaps you need -targa")
|
"Unrecognized input file format --- perhaps you need -targa")
|
||||||
#else
|
#else
|
||||||
JMESSAGE(JERR_UNKNOWN_FORMAT, "Unrecognized input file format")
|
JMESSAGE(JERR_UNKNOWN_FORMAT, "Unrecognized input file format")
|
||||||
#endif
|
#endif
|
||||||
JMESSAGE(JERR_UNSUPPORTED_FORMAT, "Unsupported output file format")
|
JMESSAGE(JERR_UNSUPPORTED_FORMAT, "Unsupported output file format")
|
||||||
|
|
||||||
#ifdef PNG_SUPPORTED
|
|
||||||
JMESSAGE(JERR_PNG_ERROR, "Unable to read PNG file: %s")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef JMAKE_ENUM_LIST
|
#ifdef JMAKE_ENUM_LIST
|
||||||
|
|
||||||
JMSG_LASTADDONCODE
|
JMSG_LASTADDONCODE
|
||||||
|
|||||||
79
cdjpeg.c
@@ -1,23 +1,60 @@
|
|||||||
/*
|
/*
|
||||||
* cdjpeg.c
|
* cdjpeg.c
|
||||||
*
|
*
|
||||||
* This file was part of the Independent JPEG Group's software:
|
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* It was modified by The libjpeg-turbo Project to include only code relevant
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* to libjpeg-turbo.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
|
||||||
* file.
|
|
||||||
*
|
*
|
||||||
* This file contains common support routines used by the IJG application
|
* This file contains common support routines used by the IJG application
|
||||||
* programs (cjpeg, djpeg, jpegtran).
|
* programs (cjpeg, djpeg, jpegtran).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
|
#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
|
||||||
#include <ctype.h> /* to declare isupper(), tolower() */
|
#include <ctype.h> /* to declare isupper(), tolower() */
|
||||||
|
#ifdef NEED_SIGNAL_CATCHER
|
||||||
|
#include <signal.h> /* to declare signal() */
|
||||||
|
#endif
|
||||||
#ifdef USE_SETMODE
|
#ifdef USE_SETMODE
|
||||||
#include <fcntl.h> /* to declare setmode()'s parameter macros */
|
#include <fcntl.h> /* to declare setmode()'s parameter macros */
|
||||||
/* If you have setmode() but not <io.h>, just delete this line: */
|
/* If you have setmode() but not <io.h>, just delete this line: */
|
||||||
#include <io.h> /* to declare setmode() */
|
#include <io.h> /* to declare setmode() */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Signal catcher to ensure that temporary files are removed before aborting.
|
||||||
|
* NB: for Amiga Manx C this is actually a global routine named _abort();
|
||||||
|
* we put "#define signal_catcher _abort" in jconfig.h. Talk about bogus...
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef NEED_SIGNAL_CATCHER
|
||||||
|
|
||||||
|
static j_common_ptr sig_cinfo;
|
||||||
|
|
||||||
|
void /* must be global for Manx C */
|
||||||
|
signal_catcher (int signum)
|
||||||
|
{
|
||||||
|
if (sig_cinfo != NULL) {
|
||||||
|
if (sig_cinfo->err != NULL) /* turn off trace output */
|
||||||
|
sig_cinfo->err->trace_level = 0;
|
||||||
|
jpeg_destroy(sig_cinfo); /* clean up memory allocation & temp files */
|
||||||
|
}
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
enable_signal_catcher (j_common_ptr cinfo)
|
||||||
|
{
|
||||||
|
sig_cinfo = cinfo;
|
||||||
|
#ifdef SIGINT /* not all systems have SIGINT */
|
||||||
|
signal(SIGINT, signal_catcher);
|
||||||
|
#endif
|
||||||
|
#ifdef SIGTERM /* not all systems have SIGTERM */
|
||||||
|
signal(SIGTERM, signal_catcher);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -38,8 +75,8 @@ progress_monitor (j_common_ptr cinfo)
|
|||||||
prog->percent_done = percent_done;
|
prog->percent_done = percent_done;
|
||||||
if (total_passes > 1) {
|
if (total_passes > 1) {
|
||||||
fprintf(stderr, "\rPass %d/%d: %3d%% ",
|
fprintf(stderr, "\rPass %d/%d: %3d%% ",
|
||||||
prog->pub.completed_passes + prog->completed_extra_passes + 1,
|
prog->pub.completed_passes + prog->completed_extra_passes + 1,
|
||||||
total_passes, percent_done);
|
total_passes, percent_done);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "\r %3d%% ", percent_done);
|
fprintf(stderr, "\r %3d%% ", percent_done);
|
||||||
}
|
}
|
||||||
@@ -82,24 +119,24 @@ end_progress_monitor (j_common_ptr cinfo)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
GLOBAL(boolean)
|
GLOBAL(boolean)
|
||||||
keymatch (char *arg, const char *keyword, int minchars)
|
keymatch (char * arg, const char * keyword, int minchars)
|
||||||
{
|
{
|
||||||
register int ca, ck;
|
register int ca, ck;
|
||||||
register int nmatched = 0;
|
register int nmatched = 0;
|
||||||
|
|
||||||
while ((ca = *arg++) != '\0') {
|
while ((ca = *arg++) != '\0') {
|
||||||
if ((ck = *keyword++) == '\0')
|
if ((ck = *keyword++) == '\0')
|
||||||
return FALSE; /* arg longer than keyword, no good */
|
return FALSE; /* arg longer than keyword, no good */
|
||||||
if (isupper(ca)) /* force arg to lcase (assume ck is already) */
|
if (isupper(ca)) /* force arg to lcase (assume ck is already) */
|
||||||
ca = tolower(ca);
|
ca = tolower(ca);
|
||||||
if (ca != ck)
|
if (ca != ck)
|
||||||
return FALSE; /* no good */
|
return FALSE; /* no good */
|
||||||
nmatched++; /* count matched characters */
|
nmatched++; /* count matched characters */
|
||||||
}
|
}
|
||||||
/* reached end of argument; fail if it's too short for unique abbrev */
|
/* reached end of argument; fail if it's too short for unique abbrev */
|
||||||
if (nmatched < minchars)
|
if (nmatched < minchars)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
return TRUE; /* A-OK */
|
return TRUE; /* A-OK */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -113,10 +150,10 @@ read_stdin (void)
|
|||||||
{
|
{
|
||||||
FILE * input_file = stdin;
|
FILE * input_file = stdin;
|
||||||
|
|
||||||
#ifdef USE_SETMODE /* need to hack file mode? */
|
#ifdef USE_SETMODE /* need to hack file mode? */
|
||||||
setmode(fileno(stdin), O_BINARY);
|
setmode(fileno(stdin), O_BINARY);
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_FDOPEN /* need to re-open in binary mode? */
|
#ifdef USE_FDOPEN /* need to re-open in binary mode? */
|
||||||
if ((input_file = fdopen(fileno(stdin), READ_BINARY)) == NULL) {
|
if ((input_file = fdopen(fileno(stdin), READ_BINARY)) == NULL) {
|
||||||
fprintf(stderr, "Cannot reopen stdin\n");
|
fprintf(stderr, "Cannot reopen stdin\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
@@ -131,10 +168,10 @@ write_stdout (void)
|
|||||||
{
|
{
|
||||||
FILE * output_file = stdout;
|
FILE * output_file = stdout;
|
||||||
|
|
||||||
#ifdef USE_SETMODE /* need to hack file mode? */
|
#ifdef USE_SETMODE /* need to hack file mode? */
|
||||||
setmode(fileno(stdout), O_BINARY);
|
setmode(fileno(stdout), O_BINARY);
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_FDOPEN /* need to re-open in binary mode? */
|
#ifdef USE_FDOPEN /* need to re-open in binary mode? */
|
||||||
if ((output_file = fdopen(fileno(stdout), WRITE_BINARY)) == NULL) {
|
if ((output_file = fdopen(fileno(stdout), WRITE_BINARY)) == NULL) {
|
||||||
fprintf(stderr, "Cannot reopen stdout\n");
|
fprintf(stderr, "Cannot reopen stdout\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|||||||
163
cdjpeg.h
@@ -1,49 +1,40 @@
|
|||||||
/*
|
/*
|
||||||
* cdjpeg.h
|
* cdjpeg.h
|
||||||
*
|
*
|
||||||
* This file was part of the Independent JPEG Group's software:
|
|
||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
* Copyright (C) 1994-1997, Thomas G. Lane.
|
||||||
* It was modified by The libjpeg-turbo Project to include only code relevant
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* to libjpeg-turbo.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
* mozjpeg Modifications:
|
|
||||||
* Copyright (C) 2014, Mozilla Corporation.
|
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg file.
|
|
||||||
*
|
*
|
||||||
* This file contains common declarations for the sample applications
|
* This file contains common declarations for the sample applications
|
||||||
* cjpeg and djpeg. It is NOT used by the core JPEG library.
|
* cjpeg and djpeg. It is NOT used by the core JPEG library.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define JPEG_CJPEG_DJPEG /* define proper options in jconfig.h */
|
#define JPEG_CJPEG_DJPEG /* define proper options in jconfig.h */
|
||||||
#define JPEG_INTERNAL_OPTIONS /* cjpeg.c,djpeg.c need to see xxx_SUPPORTED */
|
#define JPEG_INTERNAL_OPTIONS /* cjpeg.c,djpeg.c need to see xxx_SUPPORTED */
|
||||||
#include "jinclude.h"
|
#include "jinclude.h"
|
||||||
#include "jpeglib.h"
|
#include "jpeglib.h"
|
||||||
#include "jerror.h" /* get library error codes too */
|
#include "jerror.h" /* get library error codes too */
|
||||||
#include "cderror.h" /* get application-specific error codes */
|
#include "cderror.h" /* get application-specific error codes */
|
||||||
|
|
||||||
#define JPEG_RAW_READER 0
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Object interface for cjpeg's source file decoding modules
|
* Object interface for cjpeg's source file decoding modules
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct cjpeg_source_struct *cjpeg_source_ptr;
|
typedef struct cjpeg_source_struct * cjpeg_source_ptr;
|
||||||
|
|
||||||
struct cjpeg_source_struct {
|
struct cjpeg_source_struct {
|
||||||
void (*start_input) (j_compress_ptr cinfo, cjpeg_source_ptr sinfo);
|
JMETHOD(void, start_input, (j_compress_ptr cinfo,
|
||||||
JDIMENSION (*get_pixel_rows) (j_compress_ptr cinfo, cjpeg_source_ptr sinfo);
|
cjpeg_source_ptr sinfo));
|
||||||
void (*finish_input) (j_compress_ptr cinfo, cjpeg_source_ptr sinfo);
|
JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo,
|
||||||
|
cjpeg_source_ptr sinfo));
|
||||||
|
JMETHOD(void, finish_input, (j_compress_ptr cinfo,
|
||||||
|
cjpeg_source_ptr sinfo));
|
||||||
|
|
||||||
FILE *input_file;
|
FILE *input_file;
|
||||||
|
|
||||||
JSAMPARRAY buffer;
|
JSAMPARRAY buffer;
|
||||||
JDIMENSION buffer_height;
|
JDIMENSION buffer_height;
|
||||||
|
|
||||||
#if JPEG_RAW_READER
|
|
||||||
// For reading JPEG
|
|
||||||
JSAMPARRAY plane_pointer[4];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
jpeg_saved_marker_ptr marker_list;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -51,21 +42,24 @@ struct cjpeg_source_struct {
|
|||||||
* Object interface for djpeg's output file encoding modules
|
* Object interface for djpeg's output file encoding modules
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct djpeg_dest_struct *djpeg_dest_ptr;
|
typedef struct djpeg_dest_struct * djpeg_dest_ptr;
|
||||||
|
|
||||||
struct djpeg_dest_struct {
|
struct djpeg_dest_struct {
|
||||||
/* start_output is called after jpeg_start_decompress finishes.
|
/* start_output is called after jpeg_start_decompress finishes.
|
||||||
* The color map will be ready at this time, if one is needed.
|
* The color map will be ready at this time, if one is needed.
|
||||||
*/
|
*/
|
||||||
void (*start_output) (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo);
|
JMETHOD(void, start_output, (j_decompress_ptr cinfo,
|
||||||
|
djpeg_dest_ptr dinfo));
|
||||||
/* Emit the specified number of pixel rows from the buffer. */
|
/* Emit the specified number of pixel rows from the buffer. */
|
||||||
void (*put_pixel_rows) (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,
|
JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo,
|
||||||
JDIMENSION rows_supplied);
|
djpeg_dest_ptr dinfo,
|
||||||
|
JDIMENSION rows_supplied));
|
||||||
/* Finish up at the end of the image. */
|
/* Finish up at the end of the image. */
|
||||||
void (*finish_output) (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo);
|
JMETHOD(void, finish_output, (j_decompress_ptr cinfo,
|
||||||
|
djpeg_dest_ptr dinfo));
|
||||||
|
|
||||||
/* Target file spec; filled in by djpeg.c after object is created. */
|
/* Target file spec; filled in by djpeg.c after object is created. */
|
||||||
FILE *output_file;
|
FILE * output_file;
|
||||||
|
|
||||||
/* Output pixel-row buffer. Created by module init or start_output.
|
/* Output pixel-row buffer. Created by module init or start_output.
|
||||||
* Width is cinfo->output_width * cinfo->output_components;
|
* Width is cinfo->output_width * cinfo->output_components;
|
||||||
@@ -85,72 +79,109 @@ struct djpeg_dest_struct {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
struct cdjpeg_progress_mgr {
|
struct cdjpeg_progress_mgr {
|
||||||
struct jpeg_progress_mgr pub; /* fields known to JPEG library */
|
struct jpeg_progress_mgr pub; /* fields known to JPEG library */
|
||||||
int completed_extra_passes; /* extra passes completed */
|
int completed_extra_passes; /* extra passes completed */
|
||||||
int total_extra_passes; /* total extra */
|
int total_extra_passes; /* total extra */
|
||||||
/* last printed percentage stored here to avoid multiple printouts */
|
/* last printed percentage stored here to avoid multiple printouts */
|
||||||
int percent_done;
|
int percent_done;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct cdjpeg_progress_mgr *cd_progress_ptr;
|
typedef struct cdjpeg_progress_mgr * cd_progress_ptr;
|
||||||
|
|
||||||
|
|
||||||
|
/* Short forms of external names for systems with brain-damaged linkers. */
|
||||||
|
|
||||||
|
#ifdef NEED_SHORT_EXTERNAL_NAMES
|
||||||
|
#define jinit_read_bmp jIRdBMP
|
||||||
|
#define jinit_write_bmp jIWrBMP
|
||||||
|
#define jinit_read_gif jIRdGIF
|
||||||
|
#define jinit_write_gif jIWrGIF
|
||||||
|
#define jinit_read_ppm jIRdPPM
|
||||||
|
#define jinit_write_ppm jIWrPPM
|
||||||
|
#define jinit_read_rle jIRdRLE
|
||||||
|
#define jinit_write_rle jIWrRLE
|
||||||
|
#define jinit_read_targa jIRdTarga
|
||||||
|
#define jinit_write_targa jIWrTarga
|
||||||
|
#define read_quant_tables RdQTables
|
||||||
|
#define read_scan_script RdScnScript
|
||||||
|
#define set_quality_ratings SetQRates
|
||||||
|
#define set_quant_slots SetQSlots
|
||||||
|
#define set_sample_factors SetSFacts
|
||||||
|
#define read_color_map RdCMap
|
||||||
|
#define enable_signal_catcher EnSigCatcher
|
||||||
|
#define start_progress_monitor StProgMon
|
||||||
|
#define end_progress_monitor EnProgMon
|
||||||
|
#define read_stdin RdStdin
|
||||||
|
#define write_stdout WrStdout
|
||||||
|
#endif /* NEED_SHORT_EXTERNAL_NAMES */
|
||||||
|
|
||||||
/* Module selection routines for I/O modules. */
|
/* Module selection routines for I/O modules. */
|
||||||
|
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_bmp (j_compress_ptr cinfo);
|
EXTERN(cjpeg_source_ptr) jinit_read_bmp JPP((j_compress_ptr cinfo));
|
||||||
EXTERN(djpeg_dest_ptr) jinit_write_bmp (j_decompress_ptr cinfo,
|
EXTERN(djpeg_dest_ptr) jinit_write_bmp JPP((j_decompress_ptr cinfo,
|
||||||
boolean is_os2);
|
boolean is_os2));
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_gif (j_compress_ptr cinfo);
|
EXTERN(cjpeg_source_ptr) jinit_read_gif JPP((j_compress_ptr cinfo));
|
||||||
EXTERN(djpeg_dest_ptr) jinit_write_gif (j_decompress_ptr cinfo);
|
EXTERN(djpeg_dest_ptr) jinit_write_gif JPP((j_decompress_ptr cinfo));
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_jpeg (j_compress_ptr cinfo);
|
EXTERN(cjpeg_source_ptr) jinit_read_ppm JPP((j_compress_ptr cinfo));
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_ppm (j_compress_ptr cinfo);
|
EXTERN(djpeg_dest_ptr) jinit_write_ppm JPP((j_decompress_ptr cinfo));
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_png (j_compress_ptr cinfo);
|
EXTERN(cjpeg_source_ptr) jinit_read_rle JPP((j_compress_ptr cinfo));
|
||||||
EXTERN(djpeg_dest_ptr) jinit_write_ppm (j_decompress_ptr cinfo);
|
EXTERN(djpeg_dest_ptr) jinit_write_rle JPP((j_decompress_ptr cinfo));
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_rle (j_compress_ptr cinfo);
|
EXTERN(cjpeg_source_ptr) jinit_read_targa JPP((j_compress_ptr cinfo));
|
||||||
EXTERN(djpeg_dest_ptr) jinit_write_rle (j_decompress_ptr cinfo);
|
EXTERN(djpeg_dest_ptr) jinit_write_targa JPP((j_decompress_ptr cinfo));
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_targa (j_compress_ptr cinfo);
|
|
||||||
EXTERN(djpeg_dest_ptr) jinit_write_targa (j_decompress_ptr cinfo);
|
|
||||||
|
|
||||||
/* cjpeg support routines (in rdswitch.c) */
|
/* cjpeg support routines (in rdswitch.c) */
|
||||||
|
|
||||||
EXTERN(boolean) read_quant_tables (j_compress_ptr cinfo, char *filename,
|
EXTERN(boolean) read_quant_tables JPP((j_compress_ptr cinfo, char * filename,
|
||||||
boolean force_baseline);
|
boolean force_baseline));
|
||||||
EXTERN(boolean) read_scan_script (j_compress_ptr cinfo, char *filename);
|
EXTERN(boolean) read_scan_script JPP((j_compress_ptr cinfo, char * filename));
|
||||||
EXTERN(boolean) set_quality_ratings (j_compress_ptr cinfo, char *arg,
|
EXTERN(boolean) set_quality_ratings JPP((j_compress_ptr cinfo, char *arg,
|
||||||
boolean force_baseline);
|
boolean force_baseline));
|
||||||
EXTERN(boolean) set_quant_slots (j_compress_ptr cinfo, char *arg);
|
EXTERN(boolean) set_quant_slots JPP((j_compress_ptr cinfo, char *arg));
|
||||||
EXTERN(boolean) set_sample_factors (j_compress_ptr cinfo, char *arg);
|
EXTERN(boolean) set_sample_factors JPP((j_compress_ptr cinfo, char *arg));
|
||||||
|
|
||||||
/* djpeg support routines (in rdcolmap.c) */
|
/* djpeg support routines (in rdcolmap.c) */
|
||||||
|
|
||||||
EXTERN(void) read_color_map (j_decompress_ptr cinfo, FILE *infile);
|
EXTERN(void) read_color_map JPP((j_decompress_ptr cinfo, FILE * infile));
|
||||||
|
|
||||||
/* common support routines (in cdjpeg.c) */
|
/* common support routines (in cdjpeg.c) */
|
||||||
|
|
||||||
EXTERN(void) enable_signal_catcher (j_common_ptr cinfo);
|
EXTERN(void) enable_signal_catcher JPP((j_common_ptr cinfo));
|
||||||
EXTERN(void) start_progress_monitor (j_common_ptr cinfo,
|
EXTERN(void) start_progress_monitor JPP((j_common_ptr cinfo,
|
||||||
cd_progress_ptr progress);
|
cd_progress_ptr progress));
|
||||||
EXTERN(void) end_progress_monitor (j_common_ptr cinfo);
|
EXTERN(void) end_progress_monitor JPP((j_common_ptr cinfo));
|
||||||
EXTERN(boolean) keymatch (char *arg, const char *keyword, int minchars);
|
EXTERN(boolean) keymatch JPP((char * arg, const char * keyword, int minchars));
|
||||||
EXTERN(FILE *) read_stdin (void);
|
EXTERN(FILE *) read_stdin JPP((void));
|
||||||
EXTERN(FILE *) write_stdout (void);
|
EXTERN(FILE *) write_stdout JPP((void));
|
||||||
|
|
||||||
/* miscellaneous useful macros */
|
/* miscellaneous useful macros */
|
||||||
|
|
||||||
#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */
|
#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */
|
||||||
#define READ_BINARY "r"
|
#define READ_BINARY "r"
|
||||||
#define WRITE_BINARY "w"
|
#define WRITE_BINARY "w"
|
||||||
#else
|
#else
|
||||||
#define READ_BINARY "rb"
|
#ifdef VMS /* VMS is very nonstandard */
|
||||||
#define WRITE_BINARY "wb"
|
#define READ_BINARY "rb", "ctx=stm"
|
||||||
|
#define WRITE_BINARY "wb", "ctx=stm"
|
||||||
|
#else /* standard ANSI-compliant case */
|
||||||
|
#define READ_BINARY "rb"
|
||||||
|
#define WRITE_BINARY "wb"
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef EXIT_FAILURE /* define exit() codes if not provided */
|
#ifndef EXIT_FAILURE /* define exit() codes if not provided */
|
||||||
#define EXIT_FAILURE 1
|
#define EXIT_FAILURE 1
|
||||||
#endif
|
#endif
|
||||||
#ifndef EXIT_SUCCESS
|
#ifndef EXIT_SUCCESS
|
||||||
|
#ifdef VMS
|
||||||
|
#define EXIT_SUCCESS 1 /* VMS is very nonstandard */
|
||||||
|
#else
|
||||||
#define EXIT_SUCCESS 0
|
#define EXIT_SUCCESS 0
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
#ifndef EXIT_WARNING
|
#ifndef EXIT_WARNING
|
||||||
|
#ifdef VMS
|
||||||
|
#define EXIT_WARNING 1 /* VMS is very nonstandard */
|
||||||
|
#else
|
||||||
#define EXIT_WARNING 2
|
#define EXIT_WARNING 2
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|||||||
148
change.log
@@ -1,27 +1,112 @@
|
|||||||
libjpeg-turbo note: This file has been modified by The libjpeg-turbo Project
|
|
||||||
to include only information relevant to libjpeg-turbo. It is included only for
|
|
||||||
reference. Please see ChangeLog.md for information specific to libjpeg-turbo.
|
|
||||||
|
|
||||||
|
|
||||||
CHANGE LOG for Independent JPEG Group's JPEG software
|
CHANGE LOG for Independent JPEG Group's JPEG software
|
||||||
|
|
||||||
|
|
||||||
|
Version 9c 14-Jan-2018
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
jpegtran: add an option to the -wipe switch to fill the region
|
||||||
|
with the average of adjacent blocks, instead of gray out.
|
||||||
|
Thank to Caitlyn Feddock and Maddie Ziegler for inspiration.
|
||||||
|
|
||||||
|
Make range extension bits adjustable (in jpegint.h).
|
||||||
|
Thank to Robin Watts for suggestion.
|
||||||
|
|
||||||
|
Provide macros for fflush() and ferror() in jinclude.h in order
|
||||||
|
to facilitate adaption by applications using an own FILE class.
|
||||||
|
Thank to Gerhard Huber for suggestion.
|
||||||
|
|
||||||
|
Add libjpeg pkg-config file. Thank to Mark Lavi, Vincent Torri,
|
||||||
|
Patrick McMunn, and Huw Davies for suggestion.
|
||||||
|
|
||||||
|
Add sanity checks in cjpeg image reader modules.
|
||||||
|
Thank to Bingchang, Liu for reports.
|
||||||
|
|
||||||
|
|
||||||
Version 9b 17-Jan-2016
|
Version 9b 17-Jan-2016
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
|
Improvements and optimizations in DCT and color calculations.
|
||||||
|
Normalize range limit array composition and access pattern.
|
||||||
|
Thank to Sia Furler and Maddie Ziegler for inspiration.
|
||||||
|
|
||||||
|
Use merged upsample with scaled DCT sizes larger than 8.
|
||||||
|
Thank to Taylor Hatala for inspiration.
|
||||||
|
|
||||||
|
Check for excessive comment lengths in argument parsing in wrjpgcom.c.
|
||||||
|
Thank to Julian Cohen for hint.
|
||||||
|
|
||||||
|
Add makefile.b32 for use with Borland C++ 32-bit (bcc32).
|
||||||
|
Thank to Joe Slater for contribution.
|
||||||
|
|
||||||
Document 'f' specifier for jpegtran -crop specification.
|
Document 'f' specifier for jpegtran -crop specification.
|
||||||
Thank to Michele Martone for suggestion.
|
Thank to Michele Martone for suggestion.
|
||||||
|
|
||||||
|
Use defined value from header instead of hardwired number in rdswitch.c.
|
||||||
|
Thank to Robert Sprowson for hint.
|
||||||
|
|
||||||
|
|
||||||
|
Version 9a 19-Jan-2014
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Add support for wide gamut color spaces (JFIF version 2).
|
||||||
|
Improve clarity and accuracy in color conversion modules.
|
||||||
|
Note: Requires rebuild of test images.
|
||||||
|
|
||||||
|
Extend the bit depth support to all values from 8 to 12
|
||||||
|
(BITS_IN_JSAMPLE configuration option in jmorecfg.h).
|
||||||
|
jpegtran now supports N bits sample data precision with all N from 8 to 12
|
||||||
|
in a single instance. Thank to Roland Fassauer for inspiration.
|
||||||
|
|
||||||
|
Try to resolve issues with new boolean type definition.
|
||||||
|
Thank also to v4hn for suggestion.
|
||||||
|
|
||||||
|
Enable option to use default Huffman tables for lossless compression
|
||||||
|
(for hardware solution), and in this case improve lossless RGB compression
|
||||||
|
with reversible color transform. Thank to Benny Alexandar for hint.
|
||||||
|
|
||||||
|
Extend the entropy decoding structure, so that extraneous bytes between
|
||||||
|
compressed scan data and following marker can be reported correctly.
|
||||||
|
Thank to Nigel Tao for hint.
|
||||||
|
|
||||||
|
Add jpegtran -wipe option and extension for -crop.
|
||||||
|
Thank to Andrew Senior, David Clunie, and Josef Schmid for suggestion.
|
||||||
|
|
||||||
|
|
||||||
Version 9 13-Jan-2013
|
Version 9 13-Jan-2013
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
|
Add cjpeg -rgb1 option to create an RGB JPEG file, and insert
|
||||||
|
a simple reversible color transform into the processing which
|
||||||
|
significantly improves the compression.
|
||||||
|
The recommended command for lossless coding of RGB images is now
|
||||||
|
cjpeg -rgb1 -block 1 -arithmetic.
|
||||||
|
As said, this option improves the compression significantly, but
|
||||||
|
the files are not compatible with JPEG decoders prior to IJG v9
|
||||||
|
due to the included color transform.
|
||||||
|
The used color transform and marker signaling is compatible with
|
||||||
|
other JPEG standards (e.g., JPEG-LS part 2).
|
||||||
|
|
||||||
|
Remove the automatic de-ANSI-fication support (Automake 1.12).
|
||||||
|
Thank also to Nitin A Kamble for suggestion.
|
||||||
|
|
||||||
Add remark for jpeg_mem_dest() in jdatadst.c.
|
Add remark for jpeg_mem_dest() in jdatadst.c.
|
||||||
Thank to Elie-Gregoire Khoury for the hint.
|
Thank to Elie-Gregoire Khoury for the hint.
|
||||||
|
|
||||||
|
Support files with invalid component identifiers (created
|
||||||
|
by Adobe PDF). Thank to Robin Watts for the suggestion.
|
||||||
|
|
||||||
|
Adapt full buffer case in jcmainct.c for use with scaled DCT.
|
||||||
|
Thank to Sergii Biloshytskyi for the suggestion.
|
||||||
|
|
||||||
|
Add type identifier for declaration of noreturn functions.
|
||||||
|
Thank to Brett L. Moore for the suggestion.
|
||||||
|
|
||||||
Correct argument type in format string, avoid compiler warnings.
|
Correct argument type in format string, avoid compiler warnings.
|
||||||
Thank to Vincent Torri for hint.
|
Thank to Vincent Torri for hint.
|
||||||
|
|
||||||
|
Add missing #include directives in configuration checks, avoid
|
||||||
|
configuration errors. Thank to John Spencer for the hint.
|
||||||
|
|
||||||
|
|
||||||
Version 8d 15-Jan-2012
|
Version 8d 15-Jan-2012
|
||||||
-----------------------
|
-----------------------
|
||||||
@@ -29,11 +114,30 @@ Version 8d 15-Jan-2012
|
|||||||
Add cjpeg -rgb option to create RGB JPEG files.
|
Add cjpeg -rgb option to create RGB JPEG files.
|
||||||
Using this switch suppresses the conversion from RGB
|
Using this switch suppresses the conversion from RGB
|
||||||
colorspace input to the default YCbCr JPEG colorspace.
|
colorspace input to the default YCbCr JPEG colorspace.
|
||||||
|
This feature allows true lossless JPEG coding of RGB color images.
|
||||||
|
The recommended command for this purpose is currently
|
||||||
|
cjpeg -rgb -block 1 -arithmetic.
|
||||||
|
SmartScale capable decoder (introduced with IJG JPEG 8) required.
|
||||||
Thank to Michael Koch for the initial suggestion.
|
Thank to Michael Koch for the initial suggestion.
|
||||||
|
|
||||||
Add option to disable the region adjustment in the transupp crop code.
|
Add option to disable the region adjustment in the transupp crop code.
|
||||||
Thank to Jeffrey Friedl for the suggestion.
|
Thank to Jeffrey Friedl for the suggestion.
|
||||||
|
|
||||||
|
Thank to Richard Jones and Edd Dawson for various minor corrections.
|
||||||
|
|
||||||
|
Thank to Akim Demaille for configure.ac cleanup.
|
||||||
|
|
||||||
|
|
||||||
|
Version 8c 16-Jan-2011
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Add option to compression library and cjpeg (-block N) to use
|
||||||
|
different DCT block size.
|
||||||
|
All N from 1 to 16 are possible. Default is 8 (baseline format).
|
||||||
|
Larger values produce higher compression,
|
||||||
|
smaller values produce higher quality.
|
||||||
|
SmartScale capable decoder (introduced with IJG JPEG 8) required.
|
||||||
|
|
||||||
|
|
||||||
Version 8b 16-May-2010
|
Version 8b 16-May-2010
|
||||||
-----------------------
|
-----------------------
|
||||||
@@ -41,6 +145,12 @@ Version 8b 16-May-2010
|
|||||||
Repair problem in new memory source manager with corrupt JPEG data.
|
Repair problem in new memory source manager with corrupt JPEG data.
|
||||||
Thank to Ted Campbell and Samuel Chun for the report.
|
Thank to Ted Campbell and Samuel Chun for the report.
|
||||||
|
|
||||||
|
Repair problem in Makefile.am test target.
|
||||||
|
Thank to anonymous user for the report.
|
||||||
|
|
||||||
|
Support MinGW installation with automatic configure.
|
||||||
|
Thank to Volker Grabsch for the suggestion.
|
||||||
|
|
||||||
|
|
||||||
Version 8a 28-Feb-2010
|
Version 8a 28-Feb-2010
|
||||||
-----------------------
|
-----------------------
|
||||||
@@ -50,10 +160,22 @@ Writing tables-only datastreams via jpeg_write_tables works again.
|
|||||||
Support 32-bit BMPs (RGB image with Alpha channel) for read in cjpeg.
|
Support 32-bit BMPs (RGB image with Alpha channel) for read in cjpeg.
|
||||||
Thank to Brett Blackham for the suggestion.
|
Thank to Brett Blackham for the suggestion.
|
||||||
|
|
||||||
|
Improve accuracy in floating point IDCT calculation.
|
||||||
|
Thank to Robert Hooke for the hint.
|
||||||
|
|
||||||
|
|
||||||
Version 8 10-Jan-2010
|
Version 8 10-Jan-2010
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
|
jpegtran now supports the same -scale option as djpeg for "lossless" resize.
|
||||||
|
An implementation of the JPEG SmartScale extension is required for this
|
||||||
|
feature. A (draft) specification of the JPEG SmartScale extension is
|
||||||
|
available as a contributed document at ITU and ISO. Revision 2 or later
|
||||||
|
of the document is required (latest document version is Revision 3).
|
||||||
|
The SmartScale extension will enable more features beside lossless resize
|
||||||
|
in future implementations, as described in the document (new compression
|
||||||
|
options).
|
||||||
|
|
||||||
Add sanity check in BMP reader module to avoid cjpeg crash for empty input
|
Add sanity check in BMP reader module to avoid cjpeg crash for empty input
|
||||||
image (thank to Isaev Ildar of ISP RAS, Moscow, RU for reporting this error).
|
image (thank to Isaev Ildar of ISP RAS, Moscow, RU for reporting this error).
|
||||||
|
|
||||||
@@ -67,15 +189,31 @@ Version 7 27-Jun-2009
|
|||||||
|
|
||||||
New scaled DCTs implemented.
|
New scaled DCTs implemented.
|
||||||
djpeg now supports scalings N/8 with all N from 1 to 16.
|
djpeg now supports scalings N/8 with all N from 1 to 16.
|
||||||
|
cjpeg now supports scalings 8/N with all N from 1 to 16.
|
||||||
|
Scaled DCTs with size larger than 8 are now also used for resolving the
|
||||||
|
common 2x2 chroma subsampling case without additional spatial resampling.
|
||||||
|
Separate spatial resampling for those kind of files is now only necessary
|
||||||
|
for N>8 scaling cases.
|
||||||
|
Furthermore, separate scaled DCT functions are provided for direct resolving
|
||||||
|
of the common asymmetric subsampling cases (2x1 and 1x2) without additional
|
||||||
|
spatial resampling.
|
||||||
|
|
||||||
cjpeg -quality option has been extended for support of separate quality
|
cjpeg -quality option has been extended for support of separate quality
|
||||||
settings for luminance and chrominance (or in general, for every provided
|
settings for luminance and chrominance (or in general, for every provided
|
||||||
quantization table slot).
|
quantization table slot).
|
||||||
New API function jpeg_default_qtables() and q_scale_factor array in library.
|
New API function jpeg_default_qtables() and q_scale_factor array in library.
|
||||||
|
|
||||||
|
Added -nosmooth option to cjpeg, complementary to djpeg.
|
||||||
|
New variable "do_fancy_downsampling" in library, complement to fancy
|
||||||
|
upsampling. Fancy upsampling now uses direct DCT scaling with sizes
|
||||||
|
larger than 8. The old method is not reversible and has been removed.
|
||||||
|
|
||||||
Support arithmetic entropy encoding and decoding.
|
Support arithmetic entropy encoding and decoding.
|
||||||
Added files jaricom.c, jcarith.c, jdarith.c.
|
Added files jaricom.c, jcarith.c, jdarith.c.
|
||||||
|
|
||||||
|
Straighten the file structure:
|
||||||
|
Removed files jidctred.c, jcphuff.c, jchuff.h, jdphuff.c, jdhuff.h.
|
||||||
|
|
||||||
jpegtran has a new "lossless" cropping feature.
|
jpegtran has a new "lossless" cropping feature.
|
||||||
|
|
||||||
Implement -perfect option in jpegtran, new API function
|
Implement -perfect option in jpegtran, new API function
|
||||||
|
|||||||
182
cjpeg.1
@@ -1,4 +1,4 @@
|
|||||||
.TH CJPEG 1 "17 February 2016"
|
.TH CJPEG 1 "26 July 2015"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
cjpeg \- compress an image file to a JPEG file
|
cjpeg \- compress an image file to a JPEG file
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -53,6 +53,12 @@ you'll get a smaller JPEG file that takes less time to process.
|
|||||||
Create RGB JPEG file.
|
Create RGB JPEG file.
|
||||||
Using this switch suppresses the conversion from RGB
|
Using this switch suppresses the conversion from RGB
|
||||||
colorspace input to the default YCbCr JPEG colorspace.
|
colorspace input to the default YCbCr JPEG colorspace.
|
||||||
|
You can use this switch in combination with the
|
||||||
|
.BI \-block " N"
|
||||||
|
switch (see below) for lossless JPEG coding.
|
||||||
|
See also the
|
||||||
|
.B \-rgb1
|
||||||
|
switch below.
|
||||||
.TP
|
.TP
|
||||||
.B \-optimize
|
.B \-optimize
|
||||||
Perform optimization of entropy encoding parameters. Without this, default
|
Perform optimization of entropy encoding parameters. Without this, default
|
||||||
@@ -67,6 +73,13 @@ decompression are unaffected by
|
|||||||
.B \-progressive
|
.B \-progressive
|
||||||
Create progressive JPEG file (see below).
|
Create progressive JPEG file (see below).
|
||||||
.TP
|
.TP
|
||||||
|
.BI \-scale " M/N"
|
||||||
|
Scale the output image by a factor M/N. Currently supported scale factors are
|
||||||
|
M/N with all N from 1 to 16, where M is the destination DCT size, which is 8
|
||||||
|
by default (see
|
||||||
|
.BI \-block " N"
|
||||||
|
switch below).
|
||||||
|
.TP
|
||||||
.B \-targa
|
.B \-targa
|
||||||
Input file is Targa format. Targa files that contain an "identification"
|
Input file is Targa format. Targa files that contain an "identification"
|
||||||
field will not be automatically recognized by
|
field will not be automatically recognized by
|
||||||
@@ -85,8 +98,8 @@ reconstructed image: the higher the quality setting, the larger the JPEG file,
|
|||||||
and the closer the output image will be to the original input. Normally you
|
and the closer the output image will be to the original input. Normally you
|
||||||
want to use the lowest quality setting (smallest file) that decompresses into
|
want to use the lowest quality setting (smallest file) that decompresses into
|
||||||
something visually indistinguishable from the original image. For this
|
something visually indistinguishable from the original image. For this
|
||||||
purpose the quality setting should generally be between 50 and 95 (the default
|
purpose the quality setting should be between 50 and 95; the default of 75 is
|
||||||
is 75) for photographic images. If you see defects at
|
often about right. If you see defects at
|
||||||
.B \-quality
|
.B \-quality
|
||||||
75, then go up 5 or 10 counts at a time until you are happy with the output
|
75, then go up 5 or 10 counts at a time until you are happy with the output
|
||||||
image. (The optimal setting will vary from one image to another.)
|
image. (The optimal setting will vary from one image to another.)
|
||||||
@@ -94,10 +107,11 @@ image. (The optimal setting will vary from one image to another.)
|
|||||||
.B \-quality
|
.B \-quality
|
||||||
100 will generate a quantization table of all 1's, minimizing loss in the
|
100 will generate a quantization table of all 1's, minimizing loss in the
|
||||||
quantization step (but there is still information loss in subsampling, as well
|
quantization step (but there is still information loss in subsampling, as well
|
||||||
as roundoff error.) For most images, specifying a quality value above
|
as roundoff error). This setting is mainly of interest for experimental
|
||||||
about 95 will increase the size of the compressed file dramatically, and while
|
purposes. Quality values above about 95 are
|
||||||
the quality gain from these higher quality values is measurable (using metrics
|
.B not
|
||||||
such as PSNR or SSIM), it is rarely perceivable by human vision.
|
recommended for normal use; the compressed file size goes up dramatically for
|
||||||
|
hardly any gain in output image quality.
|
||||||
.PP
|
.PP
|
||||||
In the other direction, quality values below 50 will produce very small files
|
In the other direction, quality values below 50 will produce very small files
|
||||||
of low image quality. Settings around 5 to 10 might be useful in preparing an
|
of low image quality. Settings around 5 to 10 might be useful in preparing an
|
||||||
@@ -112,35 +126,33 @@ other JPEG programs may be unable to decode the resulting file. Use
|
|||||||
.B \-baseline
|
.B \-baseline
|
||||||
if you need to ensure compatibility at low quality values.)
|
if you need to ensure compatibility at low quality values.)
|
||||||
.PP
|
.PP
|
||||||
The \fB-quality\fR option has been extended in this version of \fBcjpeg\fR to
|
The
|
||||||
support separate quality settings for luminance and chrominance (or, in
|
.B \-quality
|
||||||
general, separate settings for every quantization table slot.) The principle
|
option has been extended in IJG version 7 for support of separate quality
|
||||||
is the same as chrominance subsampling: since the human eye is more sensitive
|
settings for luminance and chrominance (or in general, for every provided
|
||||||
to spatial changes in brightness than spatial changes in color, the chrominance
|
quantization table slot). This feature is useful for high-quality
|
||||||
components can be quantized more than the luminance components without
|
applications which cannot accept the damage of color data by coarse
|
||||||
incurring any visible image quality loss. However, unlike subsampling, this
|
subsampling settings. You can now easily reduce the color data amount more
|
||||||
feature reduces data in the frequency domain instead of the spatial domain,
|
smoothly with finer control without separate subsampling. The resulting file
|
||||||
which allows for more fine-grained control. This option is useful in
|
is fully compliant with standard JPEG decoders.
|
||||||
quality-sensitive applications, for which the artifacts generated by
|
Note that the
|
||||||
subsampling may be unacceptable.
|
.B \-quality
|
||||||
.PP
|
ratings refer to the quantization table slots, and that the last value is
|
||||||
The \fB-quality\fR option accepts a comma-separated list of parameters, which
|
replicated if there are more q-table slots than parameters. The default
|
||||||
respectively refer to the quality levels that should be assigned to the
|
q-table slots are 0 for luminance and 1 for chrominance with default tables as
|
||||||
quantization table slots. If there are more q-table slots than parameters,
|
given in the JPEG standard. This is compatible with the old behaviour in case
|
||||||
then the last parameter is replicated. Thus, if only one quality parameter is
|
that only one parameter is given, which is then used for both luminance and
|
||||||
given, this is used for both luminance and chrominance (slots 0 and 1,
|
chrominance (slots 0 and 1). More or custom quantization tables can be set
|
||||||
respectively), preserving the legacy behavior of cjpeg v6b and prior.
|
with
|
||||||
More (or customized) quantization tables can be set with the \fB-qtables\fR
|
.B \-qtables
|
||||||
option and assigned to components with the \fB-qslots\fR option (see the
|
and assigned to components with
|
||||||
"wizard" switches below.)
|
.B \-qslots
|
||||||
.PP
|
parameter (see the "wizard" switches below).
|
||||||
JPEG files generated with separate luminance and chrominance quality are fully
|
.B Caution:
|
||||||
compliant with standard JPEG decoders.
|
You must explicitly add
|
||||||
.PP
|
.BI \-sample " 1x1"
|
||||||
.BR CAUTION:
|
for efficient separate color
|
||||||
For this setting to be useful, be sure to pass an argument of \fB-sample 1x1\fR
|
quality selection, since the default value used by library is 2x2!
|
||||||
to \fBcjpeg\fR to disable chrominance subsampling. Otherwise, the default
|
|
||||||
subsampling level (2x2, AKA "4:2:0") will be used.
|
|
||||||
.PP
|
.PP
|
||||||
The
|
The
|
||||||
.B \-progressive
|
.B \-progressive
|
||||||
@@ -157,35 +169,72 @@ Switches for advanced users:
|
|||||||
.B \-arithmetic
|
.B \-arithmetic
|
||||||
Use arithmetic coding.
|
Use arithmetic coding.
|
||||||
.B Caution:
|
.B Caution:
|
||||||
arithmetic coded JPEG is not yet widely implemented, so many decoders will be
|
arithmetic coded JPEG is not yet widely implemented, so many decoders will
|
||||||
unable to view an arithmetic coded JPEG file at all.
|
be unable to view an arithmetic coded JPEG file at all.
|
||||||
|
.TP
|
||||||
|
.BI \-block " N"
|
||||||
|
Set DCT block size. All N from 1 to 16 are possible.
|
||||||
|
Default is 8 (baseline format).
|
||||||
|
Larger values produce higher compression,
|
||||||
|
smaller values produce higher quality
|
||||||
|
(exact DCT stage possible with 1 or 2; with the default quality of 75 and
|
||||||
|
default Luminance qtable the DCT+Quantization stage is lossless for N=1).
|
||||||
|
.B Caution:
|
||||||
|
An implementation of the JPEG SmartScale extension is required for this
|
||||||
|
feature. SmartScale enabled JPEG is not yet widely implemented, so many
|
||||||
|
decoders will be unable to view a SmartScale extended JPEG file at all.
|
||||||
|
.TP
|
||||||
|
.B \-rgb1
|
||||||
|
Create RGB JPEG file with reversible color transform.
|
||||||
|
Works like the
|
||||||
|
.B \-rgb
|
||||||
|
switch (see above) and inserts a simple reversible color transform
|
||||||
|
into the processing which significantly improves the compression.
|
||||||
|
Use this switch in combination with the
|
||||||
|
.BI \-block " N"
|
||||||
|
switch (see above) for lossless JPEG coding.
|
||||||
|
.B Caution:
|
||||||
|
A decoder with inverse color transform support is required for
|
||||||
|
this feature. Reversible color transform support is not yet
|
||||||
|
widely implemented, so many decoders will be unable to view
|
||||||
|
a reversible color transformed JPEG file at all.
|
||||||
|
.TP
|
||||||
|
.B \-bgycc
|
||||||
|
Create big gamut YCC JPEG file.
|
||||||
|
In this type of encoding the color difference components are quantized
|
||||||
|
further by a factor of 2 compared to the normal Cb/Cr values, thus creating
|
||||||
|
space to allow larger color values with higher saturation than the normal
|
||||||
|
gamut limits to be encoded. In order to compensate for the loss of color
|
||||||
|
fidelity compared to a normal YCC encoded file, the color quantization
|
||||||
|
tables can be adjusted accordingly. For example,
|
||||||
|
.B cjpeg \-bgycc \-quality
|
||||||
|
80,90 will give similar results as
|
||||||
|
.B cjpeg \-quality
|
||||||
|
80.
|
||||||
|
.B Caution:
|
||||||
|
For correct decompression a decoder with big gamut YCC support (JFIF
|
||||||
|
version 2) is required. An old decoder may or may not display a big
|
||||||
|
gamut YCC encoded JPEG file, depending on JFIF version check and
|
||||||
|
corresponding warning/error configuration. In case of a granted
|
||||||
|
decompression the old decoder will display the image with half
|
||||||
|
saturated colors.
|
||||||
.TP
|
.TP
|
||||||
.B \-dct int
|
.B \-dct int
|
||||||
Use integer DCT method (default).
|
Use integer DCT method (default).
|
||||||
.TP
|
.TP
|
||||||
.B \-dct fast
|
.B \-dct fast
|
||||||
Use fast integer DCT (less accurate).
|
Use fast integer DCT (less accurate).
|
||||||
In libjpeg-turbo, the fast method is generally about 5-15% faster than the int
|
|
||||||
method when using the x86/x86-64 SIMD extensions (results may vary with other
|
|
||||||
SIMD implementations, or when using libjpeg-turbo without SIMD extensions.)
|
|
||||||
For quality levels of 90 and below, there should be little or no perceptible
|
|
||||||
difference between the two algorithms. For quality levels above 90, however,
|
|
||||||
the difference between the fast and the int methods becomes more pronounced.
|
|
||||||
With quality=97, for instance, the fast method incurs generally about a 1-3 dB
|
|
||||||
loss (in PSNR) relative to the int method, but this can be larger for some
|
|
||||||
images. Do not use the fast method with quality levels above 97. The
|
|
||||||
algorithm often degenerates at quality=98 and above and can actually produce a
|
|
||||||
more lossy image than if lower quality levels had been used. Also, in
|
|
||||||
libjpeg-turbo, the fast method is not fully accelerated for quality levels
|
|
||||||
above 97, so it will be slower than the int method.
|
|
||||||
.TP
|
.TP
|
||||||
.B \-dct float
|
.B \-dct float
|
||||||
Use floating-point DCT method.
|
Use floating-point DCT method.
|
||||||
The float method is mainly a legacy feature. It does not produce significantly
|
The float method is very slightly more accurate than the int method, but is
|
||||||
more accurate results than the int method, and it is much slower. The float
|
much slower unless your machine has very fast floating-point hardware. Also
|
||||||
method may also give different results on different machines due to varying
|
note that results of the floating-point method may vary slightly across
|
||||||
roundoff behavior, whereas the integer methods should give the same results on
|
machines, while the integer methods should give the same results everywhere.
|
||||||
all machines.
|
The fast integer method is much less accurate than the other two.
|
||||||
|
.TP
|
||||||
|
.B \-nosmooth
|
||||||
|
Don't use high-quality downsampling.
|
||||||
.TP
|
.TP
|
||||||
.BI \-restart " N"
|
.BI \-restart " N"
|
||||||
Emit a JPEG restart marker every N MCU rows, or every N MCU blocks if "B" is
|
Emit a JPEG restart marker every N MCU rows, or every N MCU blocks if "B" is
|
||||||
@@ -207,11 +256,6 @@ selects 4000000 bytes. If more space is needed, temporary files will be used.
|
|||||||
.BI \-outfile " name"
|
.BI \-outfile " name"
|
||||||
Send output image to the named file, not to standard output.
|
Send output image to the named file, not to standard output.
|
||||||
.TP
|
.TP
|
||||||
.BI \-memdst
|
|
||||||
Compress to memory instead of a file. This feature was implemented mainly as a
|
|
||||||
way of testing the in-memory destination manager (jpeg_mem_dest()), but it is
|
|
||||||
also useful for benchmarking, since it reduces the I/O overhead.
|
|
||||||
.TP
|
|
||||||
.B \-verbose
|
.B \-verbose
|
||||||
Enable debug printout. More
|
Enable debug printout. More
|
||||||
.BR \-v 's
|
.BR \-v 's
|
||||||
@@ -220,9 +264,6 @@ give more output. Also, version information is printed at startup.
|
|||||||
.B \-debug
|
.B \-debug
|
||||||
Same as
|
Same as
|
||||||
.BR \-verbose .
|
.BR \-verbose .
|
||||||
.TP
|
|
||||||
.B \-version
|
|
||||||
Print version information and exit.
|
|
||||||
.PP
|
.PP
|
||||||
The
|
The
|
||||||
.B \-restart
|
.B \-restart
|
||||||
@@ -333,15 +374,10 @@ Wallace, Gregory K. "The JPEG Still Picture Compression Standard",
|
|||||||
Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44.
|
Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44.
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
Independent JPEG Group
|
Independent JPEG Group
|
||||||
.PP
|
.SH BUGS
|
||||||
This file was modified by The libjpeg-turbo Project to include only information
|
GIF input files are no longer supported, to avoid the Unisys LZW patent
|
||||||
relevant to libjpeg-turbo, to wordsmith certain sections, and to describe
|
(now expired).
|
||||||
features not present in libjpeg.
|
(Conversion of GIF files to JPEG is usually a bad idea anyway.)
|
||||||
.SH ISSUES
|
|
||||||
Support for GIF input files was removed in cjpeg v6b due to concerns over
|
|
||||||
the Unisys LZW patent. Although this patent expired in 2006, cjpeg still
|
|
||||||
lacks GIF support, for these historical reasons. (Conversion of GIF files to
|
|
||||||
JPEG is usually a bad idea anyway, since GIF is a 256-color format.)
|
|
||||||
.PP
|
.PP
|
||||||
Not all variants of BMP and Targa file formats are supported.
|
Not all variants of BMP and Targa file formats are supported.
|
||||||
.PP
|
.PP
|
||||||
|
|||||||
536
cjpeg.c
@@ -1,13 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* cjpeg.c
|
* cjpeg.c
|
||||||
*
|
*
|
||||||
* This file was part of the Independent JPEG Group's software:
|
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2003-2011 by Guido Vollbeding.
|
* Modified 2003-2013 by Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* Copyright (C) 2010, 2013-2014, D. R. Commander.
|
|
||||||
* mozjpeg Modifications:
|
|
||||||
* Copyright (C) 2014, Mozilla Corporation.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
* This file contains a command-line user interface for the JPEG compressor.
|
* This file contains a command-line user interface for the JPEG compressor.
|
||||||
@@ -15,8 +11,8 @@
|
|||||||
*
|
*
|
||||||
* Two different command line styles are permitted, depending on the
|
* Two different command line styles are permitted, depending on the
|
||||||
* compile-time switch TWO_FILE_COMMANDLINE:
|
* compile-time switch TWO_FILE_COMMANDLINE:
|
||||||
* cjpeg [options] inputfile outputfile
|
* cjpeg [options] inputfile outputfile
|
||||||
* cjpeg [options] [inputfile]
|
* cjpeg [options] [inputfile]
|
||||||
* In the second style, output is always to standard output, which you'd
|
* In the second style, output is always to standard output, which you'd
|
||||||
* normally redirect to a file or pipe to some other program. Input is
|
* normally redirect to a file or pipe to some other program. Input is
|
||||||
* either from a named file or from standard input (typically redirected).
|
* either from a named file or from standard input (typically redirected).
|
||||||
@@ -24,28 +20,27 @@
|
|||||||
* don't support pipes. Also, you MUST use the first style if your system
|
* don't support pipes. Also, you MUST use the first style if your system
|
||||||
* doesn't do binary I/O to stdin/stdout.
|
* doesn't do binary I/O to stdin/stdout.
|
||||||
* To simplify script writing, the "-outfile" switch is provided. The syntax
|
* To simplify script writing, the "-outfile" switch is provided. The syntax
|
||||||
* cjpeg [options] -outfile outputfile inputfile
|
* cjpeg [options] -outfile outputfile inputfile
|
||||||
* works regardless of which command line style is used.
|
* works regardless of which command line style is used.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
|
#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
|
||||||
#include "jversion.h" /* for version message */
|
#include "jversion.h" /* for version message */
|
||||||
#include "jconfigint.h"
|
|
||||||
|
|
||||||
#ifdef USE_CCOMMAND /* command-line reader for Macintosh */
|
#ifdef USE_CCOMMAND /* command-line reader for Macintosh */
|
||||||
#ifdef __MWERKS__
|
#ifdef __MWERKS__
|
||||||
#include <SIOUX.h> /* Metrowerks needs this */
|
#include <SIOUX.h> /* Metrowerks needs this */
|
||||||
#include <console.h> /* ... and this */
|
#include <console.h> /* ... and this */
|
||||||
#endif
|
#endif
|
||||||
#ifdef THINK_C
|
#ifdef THINK_C
|
||||||
#include <console.h> /* Think declares it here */
|
#include <console.h> /* Think declares it here */
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Create the add-on message string table. */
|
/* Create the add-on message string table. */
|
||||||
|
|
||||||
#define JMESSAGE(code,string) string ,
|
#define JMESSAGE(code,string) string ,
|
||||||
|
|
||||||
static const char * const cdjpeg_message_table[] = {
|
static const char * const cdjpeg_message_table[] = {
|
||||||
#include "cderror.h"
|
#include "cderror.h"
|
||||||
@@ -79,11 +74,11 @@ static const char * const cdjpeg_message_table[] = {
|
|||||||
* seldom-used ID field), so we provide a switch to force Targa input mode.
|
* seldom-used ID field), so we provide a switch to force Targa input mode.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static boolean is_targa; /* records user -targa switch */
|
static boolean is_targa; /* records user -targa switch */
|
||||||
static boolean is_jpeg;
|
|
||||||
|
|
||||||
LOCAL(cjpeg_source_ptr)
|
LOCAL(cjpeg_source_ptr)
|
||||||
select_file_type (j_compress_ptr cinfo, FILE *infile)
|
select_file_type (j_compress_ptr cinfo, FILE * infile)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
@@ -113,10 +108,6 @@ select_file_type (j_compress_ptr cinfo, FILE *infile)
|
|||||||
case 'P':
|
case 'P':
|
||||||
return jinit_read_ppm(cinfo);
|
return jinit_read_ppm(cinfo);
|
||||||
#endif
|
#endif
|
||||||
#ifdef PNG_SUPPORTED
|
|
||||||
case 0x89:
|
|
||||||
return jinit_read_png(cinfo);
|
|
||||||
#endif
|
|
||||||
#ifdef RLE_SUPPORTED
|
#ifdef RLE_SUPPORTED
|
||||||
case 'R':
|
case 'R':
|
||||||
return jinit_read_rle(cinfo);
|
return jinit_read_rle(cinfo);
|
||||||
@@ -125,15 +116,12 @@ select_file_type (j_compress_ptr cinfo, FILE *infile)
|
|||||||
case 0x00:
|
case 0x00:
|
||||||
return jinit_read_targa(cinfo);
|
return jinit_read_targa(cinfo);
|
||||||
#endif
|
#endif
|
||||||
case 0xff:
|
|
||||||
is_jpeg = TRUE;
|
|
||||||
return jinit_read_jpeg(cinfo);
|
|
||||||
default:
|
default:
|
||||||
ERREXIT(cinfo, JERR_UNKNOWN_FORMAT);
|
ERREXIT(cinfo, JERR_UNKNOWN_FORMAT);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL; /* suppress compiler warnings */
|
return NULL; /* suppress compiler warnings */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -146,9 +134,8 @@ select_file_type (j_compress_ptr cinfo, FILE *infile)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
static const char *progname; /* program name for error messages */
|
static const char * progname; /* program name for error messages */
|
||||||
static char *outfilename; /* for -outfile switch */
|
static char * outfilename; /* for -outfile switch */
|
||||||
boolean memdst; /* for -memdst switch */
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
LOCAL(void)
|
||||||
@@ -163,71 +150,54 @@ usage (void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
fprintf(stderr, "Switches (names may be abbreviated):\n");
|
fprintf(stderr, "Switches (names may be abbreviated):\n");
|
||||||
fprintf(stderr, " -quality N[,...] Compression quality (0..100; 5-95 is most useful range,\n");
|
fprintf(stderr, " -quality N[,...] Compression quality (0..100; 5-95 is useful range)\n");
|
||||||
fprintf(stderr, " default is 75)\n");
|
|
||||||
fprintf(stderr, " -grayscale Create monochrome JPEG file\n");
|
fprintf(stderr, " -grayscale Create monochrome JPEG file\n");
|
||||||
fprintf(stderr, " -rgb Create RGB JPEG file\n");
|
fprintf(stderr, " -rgb Create RGB JPEG file\n");
|
||||||
#ifdef ENTROPY_OPT_SUPPORTED
|
#ifdef ENTROPY_OPT_SUPPORTED
|
||||||
fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression, enabled by default)\n");
|
fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n");
|
||||||
#endif
|
#endif
|
||||||
#ifdef C_PROGRESSIVE_SUPPORTED
|
#ifdef C_PROGRESSIVE_SUPPORTED
|
||||||
fprintf(stderr, " -progressive Create progressive JPEG file (enabled by default)\n");
|
fprintf(stderr, " -progressive Create progressive JPEG file\n");
|
||||||
|
#endif
|
||||||
|
#ifdef DCT_SCALING_SUPPORTED
|
||||||
|
fprintf(stderr, " -scale M/N Scale image by fraction M/N, eg, 1/2\n");
|
||||||
#endif
|
#endif
|
||||||
fprintf(stderr, " -baseline Create baseline JPEG file (disable progressive coding)\n");
|
|
||||||
#ifdef TARGA_SUPPORTED
|
#ifdef TARGA_SUPPORTED
|
||||||
fprintf(stderr, " -targa Input file is Targa format (usually not needed)\n");
|
fprintf(stderr, " -targa Input file is Targa format (usually not needed)\n");
|
||||||
#endif
|
#endif
|
||||||
fprintf(stderr, " -revert Revert to standard defaults (instead of mozjpeg defaults)\n");
|
|
||||||
fprintf(stderr, " -fastcrush Disable progressive scan optimization\n");
|
|
||||||
fprintf(stderr, " -dc-scan-opt DC scan optimization mode\n");
|
|
||||||
fprintf(stderr, " - 0 One scan for all components\n");
|
|
||||||
fprintf(stderr, " - 1 One scan per component (default)\n");
|
|
||||||
fprintf(stderr, " - 2 Optimize between one scan for all components and one scan for 1st component\n");
|
|
||||||
fprintf(stderr, " plus one scan for remaining components\n");
|
|
||||||
fprintf(stderr, " -notrellis Disable trellis optimization\n");
|
|
||||||
fprintf(stderr, " -trellis-dc Enable trellis optimization of DC coefficients (default)\n");
|
|
||||||
fprintf(stderr, " -notrellis-dc Disable trellis optimization of DC coefficients\n");
|
|
||||||
fprintf(stderr, " -tune-psnr Tune trellis optimization for PSNR\n");
|
|
||||||
fprintf(stderr, " -tune-hvs-psnr Tune trellis optimization for PSNR-HVS (default)\n");
|
|
||||||
fprintf(stderr, " -tune-ssim Tune trellis optimization for SSIM\n");
|
|
||||||
fprintf(stderr, " -tune-ms-ssim Tune trellis optimization for MS-SSIM\n");
|
|
||||||
fprintf(stderr, "Switches for advanced users:\n");
|
fprintf(stderr, "Switches for advanced users:\n");
|
||||||
fprintf(stderr, " -noovershoot Disable black-on-white deringing via overshoot\n");
|
|
||||||
#ifdef C_ARITH_CODING_SUPPORTED
|
#ifdef C_ARITH_CODING_SUPPORTED
|
||||||
fprintf(stderr, " -arithmetic Use arithmetic coding\n");
|
fprintf(stderr, " -arithmetic Use arithmetic coding\n");
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef DCT_SCALING_SUPPORTED
|
||||||
|
fprintf(stderr, " -block N DCT block size (1..16; default is 8)\n");
|
||||||
|
#endif
|
||||||
|
#if JPEG_LIB_VERSION_MAJOR >= 9
|
||||||
|
fprintf(stderr, " -rgb1 Create RGB JPEG file with reversible color transform\n");
|
||||||
|
fprintf(stderr, " -bgycc Create big gamut YCC JPEG file\n");
|
||||||
|
#endif
|
||||||
#ifdef DCT_ISLOW_SUPPORTED
|
#ifdef DCT_ISLOW_SUPPORTED
|
||||||
fprintf(stderr, " -dct int Use integer DCT method%s\n",
|
fprintf(stderr, " -dct int Use integer DCT method%s\n",
|
||||||
(JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : ""));
|
(JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : ""));
|
||||||
#endif
|
#endif
|
||||||
#ifdef DCT_IFAST_SUPPORTED
|
#ifdef DCT_IFAST_SUPPORTED
|
||||||
fprintf(stderr, " -dct fast Use fast integer DCT (less accurate)%s\n",
|
fprintf(stderr, " -dct fast Use fast integer DCT (less accurate)%s\n",
|
||||||
(JDCT_DEFAULT == JDCT_IFAST ? " (default)" : ""));
|
(JDCT_DEFAULT == JDCT_IFAST ? " (default)" : ""));
|
||||||
#endif
|
#endif
|
||||||
#ifdef DCT_FLOAT_SUPPORTED
|
#ifdef DCT_FLOAT_SUPPORTED
|
||||||
fprintf(stderr, " -dct float Use floating-point DCT method%s\n",
|
fprintf(stderr, " -dct float Use floating-point DCT method%s\n",
|
||||||
(JDCT_DEFAULT == JDCT_FLOAT ? " (default)" : ""));
|
(JDCT_DEFAULT == JDCT_FLOAT ? " (default)" : ""));
|
||||||
#endif
|
#endif
|
||||||
fprintf(stderr, " -quant-baseline Use 8-bit quantization table entries for baseline JPEG compatibility\n");
|
fprintf(stderr, " -nosmooth Don't use high-quality downsampling\n");
|
||||||
fprintf(stderr, " -quant-table N Use predefined quantization table N:\n");
|
|
||||||
fprintf(stderr, " - 0 JPEG Annex K\n");
|
|
||||||
fprintf(stderr, " - 1 Flat\n");
|
|
||||||
fprintf(stderr, " - 2 Custom, tuned for MS-SSIM\n");
|
|
||||||
fprintf(stderr, " - 3 ImageMagick table by N. Robidoux\n");
|
|
||||||
fprintf(stderr, " - 4 Custom, tuned for PSNR-HVS\n");
|
|
||||||
fprintf(stderr, " - 5 Table from paper by Klein, Silverstein and Carney\n");
|
|
||||||
fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n");
|
fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n");
|
||||||
#ifdef INPUT_SMOOTHING_SUPPORTED
|
#ifdef INPUT_SMOOTHING_SUPPORTED
|
||||||
fprintf(stderr, " -smooth N Smooth dithered input (N=1..100 is strength)\n");
|
fprintf(stderr, " -smooth N Smooth dithered input (N=1..100 is strength)\n");
|
||||||
#endif
|
#endif
|
||||||
fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n");
|
fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n");
|
||||||
fprintf(stderr, " -outfile name Specify name for output file\n");
|
fprintf(stderr, " -outfile name Specify name for output file\n");
|
||||||
#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED)
|
|
||||||
fprintf(stderr, " -memdst Compress to memory instead of file (useful for benchmarking)\n");
|
|
||||||
#endif
|
|
||||||
fprintf(stderr, " -verbose or -debug Emit debug output\n");
|
fprintf(stderr, " -verbose or -debug Emit debug output\n");
|
||||||
fprintf(stderr, " -version Print version information and exit\n");
|
|
||||||
fprintf(stderr, "Switches for wizards:\n");
|
fprintf(stderr, "Switches for wizards:\n");
|
||||||
|
fprintf(stderr, " -baseline Force baseline quantization tables\n");
|
||||||
fprintf(stderr, " -qtables file Use quantization tables given in file\n");
|
fprintf(stderr, " -qtables file Use quantization tables given in file\n");
|
||||||
fprintf(stderr, " -qslots N[,...] Set component quantization tables\n");
|
fprintf(stderr, " -qslots N[,...] Set component quantization tables\n");
|
||||||
fprintf(stderr, " -sample HxV[,...] Set component sampling factors\n");
|
fprintf(stderr, " -sample HxV[,...] Set component sampling factors\n");
|
||||||
@@ -240,7 +210,7 @@ usage (void)
|
|||||||
|
|
||||||
LOCAL(int)
|
LOCAL(int)
|
||||||
parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
||||||
int last_file_arg_seen, boolean for_real)
|
int last_file_arg_seen, boolean for_real)
|
||||||
/* Parse optional switches.
|
/* Parse optional switches.
|
||||||
* Returns argv[] index of first file-name argument (== argc if none).
|
* Returns argv[] index of first file-name argument (== argc if none).
|
||||||
* Any file names with indexes <= last_file_arg_seen are ignored;
|
* Any file names with indexes <= last_file_arg_seen are ignored;
|
||||||
@@ -251,26 +221,21 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
int argn;
|
int argn;
|
||||||
char *arg;
|
char * arg;
|
||||||
boolean force_baseline;
|
boolean force_baseline;
|
||||||
boolean simple_progressive;
|
boolean simple_progressive;
|
||||||
char *qualityarg = NULL; /* saves -quality parm if any */
|
char * qualityarg = NULL; /* saves -quality parm if any */
|
||||||
char *qtablefile = NULL; /* saves -qtables filename if any */
|
char * qtablefile = NULL; /* saves -qtables filename if any */
|
||||||
char *qslotsarg = NULL; /* saves -qslots parm if any */
|
char * qslotsarg = NULL; /* saves -qslots parm if any */
|
||||||
char *samplearg = NULL; /* saves -sample parm if any */
|
char * samplearg = NULL; /* saves -sample parm if any */
|
||||||
char *scansarg = NULL; /* saves -scans parm if any */
|
char * scansarg = NULL; /* saves -scans parm if any */
|
||||||
|
|
||||||
/* Set up default JPEG parameters. */
|
/* Set up default JPEG parameters. */
|
||||||
|
|
||||||
force_baseline = FALSE; /* by default, allow 16-bit quantizers */
|
force_baseline = FALSE; /* by default, allow 16-bit quantizers */
|
||||||
#ifdef C_PROGRESSIVE_SUPPORTED
|
|
||||||
simple_progressive = cinfo->num_scans == 0 ? FALSE : TRUE;
|
|
||||||
#else
|
|
||||||
simple_progressive = FALSE;
|
simple_progressive = FALSE;
|
||||||
#endif
|
|
||||||
is_targa = FALSE;
|
is_targa = FALSE;
|
||||||
outfilename = NULL;
|
outfilename = NULL;
|
||||||
memdst = FALSE;
|
|
||||||
cinfo->err->trace_level = 0;
|
cinfo->err->trace_level = 0;
|
||||||
|
|
||||||
/* Scan command line options, adjust parameters */
|
/* Scan command line options, adjust parameters */
|
||||||
@@ -280,50 +245,58 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
if (*arg != '-') {
|
if (*arg != '-') {
|
||||||
/* Not a switch, must be a file name argument */
|
/* Not a switch, must be a file name argument */
|
||||||
if (argn <= last_file_arg_seen) {
|
if (argn <= last_file_arg_seen) {
|
||||||
outfilename = NULL; /* -outfile applies to just one input file */
|
outfilename = NULL; /* -outfile applies to just one input file */
|
||||||
continue; /* ignore this name if previously processed */
|
continue; /* ignore this name if previously processed */
|
||||||
}
|
}
|
||||||
break; /* else done parsing switches */
|
break; /* else done parsing switches */
|
||||||
}
|
}
|
||||||
arg++; /* advance past switch marker character */
|
arg++; /* advance past switch marker character */
|
||||||
|
|
||||||
if (keymatch(arg, "arithmetic", 1)) {
|
if (keymatch(arg, "arithmetic", 1)) {
|
||||||
/* Use arithmetic coding. */
|
/* Use arithmetic coding. */
|
||||||
#ifdef C_ARITH_CODING_SUPPORTED
|
#ifdef C_ARITH_CODING_SUPPORTED
|
||||||
cinfo->arith_code = TRUE;
|
cinfo->arith_code = TRUE;
|
||||||
|
|
||||||
/* No table optimization required for AC */
|
|
||||||
cinfo->optimize_coding = FALSE;
|
|
||||||
#else
|
#else
|
||||||
fprintf(stderr, "%s: sorry, arithmetic coding not supported\n",
|
fprintf(stderr, "%s: sorry, arithmetic coding not supported\n",
|
||||||
progname);
|
progname);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} else if (keymatch(arg, "baseline", 1)) {
|
} else if (keymatch(arg, "baseline", 2)) {
|
||||||
/* Force baseline-compatible output (8-bit quantizer values). */
|
/* Force baseline-compatible output (8-bit quantizer values). */
|
||||||
force_baseline = TRUE;
|
force_baseline = TRUE;
|
||||||
/* Disable multiple scans */
|
|
||||||
simple_progressive = FALSE;
|
} else if (keymatch(arg, "block", 2)) {
|
||||||
cinfo->num_scans = 0;
|
/* Set DCT block size. */
|
||||||
cinfo->scan_info = NULL;
|
#if defined DCT_SCALING_SUPPORTED && JPEG_LIB_VERSION_MAJOR >= 8 && \
|
||||||
|
(JPEG_LIB_VERSION_MAJOR > 8 || JPEG_LIB_VERSION_MINOR >= 3)
|
||||||
|
int val;
|
||||||
|
|
||||||
|
if (++argn >= argc) /* advance to next argument */
|
||||||
|
usage();
|
||||||
|
if (sscanf(argv[argn], "%d", &val) != 1)
|
||||||
|
usage();
|
||||||
|
if (val < 1 || val > 16)
|
||||||
|
usage();
|
||||||
|
cinfo->block_size = val;
|
||||||
|
#else
|
||||||
|
fprintf(stderr, "%s: sorry, block size setting not supported\n",
|
||||||
|
progname);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
#endif
|
||||||
|
|
||||||
} else if (keymatch(arg, "dct", 2)) {
|
} else if (keymatch(arg, "dct", 2)) {
|
||||||
/* Select DCT algorithm. */
|
/* Select DCT algorithm. */
|
||||||
if (++argn >= argc) { /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
fprintf(stderr, "%s: missing argument for dct\n", progname);
|
usage();
|
||||||
usage();
|
|
||||||
}
|
|
||||||
if (keymatch(argv[argn], "int", 1)) {
|
if (keymatch(argv[argn], "int", 1)) {
|
||||||
cinfo->dct_method = JDCT_ISLOW;
|
cinfo->dct_method = JDCT_ISLOW;
|
||||||
} else if (keymatch(argv[argn], "fast", 2)) {
|
} else if (keymatch(argv[argn], "fast", 2)) {
|
||||||
cinfo->dct_method = JDCT_IFAST;
|
cinfo->dct_method = JDCT_IFAST;
|
||||||
} else if (keymatch(argv[argn], "float", 2)) {
|
} else if (keymatch(argv[argn], "float", 2)) {
|
||||||
cinfo->dct_method = JDCT_FLOAT;
|
cinfo->dct_method = JDCT_FLOAT;
|
||||||
} else {
|
} else
|
||||||
fprintf(stderr, "%s: invalid argument for dct\n", progname);
|
usage();
|
||||||
usage();
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) {
|
} else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) {
|
||||||
/* Enable debug printouts. */
|
/* Enable debug printouts. */
|
||||||
@@ -331,80 +304,69 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
static boolean printed_version = FALSE;
|
static boolean printed_version = FALSE;
|
||||||
|
|
||||||
if (! printed_version) {
|
if (! printed_version) {
|
||||||
fprintf(stderr, "%s version %s (build %s)\n",
|
fprintf(stderr, "Independent JPEG Group's CJPEG, version %s\n%s\n",
|
||||||
PACKAGE_NAME, VERSION, BUILD);
|
JVERSION, JCOPYRIGHT);
|
||||||
fprintf(stderr, "%s\n\n", JCOPYRIGHT);
|
printed_version = TRUE;
|
||||||
fprintf(stderr, "Emulating The Independent JPEG Group's software, version %s\n\n",
|
|
||||||
JVERSION);
|
|
||||||
printed_version = TRUE;
|
|
||||||
}
|
}
|
||||||
cinfo->err->trace_level++;
|
cinfo->err->trace_level++;
|
||||||
|
|
||||||
} else if (keymatch(arg, "version", 4)) {
|
|
||||||
fprintf(stderr, "%s version %s (build %s)\n",
|
|
||||||
PACKAGE_NAME, VERSION, BUILD);
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "fastcrush", 4)) {
|
|
||||||
jpeg_c_set_bool_param(cinfo, JBOOLEAN_OPTIMIZE_SCANS, FALSE);
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) {
|
} else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) {
|
||||||
/* Force a monochrome JPEG file to be generated. */
|
/* Force a monochrome JPEG file to be generated. */
|
||||||
jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
|
jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
|
||||||
|
|
||||||
} else if (keymatch(arg, "rgb", 3)) {
|
} else if (keymatch(arg, "rgb", 3) || keymatch(arg, "rgb1", 4)) {
|
||||||
/* Force an RGB JPEG file to be generated. */
|
/* Force an RGB JPEG file to be generated. */
|
||||||
|
#if JPEG_LIB_VERSION_MAJOR >= 9
|
||||||
|
/* Note: Entropy table assignment in jpeg_set_colorspace depends
|
||||||
|
* on color_transform.
|
||||||
|
*/
|
||||||
|
cinfo->color_transform = arg[3] ? JCT_SUBTRACT_GREEN : JCT_NONE;
|
||||||
|
#endif
|
||||||
jpeg_set_colorspace(cinfo, JCS_RGB);
|
jpeg_set_colorspace(cinfo, JCS_RGB);
|
||||||
|
|
||||||
} else if (keymatch(arg, "lambda1", 7)) {
|
} else if (keymatch(arg, "bgycc", 5)) {
|
||||||
if (++argn >= argc) /* advance to next argument */
|
/* Force a big gamut YCC JPEG file to be generated. */
|
||||||
usage();
|
#if JPEG_LIB_VERSION_MAJOR >= 9 && \
|
||||||
jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE1,
|
(JPEG_LIB_VERSION_MAJOR > 9 || JPEG_LIB_VERSION_MINOR >= 1)
|
||||||
atof(argv[argn]));
|
jpeg_set_colorspace(cinfo, JCS_BG_YCC);
|
||||||
|
#else
|
||||||
} else if (keymatch(arg, "lambda2", 7)) {
|
fprintf(stderr, "%s: sorry, BG_YCC colorspace not supported\n",
|
||||||
if (++argn >= argc) /* advance to next argument */
|
progname);
|
||||||
usage();
|
exit(EXIT_FAILURE);
|
||||||
jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE2,
|
#endif
|
||||||
atof(argv[argn]));
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "maxmemory", 3)) {
|
} else if (keymatch(arg, "maxmemory", 3)) {
|
||||||
/* Maximum memory in Kb (or Mb with 'm'). */
|
/* Maximum memory in Kb (or Mb with 'm'). */
|
||||||
long lval;
|
long lval;
|
||||||
char ch = 'x';
|
char ch = 'x';
|
||||||
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1)
|
if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1)
|
||||||
usage();
|
usage();
|
||||||
if (ch == 'm' || ch == 'M')
|
if (ch == 'm' || ch == 'M')
|
||||||
lval *= 1000L;
|
lval *= 1000L;
|
||||||
cinfo->mem->max_memory_to_use = lval * 1000L;
|
cinfo->mem->max_memory_to_use = lval * 1000L;
|
||||||
|
|
||||||
} else if (keymatch(arg, "dc-scan-opt", 3)) {
|
} else if (keymatch(arg, "nosmooth", 3)) {
|
||||||
if (++argn >= argc) { /* advance to next argument */
|
/* Suppress fancy downsampling. */
|
||||||
fprintf(stderr, "%s: missing argument for dc-scan-opt\n", progname);
|
cinfo->do_fancy_downsampling = FALSE;
|
||||||
usage();
|
|
||||||
}
|
|
||||||
jpeg_c_set_int_param(cinfo, JINT_DC_SCAN_OPT_MODE, atoi(argv[argn]));
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) {
|
} else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) {
|
||||||
/* Enable entropy parm optimization. */
|
/* Enable entropy parm optimization. */
|
||||||
#ifdef ENTROPY_OPT_SUPPORTED
|
#ifdef ENTROPY_OPT_SUPPORTED
|
||||||
cinfo->optimize_coding = TRUE;
|
cinfo->optimize_coding = TRUE;
|
||||||
#else
|
#else
|
||||||
fprintf(stderr, "%s: sorry, entropy optimization was not compiled in\n",
|
fprintf(stderr, "%s: sorry, entropy optimization was not compiled\n",
|
||||||
progname);
|
progname);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} else if (keymatch(arg, "outfile", 4)) {
|
} else if (keymatch(arg, "outfile", 4)) {
|
||||||
/* Set output file name. */
|
/* Set output file name. */
|
||||||
if (++argn >= argc) { /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
fprintf(stderr, "%s: missing argument for outfile\n", progname);
|
usage();
|
||||||
usage();
|
outfilename = argv[argn]; /* save it away for later use */
|
||||||
}
|
|
||||||
outfilename = argv[argn]; /* save it away for later use */
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "progressive", 1)) {
|
} else if (keymatch(arg, "progressive", 1)) {
|
||||||
/* Select simple progressive mode. */
|
/* Select simple progressive mode. */
|
||||||
@@ -412,33 +374,21 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
simple_progressive = TRUE;
|
simple_progressive = TRUE;
|
||||||
/* We must postpone execution until num_components is known. */
|
/* We must postpone execution until num_components is known. */
|
||||||
#else
|
#else
|
||||||
fprintf(stderr, "%s: sorry, progressive output was not compiled in\n",
|
fprintf(stderr, "%s: sorry, progressive output was not compiled\n",
|
||||||
progname);
|
progname);
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "memdst", 2)) {
|
|
||||||
/* Use in-memory destination manager */
|
|
||||||
#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED)
|
|
||||||
memdst = TRUE;
|
|
||||||
#else
|
|
||||||
fprintf(stderr, "%s: sorry, in-memory destination manager was not compiled in\n",
|
|
||||||
progname);
|
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} else if (keymatch(arg, "quality", 1)) {
|
} else if (keymatch(arg, "quality", 1)) {
|
||||||
/* Quality ratings (quantization table scaling factors). */
|
/* Quality ratings (quantization table scaling factors). */
|
||||||
if (++argn >= argc) { /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
fprintf(stderr, "%s: missing argument for quality\n", progname);
|
usage();
|
||||||
usage();
|
|
||||||
}
|
|
||||||
qualityarg = argv[argn];
|
qualityarg = argv[argn];
|
||||||
|
|
||||||
} else if (keymatch(arg, "qslots", 2)) {
|
} else if (keymatch(arg, "qslots", 2)) {
|
||||||
/* Quantization table slot numbers. */
|
/* Quantization table slot numbers. */
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
qslotsarg = argv[argn];
|
qslotsarg = argv[argn];
|
||||||
/* Must delay setting qslots until after we have processed any
|
/* Must delay setting qslots until after we have processed any
|
||||||
* colorspace-determining switches, since jpeg_set_colorspace sets
|
* colorspace-determining switches, since jpeg_set_colorspace sets
|
||||||
@@ -447,71 +397,58 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
|
|
||||||
} else if (keymatch(arg, "qtables", 2)) {
|
} else if (keymatch(arg, "qtables", 2)) {
|
||||||
/* Quantization tables fetched from file. */
|
/* Quantization tables fetched from file. */
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
qtablefile = argv[argn];
|
qtablefile = argv[argn];
|
||||||
/* We postpone actually reading the file in case -quality comes later. */
|
/* We postpone actually reading the file in case -quality comes later. */
|
||||||
|
|
||||||
} else if (keymatch(arg, "quant-table", 7)) {
|
|
||||||
int val;
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
val = atoi(argv[argn]);
|
|
||||||
jpeg_c_set_int_param(cinfo, JINT_BASE_QUANT_TBL_IDX, val);
|
|
||||||
if (jpeg_c_get_int_param(cinfo, JINT_BASE_QUANT_TBL_IDX) != val) {
|
|
||||||
fprintf(stderr, "%s: %d is invalid argument for quant-table\n", progname, val);
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
jpeg_set_quality(cinfo, 75, TRUE);
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "quant-baseline", 7)) {
|
|
||||||
/* Force quantization table to meet baseline requirements */
|
|
||||||
force_baseline = TRUE;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "restart", 1)) {
|
} else if (keymatch(arg, "restart", 1)) {
|
||||||
/* Restart interval in MCU rows (or in MCUs with 'b'). */
|
/* Restart interval in MCU rows (or in MCUs with 'b'). */
|
||||||
long lval;
|
long lval;
|
||||||
char ch = 'x';
|
char ch = 'x';
|
||||||
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1)
|
if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1)
|
||||||
usage();
|
usage();
|
||||||
if (lval < 0 || lval > 65535L)
|
if (lval < 0 || lval > 65535L)
|
||||||
usage();
|
usage();
|
||||||
if (ch == 'b' || ch == 'B') {
|
if (ch == 'b' || ch == 'B') {
|
||||||
cinfo->restart_interval = (unsigned int) lval;
|
cinfo->restart_interval = (unsigned int) lval;
|
||||||
cinfo->restart_in_rows = 0; /* else prior '-restart n' overrides me */
|
cinfo->restart_in_rows = 0; /* else prior '-restart n' overrides me */
|
||||||
} else {
|
} else {
|
||||||
cinfo->restart_in_rows = (int) lval;
|
cinfo->restart_in_rows = (int) lval;
|
||||||
/* restart_interval will be computed during startup */
|
/* restart_interval will be computed during startup */
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (keymatch(arg, "revert", 3)) {
|
|
||||||
/* revert to old JPEG default */
|
|
||||||
jpeg_c_set_int_param(cinfo, JINT_COMPRESS_PROFILE, JCP_FASTEST);
|
|
||||||
jpeg_set_defaults(cinfo);
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "sample", 2)) {
|
} else if (keymatch(arg, "sample", 2)) {
|
||||||
/* Set sampling factors. */
|
/* Set sampling factors. */
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
samplearg = argv[argn];
|
samplearg = argv[argn];
|
||||||
/* Must delay setting sample factors until after we have processed any
|
/* Must delay setting sample factors until after we have processed any
|
||||||
* colorspace-determining switches, since jpeg_set_colorspace sets
|
* colorspace-determining switches, since jpeg_set_colorspace sets
|
||||||
* default sampling factors.
|
* default sampling factors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
} else if (keymatch(arg, "scale", 4)) {
|
||||||
|
/* Scale the image by a fraction M/N. */
|
||||||
|
if (++argn >= argc) /* advance to next argument */
|
||||||
|
usage();
|
||||||
|
if (sscanf(argv[argn], "%u/%u",
|
||||||
|
&cinfo->scale_num, &cinfo->scale_denom) != 2)
|
||||||
|
usage();
|
||||||
|
|
||||||
} else if (keymatch(arg, "scans", 4)) {
|
} else if (keymatch(arg, "scans", 4)) {
|
||||||
/* Set scan script. */
|
/* Set scan script. */
|
||||||
#ifdef C_MULTISCAN_FILES_SUPPORTED
|
#ifdef C_MULTISCAN_FILES_SUPPORTED
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
scansarg = argv[argn];
|
scansarg = argv[argn];
|
||||||
/* We must postpone reading the file in case -progressive appears. */
|
/* We must postpone reading the file in case -progressive appears. */
|
||||||
#else
|
#else
|
||||||
fprintf(stderr, "%s: sorry, multi-scan output was not compiled in\n",
|
fprintf(stderr, "%s: sorry, multi-scan output was not compiled\n",
|
||||||
progname);
|
progname);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -519,70 +456,20 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
/* Set input smoothing factor. */
|
/* Set input smoothing factor. */
|
||||||
int val;
|
int val;
|
||||||
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
if (sscanf(argv[argn], "%d", &val) != 1)
|
if (sscanf(argv[argn], "%d", &val) != 1)
|
||||||
usage();
|
usage();
|
||||||
if (val < 0 || val > 100)
|
if (val < 0 || val > 100)
|
||||||
usage();
|
usage();
|
||||||
cinfo->smoothing_factor = val;
|
cinfo->smoothing_factor = val;
|
||||||
|
|
||||||
} else if (keymatch(arg, "targa", 1)) {
|
} else if (keymatch(arg, "targa", 1)) {
|
||||||
/* Input file is Targa format. */
|
/* Input file is Targa format. */
|
||||||
is_targa = TRUE;
|
is_targa = TRUE;
|
||||||
|
|
||||||
} else if (keymatch(arg, "notrellis-dc", 11)) {
|
|
||||||
/* disable trellis quantization */
|
|
||||||
jpeg_c_set_bool_param(cinfo, JBOOLEAN_TRELLIS_QUANT_DC, FALSE);
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "notrellis", 1)) {
|
|
||||||
/* disable trellis quantization */
|
|
||||||
jpeg_c_set_bool_param(cinfo, JBOOLEAN_TRELLIS_QUANT, FALSE);
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "trellis-dc-ver-weight", 12)) {
|
|
||||||
if (++argn >= argc) { /* advance to next argument */
|
|
||||||
fprintf(stderr, "%s: missing argument for trellis-dc-ver-weight\n", progname);
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
jpeg_c_set_float_param(cinfo, JFLOAT_TRELLIS_DELTA_DC_WEIGHT, atof(argv[argn]));
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "trellis-dc", 9)) {
|
|
||||||
/* enable DC trellis quantization */
|
|
||||||
jpeg_c_set_bool_param(cinfo, JBOOLEAN_TRELLIS_QUANT_DC, TRUE);
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "tune-psnr", 6)) {
|
|
||||||
jpeg_c_set_int_param(cinfo, JINT_BASE_QUANT_TBL_IDX, 1);
|
|
||||||
jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE1, 9.0);
|
|
||||||
jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE2, 0.0);
|
|
||||||
jpeg_c_set_bool_param(cinfo, JBOOLEAN_USE_LAMBDA_WEIGHT_TBL, FALSE);
|
|
||||||
jpeg_set_quality(cinfo, 75, TRUE);
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "tune-ssim", 6)) {
|
|
||||||
jpeg_c_set_int_param(cinfo, JINT_BASE_QUANT_TBL_IDX, 1);
|
|
||||||
jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE1, 11.5);
|
|
||||||
jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE2, 12.75);
|
|
||||||
jpeg_c_set_bool_param(cinfo, JBOOLEAN_USE_LAMBDA_WEIGHT_TBL, FALSE);
|
|
||||||
jpeg_set_quality(cinfo, 75, TRUE);
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "tune-ms-ssim", 6)) {
|
|
||||||
jpeg_c_set_int_param(cinfo, JINT_BASE_QUANT_TBL_IDX, 3);
|
|
||||||
jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE1, 12.0);
|
|
||||||
jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE2, 13.0);
|
|
||||||
jpeg_c_set_bool_param(cinfo, JBOOLEAN_USE_LAMBDA_WEIGHT_TBL, TRUE);
|
|
||||||
jpeg_set_quality(cinfo, 75, TRUE);
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "tune-hvs-psnr", 6)) {
|
|
||||||
jpeg_c_set_int_param(cinfo, JINT_BASE_QUANT_TBL_IDX, 3);
|
|
||||||
jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE1, 14.75);
|
|
||||||
jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE2, 16.5);
|
|
||||||
jpeg_c_set_bool_param(cinfo, JBOOLEAN_USE_LAMBDA_WEIGHT_TBL, TRUE);
|
|
||||||
jpeg_set_quality(cinfo, 75, TRUE);
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "noovershoot", 11)) {
|
|
||||||
jpeg_c_set_bool_param(cinfo, JBOOLEAN_OVERSHOOT_DERINGING, FALSE);
|
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "%s: unknown option '%s'\n", progname, arg);
|
usage(); /* bogus switch */
|
||||||
usage(); /* bogus switch */
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -592,43 +479,35 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
|
|
||||||
/* Set quantization tables for selected quality. */
|
/* Set quantization tables for selected quality. */
|
||||||
/* Some or all may be overridden if -qtables is present. */
|
/* Some or all may be overridden if -qtables is present. */
|
||||||
if (qualityarg != NULL) /* process -quality if it was present */
|
if (qualityarg != NULL) /* process -quality if it was present */
|
||||||
if (! set_quality_ratings(cinfo, qualityarg, force_baseline)) {
|
if (! set_quality_ratings(cinfo, qualityarg, force_baseline))
|
||||||
fprintf(stderr, "%s: can't set quality ratings\n", progname);
|
usage();
|
||||||
usage();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qtablefile != NULL) /* process -qtables if it was present */
|
if (qtablefile != NULL) /* process -qtables if it was present */
|
||||||
if (! read_quant_tables(cinfo, qtablefile, force_baseline)) {
|
if (! read_quant_tables(cinfo, qtablefile, force_baseline))
|
||||||
fprintf(stderr, "%s: can't read qtable file\n", progname);
|
usage();
|
||||||
usage();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qslotsarg != NULL) /* process -qslots if it was present */
|
if (qslotsarg != NULL) /* process -qslots if it was present */
|
||||||
if (! set_quant_slots(cinfo, qslotsarg))
|
if (! set_quant_slots(cinfo, qslotsarg))
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
/* set_quality_ratings sets default subsampling, so the explicit
|
if (samplearg != NULL) /* process -sample if it was present */
|
||||||
subsampling must be set after it */
|
if (! set_sample_factors(cinfo, samplearg))
|
||||||
if (samplearg != NULL) /* process -sample if it was present */
|
usage();
|
||||||
if (! set_sample_factors(cinfo, samplearg)) {
|
|
||||||
fprintf(stderr, "%s: can't set sample factors\n", progname);
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef C_PROGRESSIVE_SUPPORTED
|
#ifdef C_PROGRESSIVE_SUPPORTED
|
||||||
if (simple_progressive) /* process -progressive; -scans can override */
|
if (simple_progressive) /* process -progressive; -scans can override */
|
||||||
jpeg_simple_progression(cinfo);
|
jpeg_simple_progression(cinfo);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef C_MULTISCAN_FILES_SUPPORTED
|
#ifdef C_MULTISCAN_FILES_SUPPORTED
|
||||||
if (scansarg != NULL) /* process -scans if it was present */
|
if (scansarg != NULL) /* process -scans if it was present */
|
||||||
if (! read_scan_script(cinfo, scansarg))
|
if (! read_scan_script(cinfo, scansarg))
|
||||||
usage();
|
usage();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return argn; /* return index of next arg (file name) */
|
return argn; /* return index of next arg (file name) */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -646,10 +525,8 @@ main (int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
int file_index;
|
int file_index;
|
||||||
cjpeg_source_ptr src_mgr;
|
cjpeg_source_ptr src_mgr;
|
||||||
FILE *input_file;
|
FILE * input_file;
|
||||||
FILE *output_file = NULL;
|
FILE * output_file;
|
||||||
unsigned char *outbuffer = NULL;
|
|
||||||
unsigned long outsize = 0;
|
|
||||||
JDIMENSION num_scanlines;
|
JDIMENSION num_scanlines;
|
||||||
|
|
||||||
/* On Mac, fetch a command line. */
|
/* On Mac, fetch a command line. */
|
||||||
@@ -659,7 +536,7 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
progname = argv[0];
|
progname = argv[0];
|
||||||
if (progname == NULL || progname[0] == 0)
|
if (progname == NULL || progname[0] == 0)
|
||||||
progname = "cjpeg"; /* in case C library doesn't provide it */
|
progname = "cjpeg"; /* in case C library doesn't provide it */
|
||||||
|
|
||||||
/* Initialize the JPEG compression object with default error handling. */
|
/* Initialize the JPEG compression object with default error handling. */
|
||||||
cinfo.err = jpeg_std_error(&jerr);
|
cinfo.err = jpeg_std_error(&jerr);
|
||||||
@@ -669,6 +546,11 @@ main (int argc, char **argv)
|
|||||||
jerr.first_addon_message = JMSG_FIRSTADDONCODE;
|
jerr.first_addon_message = JMSG_FIRSTADDONCODE;
|
||||||
jerr.last_addon_message = JMSG_LASTADDONCODE;
|
jerr.last_addon_message = JMSG_LASTADDONCODE;
|
||||||
|
|
||||||
|
/* Now safe to enable signal catcher. */
|
||||||
|
#ifdef NEED_SIGNAL_CATCHER
|
||||||
|
enable_signal_catcher((j_common_ptr) &cinfo);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize JPEG parameters.
|
/* Initialize JPEG parameters.
|
||||||
* Much of this may be overridden later.
|
* Much of this may be overridden later.
|
||||||
* In particular, we don't yet know the input file's color space,
|
* In particular, we don't yet know the input file's color space,
|
||||||
@@ -687,21 +569,19 @@ main (int argc, char **argv)
|
|||||||
file_index = parse_switches(&cinfo, argc, argv, 0, FALSE);
|
file_index = parse_switches(&cinfo, argc, argv, 0, FALSE);
|
||||||
|
|
||||||
#ifdef TWO_FILE_COMMANDLINE
|
#ifdef TWO_FILE_COMMANDLINE
|
||||||
if (!memdst) {
|
/* Must have either -outfile switch or explicit output file name */
|
||||||
/* Must have either -outfile switch or explicit output file name */
|
if (outfilename == NULL) {
|
||||||
if (outfilename == NULL) {
|
if (file_index != argc-2) {
|
||||||
if (file_index != argc-2) {
|
fprintf(stderr, "%s: must name one input and one output file\n",
|
||||||
fprintf(stderr, "%s: must name one input and one output file\n",
|
progname);
|
||||||
progname);
|
usage();
|
||||||
usage();
|
}
|
||||||
}
|
outfilename = argv[file_index+1];
|
||||||
outfilename = argv[file_index+1];
|
} else {
|
||||||
} else {
|
if (file_index != argc-1) {
|
||||||
if (file_index != argc-1) {
|
fprintf(stderr, "%s: must name one input and one output file\n",
|
||||||
fprintf(stderr, "%s: must name one input and one output file\n",
|
progname);
|
||||||
progname);
|
usage();
|
||||||
usage();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@@ -729,7 +609,7 @@ main (int argc, char **argv)
|
|||||||
fprintf(stderr, "%s: can't open %s\n", progname, outfilename);
|
fprintf(stderr, "%s: can't open %s\n", progname, outfilename);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
} else if (!memdst) {
|
} else {
|
||||||
/* default output file is stdout */
|
/* default output file is stdout */
|
||||||
output_file = write_stdout();
|
output_file = write_stdout();
|
||||||
}
|
}
|
||||||
@@ -746,66 +626,20 @@ main (int argc, char **argv)
|
|||||||
(*src_mgr->start_input) (&cinfo, src_mgr);
|
(*src_mgr->start_input) (&cinfo, src_mgr);
|
||||||
|
|
||||||
/* Now that we know input colorspace, fix colorspace-dependent defaults */
|
/* Now that we know input colorspace, fix colorspace-dependent defaults */
|
||||||
#if JPEG_RAW_READER
|
|
||||||
if (!is_jpeg)
|
|
||||||
#endif
|
|
||||||
jpeg_default_colorspace(&cinfo);
|
jpeg_default_colorspace(&cinfo);
|
||||||
|
|
||||||
/* Adjust default compression parameters by re-parsing the options */
|
/* Adjust default compression parameters by re-parsing the options */
|
||||||
file_index = parse_switches(&cinfo, argc, argv, 0, TRUE);
|
file_index = parse_switches(&cinfo, argc, argv, 0, TRUE);
|
||||||
|
|
||||||
/* Specify data destination for compression */
|
/* Specify data destination for compression */
|
||||||
#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED)
|
jpeg_stdio_dest(&cinfo, output_file);
|
||||||
if (memdst)
|
|
||||||
jpeg_mem_dest(&cinfo, &outbuffer, &outsize);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
jpeg_stdio_dest(&cinfo, output_file);
|
|
||||||
|
|
||||||
/* Start compressor */
|
/* Start compressor */
|
||||||
jpeg_start_compress(&cinfo, TRUE);
|
jpeg_start_compress(&cinfo, TRUE);
|
||||||
|
|
||||||
/* Copy metadata */
|
|
||||||
if (is_jpeg) {
|
|
||||||
jpeg_saved_marker_ptr marker;
|
|
||||||
|
|
||||||
/* In the current implementation, we don't actually need to examine the
|
|
||||||
* option flag here; we just copy everything that got saved.
|
|
||||||
* But to avoid confusion, we do not output JFIF and Adobe APP14 markers
|
|
||||||
* if the encoder library already wrote one.
|
|
||||||
*/
|
|
||||||
for (marker = src_mgr->marker_list; marker != NULL; marker = marker->next) {
|
|
||||||
if (cinfo.write_JFIF_header &&
|
|
||||||
marker->marker == JPEG_APP0 &&
|
|
||||||
marker->data_length >= 5 &&
|
|
||||||
GETJOCTET(marker->data[0]) == 0x4A &&
|
|
||||||
GETJOCTET(marker->data[1]) == 0x46 &&
|
|
||||||
GETJOCTET(marker->data[2]) == 0x49 &&
|
|
||||||
GETJOCTET(marker->data[3]) == 0x46 &&
|
|
||||||
GETJOCTET(marker->data[4]) == 0)
|
|
||||||
continue; /* reject duplicate JFIF */
|
|
||||||
if (cinfo.write_Adobe_marker &&
|
|
||||||
marker->marker == JPEG_APP0+14 &&
|
|
||||||
marker->data_length >= 5 &&
|
|
||||||
GETJOCTET(marker->data[0]) == 0x41 &&
|
|
||||||
GETJOCTET(marker->data[1]) == 0x64 &&
|
|
||||||
GETJOCTET(marker->data[2]) == 0x6F &&
|
|
||||||
GETJOCTET(marker->data[3]) == 0x62 &&
|
|
||||||
GETJOCTET(marker->data[4]) == 0x65)
|
|
||||||
continue; /* reject duplicate Adobe */
|
|
||||||
jpeg_write_marker(&cinfo, marker->marker, marker->data,
|
|
||||||
marker->data_length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Process data */
|
/* Process data */
|
||||||
while (cinfo.next_scanline < cinfo.image_height) {
|
while (cinfo.next_scanline < cinfo.image_height) {
|
||||||
num_scanlines = (*src_mgr->get_pixel_rows) (&cinfo, src_mgr);
|
num_scanlines = (*src_mgr->get_pixel_rows) (&cinfo, src_mgr);
|
||||||
#if JPEG_RAW_READER
|
|
||||||
if (is_jpeg)
|
|
||||||
(void) jpeg_write_raw_data(&cinfo, src_mgr->plane_pointer, num_scanlines);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
(void) jpeg_write_scanlines(&cinfo, src_mgr->buffer, num_scanlines);
|
(void) jpeg_write_scanlines(&cinfo, src_mgr->buffer, num_scanlines);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -817,20 +651,14 @@ main (int argc, char **argv)
|
|||||||
/* Close files, if we opened them */
|
/* Close files, if we opened them */
|
||||||
if (input_file != stdin)
|
if (input_file != stdin)
|
||||||
fclose(input_file);
|
fclose(input_file);
|
||||||
if (output_file != stdout && output_file != NULL)
|
if (output_file != stdout)
|
||||||
fclose(output_file);
|
fclose(output_file);
|
||||||
|
|
||||||
#ifdef PROGRESS_REPORT
|
#ifdef PROGRESS_REPORT
|
||||||
end_progress_monitor((j_common_ptr) &cinfo);
|
end_progress_monitor((j_common_ptr) &cinfo);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (memdst) {
|
|
||||||
fprintf(stderr, "Compressed size: %lu bytes\n", outsize);
|
|
||||||
if (outbuffer != NULL)
|
|
||||||
free(outbuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* All done. */
|
/* All done. */
|
||||||
exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS);
|
exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS);
|
||||||
return 0; /* suppress no-return-value warnings */
|
return 0; /* suppress no-return-value warnings */
|
||||||
}
|
}
|
||||||
|
|||||||
402
ckconfig.c
Normal file
@@ -0,0 +1,402 @@
|
|||||||
|
/*
|
||||||
|
* ckconfig.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 1991-1994, Thomas G. Lane.
|
||||||
|
* This file is part of the Independent JPEG Group's software.
|
||||||
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This program is intended to help you determine how to configure the JPEG
|
||||||
|
* software for installation on a particular system. The idea is to try to
|
||||||
|
* compile and execute this program. If your compiler fails to compile the
|
||||||
|
* program, make changes as indicated in the comments below. Once you can
|
||||||
|
* compile the program, run it, and it will produce a "jconfig.h" file for
|
||||||
|
* your system.
|
||||||
|
*
|
||||||
|
* As a general rule, each time you try to compile this program,
|
||||||
|
* pay attention only to the *first* error message you get from the compiler.
|
||||||
|
* Many C compilers will issue lots of spurious error messages once they
|
||||||
|
* have gotten confused. Go to the line indicated in the first error message,
|
||||||
|
* and read the comments preceding that line to see what to change.
|
||||||
|
*
|
||||||
|
* Almost all of the edits you may need to make to this program consist of
|
||||||
|
* changing a line that reads "#define SOME_SYMBOL" to "#undef SOME_SYMBOL",
|
||||||
|
* or vice versa. This is called defining or undefining that symbol.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* First we must see if your system has the include files we need.
|
||||||
|
* We start out with the assumption that your system has all the ANSI-standard
|
||||||
|
* include files. If you get any error trying to include one of these files,
|
||||||
|
* undefine the corresponding HAVE_xxx symbol.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define HAVE_STDDEF_H /* replace 'define' by 'undef' if error here */
|
||||||
|
#ifdef HAVE_STDDEF_H /* next line will be skipped if you undef... */
|
||||||
|
#include <stddef.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define HAVE_STDLIB_H /* same thing for stdlib.h */
|
||||||
|
#ifdef HAVE_STDLIB_H
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h> /* If you ain't got this, you ain't got C. */
|
||||||
|
|
||||||
|
/* We have to see if your string functions are defined by
|
||||||
|
* strings.h (old BSD convention) or string.h (everybody else).
|
||||||
|
* We try the non-BSD convention first; define NEED_BSD_STRINGS
|
||||||
|
* if the compiler says it can't find string.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef NEED_BSD_STRINGS
|
||||||
|
|
||||||
|
#ifdef NEED_BSD_STRINGS
|
||||||
|
#include <strings.h>
|
||||||
|
#else
|
||||||
|
#include <string.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* On some systems (especially older Unix machines), type size_t is
|
||||||
|
* defined only in the include file <sys/types.h>. If you get a failure
|
||||||
|
* on the size_t test below, try defining NEED_SYS_TYPES_H.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef NEED_SYS_TYPES_H /* start by assuming we don't need it */
|
||||||
|
#ifdef NEED_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Usually type size_t is defined in one of the include files we've included
|
||||||
|
* above. If not, you'll get an error on the "typedef size_t my_size_t;" line.
|
||||||
|
* In that case, first try defining NEED_SYS_TYPES_H just above.
|
||||||
|
* If that doesn't work, you'll have to search through your system library
|
||||||
|
* to figure out which include file defines "size_t". Look for a line that
|
||||||
|
* says "typedef something-or-other size_t;". Then, change the line below
|
||||||
|
* that says "#include <someincludefile.h>" to instead include the file
|
||||||
|
* you found size_t in, and define NEED_SPECIAL_INCLUDE. If you can't find
|
||||||
|
* type size_t anywhere, try replacing "#include <someincludefile.h>" with
|
||||||
|
* "typedef unsigned int size_t;".
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef NEED_SPECIAL_INCLUDE /* assume we DON'T need it, for starters */
|
||||||
|
|
||||||
|
#ifdef NEED_SPECIAL_INCLUDE
|
||||||
|
#include <someincludefile.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef size_t my_size_t; /* The payoff: do we have size_t now? */
|
||||||
|
|
||||||
|
|
||||||
|
/* The next question is whether your compiler supports ANSI-style function
|
||||||
|
* prototypes. You need to know this in order to choose between using
|
||||||
|
* makefile.ansi and using makefile.unix.
|
||||||
|
* The #define line below is set to assume you have ANSI function prototypes.
|
||||||
|
* If you get an error in this group of lines, undefine HAVE_PROTOTYPES.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define HAVE_PROTOTYPES
|
||||||
|
|
||||||
|
#ifdef HAVE_PROTOTYPES
|
||||||
|
int testfunction (int arg1, int * arg2); /* check prototypes */
|
||||||
|
|
||||||
|
struct methods_struct { /* check method-pointer declarations */
|
||||||
|
int (*error_exit) (char *msgtext);
|
||||||
|
int (*trace_message) (char *msgtext);
|
||||||
|
int (*another_method) (void);
|
||||||
|
};
|
||||||
|
|
||||||
|
int testfunction (int arg1, int * arg2) /* check definitions */
|
||||||
|
{
|
||||||
|
return arg2[arg1];
|
||||||
|
}
|
||||||
|
|
||||||
|
int test2function (void) /* check void arg list */
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Now we want to find out if your compiler knows what "unsigned char" means.
|
||||||
|
* If you get an error on the "unsigned char un_char;" line,
|
||||||
|
* then undefine HAVE_UNSIGNED_CHAR.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define HAVE_UNSIGNED_CHAR
|
||||||
|
|
||||||
|
#ifdef HAVE_UNSIGNED_CHAR
|
||||||
|
unsigned char un_char;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Now we want to find out if your compiler knows what "unsigned short" means.
|
||||||
|
* If you get an error on the "unsigned short un_short;" line,
|
||||||
|
* then undefine HAVE_UNSIGNED_SHORT.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define HAVE_UNSIGNED_SHORT
|
||||||
|
|
||||||
|
#ifdef HAVE_UNSIGNED_SHORT
|
||||||
|
unsigned short un_short;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Now we want to find out if your compiler understands type "void".
|
||||||
|
* If you get an error anywhere in here, undefine HAVE_VOID.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define HAVE_VOID
|
||||||
|
|
||||||
|
#ifdef HAVE_VOID
|
||||||
|
/* Caution: a C++ compiler will insist on complete prototypes */
|
||||||
|
typedef void * void_ptr; /* check void * */
|
||||||
|
#ifdef HAVE_PROTOTYPES /* check ptr to function returning void */
|
||||||
|
typedef void (*void_func) (int a, int b);
|
||||||
|
#else
|
||||||
|
typedef void (*void_func) ();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_PROTOTYPES /* check void function result */
|
||||||
|
void test3function (void_ptr arg1, void_func arg2)
|
||||||
|
#else
|
||||||
|
void test3function (arg1, arg2)
|
||||||
|
void_ptr arg1;
|
||||||
|
void_func arg2;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
char * locptr = (char *) arg1; /* check casting to and from void * */
|
||||||
|
arg1 = (void *) locptr;
|
||||||
|
(*arg2) (1, 2); /* check call of fcn returning void */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Now we want to find out if your compiler knows what "const" means.
|
||||||
|
* If you get an error here, undefine HAVE_CONST.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define HAVE_CONST
|
||||||
|
|
||||||
|
#ifdef HAVE_CONST
|
||||||
|
static const int carray[3] = {1, 2, 3};
|
||||||
|
|
||||||
|
#ifdef HAVE_PROTOTYPES
|
||||||
|
int test4function (const int arg1)
|
||||||
|
#else
|
||||||
|
int test4function (arg1)
|
||||||
|
const int arg1;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
return carray[arg1];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* If you get an error or warning about this structure definition,
|
||||||
|
* define INCOMPLETE_TYPES_BROKEN.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef INCOMPLETE_TYPES_BROKEN
|
||||||
|
|
||||||
|
#ifndef INCOMPLETE_TYPES_BROKEN
|
||||||
|
typedef struct undefined_structure * undef_struct_ptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* If you get an error about duplicate names,
|
||||||
|
* define NEED_SHORT_EXTERNAL_NAMES.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef NEED_SHORT_EXTERNAL_NAMES
|
||||||
|
|
||||||
|
#ifndef NEED_SHORT_EXTERNAL_NAMES
|
||||||
|
|
||||||
|
int possibly_duplicate_function ()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int possibly_dupli_function ()
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
* OK, that's it. You should not have to change anything beyond this
|
||||||
|
* point in order to compile and execute this program. (You might get
|
||||||
|
* some warnings, but you can ignore them.)
|
||||||
|
* When you run the program, it will make a couple more tests that it
|
||||||
|
* can do automatically, and then it will create jconfig.h and print out
|
||||||
|
* any additional suggestions it has.
|
||||||
|
************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HAVE_PROTOTYPES
|
||||||
|
int is_char_signed (int arg)
|
||||||
|
#else
|
||||||
|
int is_char_signed (arg)
|
||||||
|
int arg;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (arg == 189) { /* expected result for unsigned char */
|
||||||
|
return 0; /* type char is unsigned */
|
||||||
|
}
|
||||||
|
else if (arg != -67) { /* expected result for signed char */
|
||||||
|
printf("Hmm, it seems 'char' is not eight bits wide on your machine.\n");
|
||||||
|
printf("I fear the JPEG software will not work at all.\n\n");
|
||||||
|
}
|
||||||
|
return 1; /* assume char is signed otherwise */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HAVE_PROTOTYPES
|
||||||
|
int is_shifting_signed (long arg)
|
||||||
|
#else
|
||||||
|
int is_shifting_signed (arg)
|
||||||
|
long arg;
|
||||||
|
#endif
|
||||||
|
/* See whether right-shift on a long is signed or not. */
|
||||||
|
{
|
||||||
|
long res = arg >> 4;
|
||||||
|
|
||||||
|
if (res == -0x7F7E80CL) { /* expected result for signed shift */
|
||||||
|
return 1; /* right shift is signed */
|
||||||
|
}
|
||||||
|
/* see if unsigned-shift hack will fix it. */
|
||||||
|
/* we can't just test exact value since it depends on width of long... */
|
||||||
|
res |= (~0L) << (32-4);
|
||||||
|
if (res == -0x7F7E80CL) { /* expected result now? */
|
||||||
|
return 0; /* right shift is unsigned */
|
||||||
|
}
|
||||||
|
printf("Right shift isn't acting as I expect it to.\n");
|
||||||
|
printf("I fear the JPEG software will not work at all.\n\n");
|
||||||
|
return 0; /* try it with unsigned anyway */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HAVE_PROTOTYPES
|
||||||
|
int main (int argc, char ** argv)
|
||||||
|
#else
|
||||||
|
int main (argc, argv)
|
||||||
|
int argc;
|
||||||
|
char ** argv;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
char signed_char_check = (char) (-67);
|
||||||
|
FILE *outfile;
|
||||||
|
|
||||||
|
/* Attempt to write jconfig.h */
|
||||||
|
if ((outfile = fopen("jconfig.h", "w")) == NULL) {
|
||||||
|
printf("Failed to write jconfig.h\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write out all the info */
|
||||||
|
fprintf(outfile, "/* jconfig.h --- generated by ckconfig.c */\n");
|
||||||
|
fprintf(outfile, "/* see jconfig.txt for explanations */\n\n");
|
||||||
|
#ifdef HAVE_PROTOTYPES
|
||||||
|
fprintf(outfile, "#define HAVE_PROTOTYPES\n");
|
||||||
|
#else
|
||||||
|
fprintf(outfile, "#undef HAVE_PROTOTYPES\n");
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_UNSIGNED_CHAR
|
||||||
|
fprintf(outfile, "#define HAVE_UNSIGNED_CHAR\n");
|
||||||
|
#else
|
||||||
|
fprintf(outfile, "#undef HAVE_UNSIGNED_CHAR\n");
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_UNSIGNED_SHORT
|
||||||
|
fprintf(outfile, "#define HAVE_UNSIGNED_SHORT\n");
|
||||||
|
#else
|
||||||
|
fprintf(outfile, "#undef HAVE_UNSIGNED_SHORT\n");
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_VOID
|
||||||
|
fprintf(outfile, "/* #define void char */\n");
|
||||||
|
#else
|
||||||
|
fprintf(outfile, "#define void char\n");
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_CONST
|
||||||
|
fprintf(outfile, "/* #define const */\n");
|
||||||
|
#else
|
||||||
|
fprintf(outfile, "#define const\n");
|
||||||
|
#endif
|
||||||
|
if (is_char_signed((int) signed_char_check))
|
||||||
|
fprintf(outfile, "#undef CHAR_IS_UNSIGNED\n");
|
||||||
|
else
|
||||||
|
fprintf(outfile, "#define CHAR_IS_UNSIGNED\n");
|
||||||
|
#ifdef HAVE_STDDEF_H
|
||||||
|
fprintf(outfile, "#define HAVE_STDDEF_H\n");
|
||||||
|
#else
|
||||||
|
fprintf(outfile, "#undef HAVE_STDDEF_H\n");
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_STDLIB_H
|
||||||
|
fprintf(outfile, "#define HAVE_STDLIB_H\n");
|
||||||
|
#else
|
||||||
|
fprintf(outfile, "#undef HAVE_STDLIB_H\n");
|
||||||
|
#endif
|
||||||
|
#ifdef NEED_BSD_STRINGS
|
||||||
|
fprintf(outfile, "#define NEED_BSD_STRINGS\n");
|
||||||
|
#else
|
||||||
|
fprintf(outfile, "#undef NEED_BSD_STRINGS\n");
|
||||||
|
#endif
|
||||||
|
#ifdef NEED_SYS_TYPES_H
|
||||||
|
fprintf(outfile, "#define NEED_SYS_TYPES_H\n");
|
||||||
|
#else
|
||||||
|
fprintf(outfile, "#undef NEED_SYS_TYPES_H\n");
|
||||||
|
#endif
|
||||||
|
fprintf(outfile, "#undef NEED_FAR_POINTERS\n");
|
||||||
|
#ifdef NEED_SHORT_EXTERNAL_NAMES
|
||||||
|
fprintf(outfile, "#define NEED_SHORT_EXTERNAL_NAMES\n");
|
||||||
|
#else
|
||||||
|
fprintf(outfile, "#undef NEED_SHORT_EXTERNAL_NAMES\n");
|
||||||
|
#endif
|
||||||
|
#ifdef INCOMPLETE_TYPES_BROKEN
|
||||||
|
fprintf(outfile, "#define INCOMPLETE_TYPES_BROKEN\n");
|
||||||
|
#else
|
||||||
|
fprintf(outfile, "#undef INCOMPLETE_TYPES_BROKEN\n");
|
||||||
|
#endif
|
||||||
|
fprintf(outfile, "\n#ifdef JPEG_INTERNALS\n\n");
|
||||||
|
if (is_shifting_signed(-0x7F7E80B1L))
|
||||||
|
fprintf(outfile, "#undef RIGHT_SHIFT_IS_UNSIGNED\n");
|
||||||
|
else
|
||||||
|
fprintf(outfile, "#define RIGHT_SHIFT_IS_UNSIGNED\n");
|
||||||
|
fprintf(outfile, "\n#endif /* JPEG_INTERNALS */\n");
|
||||||
|
fprintf(outfile, "\n#ifdef JPEG_CJPEG_DJPEG\n\n");
|
||||||
|
fprintf(outfile, "#define BMP_SUPPORTED /* BMP image file format */\n");
|
||||||
|
fprintf(outfile, "#define GIF_SUPPORTED /* GIF image file format */\n");
|
||||||
|
fprintf(outfile, "#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */\n");
|
||||||
|
fprintf(outfile, "#undef RLE_SUPPORTED /* Utah RLE image file format */\n");
|
||||||
|
fprintf(outfile, "#define TARGA_SUPPORTED /* Targa image file format */\n\n");
|
||||||
|
fprintf(outfile, "#undef TWO_FILE_COMMANDLINE /* You may need this on non-Unix systems */\n");
|
||||||
|
fprintf(outfile, "#undef NEED_SIGNAL_CATCHER /* Define this if you use jmemname.c */\n");
|
||||||
|
fprintf(outfile, "#undef DONT_USE_B_MODE\n");
|
||||||
|
fprintf(outfile, "/* #define PROGRESS_REPORT */ /* optional */\n");
|
||||||
|
fprintf(outfile, "\n#endif /* JPEG_CJPEG_DJPEG */\n");
|
||||||
|
|
||||||
|
/* Close the jconfig.h file */
|
||||||
|
fclose(outfile);
|
||||||
|
|
||||||
|
/* User report */
|
||||||
|
printf("Configuration check for Independent JPEG Group's software done.\n");
|
||||||
|
printf("\nI have written the jconfig.h file for you.\n\n");
|
||||||
|
#ifdef HAVE_PROTOTYPES
|
||||||
|
printf("You should use makefile.ansi as the starting point for your Makefile.\n");
|
||||||
|
#else
|
||||||
|
printf("You should use makefile.unix as the starting point for your Makefile.\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef NEED_SPECIAL_INCLUDE
|
||||||
|
printf("\nYou'll need to change jconfig.h to include the system include file\n");
|
||||||
|
printf("that you found type size_t in, or add a direct definition of type\n");
|
||||||
|
printf("size_t if that's what you used. Just add it to the end.\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
file(GLOB FILES
|
|
||||||
testout*
|
|
||||||
*_GRAY_*.bmp
|
|
||||||
*_GRAY_*.png
|
|
||||||
*_GRAY_*.ppm
|
|
||||||
*_GRAY_*.jpg
|
|
||||||
*_GRAY.yuv
|
|
||||||
*_420_*.bmp
|
|
||||||
*_420_*.png
|
|
||||||
*_420_*.ppm
|
|
||||||
*_420_*.jpg
|
|
||||||
*_420.yuv
|
|
||||||
*_422_*.bmp
|
|
||||||
*_422_*.png
|
|
||||||
*_422_*.ppm
|
|
||||||
*_422_*.jpg
|
|
||||||
*_422.yuv
|
|
||||||
*_444_*.bmp
|
|
||||||
*_444_*.png
|
|
||||||
*_444_*.ppm
|
|
||||||
*_444_*.jpg
|
|
||||||
*_444.yuv
|
|
||||||
*_440_*.bmp
|
|
||||||
*_440_*.png
|
|
||||||
*_440_*.ppm
|
|
||||||
*_440_*.jpg
|
|
||||||
*_440.yuv)
|
|
||||||
|
|
||||||
if(NOT FILES STREQUAL "")
|
|
||||||
message(STATUS "Removing test files")
|
|
||||||
file(REMOVE ${FILES})
|
|
||||||
else()
|
|
||||||
message(STATUS "No files to remove")
|
|
||||||
endif()
|
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
IJG JPEG LIBRARY: CODING RULES
|
IJG JPEG LIBRARY: CODING RULES
|
||||||
|
|
||||||
This file was part of the Independent JPEG Group's software:
|
|
||||||
Copyright (C) 1991-1996, Thomas G. Lane.
|
Copyright (C) 1991-1996, Thomas G. Lane.
|
||||||
It was modified by The libjpeg-turbo Project to include only information
|
This file is part of the Independent JPEG Group's software.
|
||||||
relevant to libjpeg-turbo.
|
For conditions of distribution and use, see the accompanying README file.
|
||||||
For conditions of distribution and use, see the accompanying README.ijg file.
|
|
||||||
|
|
||||||
|
|
||||||
Since numerous people will be contributing code and bug fixes, it's important
|
Since numerous people will be contributing code and bug fixes, it's important
|
||||||
@@ -23,18 +21,33 @@ Block comments should be laid out thusly:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
We indent statements in K&R style, e.g.,
|
We indent statements in K&R style, e.g.,
|
||||||
if (test) {
|
if (test) {
|
||||||
then-part;
|
then-part;
|
||||||
} else {
|
} else {
|
||||||
else-part;
|
else-part;
|
||||||
}
|
}
|
||||||
with two spaces per indentation level. (This indentation convention is
|
with two spaces per indentation level. (This indentation convention is
|
||||||
handled automatically by GNU Emacs and many other text editors.)
|
handled automatically by GNU Emacs and many other text editors.)
|
||||||
|
|
||||||
Multi-word names should be written in lower case with underscores, e.g.,
|
Multi-word names should be written in lower case with underscores, e.g.,
|
||||||
multi_word_name (not multiWordName). Preprocessor symbols and enum constants
|
multi_word_name (not multiWordName). Preprocessor symbols and enum constants
|
||||||
are similar but upper case (MULTI_WORD_NAME). Names should be unique within
|
are similar but upper case (MULTI_WORD_NAME). Names should be unique within
|
||||||
the first fifteen characters.
|
the first fifteen characters. (On some older systems, global names must be
|
||||||
|
unique within six characters. We accommodate this without cluttering the
|
||||||
|
source code by using macros to substitute shorter names.)
|
||||||
|
|
||||||
|
We use function prototypes everywhere; we rely on automatic source code
|
||||||
|
transformation to feed prototype-less C compilers. Transformation is done
|
||||||
|
by the simple and portable tool 'ansi2knr.c' (courtesy of Ghostscript).
|
||||||
|
ansi2knr is not very bright, so it imposes a format requirement on function
|
||||||
|
declarations: the function name MUST BEGIN IN COLUMN 1. Thus all functions
|
||||||
|
should be written in the following style:
|
||||||
|
|
||||||
|
LOCAL(int *)
|
||||||
|
function_name (int a, char *b)
|
||||||
|
{
|
||||||
|
code...
|
||||||
|
}
|
||||||
|
|
||||||
Note that each function definition must begin with GLOBAL(type), LOCAL(type),
|
Note that each function definition must begin with GLOBAL(type), LOCAL(type),
|
||||||
or METHODDEF(type). These macros expand to "static type" or just "type" as
|
or METHODDEF(type). These macros expand to "static type" or just "type" as
|
||||||
@@ -42,8 +55,32 @@ appropriate. They provide a readable indication of the routine's usage and
|
|||||||
can readily be changed for special needs. (For instance, special linkage
|
can readily be changed for special needs. (For instance, special linkage
|
||||||
keywords can be inserted for use in Windows DLLs.)
|
keywords can be inserted for use in Windows DLLs.)
|
||||||
|
|
||||||
A similar solution is used for external function declarations (see the EXTERN
|
ansi2knr does not transform method declarations (function pointers in
|
||||||
macro.)
|
structs). We handle these with a macro JMETHOD, defined as
|
||||||
|
#ifdef HAVE_PROTOTYPES
|
||||||
|
#define JMETHOD(type,methodname,arglist) type (*methodname) arglist
|
||||||
|
#else
|
||||||
|
#define JMETHOD(type,methodname,arglist) type (*methodname) ()
|
||||||
|
#endif
|
||||||
|
which is used like this:
|
||||||
|
struct function_pointers {
|
||||||
|
JMETHOD(void, init_entropy_encoder, (int somearg, jparms *jp));
|
||||||
|
JMETHOD(void, term_entropy_encoder, (void));
|
||||||
|
};
|
||||||
|
Note the set of parentheses surrounding the parameter list.
|
||||||
|
|
||||||
|
A similar solution is used for forward and external function declarations
|
||||||
|
(see the EXTERN and JPP macros).
|
||||||
|
|
||||||
|
If the code is to work on non-ANSI compilers, we cannot rely on a prototype
|
||||||
|
declaration to coerce actual parameters into the right types. Therefore, use
|
||||||
|
explicit casts on actual parameters whenever the actual parameter type is not
|
||||||
|
identical to the formal parameter. Beware of implicit conversions to "int".
|
||||||
|
|
||||||
|
It seems there are some non-ANSI compilers in which the sizeof() operator
|
||||||
|
is defined to return int, yet size_t is defined as long. Needless to say,
|
||||||
|
this is brain-damaged. Always use the SIZEOF() macro in place of sizeof(),
|
||||||
|
so that the result is guaranteed to be of type size_t.
|
||||||
|
|
||||||
|
|
||||||
The JPEG library is intended to be used within larger programs. Furthermore,
|
The JPEG library is intended to be used within larger programs. Furthermore,
|
||||||
@@ -57,7 +94,9 @@ pass these through the common routines provided.
|
|||||||
wherever possible. (Note that our method-based calling conventions help this
|
wherever possible. (Note that our method-based calling conventions help this
|
||||||
a lot: in many modules only the initialization function will ever need to be
|
a lot: in many modules only the initialization function will ever need to be
|
||||||
called directly, so only that function need be externally visible.) All
|
called directly, so only that function need be externally visible.) All
|
||||||
global function names should begin with "jpeg_".
|
global function names should begin with "jpeg_", and should have an
|
||||||
|
abbreviated name (unique in the first six characters) substituted by macro
|
||||||
|
when NEED_SHORT_EXTERNAL_NAMES is set.
|
||||||
|
|
||||||
3. Don't use global variables; anything that must be used in another module
|
3. Don't use global variables; anything that must be used in another module
|
||||||
should be in the common data structures.
|
should be in the common data structures.
|
||||||
@@ -68,9 +107,10 @@ the system architecture document, structure.txt).
|
|||||||
|
|
||||||
5. Source file names should begin with "j" for files that are part of the
|
5. Source file names should begin with "j" for files that are part of the
|
||||||
library proper; source files that are not part of the library, such as cjpeg.c
|
library proper; source files that are not part of the library, such as cjpeg.c
|
||||||
and djpeg.c, do not begin with "j". Keep compression and decompression code in
|
and djpeg.c, do not begin with "j". Keep source file names to eight
|
||||||
separate source files --- some applications may want only one half of the
|
characters (plus ".c" or ".h", etc) to make life easy for MS-DOSers. Keep
|
||||||
library.
|
compression and decompression code in separate source files --- some
|
||||||
|
applications may want only one half of the library.
|
||||||
|
|
||||||
Note: these rules (particularly #4) are not followed religiously in the
|
Note: these rules (particularly #4) are not followed religiously in the
|
||||||
modules that are used in cjpeg/djpeg but are not part of the JPEG library
|
modules that are used in cjpeg/djpeg but are not part of the JPEG library
|
||||||
|
|||||||
348
compile
Executable file
@@ -0,0 +1,348 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# Wrapper for compilers which do not understand '-c -o'.
|
||||||
|
|
||||||
|
scriptversion=2016-01-11.22; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1999-2017 Free Software Foundation, Inc.
|
||||||
|
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# This file is maintained in Automake, please report
|
||||||
|
# bugs to <bug-automake@gnu.org> or send patches to
|
||||||
|
# <automake-patches@gnu.org>.
|
||||||
|
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
|
||||||
|
# We need space, tab and new line, in precisely that order. Quoting is
|
||||||
|
# there to prevent tools from complaining about whitespace usage.
|
||||||
|
IFS=" "" $nl"
|
||||||
|
|
||||||
|
file_conv=
|
||||||
|
|
||||||
|
# func_file_conv build_file lazy
|
||||||
|
# Convert a $build file to $host form and store it in $file
|
||||||
|
# Currently only supports Windows hosts. If the determined conversion
|
||||||
|
# type is listed in (the comma separated) LAZY, no conversion will
|
||||||
|
# take place.
|
||||||
|
func_file_conv ()
|
||||||
|
{
|
||||||
|
file=$1
|
||||||
|
case $file in
|
||||||
|
/ | /[!/]*) # absolute file, and not a UNC file
|
||||||
|
if test -z "$file_conv"; then
|
||||||
|
# lazily determine how to convert abs files
|
||||||
|
case `uname -s` in
|
||||||
|
MINGW*)
|
||||||
|
file_conv=mingw
|
||||||
|
;;
|
||||||
|
CYGWIN*)
|
||||||
|
file_conv=cygwin
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
file_conv=wine
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
case $file_conv/,$2, in
|
||||||
|
*,$file_conv,*)
|
||||||
|
;;
|
||||||
|
mingw/*)
|
||||||
|
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
||||||
|
;;
|
||||||
|
cygwin/*)
|
||||||
|
file=`cygpath -m "$file" || echo "$file"`
|
||||||
|
;;
|
||||||
|
wine/*)
|
||||||
|
file=`winepath -w "$file" || echo "$file"`
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# func_cl_dashL linkdir
|
||||||
|
# Make cl look for libraries in LINKDIR
|
||||||
|
func_cl_dashL ()
|
||||||
|
{
|
||||||
|
func_file_conv "$1"
|
||||||
|
if test -z "$lib_path"; then
|
||||||
|
lib_path=$file
|
||||||
|
else
|
||||||
|
lib_path="$lib_path;$file"
|
||||||
|
fi
|
||||||
|
linker_opts="$linker_opts -LIBPATH:$file"
|
||||||
|
}
|
||||||
|
|
||||||
|
# func_cl_dashl library
|
||||||
|
# Do a library search-path lookup for cl
|
||||||
|
func_cl_dashl ()
|
||||||
|
{
|
||||||
|
lib=$1
|
||||||
|
found=no
|
||||||
|
save_IFS=$IFS
|
||||||
|
IFS=';'
|
||||||
|
for dir in $lib_path $LIB
|
||||||
|
do
|
||||||
|
IFS=$save_IFS
|
||||||
|
if $shared && test -f "$dir/$lib.dll.lib"; then
|
||||||
|
found=yes
|
||||||
|
lib=$dir/$lib.dll.lib
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if test -f "$dir/$lib.lib"; then
|
||||||
|
found=yes
|
||||||
|
lib=$dir/$lib.lib
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if test -f "$dir/lib$lib.a"; then
|
||||||
|
found=yes
|
||||||
|
lib=$dir/lib$lib.a
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS=$save_IFS
|
||||||
|
|
||||||
|
if test "$found" != yes; then
|
||||||
|
lib=$lib.lib
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# func_cl_wrapper cl arg...
|
||||||
|
# Adjust compile command to suit cl
|
||||||
|
func_cl_wrapper ()
|
||||||
|
{
|
||||||
|
# Assume a capable shell
|
||||||
|
lib_path=
|
||||||
|
shared=:
|
||||||
|
linker_opts=
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$eat"; then
|
||||||
|
eat=
|
||||||
|
else
|
||||||
|
case $1 in
|
||||||
|
-o)
|
||||||
|
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||||
|
eat=1
|
||||||
|
case $2 in
|
||||||
|
*.o | *.[oO][bB][jJ])
|
||||||
|
func_file_conv "$2"
|
||||||
|
set x "$@" -Fo"$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
func_file_conv "$2"
|
||||||
|
set x "$@" -Fe"$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
-I)
|
||||||
|
eat=1
|
||||||
|
func_file_conv "$2" mingw
|
||||||
|
set x "$@" -I"$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-I*)
|
||||||
|
func_file_conv "${1#-I}" mingw
|
||||||
|
set x "$@" -I"$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-l)
|
||||||
|
eat=1
|
||||||
|
func_cl_dashl "$2"
|
||||||
|
set x "$@" "$lib"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-l*)
|
||||||
|
func_cl_dashl "${1#-l}"
|
||||||
|
set x "$@" "$lib"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-L)
|
||||||
|
eat=1
|
||||||
|
func_cl_dashL "$2"
|
||||||
|
;;
|
||||||
|
-L*)
|
||||||
|
func_cl_dashL "${1#-L}"
|
||||||
|
;;
|
||||||
|
-static)
|
||||||
|
shared=false
|
||||||
|
;;
|
||||||
|
-Wl,*)
|
||||||
|
arg=${1#-Wl,}
|
||||||
|
save_ifs="$IFS"; IFS=','
|
||||||
|
for flag in $arg; do
|
||||||
|
IFS="$save_ifs"
|
||||||
|
linker_opts="$linker_opts $flag"
|
||||||
|
done
|
||||||
|
IFS="$save_ifs"
|
||||||
|
;;
|
||||||
|
-Xlinker)
|
||||||
|
eat=1
|
||||||
|
linker_opts="$linker_opts $2"
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
set x "$@" "$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
||||||
|
func_file_conv "$1"
|
||||||
|
set x "$@" -Tp"$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
||||||
|
func_file_conv "$1" mingw
|
||||||
|
set x "$@" "$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set x "$@" "$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
if test -n "$linker_opts"; then
|
||||||
|
linker_opts="-link$linker_opts"
|
||||||
|
fi
|
||||||
|
exec "$@" $linker_opts
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
eat=
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
'')
|
||||||
|
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||||
|
exit 1;
|
||||||
|
;;
|
||||||
|
-h | --h*)
|
||||||
|
cat <<\EOF
|
||||||
|
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
||||||
|
|
||||||
|
Wrapper for compilers which do not understand '-c -o'.
|
||||||
|
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
||||||
|
arguments, and rename the output as expected.
|
||||||
|
|
||||||
|
If you are trying to build a whole package this is not the
|
||||||
|
right script to run: please start by reading the file 'INSTALL'.
|
||||||
|
|
||||||
|
Report bugs to <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "compile $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
|
||||||
|
icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
|
||||||
|
func_cl_wrapper "$@" # Doesn't return...
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
ofile=
|
||||||
|
cfile=
|
||||||
|
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$eat"; then
|
||||||
|
eat=
|
||||||
|
else
|
||||||
|
case $1 in
|
||||||
|
-o)
|
||||||
|
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||||
|
# So we strip '-o arg' only if arg is an object.
|
||||||
|
eat=1
|
||||||
|
case $2 in
|
||||||
|
*.o | *.obj)
|
||||||
|
ofile=$2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set x "$@" -o "$2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
*.c)
|
||||||
|
cfile=$1
|
||||||
|
set x "$@" "$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set x "$@" "$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -z "$ofile" || test -z "$cfile"; then
|
||||||
|
# If no '-o' option was seen then we might have been invoked from a
|
||||||
|
# pattern rule where we don't need one. That is ok -- this is a
|
||||||
|
# normal compilation that the losing compiler can handle. If no
|
||||||
|
# '.c' file was seen then we are probably linking. That is also
|
||||||
|
# ok.
|
||||||
|
exec "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Name of file we expect compiler to create.
|
||||||
|
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
||||||
|
|
||||||
|
# Create the lock directory.
|
||||||
|
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
||||||
|
# that we are using for the .o file. Also, base the name on the expected
|
||||||
|
# object file name, since that is what matters with a parallel build.
|
||||||
|
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
||||||
|
while true; do
|
||||||
|
if mkdir "$lockdir" >/dev/null 2>&1; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
# FIXME: race condition here if user kills between mkdir and trap.
|
||||||
|
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
||||||
|
|
||||||
|
# Run the compile.
|
||||||
|
"$@"
|
||||||
|
ret=$?
|
||||||
|
|
||||||
|
if test -f "$cofile"; then
|
||||||
|
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
||||||
|
elif test -f "${cofile}bj"; then
|
||||||
|
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rmdir "$lockdir"
|
||||||
|
exit $ret
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
1473
config.guess
vendored
Executable file
1836
config.sub
vendored
Executable file
918
configure.ac
@@ -1,619 +1,365 @@
|
|||||||
# -*- Autoconf -*-
|
# IJG auto-configuration source file.
|
||||||
# Process this file with autoconf to produce a configure script.
|
# Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
AC_PREREQ([2.56])
|
#
|
||||||
AC_INIT([mozjpeg], [3.2])
|
# Configure script for IJG libjpeg
|
||||||
BUILD=`date +%Y%m%d`
|
#
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE([-Wall foreign dist-bzip2])
|
AC_INIT([libjpeg], [9.3.0])
|
||||||
AC_PREFIX_DEFAULT(/opt/mozjpeg)
|
|
||||||
|
|
||||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
# Directory where autotools helper scripts lives.
|
||||||
|
AC_CONFIG_AUX_DIR([.])
|
||||||
|
|
||||||
# Checks for programs.
|
# Generate configuration headers.
|
||||||
SAVED_CFLAGS=${CFLAGS}
|
AC_CONFIG_HEADERS([jconfig.h:jconfig.cfg])
|
||||||
SAVED_CPPFLAGS=${CPPFLAGS}
|
|
||||||
AC_PROG_CPP
|
# Hack: disable autoheader so that it doesn't overwrite our cfg template.
|
||||||
|
AUTOHEADER="echo autoheader ignored"
|
||||||
|
|
||||||
|
# Check system type
|
||||||
|
AC_CANONICAL_TARGET
|
||||||
|
|
||||||
|
# Initialize Automake
|
||||||
|
# Don't require all the GNU mandated files
|
||||||
|
AM_INIT_AUTOMAKE([-Wall -Werror no-dist foreign])
|
||||||
|
|
||||||
|
# Make --enable-silent-rules the default.
|
||||||
|
# To get verbose build output you may configure
|
||||||
|
# with --disable-silent-rules or use "make V=1".
|
||||||
|
AM_SILENT_RULES([yes])
|
||||||
|
|
||||||
|
# Add configure option --enable-maintainer-mode which enables
|
||||||
|
# dependency checking and generation useful to package maintainers.
|
||||||
|
# This is made an option to avoid confusing end users.
|
||||||
|
AM_MAINTAINER_MODE
|
||||||
|
|
||||||
|
# Check for programs
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
|
AC_PROG_CC_STDC
|
||||||
AM_PROG_AS
|
AC_PROG_CPP
|
||||||
AM_PROG_CC_C_O
|
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
|
AC_PROG_MAKE_SET
|
||||||
AC_PROG_LIBTOOL
|
|
||||||
AC_PROG_LN_S
|
AC_PROG_LN_S
|
||||||
|
AM_PROG_AR
|
||||||
|
|
||||||
AC_ARG_WITH([build-date], [Use custom build string to enable reproducible builds (default: YYMMDD)],
|
# Check if LD supports linker scripts,
|
||||||
[BUILD="$with_build_date"],
|
# and define automake conditional HAVE_LD_VERSION_SCRIPT if so.
|
||||||
[BUILD=`date +%Y%m%d`])
|
|
||||||
|
|
||||||
PKG_PROG_PKG_CONFIG
|
|
||||||
|
|
||||||
# When the prefix is /opt/libjpeg-turbo, we assume that an "official" binary is
|
|
||||||
# being created, and thus we install things into specific locations.
|
|
||||||
|
|
||||||
old_prefix=${prefix}
|
|
||||||
if test "x$prefix" = "xNONE" -a "x$ac_default_prefix" != "x"; then
|
|
||||||
prefix=$ac_default_prefix
|
|
||||||
fi
|
|
||||||
DATADIR=`eval echo ${datadir}`
|
|
||||||
DATADIR=`eval echo $DATADIR`
|
|
||||||
if test "$DATADIR" = "/opt/libjpeg-turbo/share"; then
|
|
||||||
datadir='${prefix}'
|
|
||||||
fi
|
|
||||||
DATADIR=`eval echo ${datarootdir}`
|
|
||||||
DATADIR=`eval echo $DATADIR`
|
|
||||||
if test "$DATADIR" = "/opt/libjpeg-turbo/share"; then
|
|
||||||
datarootdir='${prefix}'
|
|
||||||
fi
|
|
||||||
DOCDIR=`eval echo ${docdir}`
|
|
||||||
DOCDIR=`eval echo $DOCDIR`
|
|
||||||
if test "$DOCDIR" = "/opt/libjpeg-turbo/doc/libjpeg-turbo"; then
|
|
||||||
docdir='${datadir}/doc'
|
|
||||||
fi
|
|
||||||
|
|
||||||
old_exec_prefix=${exec_prefix}
|
|
||||||
if test "x$exec_prefix" = "xNONE"; then
|
|
||||||
exec_prefix=${prefix}
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CHECK_SIZEOF(size_t)
|
|
||||||
|
|
||||||
if test "x${libdir}" = 'x${exec_prefix}/lib' -o "x${libdir}" = 'x${prefix}/lib'; then
|
|
||||||
LIBDIR=`eval echo ${libdir}`
|
|
||||||
LIBDIR=`eval echo $LIBDIR`
|
|
||||||
if test "$LIBDIR" = "/opt/mozjpeg/lib"; then
|
|
||||||
case $host_os in
|
|
||||||
darwin*)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
if test "${ac_cv_sizeof_size_t}" = "8"; then
|
|
||||||
libdir='${exec_prefix}/lib64'
|
|
||||||
elif test "${ac_cv_sizeof_size_t}" = "4"; then
|
|
||||||
libdir='${exec_prefix}/lib32'
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
exec_prefix=${old_exec_prefix}
|
|
||||||
prefix=${old_prefix}
|
|
||||||
|
|
||||||
# Check whether compiler supports pointers to undefined structures
|
|
||||||
AC_MSG_CHECKING(whether compiler supports pointers to undefined structures)
|
|
||||||
AC_TRY_COMPILE([ typedef struct undefined_structure *undef_struct_ptr; ], ,
|
|
||||||
AC_MSG_RESULT(yes),
|
|
||||||
[AC_MSG_RESULT(no)
|
|
||||||
AC_DEFINE([INCOMPLETE_TYPES_BROKEN], [1],
|
|
||||||
[Compiler does not support pointers to undefined structures.])])
|
|
||||||
|
|
||||||
if test "x${GCC}" = "xyes"; then
|
|
||||||
if test "x${SAVED_CFLAGS}" = "x"; then
|
|
||||||
CFLAGS=-O3
|
|
||||||
fi
|
|
||||||
if test "x${SAVED_CPPFLAGS}" = "x"; then
|
|
||||||
CPPFLAGS=-Wall
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CHECK_DECL([__SUNPRO_C], [SUNCC="yes"], [SUNCC="no"])
|
|
||||||
if test "x${SUNCC}" = "xyes"; then
|
|
||||||
if test "x${SAVED_CFLAGS}" = "x"; then
|
|
||||||
CFLAGS=-xO5
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Checks for libraries.
|
|
||||||
AC_CHECK_LIB([m],[pow])
|
|
||||||
|
|
||||||
PKG_CHECK_MODULES([libpng], [libpng], [HAVE_LIBPNG=1], [
|
|
||||||
PKG_CHECK_MODULES([libpng], [libpng12], [HAVE_LIBPNG=1], [HAVE_LIBPNG=0])
|
|
||||||
])
|
|
||||||
AM_CONDITIONAL([HAVE_LIBPNG], [test "$HAVE_LIBPNG" -eq 1])
|
|
||||||
|
|
||||||
# Checks for header files.
|
|
||||||
AC_HEADER_STDC
|
|
||||||
AC_CHECK_HEADERS([stddef.h stdlib.h locale.h string.h])
|
|
||||||
AC_CHECK_HEADER([sys/types.h],
|
|
||||||
AC_DEFINE([NEED_SYS_TYPES_H], 1, [Define if you need to include <sys/types.h> to get size_t.]))
|
|
||||||
|
|
||||||
# Checks for typedefs, structures, and compiler characteristics.
|
|
||||||
AC_C_CONST
|
|
||||||
AC_C_CHAR_UNSIGNED
|
|
||||||
AC_C_INLINE
|
|
||||||
AC_TYPE_SIZE_T
|
|
||||||
AC_CHECK_TYPES([unsigned char, unsigned short])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([if right shift is signed])
|
|
||||||
AC_TRY_RUN(
|
|
||||||
[#include <stdio.h>
|
|
||||||
int is_shifting_signed (long arg) {
|
|
||||||
long res = arg >> 4;
|
|
||||||
|
|
||||||
if (res == -0x7F7E80CL)
|
|
||||||
return 1; /* right shift is signed */
|
|
||||||
|
|
||||||
/* see if unsigned-shift hack will fix it. */
|
|
||||||
/* we can't just test exact value since it depends on width of long... */
|
|
||||||
res |= (~0L) << (32-4);
|
|
||||||
if (res == -0x7F7E80CL)
|
|
||||||
return 0; /* right shift is unsigned */
|
|
||||||
|
|
||||||
printf("Right shift isn't acting as I expect it to.\n");
|
|
||||||
printf("I fear the JPEG software will not work at all.\n\n");
|
|
||||||
return 0; /* try it with unsigned anyway */
|
|
||||||
}
|
|
||||||
int main (void) {
|
|
||||||
exit(is_shifting_signed(-0x7F7E80B1L));
|
|
||||||
}],
|
|
||||||
[AC_MSG_RESULT(no)
|
|
||||||
AC_DEFINE([RIGHT_SHIFT_IS_UNSIGNED], 1,
|
|
||||||
[Define if your (broken) compiler shifts signed values as if they were unsigned.])],
|
|
||||||
[AC_MSG_RESULT(yes)],
|
|
||||||
[AC_MSG_RESULT(Assuming that right shift is signed on target machine.)])
|
|
||||||
|
|
||||||
# Checks for library functions.
|
|
||||||
AC_CHECK_FUNCS([memset memcpy], [],
|
|
||||||
[AC_DEFINE([NEED_BSD_STRINGS], 1,
|
|
||||||
[Define if you have BSD-like bzero and bcopy in <strings.h> rather than memset/memcpy in <string.h>.])])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([libjpeg API version])
|
|
||||||
AC_ARG_VAR(JPEG_LIB_VERSION, [libjpeg API version (62, 70, or 80)])
|
|
||||||
if test "x$JPEG_LIB_VERSION" = "x"; then
|
|
||||||
AC_ARG_WITH([jpeg7],
|
|
||||||
AC_HELP_STRING([--with-jpeg7],
|
|
||||||
[Emulate libjpeg v7 API/ABI (this makes mozjpeg backward incompatible with libjpeg v6b.)]))
|
|
||||||
AC_ARG_WITH([jpeg8],
|
|
||||||
AC_HELP_STRING([--with-jpeg8],
|
|
||||||
[Emulate libjpeg v8 API/ABI (this makes mozjpeg backward incompatible with libjpeg v6b.)]))
|
|
||||||
if test "x${with_jpeg8}" = "xyes"; then
|
|
||||||
JPEG_LIB_VERSION=80
|
|
||||||
else
|
|
||||||
if test "x${with_jpeg7}" = "xyes"; then
|
|
||||||
JPEG_LIB_VERSION=70
|
|
||||||
else
|
|
||||||
JPEG_LIB_VERSION=62
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
JPEG_LIB_VERSION_DECIMAL=`expr $JPEG_LIB_VERSION / 10`.`expr $JPEG_LIB_VERSION % 10`
|
|
||||||
AC_SUBST(JPEG_LIB_VERSION_DECIMAL)
|
|
||||||
AC_MSG_RESULT([$JPEG_LIB_VERSION_DECIMAL])
|
|
||||||
AC_DEFINE_UNQUOTED(JPEG_LIB_VERSION, [$JPEG_LIB_VERSION],
|
|
||||||
[libjpeg API version])
|
|
||||||
|
|
||||||
AC_ARG_VAR(SO_MAJOR_VERSION,
|
|
||||||
[Major version of the mozjpeg shared library (default is determined by the API version)])
|
|
||||||
AC_ARG_VAR(SO_MINOR_VERSION,
|
|
||||||
[Minor version of the mozjpeg shared library (default is determined by the API version)])
|
|
||||||
if test "x$SO_MAJOR_VERSION" = "x"; then
|
|
||||||
case "$JPEG_LIB_VERSION" in
|
|
||||||
62) SO_MAJOR_VERSION=$JPEG_LIB_VERSION ;;
|
|
||||||
*) SO_MAJOR_VERSION=`expr $JPEG_LIB_VERSION / 10` ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if test "x$SO_MINOR_VERSION" = "x"; then
|
|
||||||
case "$JPEG_LIB_VERSION" in
|
|
||||||
80) SO_MINOR_VERSION=2 ;;
|
|
||||||
*) SO_MINOR_VERSION=0 ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
RPM_CONFIG_ARGS=
|
|
||||||
|
|
||||||
# Memory source/destination managers
|
|
||||||
SO_AGE=1
|
|
||||||
MEM_SRCDST_FUNCTIONS=
|
|
||||||
if test "x${with_jpeg8}" != "xyes"; then
|
|
||||||
AC_MSG_CHECKING([whether to include in-memory source/destination managers])
|
|
||||||
AC_ARG_WITH([mem-srcdst],
|
|
||||||
AC_HELP_STRING([--without-mem-srcdst],
|
|
||||||
[Do not include in-memory source/destination manager functions when emulating the libjpeg v6b or v7 API/ABI]))
|
|
||||||
if test "x$with_mem_srcdst" != "xno"; then
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
AC_DEFINE([MEM_SRCDST_SUPPORTED], [1],
|
|
||||||
[Support in-memory source/destination managers])
|
|
||||||
SO_AGE=2
|
|
||||||
MEM_SRCDST_FUNCTIONS="global: jpeg_mem_dest; jpeg_mem_src;";
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-mem-srcdst"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([libjpeg shared library version])
|
|
||||||
AC_MSG_RESULT([$SO_MAJOR_VERSION.$SO_AGE.$SO_MINOR_VERSION])
|
|
||||||
LIBTOOL_CURRENT=`expr $SO_MAJOR_VERSION + $SO_AGE`
|
|
||||||
AC_SUBST(LIBTOOL_CURRENT)
|
|
||||||
AC_SUBST(SO_MAJOR_VERSION)
|
|
||||||
AC_SUBST(SO_MINOR_VERSION)
|
|
||||||
AC_SUBST(SO_AGE)
|
|
||||||
AC_SUBST(MEM_SRCDST_FUNCTIONS)
|
|
||||||
|
|
||||||
AC_DEFINE_UNQUOTED(MOZJPEG_VERSION, [$VERSION], [mozjpeg version])
|
|
||||||
|
|
||||||
m4_define(version_triplet,m4_split(AC_PACKAGE_VERSION,[[.]]))
|
|
||||||
m4_define(version_major,m4_argn(1,version_triplet))
|
|
||||||
m4_define(version_minor,m4_argn(2,version_triplet))
|
|
||||||
m4_define(version_revision,m4_argn(3,version_triplet))
|
|
||||||
VERSION_MAJOR=version_major
|
|
||||||
VERSION_MINOR=version_minor
|
|
||||||
VERSION_REVISION=version_revision
|
|
||||||
LIBJPEG_TURBO_VERSION_NUMBER=`printf "%d%03d%03d" $VERSION_MAJOR $VERSION_MINOR $VERSION_REVISION`
|
|
||||||
AC_DEFINE_UNQUOTED(LIBJPEG_TURBO_VERSION_NUMBER, [$LIBJPEG_TURBO_VERSION_NUMBER], [libjpeg-turbo version in integer form])
|
|
||||||
|
|
||||||
VERSION_SCRIPT=yes
|
|
||||||
AC_ARG_ENABLE([ld-version-script],
|
AC_ARG_ENABLE([ld-version-script],
|
||||||
AS_HELP_STRING([--disable-ld-version-script],
|
AS_HELP_STRING([--enable-ld-version-script],
|
||||||
[Disable linker version script for mozjpeg (default is to use linker version script if the linker supports it)]),
|
[enable linker version script (default is enabled when possible)]),
|
||||||
[VERSION_SCRIPT=$enableval], [])
|
[have_ld_version_script=$enableval], [])
|
||||||
|
if test -z "$have_ld_version_script"; then
|
||||||
AC_MSG_CHECKING([whether the linker supports version scripts])
|
AC_MSG_CHECKING([if LD -Wl,--version-script works])
|
||||||
SAVED_LDFLAGS="$LDFLAGS"
|
save_LDFLAGS="$LDFLAGS"
|
||||||
LDFLAGS="$LDFLAGS -Wl,--version-script,conftest.map"
|
LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map"
|
||||||
cat > conftest.map <<EOF
|
cat > conftest.map <<EOF
|
||||||
VERS_1 {
|
VERS_1 {
|
||||||
global: *;
|
global: sym;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
VERS_2 {
|
||||||
|
global: sym;
|
||||||
|
} VERS_1;
|
||||||
EOF
|
EOF
|
||||||
AC_LINK_IFELSE([AC_LANG_SOURCE([AC_LANG_PROGRAM([], [])])],
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
|
||||||
[VERSION_SCRIPT_FLAG=-Wl,--version-script,;
|
[have_ld_version_script=yes], [have_ld_version_script=no])
|
||||||
AC_MSG_RESULT([yes (GNU style)])],
|
rm -f conftest.map
|
||||||
[])
|
LDFLAGS="$save_LDFLAGS"
|
||||||
if test "x$VERSION_SCRIPT_FLAG" = "x"; then
|
AC_MSG_RESULT($have_ld_version_script)
|
||||||
LDFLAGS="$SAVED_LDFLAGS -Wl,-M,conftest.map"
|
|
||||||
AC_LINK_IFELSE([AC_LANG_SOURCE([AC_LANG_PROGRAM([], [])])],
|
|
||||||
[VERSION_SCRIPT_FLAG=-Wl,-M,;
|
|
||||||
AC_MSG_RESULT([yes (Sun style)])],
|
|
||||||
[])
|
|
||||||
fi
|
fi
|
||||||
if test "x$VERSION_SCRIPT_FLAG" = "x"; then
|
AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes")
|
||||||
VERSION_SCRIPT=no
|
|
||||||
AC_MSG_RESULT(no)
|
# See if compiler supports prototypes.
|
||||||
|
AC_MSG_CHECKING([for function prototypes])
|
||||||
|
AC_CACHE_VAL([ijg_cv_have_prototypes],
|
||||||
|
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
||||||
|
int testfunction (int arg1, int * arg2); /* check prototypes */
|
||||||
|
struct methods_struct { /* check method-pointer declarations */
|
||||||
|
int (*error_exit) (char *msgtext);
|
||||||
|
int (*trace_message) (char *msgtext);
|
||||||
|
int (*another_method) (void);
|
||||||
|
};
|
||||||
|
int testfunction (int arg1, int * arg2) /* check definitions */
|
||||||
|
{ return arg2[arg1]; }
|
||||||
|
int test2function (void) /* check void arg list */
|
||||||
|
{ return 0; }
|
||||||
|
]])],
|
||||||
|
[ijg_cv_have_prototypes=yes],
|
||||||
|
[ijg_cv_have_prototypes=no])])
|
||||||
|
AC_MSG_RESULT([$ijg_cv_have_prototypes])
|
||||||
|
if test $ijg_cv_have_prototypes = yes; then
|
||||||
|
AC_DEFINE([HAVE_PROTOTYPES],[1],[Compiler supports function prototypes.])
|
||||||
|
else
|
||||||
|
AC_MSG_WARN([Your compiler does not seem to know about function prototypes.
|
||||||
|
Perhaps it needs a special switch to enable ANSI C mode.
|
||||||
|
If so, we recommend running configure like this:
|
||||||
|
./configure CC='cc -switch'
|
||||||
|
where -switch is the proper switch.])
|
||||||
fi
|
fi
|
||||||
LDFLAGS="$SAVED_LDFLAGS"
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether to use version script when building mozjpeg])
|
# Check header files
|
||||||
AC_MSG_RESULT($VERSION_SCRIPT)
|
AC_CHECK_HEADERS([stddef.h stdlib.h locale.h])
|
||||||
|
AC_CHECK_HEADER([string.h], [],
|
||||||
|
[AC_DEFINE([NEED_BSD_STRINGS], [1],
|
||||||
|
[Compiler has <strings.h> rather than standard <string.h>.])])
|
||||||
|
|
||||||
AM_CONDITIONAL(VERSION_SCRIPT, test "x$VERSION_SCRIPT" = "xyes")
|
# See whether type size_t is defined in any ANSI-standard places;
|
||||||
AC_SUBST(VERSION_SCRIPT_FLAG)
|
# if not, perhaps it is defined in <sys/types.h>.
|
||||||
|
AC_MSG_CHECKING([for size_t])
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
#ifdef HAVE_STDDEF_H
|
||||||
|
#include <stddef.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_STDLIB_H
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
#include <stdio.h>
|
||||||
|
#ifdef NEED_BSD_STRINGS
|
||||||
|
#include <strings.h>
|
||||||
|
#else
|
||||||
|
#include <string.h>
|
||||||
|
#endif
|
||||||
|
typedef size_t my_size_t;
|
||||||
|
],
|
||||||
|
[ my_size_t foovar; ],
|
||||||
|
[ijg_size_t_ok=yes],
|
||||||
|
[ijg_size_t_ok="not ANSI, perhaps it is in sys/types.h"])
|
||||||
|
AC_MSG_RESULT([$ijg_size_t_ok])
|
||||||
|
if test "$ijg_size_t_ok" != yes; then
|
||||||
|
AC_CHECK_HEADER([sys/types.h],
|
||||||
|
[AC_DEFINE([NEED_SYS_TYPES_H], [1],
|
||||||
|
[Need to include <sys/types.h> in order to obtain size_t.])
|
||||||
|
AC_EGREP_CPP([size_t], [#include <sys/types.h>],
|
||||||
|
[ijg_size_t_ok="size_t is in sys/types.h"],
|
||||||
|
[ijg_size_t_ok=no])],
|
||||||
|
[ijg_size_t_ok=no])
|
||||||
|
AC_MSG_RESULT([$ijg_size_t_ok])
|
||||||
|
if test "$ijg_size_t_ok" = no; then
|
||||||
|
AC_MSG_WARN([Type size_t is not defined in any of the usual places.
|
||||||
|
Try putting '"typedef unsigned int size_t;"' in jconfig.h.])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check compiler characteristics
|
||||||
|
AC_MSG_CHECKING([for type unsigned char])
|
||||||
|
AC_TRY_COMPILE([], [ unsigned char un_char; ],
|
||||||
|
[AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE([HAVE_UNSIGNED_CHAR], [1],
|
||||||
|
[Compiler supports 'unsigned char'.])],
|
||||||
|
[AC_MSG_RESULT(no)])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([for type unsigned short])
|
||||||
|
AC_TRY_COMPILE([], [ unsigned short un_short; ],
|
||||||
|
[AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE([HAVE_UNSIGNED_SHORT], [1],
|
||||||
|
[Compiler supports 'unsigned short'.])],
|
||||||
|
[AC_MSG_RESULT(no)])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([for type void])
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
/* Caution: a C++ compiler will insist on valid prototypes */
|
||||||
|
typedef void * void_ptr; /* check void * */
|
||||||
|
#ifdef HAVE_PROTOTYPES /* check ptr to function returning void */
|
||||||
|
typedef void (*void_func) (int a, int b);
|
||||||
|
#else
|
||||||
|
typedef void (*void_func) ();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_PROTOTYPES /* check void function result */
|
||||||
|
void test3function (void_ptr arg1, void_func arg2)
|
||||||
|
#else
|
||||||
|
void test3function (arg1, arg2)
|
||||||
|
void_ptr arg1;
|
||||||
|
void_func arg2;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
char * locptr = (char *) arg1; /* check casting to and from void * */
|
||||||
|
arg1 = (void *) locptr;
|
||||||
|
(*arg2) (1, 2); /* check call of fcn returning void */
|
||||||
|
}
|
||||||
|
], [ ],
|
||||||
|
[AC_MSG_RESULT(yes)],
|
||||||
|
[AC_MSG_RESULT(no)
|
||||||
|
AC_DEFINE([void], [char],
|
||||||
|
[Define 'void' as 'char' for archaic compilers
|
||||||
|
that don't understand it.])])
|
||||||
|
AC_C_CONST
|
||||||
|
|
||||||
# Check for non-broken inline under various spellings
|
# Check for non-broken inline under various spellings
|
||||||
AC_MSG_CHECKING(for inline)
|
AC_MSG_CHECKING([for inline])
|
||||||
ljt_cv_inline=""
|
ijg_cv_inline=""
|
||||||
AC_TRY_COMPILE(, [} inline __attribute__((always_inline)) int foo() { return 0; }
|
AC_TRY_COMPILE([], [} __inline__ int foo() { return 0; }
|
||||||
int bar() { return foo();], ljt_cv_inline="inline __attribute__((always_inline))",
|
int bar() { return foo();], ijg_cv_inline="__inline__",
|
||||||
AC_TRY_COMPILE(, [} __inline__ int foo() { return 0; }
|
[AC_TRY_COMPILE(, [} __inline int foo() { return 0; }
|
||||||
int bar() { return foo();], ljt_cv_inline="__inline__",
|
int bar() { return foo();], ijg_cv_inline="__inline",
|
||||||
AC_TRY_COMPILE(, [} __inline int foo() { return 0; }
|
[AC_TRY_COMPILE(, [} inline int foo() { return 0; }
|
||||||
int bar() { return foo();], ljt_cv_inline="__inline",
|
int bar() { return foo();], ijg_cv_inline="inline")])])
|
||||||
AC_TRY_COMPILE(, [} inline int foo() { return 0; }
|
AC_MSG_RESULT($ijg_cv_inline)
|
||||||
int bar() { return foo();], ljt_cv_inline="inline"))))
|
AC_DEFINE_UNQUOTED([INLINE], [$ijg_cv_inline],
|
||||||
AC_MSG_RESULT($ljt_cv_inline)
|
[How to obtain function inlining.])
|
||||||
AC_DEFINE_UNQUOTED([INLINE],[$ljt_cv_inline],[How to obtain function inlining.])
|
|
||||||
|
|
||||||
# Arithmetic coding support
|
# We cannot check for bogus warnings, but at least we can check for errors
|
||||||
AC_MSG_CHECKING([whether to include arithmetic encoding support])
|
AC_MSG_CHECKING([for broken incomplete types])
|
||||||
AC_ARG_WITH([arith-enc],
|
AC_TRY_COMPILE([ typedef struct undefined_structure * undef_struct_ptr; ],
|
||||||
AC_HELP_STRING([--without-arith-enc],
|
[],
|
||||||
[Do not include arithmetic encoding support when emulating the libjpeg v6b API/ABI]))
|
[AC_MSG_RESULT(ok)],
|
||||||
if test "x$with_12bit" = "xyes"; then
|
[AC_MSG_RESULT(broken)
|
||||||
with_arith_enc=no
|
AC_DEFINE([INCOMPLETE_TYPES_BROKEN], [1],
|
||||||
fi
|
[Compiler does not support pointers to unspecified
|
||||||
if test "x${with_jpeg8}" = "xyes" -o "x${with_jpeg7}" = "xyes"; then
|
structures.])])
|
||||||
with_arith_enc=yes
|
|
||||||
fi
|
|
||||||
if test "x$with_arith_enc" = "xno"; then
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-arith-enc"
|
|
||||||
else
|
|
||||||
AC_DEFINE([C_ARITH_CODING_SUPPORTED], [1], [Support arithmetic encoding])
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL([WITH_ARITH_ENC], [test "x$with_arith_enc" != "xno"])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether to include arithmetic decoding support])
|
# Test whether global names are unique to at least 15 chars
|
||||||
AC_ARG_WITH([arith-dec],
|
AC_MSG_CHECKING([for short external names])
|
||||||
AC_HELP_STRING([--without-arith-dec],
|
AC_TRY_LINK([
|
||||||
[Do not include arithmetic decoding support when emulating the libjpeg v6b API/ABI]))
|
int possibly_duplicate_function () { return 0; }
|
||||||
if test "x$with_12bit" = "xyes"; then
|
int possibly_dupli_function () { return 1; }
|
||||||
with_arith_dec=no
|
], [],
|
||||||
fi
|
[AC_MSG_RESULT(ok)],
|
||||||
if test "x${with_jpeg8}" = "xyes" -o "x${with_jpeg7}" = "xyes"; then
|
[AC_MSG_RESULT(short)
|
||||||
with_arith_dec=yes
|
AC_DEFINE([NEED_SHORT_EXTERNAL_NAMES], [1],
|
||||||
fi
|
[Linker requires that global names be unique in
|
||||||
if test "x$with_arith_dec" = "xno"; then
|
first 15 characters.])])
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-arith-dec"
|
|
||||||
else
|
|
||||||
AC_DEFINE([D_ARITH_CODING_SUPPORTED], [1], [Support arithmetic decoding])
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL([WITH_ARITH_DEC], [test "x$with_arith_dec" != "xno"])
|
|
||||||
|
|
||||||
AM_CONDITIONAL([WITH_ARITH],
|
# Run-time checks
|
||||||
[test "x$with_arith_dec" != "xno" -o "x$with_arith_enc" != "xno"])
|
AC_MSG_CHECKING([to see if char is signed])
|
||||||
|
AC_TRY_RUN([
|
||||||
|
#ifdef HAVE_STDLIB_H
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
#include <stdio.h>
|
||||||
|
#ifdef HAVE_PROTOTYPES
|
||||||
|
int is_char_signed (int arg)
|
||||||
|
#else
|
||||||
|
int is_char_signed (arg)
|
||||||
|
int arg;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (arg == 189) { /* expected result for unsigned char */
|
||||||
|
return 0; /* type char is unsigned */
|
||||||
|
}
|
||||||
|
else if (arg != -67) { /* expected result for signed char */
|
||||||
|
printf("Hmm, it seems 'char' is not eight bits wide on your machine.\n");
|
||||||
|
printf("I fear the JPEG software will not work at all.\n\n");
|
||||||
|
}
|
||||||
|
return 1; /* assume char is signed otherwise */
|
||||||
|
}
|
||||||
|
char signed_char_check = (char) (-67);
|
||||||
|
int main() {
|
||||||
|
exit(is_char_signed((int) signed_char_check));
|
||||||
|
}], [AC_MSG_RESULT(no)
|
||||||
|
AC_DEFINE([CHAR_IS_UNSIGNED], [1],
|
||||||
|
[Characters are unsigned])],
|
||||||
|
[AC_MSG_RESULT(yes)],
|
||||||
|
[AC_MSG_WARN([Assuming that char is signed on target machine.
|
||||||
|
If it is unsigned, this will be a little bit inefficient.])
|
||||||
|
])
|
||||||
|
|
||||||
# 12-bit component support
|
AC_MSG_CHECKING([to see if right shift is signed])
|
||||||
AC_MSG_CHECKING([whether to use 12-bit samples])
|
AC_TRY_RUN([
|
||||||
AC_ARG_WITH([12bit],
|
#ifdef HAVE_STDLIB_H
|
||||||
AC_HELP_STRING([--with-12bit], [Encode/decode JPEG images with 12-bit samples (implies --without-simd --without-turbojpeg --without-arith-dec --without-arith-enc)]))
|
#include <stdlib.h>
|
||||||
if test "x$with_12bit" = "xyes"; then
|
#endif
|
||||||
AC_DEFINE([BITS_IN_JSAMPLE], [12], [use 8 or 12])
|
#include <stdio.h>
|
||||||
AC_MSG_RESULT(yes)
|
#ifdef HAVE_PROTOTYPES
|
||||||
else
|
int is_shifting_signed (long arg)
|
||||||
AC_MSG_RESULT(no)
|
#else
|
||||||
fi
|
int is_shifting_signed (arg)
|
||||||
AM_CONDITIONAL([WITH_12BIT], [test "x$with_12bit" = "xyes"])
|
long arg;
|
||||||
|
#endif
|
||||||
|
/* See whether right-shift on a long is signed or not. */
|
||||||
|
{
|
||||||
|
long res = arg >> 4;
|
||||||
|
|
||||||
# TurboJPEG support
|
if (res == -0x7F7E80CL) { /* expected result for signed shift */
|
||||||
AC_MSG_CHECKING([whether to build TurboJPEG C wrapper])
|
return 1; /* right shift is signed */
|
||||||
AC_ARG_WITH([turbojpeg],
|
}
|
||||||
AC_HELP_STRING([--without-turbojpeg],
|
/* see if unsigned-shift hack will fix it. */
|
||||||
[Do not include the TurboJPEG wrapper library and associated test programs]))
|
/* we can't just test exact value since it depends on width of long... */
|
||||||
if test "x$with_12bit" = "xyes"; then
|
res |= (~0L) << (32-4);
|
||||||
with_turbojpeg=no
|
if (res == -0x7F7E80CL) { /* expected result now? */
|
||||||
fi
|
return 0; /* right shift is unsigned */
|
||||||
if test "x$with_turbojpeg" = "xno"; then
|
}
|
||||||
AC_MSG_RESULT(no)
|
printf("Right shift isn't acting as I expect it to.\n");
|
||||||
RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-turbojpeg"
|
printf("I fear the JPEG software will not work at all.\n\n");
|
||||||
else
|
return 0; /* try it with unsigned anyway */
|
||||||
AC_MSG_RESULT(yes)
|
}
|
||||||
fi
|
int main() {
|
||||||
|
exit(is_shifting_signed(-0x7F7E80B1L));
|
||||||
|
}],
|
||||||
|
[AC_MSG_RESULT(no)
|
||||||
|
AC_DEFINE([RIGHT_SHIFT_IS_UNSIGNED], [1],
|
||||||
|
[Broken compiler shifts signed values as an unsigned shift.])],
|
||||||
|
[AC_MSG_RESULT(yes)],
|
||||||
|
[AC_MSG_RESULT(Assuming that right shift is signed on target machine.)])
|
||||||
|
|
||||||
# Java support
|
AC_MSG_CHECKING([to see if fopen accepts b spec])
|
||||||
AC_ARG_VAR(JAVAC, [Java compiler command (default: javac)])
|
AC_TRY_RUN([
|
||||||
if test "x$JAVAC" = "x"; then
|
#ifdef HAVE_STDLIB_H
|
||||||
JAVAC=javac
|
#include <stdlib.h>
|
||||||
fi
|
#endif
|
||||||
AC_SUBST(JAVAC)
|
#include <stdio.h>
|
||||||
AC_ARG_VAR(JAVACFLAGS, [Java compiler flags])
|
int main() {
|
||||||
AC_SUBST(JAVACFLAGS)
|
if (fopen("conftestdata", "wb") != NULL)
|
||||||
AC_ARG_VAR(JAR, [Java archive command (default: jar)])
|
exit(0);
|
||||||
if test "x$JAR" = "x"; then
|
exit(1);
|
||||||
JAR=jar
|
}],
|
||||||
fi
|
[AC_MSG_RESULT(yes)],
|
||||||
AC_SUBST(JAR)
|
[AC_MSG_RESULT(no)
|
||||||
AC_ARG_VAR(JAVA, [Java runtime command (default: java)])
|
AC_DEFINE([DONT_USE_B_MODE], [1],
|
||||||
if test "x$JAVA" = "x"; then
|
[Don't open files in binary mode.])],
|
||||||
JAVA=java
|
[AC_MSG_RESULT(Assuming that it does.)])
|
||||||
fi
|
|
||||||
AC_SUBST(JAVA)
|
|
||||||
AC_ARG_VAR(JNI_CFLAGS,
|
|
||||||
[C compiler flags needed to include jni.h (default: -I/System/Library/Frameworks/JavaVM.framework/Headers on OS X, '-I/usr/java/include -I/usr/java/include/solaris' on Solaris, and '-I/usr/java/default/include -I/usr/java/default/include/linux' on Linux)])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether to build TurboJPEG Java wrapper])
|
# Configure libtool
|
||||||
AC_ARG_WITH([java],
|
AC_LIBTOOL_WIN32_DLL
|
||||||
AC_HELP_STRING([--with-java], [Build Java wrapper for the TurboJPEG library]))
|
AC_PROG_LIBTOOL
|
||||||
if test "x$with_12bit" = "xyes" -o "x$with_turbojpeg" = "xno"; then
|
|
||||||
with_java=no
|
# Select memory manager depending on user input.
|
||||||
|
# If no "-enable-maxmem", use jmemnobs
|
||||||
|
MEMORYMGR='jmemnobs'
|
||||||
|
MAXMEM="no"
|
||||||
|
AC_ARG_ENABLE([maxmem],
|
||||||
|
[ --enable-maxmem[=N] enable use of temp files, set max mem usage to N MB],
|
||||||
|
[MAXMEM="$enableval"])
|
||||||
|
dnl [# support --with-maxmem for backwards compatibility with IJG V5.]
|
||||||
|
dnl AC_ARG_WITH(maxmem, , MAXMEM="$withval")
|
||||||
|
if test "x$MAXMEM" = xyes; then
|
||||||
|
MAXMEM=1
|
||||||
fi
|
fi
|
||||||
|
if test "x$MAXMEM" != xno; then
|
||||||
WITH_JAVA=0
|
if test -n "`echo $MAXMEM | sed 's/[[0-9]]//g'`"; then
|
||||||
if test "x$with_java" = "xyes"; then
|
AC_MSG_ERROR(non-numeric argument to --enable-maxmem)
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
|
|
||||||
case $host_os in
|
|
||||||
darwin*)
|
|
||||||
DEFAULT_JNI_CFLAGS=-I/System/Library/Frameworks/JavaVM.framework/Headers
|
|
||||||
;;
|
|
||||||
solaris*)
|
|
||||||
DEFAULT_JNI_CFLAGS='-I/usr/java/include -I/usr/java/include/solaris'
|
|
||||||
;;
|
|
||||||
linux*)
|
|
||||||
DEFAULT_JNI_CFLAGS='-I/usr/java/default/include -I/usr/java/default/include/linux'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
if test "x$JNI_CFLAGS" = "x"; then
|
|
||||||
JNI_CFLAGS=$DEFAULT_JNI_CFLAGS
|
|
||||||
fi
|
fi
|
||||||
|
DEFAULTMAXMEM=`expr $MAXMEM \* 1048576`
|
||||||
|
AC_DEFINE_UNQUOTED([DEFAULT_MAX_MEM], [${DEFAULTMAXMEM}],
|
||||||
|
[Maximum data space library will allocate.])
|
||||||
|
AC_MSG_CHECKING([for 'tmpfile()'])
|
||||||
|
AC_TRY_LINK([#include <stdio.h>], [ FILE * tfile = tmpfile(); ],
|
||||||
|
[AC_MSG_RESULT(yes)
|
||||||
|
MEMORYMGR='jmemansi'],
|
||||||
|
[AC_MSG_RESULT(no)
|
||||||
|
dnl if tmpfile is not present, must use jmemname.
|
||||||
|
MEMORYMGR='jmemname'
|
||||||
|
|
||||||
SAVE_CPPFLAGS=${CPPFLAGS}
|
# Test for the need to remove temporary files using a signal handler
|
||||||
CPPFLAGS="${CPPFLAGS} ${JNI_CFLAGS}"
|
# (for cjpeg/djpeg)
|
||||||
AC_CHECK_HEADERS([jni.h], [DUMMY=1],
|
AC_DEFINE([NEED_SIGNAL_CATCHER], [1],
|
||||||
[AC_MSG_ERROR([Could not find JNI header file])])
|
[Need signal handler to clean up temporary files.])
|
||||||
CPPFLAGS=${SAVE_CPPFLAGS}
|
AC_MSG_CHECKING([for 'mktemp()'])
|
||||||
AC_SUBST(JNI_CFLAGS)
|
AC_TRY_LINK([], [ char fname[80]; mktemp(fname); ],
|
||||||
|
[AC_MSG_RESULT(yes)],
|
||||||
RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --with-java"
|
[AC_MSG_RESULT(no)
|
||||||
JAVA_RPM_CONTENTS_1='%dir %{_datadir}/classes'
|
AC_DEFINE([NO_MKTEMP], [1],
|
||||||
JAVA_RPM_CONTENTS_2=%{_datadir}/classes/turbojpeg.jar
|
[The mktemp() function is not available.])])])
|
||||||
WITH_JAVA=1
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
fi
|
fi
|
||||||
AM_CONDITIONAL([WITH_JAVA], [test "x$with_java" = "xyes"])
|
AC_SUBST([MEMORYMGR])
|
||||||
AC_SUBST(WITH_JAVA)
|
|
||||||
AC_SUBST(JAVA_RPM_CONTENTS_1)
|
|
||||||
AC_SUBST(JAVA_RPM_CONTENTS_2)
|
|
||||||
|
|
||||||
# optionally force using gas-preprocessor.pl for compatibility testing
|
# Extract the library version IDs from jpeglib.h.
|
||||||
AC_ARG_WITH([gas-preprocessor],
|
AC_MSG_CHECKING([libjpeg version number])
|
||||||
AC_HELP_STRING([--with-gas-preprocessor],
|
[major=`sed -ne 's/^#define JPEG_LIB_VERSION_MAJOR *\([0-9][0-9]*\).*$/\1/p' $srcdir/jpeglib.h`
|
||||||
[Force using gas-preprocessor.pl on ARM.]))
|
minor=`sed -ne 's/^#define JPEG_LIB_VERSION_MINOR *\([0-9][0-9]*\).*$/\1/p' $srcdir/jpeglib.h`]
|
||||||
if test "x${with_gas_preprocessor}" = "xyes"; then
|
AC_SUBST([JPEG_LIB_VERSION],
|
||||||
case $host_os in
|
[`expr $major + $minor`:0:$minor])
|
||||||
darwin*)
|
AC_MSG_RESULT([$JPEG_LIB_VERSION])
|
||||||
CCAS="gas-preprocessor.pl -fix-unreq $CC"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
CCAS="gas-preprocessor.pl -no-fix-unreq $CC"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
AC_SUBST([CCAS])
|
|
||||||
fi
|
|
||||||
|
|
||||||
# SIMD is optional
|
AC_CONFIG_FILES([Makefile libjpeg.pc])
|
||||||
AC_ARG_WITH([simd],
|
|
||||||
AC_HELP_STRING([--without-simd], [Do not include SIMD extensions]))
|
|
||||||
if test "x$with_12bit" = "xyes"; then
|
|
||||||
with_simd=no
|
|
||||||
fi
|
|
||||||
if test "x${with_simd}" != "xno"; then
|
|
||||||
require_simd=no
|
|
||||||
if test "x${with_simd}" = "xyes"; then
|
|
||||||
require_simd=yes
|
|
||||||
fi
|
|
||||||
# Check if we're on a supported CPU
|
|
||||||
AC_MSG_CHECKING([if we have SIMD optimisations for cpu type])
|
|
||||||
case "$host_cpu" in
|
|
||||||
x86_64 | amd64)
|
|
||||||
AC_MSG_RESULT([yes (x86_64)])
|
|
||||||
AC_PROG_NASM
|
|
||||||
simd_arch=x86_64
|
|
||||||
;;
|
|
||||||
i*86 | x86 | ia32)
|
|
||||||
AC_MSG_RESULT([yes (i386)])
|
|
||||||
AC_PROG_NASM
|
|
||||||
simd_arch=i386
|
|
||||||
;;
|
|
||||||
arm*)
|
|
||||||
AC_MSG_RESULT([yes (arm)])
|
|
||||||
AC_MSG_CHECKING([if the assembler is GNU-compatible and can be used])
|
|
||||||
AC_CHECK_COMPATIBLE_ARM_ASSEMBLER_IFELSE(
|
|
||||||
[if test "x$ac_use_gas_preprocessor" = "xyes"; then
|
|
||||||
AC_MSG_RESULT([yes (with gas-preprocessor)])
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
fi
|
|
||||||
simd_arch=arm],
|
|
||||||
[AC_MSG_RESULT([no])
|
|
||||||
with_simd=no])
|
|
||||||
if test "x${with_simd}" = "xno"; then
|
|
||||||
if test "x${require_simd}" = "xyes"; then
|
|
||||||
AC_MSG_ERROR([SIMD support can't be enabled.])
|
|
||||||
else
|
|
||||||
AC_MSG_WARN([SIMD support can't be enabled. Performance will suffer.])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
aarch64*)
|
|
||||||
AC_MSG_RESULT([yes (arm64)])
|
|
||||||
AC_MSG_CHECKING([if the assembler is GNU-compatible and can be used])
|
|
||||||
AC_CHECK_COMPATIBLE_ARM64_ASSEMBLER_IFELSE(
|
|
||||||
[if test "x$ac_use_gas_preprocessor" = "xyes"; then
|
|
||||||
AC_MSG_RESULT([yes (with gas-preprocessor)])
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
fi
|
|
||||||
simd_arch=aarch64],
|
|
||||||
[AC_MSG_RESULT([no])
|
|
||||||
with_simd=no])
|
|
||||||
if test "x${with_simd}" = "xno"; then
|
|
||||||
if test "x${require_simd}" = "xyes"; then
|
|
||||||
AC_MSG_ERROR([SIMD support can't be enabled.])
|
|
||||||
else
|
|
||||||
AC_MSG_WARN([SIMD support can't be enabled. Performance will suffer.])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
mips*)
|
|
||||||
AC_MSG_RESULT([yes (mips)])
|
|
||||||
AC_MSG_CHECKING([if the assembler is GNU-compatible and can be used])
|
|
||||||
AC_CHECK_COMPATIBLE_MIPS_ASSEMBLER_IFELSE(
|
|
||||||
[AC_MSG_RESULT([yes])
|
|
||||||
simd_arch=mips],
|
|
||||||
[AC_MSG_RESULT([no])
|
|
||||||
with_simd=no])
|
|
||||||
if test "x${with_simd}" = "xno"; then
|
|
||||||
if test "x${require_simd}" = "xyes"; then
|
|
||||||
AC_MSG_ERROR([SIMD support can't be enabled.])
|
|
||||||
else
|
|
||||||
AC_MSG_WARN([SIMD support can't be enabled. Performance will suffer.])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
powerpc*)
|
|
||||||
AC_MSG_RESULT([yes (powerpc)])
|
|
||||||
simd_arch=powerpc
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
AC_MSG_RESULT([no ("$host_cpu")])
|
|
||||||
with_simd=no;
|
|
||||||
if test "x${require_simd}" = "xyes"; then
|
|
||||||
AC_MSG_ERROR([SIMD support not available for this CPU.])
|
|
||||||
else
|
|
||||||
AC_MSG_WARN([SIMD support not available for this CPU. Performance will suffer.])
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test "x${with_simd}" != "xno"; then
|
|
||||||
AC_DEFINE([WITH_SIMD], [1], [Use accelerated SIMD routines.])
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
RPM_CONFIG_ARGS="$RPM_CONFIG_ARGS --without-simd"
|
|
||||||
fi
|
|
||||||
|
|
||||||
AM_CONDITIONAL([WITH_SIMD], [test "x$with_simd" != "xno"])
|
|
||||||
AM_CONDITIONAL([WITH_SSE_FLOAT_DCT], [test "x$simd_arch" = "xx86_64" -o "x$simd_arch" = "xi386"])
|
|
||||||
AM_CONDITIONAL([SIMD_I386], [test "x$simd_arch" = "xi386"])
|
|
||||||
AM_CONDITIONAL([SIMD_X86_64], [test "x$simd_arch" = "xx86_64"])
|
|
||||||
AM_CONDITIONAL([SIMD_ARM], [test "x$simd_arch" = "xarm"])
|
|
||||||
AM_CONDITIONAL([SIMD_ARM_64], [test "x$simd_arch" = "xaarch64"])
|
|
||||||
AM_CONDITIONAL([SIMD_MIPS], [test "x$simd_arch" = "xmips"])
|
|
||||||
AM_CONDITIONAL([SIMD_POWERPC], [test "x$simd_arch" = "xpowerpc"])
|
|
||||||
AM_CONDITIONAL([X86_64], [test "x$host_cpu" = "xx86_64" -o "x$host_cpu" = "xamd64"])
|
|
||||||
AM_CONDITIONAL([WITH_TURBOJPEG], [test "x$with_turbojpeg" != "xno"])
|
|
||||||
AM_CONDITIONAL([CROSS_COMPILING], [test "x$cross_compiling" = "xyes"])
|
|
||||||
|
|
||||||
AC_ARG_VAR(PKGNAME, [distribution package name (default: mozjpeg)])
|
|
||||||
if test "x$PKGNAME" = "x"; then
|
|
||||||
PKGNAME=$PACKAGE_NAME
|
|
||||||
fi
|
|
||||||
AC_SUBST(PKGNAME)
|
|
||||||
|
|
||||||
case "$host_cpu" in
|
|
||||||
x86_64)
|
|
||||||
RPMARCH=x86_64
|
|
||||||
DEBARCH=amd64
|
|
||||||
;;
|
|
||||||
i*86 | x86 | ia32)
|
|
||||||
RPMARCH=i386
|
|
||||||
DEBARCH=i386
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
RPMARCH=`uname -m`
|
|
||||||
DEBARCH=$RPMARCH
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test "${docdir}" = ""; then
|
|
||||||
docdir=${datadir}/doc
|
|
||||||
AC_SUBST(docdir)
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(RPMARCH)
|
|
||||||
AC_SUBST(RPM_CONFIG_ARGS)
|
|
||||||
AC_SUBST(DEBARCH)
|
|
||||||
AC_SUBST(BUILD)
|
|
||||||
AC_DEFINE_UNQUOTED([BUILD], "$BUILD", [libjpeg-turbo build number])
|
|
||||||
|
|
||||||
# NOTE: autoheader automatically modifies the input file of the first
|
|
||||||
# invocation of AC_CONFIG_HEADERS, so we put config.h first to prevent
|
|
||||||
# jconfig.h.in from being clobbered. config.h is used only internally, whereas
|
|
||||||
# jconfig.h contains macros that are relevant to external programs (macros that
|
|
||||||
# specify which features were built into the library.)
|
|
||||||
AC_CONFIG_HEADERS([config.h])
|
|
||||||
AC_CONFIG_HEADERS([jconfig.h])
|
|
||||||
AC_CONFIG_HEADERS([jconfigint.h])
|
|
||||||
AC_CONFIG_FILES([pkgscripts/mozjpeg.spec.tmpl:release/mozjpeg.spec.in])
|
|
||||||
AC_CONFIG_FILES([pkgscripts/makecygwinpkg.tmpl:release/makecygwinpkg.in])
|
|
||||||
AC_CONFIG_FILES([pkgscripts/makedpkg.tmpl:release/makedpkg.in])
|
|
||||||
AC_CONFIG_FILES([pkgscripts/makemacpkg.tmpl:release/makemacpkg.in])
|
|
||||||
AC_CONFIG_FILES([pkgscripts/uninstall.tmpl:release/uninstall.in])
|
|
||||||
AC_CONFIG_FILES([pkgscripts/libjpeg.pc:release/libjpeg.pc.in])
|
|
||||||
AC_CONFIG_FILES([pkgscripts/libturbojpeg.pc:release/libturbojpeg.pc.in])
|
|
||||||
if test "x$with_turbojpeg" != "xno"; then
|
|
||||||
AC_CONFIG_FILES([tjbenchtest])
|
|
||||||
fi
|
|
||||||
if test "x$with_java" = "xyes"; then
|
|
||||||
AC_CONFIG_FILES([tjbenchtest.java])
|
|
||||||
AC_CONFIG_FILES([tjexampletest])
|
|
||||||
fi
|
|
||||||
AC_CONFIG_FILES([libjpeg.map])
|
|
||||||
AC_CONFIG_FILES([Makefile simd/Makefile])
|
|
||||||
AC_CONFIG_FILES([java/Makefile])
|
|
||||||
AC_CONFIG_FILES([md5/Makefile])
|
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|||||||
791
depcomp
Executable file
@@ -0,0 +1,791 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# depcomp - compile a program generating dependencies as side-effects
|
||||||
|
|
||||||
|
scriptversion=2016-01-11.22; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1999-2017 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
'')
|
||||||
|
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||||
|
exit 1;
|
||||||
|
;;
|
||||||
|
-h | --h*)
|
||||||
|
cat <<\EOF
|
||||||
|
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
||||||
|
|
||||||
|
Run PROGRAMS ARGS to compile a file, generating dependencies
|
||||||
|
as side-effects.
|
||||||
|
|
||||||
|
Environment variables:
|
||||||
|
depmode Dependency tracking mode.
|
||||||
|
source Source file read by 'PROGRAMS ARGS'.
|
||||||
|
object Object file output by 'PROGRAMS ARGS'.
|
||||||
|
DEPDIR directory where to store dependencies.
|
||||||
|
depfile Dependency file to output.
|
||||||
|
tmpdepfile Temporary file to use when outputting dependencies.
|
||||||
|
libtool Whether libtool is used (yes/no).
|
||||||
|
|
||||||
|
Report bugs to <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "depcomp $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Get the directory component of the given path, and save it in the
|
||||||
|
# global variables '$dir'. Note that this directory component will
|
||||||
|
# be either empty or ending with a '/' character. This is deliberate.
|
||||||
|
set_dir_from ()
|
||||||
|
{
|
||||||
|
case $1 in
|
||||||
|
*/*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
|
||||||
|
*) dir=;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get the suffix-stripped basename of the given path, and save it the
|
||||||
|
# global variable '$base'.
|
||||||
|
set_base_from ()
|
||||||
|
{
|
||||||
|
base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
|
||||||
|
}
|
||||||
|
|
||||||
|
# If no dependency file was actually created by the compiler invocation,
|
||||||
|
# we still have to create a dummy depfile, to avoid errors with the
|
||||||
|
# Makefile "include basename.Plo" scheme.
|
||||||
|
make_dummy_depfile ()
|
||||||
|
{
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Factor out some common post-processing of the generated depfile.
|
||||||
|
# Requires the auxiliary global variable '$tmpdepfile' to be set.
|
||||||
|
aix_post_process_depfile ()
|
||||||
|
{
|
||||||
|
# If the compiler actually managed to produce a dependency file,
|
||||||
|
# post-process it.
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
# Each line is of the form 'foo.o: dependency.h'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
|
# $object: dependency.h
|
||||||
|
# and one to simply output
|
||||||
|
# dependency.h:
|
||||||
|
# which is needed to avoid the deleted-header problem.
|
||||||
|
{ sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
|
||||||
|
sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
|
||||||
|
} > "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
else
|
||||||
|
make_dummy_depfile
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# A tabulation character.
|
||||||
|
tab=' '
|
||||||
|
# A newline character.
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
# Character ranges might be problematic outside the C locale.
|
||||||
|
# These definitions help.
|
||||||
|
upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||||
|
lower=abcdefghijklmnopqrstuvwxyz
|
||||||
|
digits=0123456789
|
||||||
|
alpha=${upper}${lower}
|
||||||
|
|
||||||
|
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
||||||
|
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
||||||
|
depfile=${depfile-`echo "$object" |
|
||||||
|
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
||||||
|
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
||||||
|
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
|
||||||
|
# Avoid interferences from the environment.
|
||||||
|
gccflag= dashmflag=
|
||||||
|
|
||||||
|
# Some modes work just like other modes, but use different flags. We
|
||||||
|
# parameterize here, but still list the modes in the big case below,
|
||||||
|
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
||||||
|
# here, because this file can only contain one case statement.
|
||||||
|
if test "$depmode" = hp; then
|
||||||
|
# HP compiler uses -M and no extra arg.
|
||||||
|
gccflag=-M
|
||||||
|
depmode=gcc
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = dashXmstdout; then
|
||||||
|
# This is just like dashmstdout with a different argument.
|
||||||
|
dashmflag=-xM
|
||||||
|
depmode=dashmstdout
|
||||||
|
fi
|
||||||
|
|
||||||
|
cygpath_u="cygpath -u -f -"
|
||||||
|
if test "$depmode" = msvcmsys; then
|
||||||
|
# This is just like msvisualcpp but w/o cygpath translation.
|
||||||
|
# Just convert the backslash-escaped backslashes to single forward
|
||||||
|
# slashes to satisfy depend.m4
|
||||||
|
cygpath_u='sed s,\\\\,/,g'
|
||||||
|
depmode=msvisualcpp
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = msvc7msys; then
|
||||||
|
# This is just like msvc7 but w/o cygpath translation.
|
||||||
|
# Just convert the backslash-escaped backslashes to single forward
|
||||||
|
# slashes to satisfy depend.m4
|
||||||
|
cygpath_u='sed s,\\\\,/,g'
|
||||||
|
depmode=msvc7
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = xlc; then
|
||||||
|
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
|
||||||
|
gccflag=-qmakedep=gcc,-MF
|
||||||
|
depmode=gcc
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$depmode" in
|
||||||
|
gcc3)
|
||||||
|
## gcc 3 implements dependency tracking that does exactly what
|
||||||
|
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
||||||
|
## it if -MD -MP comes after the -MF stuff. Hmm.
|
||||||
|
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
||||||
|
## the command line argument order; so add the flags where they
|
||||||
|
## appear in depend2.am. Note that the slowdown incurred here
|
||||||
|
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
||||||
|
*) set fnord "$@" "$arg" ;;
|
||||||
|
esac
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
done
|
||||||
|
"$@"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
mv "$tmpdepfile" "$depfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
gcc)
|
||||||
|
## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
|
||||||
|
## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
|
||||||
|
## (see the conditional assignment to $gccflag above).
|
||||||
|
## There are various ways to get dependency output from gcc. Here's
|
||||||
|
## why we pick this rather obscure method:
|
||||||
|
## - Don't want to use -MD because we'd like the dependencies to end
|
||||||
|
## up in a subdir. Having to rename by hand is ugly.
|
||||||
|
## (We might end up doing this anyway to support other compilers.)
|
||||||
|
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
||||||
|
## -MM, not -M (despite what the docs say). Also, it might not be
|
||||||
|
## supported by the other compilers which use the 'gcc' depmode.
|
||||||
|
## - Using -M directly means running the compiler twice (even worse
|
||||||
|
## than renaming).
|
||||||
|
if test -z "$gccflag"; then
|
||||||
|
gccflag=-MD,
|
||||||
|
fi
|
||||||
|
"$@" -Wp,"$gccflag$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
# The second -e expression handles DOS-style file names with drive
|
||||||
|
# letters.
|
||||||
|
sed -e 's/^[^:]*: / /' \
|
||||||
|
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
||||||
|
## This next piece of magic avoids the "deleted header file" problem.
|
||||||
|
## The problem is that when a header file which appears in a .P file
|
||||||
|
## is deleted, the dependency causes make to die (because there is
|
||||||
|
## typically no way to rebuild the header). We avoid this by adding
|
||||||
|
## dummy dependencies for each header file. Too bad gcc doesn't do
|
||||||
|
## this for us directly.
|
||||||
|
## Some versions of gcc put a space before the ':'. On the theory
|
||||||
|
## that the space means something, we add a space to the output as
|
||||||
|
## well. hp depmode also adds that space, but also prefixes the VPATH
|
||||||
|
## to the object. Take care to not repeat it in the output.
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
|
||||||
|
| sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
hp)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
sgi)
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
||||||
|
else
|
||||||
|
"$@" -MDupdate "$tmpdepfile"
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
|
||||||
|
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
# Clip off the initial element (the dependent). Don't try to be
|
||||||
|
# clever and replace this with sed code, as IRIX sed won't handle
|
||||||
|
# lines with more than a fixed number of characters (4096 in
|
||||||
|
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
||||||
|
# the IRIX cc adds comments like '#:fec' to the end of the
|
||||||
|
# dependency line.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
|
||||||
|
| tr "$nl" ' ' >> "$depfile"
|
||||||
|
echo >> "$depfile"
|
||||||
|
# The second pass generates a dummy entry for each header file.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
||||||
|
>> "$depfile"
|
||||||
|
else
|
||||||
|
make_dummy_depfile
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
xlc)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
aix)
|
||||||
|
# The C for AIX Compiler uses -M and outputs the dependencies
|
||||||
|
# in a .u file. In older versions, this file always lives in the
|
||||||
|
# current directory. Also, the AIX compiler puts '$object:' at the
|
||||||
|
# start of each line; $object doesn't have directory information.
|
||||||
|
# Version 6 uses the directory in both cases.
|
||||||
|
set_dir_from "$object"
|
||||||
|
set_base_from "$object"
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
tmpdepfile1=$dir$base.u
|
||||||
|
tmpdepfile2=$base.u
|
||||||
|
tmpdepfile3=$dir.libs/$base.u
|
||||||
|
"$@" -Wc,-M
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.u
|
||||||
|
tmpdepfile2=$dir$base.u
|
||||||
|
tmpdepfile3=$dir$base.u
|
||||||
|
"$@" -M
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
aix_post_process_depfile
|
||||||
|
;;
|
||||||
|
|
||||||
|
tcc)
|
||||||
|
# tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
|
||||||
|
# FIXME: That version still under development at the moment of writing.
|
||||||
|
# Make that this statement remains true also for stable, released
|
||||||
|
# versions.
|
||||||
|
# It will wrap lines (doesn't matter whether long or short) with a
|
||||||
|
# trailing '\', as in:
|
||||||
|
#
|
||||||
|
# foo.o : \
|
||||||
|
# foo.c \
|
||||||
|
# foo.h \
|
||||||
|
#
|
||||||
|
# It will put a trailing '\' even on the last line, and will use leading
|
||||||
|
# spaces rather than leading tabs (at least since its commit 0394caf7
|
||||||
|
# "Emit spaces for -MD").
|
||||||
|
"$@" -MD -MF "$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
# Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
|
||||||
|
# We have to change lines of the first kind to '$object: \'.
|
||||||
|
sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
|
||||||
|
# And for each line of the second kind, we have to emit a 'dep.h:'
|
||||||
|
# dummy dependency, to avoid the deleted-header problem.
|
||||||
|
sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
## The order of this option in the case statement is important, since the
|
||||||
|
## shell code in configure will try each of these formats in the order
|
||||||
|
## listed in this file. A plain '-MD' option would be understood by many
|
||||||
|
## compilers, so we must ensure this comes after the gcc and icc options.
|
||||||
|
pgcc)
|
||||||
|
# Portland's C compiler understands '-MD'.
|
||||||
|
# Will always output deps to 'file.d' where file is the root name of the
|
||||||
|
# source file under compilation, even if file resides in a subdirectory.
|
||||||
|
# The object file name does not affect the name of the '.d' file.
|
||||||
|
# pgcc 10.2 will output
|
||||||
|
# foo.o: sub/foo.c sub/foo.h
|
||||||
|
# and will wrap long lines using '\' :
|
||||||
|
# foo.o: sub/foo.c ... \
|
||||||
|
# sub/foo.h ... \
|
||||||
|
# ...
|
||||||
|
set_dir_from "$object"
|
||||||
|
# Use the source, not the object, to determine the base name, since
|
||||||
|
# that's sadly what pgcc will do too.
|
||||||
|
set_base_from "$source"
|
||||||
|
tmpdepfile=$base.d
|
||||||
|
|
||||||
|
# For projects that build the same source file twice into different object
|
||||||
|
# files, the pgcc approach of using the *source* file root name can cause
|
||||||
|
# problems in parallel builds. Use a locking strategy to avoid stomping on
|
||||||
|
# the same $tmpdepfile.
|
||||||
|
lockdir=$base.d-lock
|
||||||
|
trap "
|
||||||
|
echo '$0: caught signal, cleaning up...' >&2
|
||||||
|
rmdir '$lockdir'
|
||||||
|
exit 1
|
||||||
|
" 1 2 13 15
|
||||||
|
numtries=100
|
||||||
|
i=$numtries
|
||||||
|
while test $i -gt 0; do
|
||||||
|
# mkdir is a portable test-and-set.
|
||||||
|
if mkdir "$lockdir" 2>/dev/null; then
|
||||||
|
# This process acquired the lock.
|
||||||
|
"$@" -MD
|
||||||
|
stat=$?
|
||||||
|
# Release the lock.
|
||||||
|
rmdir "$lockdir"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
# If the lock is being held by a different process, wait
|
||||||
|
# until the winning process is done or we timeout.
|
||||||
|
while test -d "$lockdir" && test $i -gt 0; do
|
||||||
|
sleep 1
|
||||||
|
i=`expr $i - 1`
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
i=`expr $i - 1`
|
||||||
|
done
|
||||||
|
trap - 1 2 13 15
|
||||||
|
if test $i -le 0; then
|
||||||
|
echo "$0: failed to acquire lock after $numtries attempts" >&2
|
||||||
|
echo "$0: check lockdir '$lockdir'" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
# Each line is of the form `foo.o: dependent.h',
|
||||||
|
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
|
# `$object: dependent.h' and one to simply `dependent.h:'.
|
||||||
|
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
||||||
|
# Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
# correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
|
||||||
|
| sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
hp2)
|
||||||
|
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
||||||
|
# compilers, which have integrated preprocessors. The correct option
|
||||||
|
# to use with these is +Maked; it writes dependencies to a file named
|
||||||
|
# 'foo.d', which lands next to the object file, wherever that
|
||||||
|
# happens to be.
|
||||||
|
# Much of this is similar to the tru64 case; see comments there.
|
||||||
|
set_dir_from "$object"
|
||||||
|
set_base_from "$object"
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
tmpdepfile1=$dir$base.d
|
||||||
|
tmpdepfile2=$dir.libs/$base.d
|
||||||
|
"$@" -Wc,+Maked
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.d
|
||||||
|
tmpdepfile2=$dir$base.d
|
||||||
|
"$@" +Maked
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
|
||||||
|
# Add 'dependent.h:' lines.
|
||||||
|
sed -ne '2,${
|
||||||
|
s/^ *//
|
||||||
|
s/ \\*$//
|
||||||
|
s/$/:/
|
||||||
|
p
|
||||||
|
}' "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
make_dummy_depfile
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile" "$tmpdepfile2"
|
||||||
|
;;
|
||||||
|
|
||||||
|
tru64)
|
||||||
|
# The Tru64 compiler uses -MD to generate dependencies as a side
|
||||||
|
# effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
|
||||||
|
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
||||||
|
# dependencies in 'foo.d' instead, so we check for that too.
|
||||||
|
# Subdirectories are respected.
|
||||||
|
set_dir_from "$object"
|
||||||
|
set_base_from "$object"
|
||||||
|
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
# Libtool generates 2 separate objects for the 2 libraries. These
|
||||||
|
# two compilations output dependencies in $dir.libs/$base.o.d and
|
||||||
|
# in $dir$base.o.d. We have to check for both files, because
|
||||||
|
# one of the two compilations can be disabled. We should prefer
|
||||||
|
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
||||||
|
# automatically cleaned when .libs/ is deleted, while ignoring
|
||||||
|
# the former would cause a distcleancheck panic.
|
||||||
|
tmpdepfile1=$dir$base.o.d # libtool 1.5
|
||||||
|
tmpdepfile2=$dir.libs/$base.o.d # Likewise.
|
||||||
|
tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||||
|
"$@" -Wc,-MD
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.d
|
||||||
|
tmpdepfile2=$dir$base.d
|
||||||
|
tmpdepfile3=$dir$base.d
|
||||||
|
"$@" -MD
|
||||||
|
fi
|
||||||
|
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
# Same post-processing that is required for AIX mode.
|
||||||
|
aix_post_process_depfile
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvc7)
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
showIncludes=-Wc,-showIncludes
|
||||||
|
else
|
||||||
|
showIncludes=-showIncludes
|
||||||
|
fi
|
||||||
|
"$@" $showIncludes > "$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
grep -v '^Note: including file: ' "$tmpdepfile"
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
# The first sed program below extracts the file names and escapes
|
||||||
|
# backslashes for cygpath. The second sed program outputs the file
|
||||||
|
# name when reading, but also accumulates all include files in the
|
||||||
|
# hold buffer in order to output them again at the end. This only
|
||||||
|
# works with sed implementations that can handle large buffers.
|
||||||
|
sed < "$tmpdepfile" -n '
|
||||||
|
/^Note: including file: *\(.*\)/ {
|
||||||
|
s//\1/
|
||||||
|
s/\\/\\\\/g
|
||||||
|
p
|
||||||
|
}' | $cygpath_u | sort -u | sed -n '
|
||||||
|
s/ /\\ /g
|
||||||
|
s/\(.*\)/'"$tab"'\1 \\/p
|
||||||
|
s/.\(.*\) \\/\1:/
|
||||||
|
H
|
||||||
|
$ {
|
||||||
|
s/.*/'"$tab"'/
|
||||||
|
G
|
||||||
|
p
|
||||||
|
}' >> "$depfile"
|
||||||
|
echo >> "$depfile" # make sure the fragment doesn't end with a backslash
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvc7msys)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
#nosideeffect)
|
||||||
|
# This comment above is used by automake to tell side-effect
|
||||||
|
# dependency tracking mechanisms from slower ones.
|
||||||
|
|
||||||
|
dashmstdout)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout, regardless of -o.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove '-o $object'.
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
test -z "$dashmflag" && dashmflag=-M
|
||||||
|
# Require at least two characters before searching for ':'
|
||||||
|
# in the target name. This is to cope with DOS-style filenames:
|
||||||
|
# a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
|
||||||
|
"$@" $dashmflag |
|
||||||
|
sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
cat < "$tmpdepfile" > "$depfile"
|
||||||
|
# Some versions of the HPUX 10.20 sed can't process this sed invocation
|
||||||
|
# correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||||
|
| sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
dashXmstdout)
|
||||||
|
# This case only exists to satisfy depend.m4. It is never actually
|
||||||
|
# run, as this mode is specially recognized in the preamble.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
makedepend)
|
||||||
|
"$@" || exit $?
|
||||||
|
# Remove any Libtool call
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
# X makedepend
|
||||||
|
shift
|
||||||
|
cleared=no eat=no
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $cleared in
|
||||||
|
no)
|
||||||
|
set ""; shift
|
||||||
|
cleared=yes ;;
|
||||||
|
esac
|
||||||
|
if test $eat = yes; then
|
||||||
|
eat=no
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
case "$arg" in
|
||||||
|
-D*|-I*)
|
||||||
|
set fnord "$@" "$arg"; shift ;;
|
||||||
|
# Strip any option that makedepend may not understand. Remove
|
||||||
|
# the object too, otherwise makedepend will parse it as a source file.
|
||||||
|
-arch)
|
||||||
|
eat=yes ;;
|
||||||
|
-*|$object)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"; shift ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
||||||
|
touch "$tmpdepfile"
|
||||||
|
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
||||||
|
rm -f "$depfile"
|
||||||
|
# makedepend may prepend the VPATH from the source file name to the object.
|
||||||
|
# No need to regex-escape $object, excess matching of '.' is harmless.
|
||||||
|
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
|
||||||
|
# Some versions of the HPUX 10.20 sed can't process the last invocation
|
||||||
|
# correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed '1,2d' "$tmpdepfile" \
|
||||||
|
| tr ' ' "$nl" \
|
||||||
|
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||||
|
| sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
||||||
|
;;
|
||||||
|
|
||||||
|
cpp)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove '-o $object'.
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
"$@" -E \
|
||||||
|
| sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||||
|
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||||
|
| sed '$ s: \\$::' > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
cat < "$tmpdepfile" >> "$depfile"
|
||||||
|
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvisualcpp)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case "$arg" in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
||||||
|
set fnord "$@"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
"$@" -E 2>/dev/null |
|
||||||
|
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
|
||||||
|
echo "$tab" >> "$depfile"
|
||||||
|
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvcmsys)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
none)
|
||||||
|
exec "$@"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Unknown depmode $depmode" 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
79
djpeg.1
@@ -1,4 +1,4 @@
|
|||||||
.TH DJPEG 1 "18 February 2016"
|
.TH DJPEG 1 "26 July 2015"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
djpeg \- decompress a JPEG file to an image file
|
djpeg \- decompress a JPEG file to an image file
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -55,19 +55,23 @@ default options are chosen for highest quality output.) Currently, this is
|
|||||||
equivalent to \fB\-dct fast \-nosmooth \-onepass \-dither ordered\fR.
|
equivalent to \fB\-dct fast \-nosmooth \-onepass \-dither ordered\fR.
|
||||||
.TP
|
.TP
|
||||||
.B \-grayscale
|
.B \-grayscale
|
||||||
Force grayscale output even if JPEG file is color. Useful for viewing on
|
Force grayscale output even if JPEG file is color.
|
||||||
monochrome displays; also,
|
Useful for viewing on monochrome displays; also,
|
||||||
.B djpeg
|
.B djpeg
|
||||||
runs noticeably faster in this mode.
|
runs noticeably faster in this mode.
|
||||||
.TP
|
.TP
|
||||||
.B \-rgb
|
.B \-rgb
|
||||||
Force RGB output even if JPEG file is grayscale.
|
Force RGB output even if JPEG file is grayscale.
|
||||||
|
This is provided to support applications that don't
|
||||||
|
want to cope with grayscale as a separate case.
|
||||||
.TP
|
.TP
|
||||||
.BI \-scale " M/N"
|
.BI \-scale " M/N"
|
||||||
Scale the output image by a factor M/N. Currently the scale factor must be
|
Scale the output image by a factor M/N. Currently supported scale factors are
|
||||||
M/8, where M is an integer between 1 and 16 inclusive, or any reduced fraction
|
M/N with all M from 1 to 16, where N is the source DCT size, which is 8 for
|
||||||
thereof (such as 1/2, 3/4, etc.) Scaling is handy if the image is larger than
|
baseline JPEG. If the /N part is omitted, then M specifies the DCT scaled
|
||||||
your screen; also,
|
size to be applied on the given input. For baseline JPEG this is equivalent
|
||||||
|
to M/8 scaling, since the source DCT size for baseline JPEG is 8.
|
||||||
|
Scaling is handy if the image is larger than your screen; also,
|
||||||
.B djpeg
|
.B djpeg
|
||||||
runs much faster when scaling down the output.
|
runs much faster when scaling down the output.
|
||||||
.TP
|
.TP
|
||||||
@@ -118,28 +122,14 @@ Use integer DCT method (default).
|
|||||||
.TP
|
.TP
|
||||||
.B \-dct fast
|
.B \-dct fast
|
||||||
Use fast integer DCT (less accurate).
|
Use fast integer DCT (less accurate).
|
||||||
In libjpeg-turbo, the fast method is generally about 5-15% faster than the int
|
|
||||||
method when using the x86/x86-64 SIMD extensions (results may vary with other
|
|
||||||
SIMD implementations, or when using libjpeg-turbo without SIMD extensions.) If
|
|
||||||
the JPEG image was compressed using a quality level of 85 or below, then there
|
|
||||||
should be little or no perceptible difference between the two algorithms. When
|
|
||||||
decompressing images that were compressed using quality levels above 85,
|
|
||||||
however, the difference between the fast and int methods becomes more
|
|
||||||
pronounced. With images compressed using quality=97, for instance, the fast
|
|
||||||
method incurs generally about a 4-6 dB loss (in PSNR) relative to the int
|
|
||||||
method, but this can be larger for some images. If you can avoid it, do not
|
|
||||||
use the fast method when decompressing images that were compressed using
|
|
||||||
quality levels above 97. The algorithm often degenerates for such images and
|
|
||||||
can actually produce a more lossy output image than if the JPEG image had been
|
|
||||||
compressed using lower quality levels.
|
|
||||||
.TP
|
.TP
|
||||||
.B \-dct float
|
.B \-dct float
|
||||||
Use floating-point DCT method.
|
Use floating-point DCT method.
|
||||||
The float method is mainly a legacy feature. It does not produce significantly
|
The float method is very slightly more accurate than the int method, but is
|
||||||
more accurate results than the int method, and it is much slower. The float
|
much slower unless your machine has very fast floating-point hardware. Also
|
||||||
method may also give different results on different machines due to varying
|
note that results of the floating-point method may vary slightly across
|
||||||
roundoff behavior, whereas the integer methods should give the same results on
|
machines, while the integer methods should give the same results everywhere.
|
||||||
all machines.
|
The fast integer method is much less accurate than the other two.
|
||||||
.TP
|
.TP
|
||||||
.B \-dither fs
|
.B \-dither fs
|
||||||
Use Floyd-Steinberg dithering in color quantization.
|
Use Floyd-Steinberg dithering in color quantization.
|
||||||
@@ -168,7 +158,7 @@ and
|
|||||||
.BR \-onepass .
|
.BR \-onepass .
|
||||||
.TP
|
.TP
|
||||||
.B \-nosmooth
|
.B \-nosmooth
|
||||||
Use a faster, lower-quality upsampling routine.
|
Don't use high-quality upsampling.
|
||||||
.TP
|
.TP
|
||||||
.B \-onepass
|
.B \-onepass
|
||||||
Use one-pass instead of two-pass color quantization. The one-pass method is
|
Use one-pass instead of two-pass color quantization. The one-pass method is
|
||||||
@@ -190,22 +180,6 @@ selects 4000000 bytes. If more space is needed, temporary files will be used.
|
|||||||
.BI \-outfile " name"
|
.BI \-outfile " name"
|
||||||
Send output image to the named file, not to standard output.
|
Send output image to the named file, not to standard output.
|
||||||
.TP
|
.TP
|
||||||
.BI \-memsrc
|
|
||||||
Load input file into memory before decompressing. This feature was implemented
|
|
||||||
mainly as a way of testing the in-memory source manager (jpeg_mem_src().)
|
|
||||||
.TP
|
|
||||||
.BI \-skip " Y0,Y1"
|
|
||||||
Decompress all rows of the JPEG image except those between Y0 and Y1
|
|
||||||
(inclusive.) Note that if decompression scaling is being used, then Y0 and Y1
|
|
||||||
are relative to the scaled image dimensions.
|
|
||||||
.TP
|
|
||||||
.BI \-crop " WxH+X+Y"
|
|
||||||
Decompress only a rectangular subregion of the image, starting at point X,Y
|
|
||||||
with width W and height H. If necessary, X will be shifted left to the nearest
|
|
||||||
iMCU boundary, and the width will be increased accordingly. Note that if
|
|
||||||
decompression scaling is being used, then X, Y, W, and H are relative to the
|
|
||||||
scaled image dimensions.
|
|
||||||
.TP
|
|
||||||
.B \-verbose
|
.B \-verbose
|
||||||
Enable debug printout. More
|
Enable debug printout. More
|
||||||
.BR \-v 's
|
.BR \-v 's
|
||||||
@@ -214,9 +188,6 @@ give more output. Also, version information is printed at startup.
|
|||||||
.B \-debug
|
.B \-debug
|
||||||
Same as
|
Same as
|
||||||
.BR \-verbose .
|
.BR \-verbose .
|
||||||
.TP
|
|
||||||
.B \-version
|
|
||||||
Print version information and exit.
|
|
||||||
.SH EXAMPLES
|
.SH EXAMPLES
|
||||||
.LP
|
.LP
|
||||||
This example decompresses the JPEG file foo.jpg, quantizes it to
|
This example decompresses the JPEG file foo.jpg, quantizes it to
|
||||||
@@ -279,14 +250,8 @@ Wallace, Gregory K. "The JPEG Still Picture Compression Standard",
|
|||||||
Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44.
|
Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44.
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
Independent JPEG Group
|
Independent JPEG Group
|
||||||
.PP
|
.SH BUGS
|
||||||
This file was modified by The libjpeg-turbo Project to include only information
|
To avoid the Unisys LZW patent (now expired),
|
||||||
relevant to libjpeg-turbo, to wordsmith certain sections, and to describe
|
.B djpeg
|
||||||
features not present in libjpeg.
|
produces uncompressed GIF files. These are larger than they should be, but
|
||||||
.SH ISSUES
|
are readable by standard GIF decoders.
|
||||||
Support for compressed GIF output files was removed in djpeg v6b due to
|
|
||||||
concerns over the Unisys LZW patent. Although this patent expired in 2006,
|
|
||||||
djpeg still lacks compressed GIF support, for these historical reasons.
|
|
||||||
(Conversion of JPEG files to GIF is usually a bad idea anyway, since GIF is a
|
|
||||||
256-color format.) The uncompressed GIF files that djpeg generates are larger
|
|
||||||
than they should be, but they are readable by standard GIF decoders.
|
|
||||||
|
|||||||
399
djpeg.c
@@ -1,22 +1,18 @@
|
|||||||
/*
|
/*
|
||||||
* djpeg.c
|
* djpeg.c
|
||||||
*
|
*
|
||||||
* This file was part of the Independent JPEG Group's software:
|
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2013 by Guido Vollbeding.
|
* Modified 2009-2015 by Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* Copyright (C) 2010-2011, 2013-2016, D. R. Commander.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
* Copyright (C) 2015, Google, Inc.
|
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
|
||||||
* file.
|
|
||||||
*
|
*
|
||||||
* This file contains a command-line user interface for the JPEG decompressor.
|
* This file contains a command-line user interface for the JPEG decompressor.
|
||||||
* It should work on any system with Unix- or MS-DOS-style command lines.
|
* It should work on any system with Unix- or MS-DOS-style command lines.
|
||||||
*
|
*
|
||||||
* Two different command line styles are permitted, depending on the
|
* Two different command line styles are permitted, depending on the
|
||||||
* compile-time switch TWO_FILE_COMMANDLINE:
|
* compile-time switch TWO_FILE_COMMANDLINE:
|
||||||
* djpeg [options] inputfile outputfile
|
* djpeg [options] inputfile outputfile
|
||||||
* djpeg [options] [inputfile]
|
* djpeg [options] [inputfile]
|
||||||
* In the second style, output is always to standard output, which you'd
|
* In the second style, output is always to standard output, which you'd
|
||||||
* normally redirect to a file or pipe to some other program. Input is
|
* normally redirect to a file or pipe to some other program. Input is
|
||||||
* either from a named file or from standard input (typically redirected).
|
* either from a named file or from standard input (typically redirected).
|
||||||
@@ -24,31 +20,29 @@
|
|||||||
* don't support pipes. Also, you MUST use the first style if your system
|
* don't support pipes. Also, you MUST use the first style if your system
|
||||||
* doesn't do binary I/O to stdin/stdout.
|
* doesn't do binary I/O to stdin/stdout.
|
||||||
* To simplify script writing, the "-outfile" switch is provided. The syntax
|
* To simplify script writing, the "-outfile" switch is provided. The syntax
|
||||||
* djpeg [options] -outfile outputfile inputfile
|
* djpeg [options] -outfile outputfile inputfile
|
||||||
* works regardless of which command line style is used.
|
* works regardless of which command line style is used.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
|
#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
|
||||||
#include "jversion.h" /* for version message */
|
#include "jversion.h" /* for version message */
|
||||||
#include "jconfigint.h"
|
|
||||||
#include "wrppm.h"
|
|
||||||
|
|
||||||
#include <ctype.h> /* to declare isprint() */
|
#include <ctype.h> /* to declare isprint() */
|
||||||
|
|
||||||
#ifdef USE_CCOMMAND /* command-line reader for Macintosh */
|
#ifdef USE_CCOMMAND /* command-line reader for Macintosh */
|
||||||
#ifdef __MWERKS__
|
#ifdef __MWERKS__
|
||||||
#include <SIOUX.h> /* Metrowerks needs this */
|
#include <SIOUX.h> /* Metrowerks needs this */
|
||||||
#include <console.h> /* ... and this */
|
#include <console.h> /* ... and this */
|
||||||
#endif
|
#endif
|
||||||
#ifdef THINK_C
|
#ifdef THINK_C
|
||||||
#include <console.h> /* Think declares it here */
|
#include <console.h> /* Think declares it here */
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Create the add-on message string table. */
|
/* Create the add-on message string table. */
|
||||||
|
|
||||||
#define JMESSAGE(code,string) string ,
|
#define JMESSAGE(code,string) string ,
|
||||||
|
|
||||||
static const char * const cdjpeg_message_table[] = {
|
static const char * const cdjpeg_message_table[] = {
|
||||||
#include "cderror.h"
|
#include "cderror.h"
|
||||||
@@ -64,17 +58,17 @@ static const char * const cdjpeg_message_table[] = {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FMT_BMP, /* BMP format (Windows flavor) */
|
FMT_BMP, /* BMP format (Windows flavor) */
|
||||||
FMT_GIF, /* GIF format */
|
FMT_GIF, /* GIF format */
|
||||||
FMT_OS2, /* BMP format (OS/2 flavor) */
|
FMT_OS2, /* BMP format (OS/2 flavor) */
|
||||||
FMT_PPM, /* PPM/PGM (PBMPLUS formats) */
|
FMT_PPM, /* PPM/PGM (PBMPLUS formats) */
|
||||||
FMT_RLE, /* RLE format */
|
FMT_RLE, /* RLE format */
|
||||||
FMT_TARGA, /* Targa format */
|
FMT_TARGA, /* Targa format */
|
||||||
FMT_TIFF /* TIFF format */
|
FMT_TIFF /* TIFF format */
|
||||||
} IMAGE_FORMATS;
|
} IMAGE_FORMATS;
|
||||||
|
|
||||||
#ifndef DEFAULT_FMT /* so can override from CFLAGS in Makefile */
|
#ifndef DEFAULT_FMT /* so can override from CFLAGS in Makefile */
|
||||||
#define DEFAULT_FMT FMT_PPM
|
#define DEFAULT_FMT FMT_PPM
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static IMAGE_FORMATS requested_fmt;
|
static IMAGE_FORMATS requested_fmt;
|
||||||
@@ -89,13 +83,8 @@ static IMAGE_FORMATS requested_fmt;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
static const char *progname; /* program name for error messages */
|
static const char * progname; /* program name for error messages */
|
||||||
static char *outfilename; /* for -outfile switch */
|
static char * outfilename; /* for -outfile switch */
|
||||||
boolean memsrc; /* for -memsrc switch */
|
|
||||||
boolean skip, crop;
|
|
||||||
JDIMENSION skip_start, skip_end;
|
|
||||||
JDIMENSION crop_x, crop_y, crop_width, crop_height;
|
|
||||||
#define INPUT_BUF_SIZE 4096
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
LOCAL(void)
|
||||||
@@ -114,46 +103,45 @@ usage (void)
|
|||||||
fprintf(stderr, " -fast Fast, low-quality processing\n");
|
fprintf(stderr, " -fast Fast, low-quality processing\n");
|
||||||
fprintf(stderr, " -grayscale Force grayscale output\n");
|
fprintf(stderr, " -grayscale Force grayscale output\n");
|
||||||
fprintf(stderr, " -rgb Force RGB output\n");
|
fprintf(stderr, " -rgb Force RGB output\n");
|
||||||
fprintf(stderr, " -rgb565 Force RGB565 output\n");
|
|
||||||
#ifdef IDCT_SCALING_SUPPORTED
|
#ifdef IDCT_SCALING_SUPPORTED
|
||||||
fprintf(stderr, " -scale M/N Scale output image by fraction M/N, eg, 1/8\n");
|
fprintf(stderr, " -scale M/N Scale output image by fraction M/N, eg, 1/8\n");
|
||||||
#endif
|
#endif
|
||||||
#ifdef BMP_SUPPORTED
|
#ifdef BMP_SUPPORTED
|
||||||
fprintf(stderr, " -bmp Select BMP output format (Windows style)%s\n",
|
fprintf(stderr, " -bmp Select BMP output format (Windows style)%s\n",
|
||||||
(DEFAULT_FMT == FMT_BMP ? " (default)" : ""));
|
(DEFAULT_FMT == FMT_BMP ? " (default)" : ""));
|
||||||
#endif
|
#endif
|
||||||
#ifdef GIF_SUPPORTED
|
#ifdef GIF_SUPPORTED
|
||||||
fprintf(stderr, " -gif Select GIF output format%s\n",
|
fprintf(stderr, " -gif Select GIF output format%s\n",
|
||||||
(DEFAULT_FMT == FMT_GIF ? " (default)" : ""));
|
(DEFAULT_FMT == FMT_GIF ? " (default)" : ""));
|
||||||
#endif
|
#endif
|
||||||
#ifdef BMP_SUPPORTED
|
#ifdef BMP_SUPPORTED
|
||||||
fprintf(stderr, " -os2 Select BMP output format (OS/2 style)%s\n",
|
fprintf(stderr, " -os2 Select BMP output format (OS/2 style)%s\n",
|
||||||
(DEFAULT_FMT == FMT_OS2 ? " (default)" : ""));
|
(DEFAULT_FMT == FMT_OS2 ? " (default)" : ""));
|
||||||
#endif
|
#endif
|
||||||
#ifdef PPM_SUPPORTED
|
#ifdef PPM_SUPPORTED
|
||||||
fprintf(stderr, " -pnm Select PBMPLUS (PPM/PGM) output format%s\n",
|
fprintf(stderr, " -pnm Select PBMPLUS (PPM/PGM) output format%s\n",
|
||||||
(DEFAULT_FMT == FMT_PPM ? " (default)" : ""));
|
(DEFAULT_FMT == FMT_PPM ? " (default)" : ""));
|
||||||
#endif
|
#endif
|
||||||
#ifdef RLE_SUPPORTED
|
#ifdef RLE_SUPPORTED
|
||||||
fprintf(stderr, " -rle Select Utah RLE output format%s\n",
|
fprintf(stderr, " -rle Select Utah RLE output format%s\n",
|
||||||
(DEFAULT_FMT == FMT_RLE ? " (default)" : ""));
|
(DEFAULT_FMT == FMT_RLE ? " (default)" : ""));
|
||||||
#endif
|
#endif
|
||||||
#ifdef TARGA_SUPPORTED
|
#ifdef TARGA_SUPPORTED
|
||||||
fprintf(stderr, " -targa Select Targa output format%s\n",
|
fprintf(stderr, " -targa Select Targa output format%s\n",
|
||||||
(DEFAULT_FMT == FMT_TARGA ? " (default)" : ""));
|
(DEFAULT_FMT == FMT_TARGA ? " (default)" : ""));
|
||||||
#endif
|
#endif
|
||||||
fprintf(stderr, "Switches for advanced users:\n");
|
fprintf(stderr, "Switches for advanced users:\n");
|
||||||
#ifdef DCT_ISLOW_SUPPORTED
|
#ifdef DCT_ISLOW_SUPPORTED
|
||||||
fprintf(stderr, " -dct int Use integer DCT method%s\n",
|
fprintf(stderr, " -dct int Use integer DCT method%s\n",
|
||||||
(JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : ""));
|
(JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : ""));
|
||||||
#endif
|
#endif
|
||||||
#ifdef DCT_IFAST_SUPPORTED
|
#ifdef DCT_IFAST_SUPPORTED
|
||||||
fprintf(stderr, " -dct fast Use fast integer DCT (less accurate)%s\n",
|
fprintf(stderr, " -dct fast Use fast integer DCT (less accurate)%s\n",
|
||||||
(JDCT_DEFAULT == JDCT_IFAST ? " (default)" : ""));
|
(JDCT_DEFAULT == JDCT_IFAST ? " (default)" : ""));
|
||||||
#endif
|
#endif
|
||||||
#ifdef DCT_FLOAT_SUPPORTED
|
#ifdef DCT_FLOAT_SUPPORTED
|
||||||
fprintf(stderr, " -dct float Use floating-point DCT method%s\n",
|
fprintf(stderr, " -dct float Use floating-point DCT method%s\n",
|
||||||
(JDCT_DEFAULT == JDCT_FLOAT ? " (default)" : ""));
|
(JDCT_DEFAULT == JDCT_FLOAT ? " (default)" : ""));
|
||||||
#endif
|
#endif
|
||||||
fprintf(stderr, " -dither fs Use F-S dithering (default)\n");
|
fprintf(stderr, " -dither fs Use F-S dithering (default)\n");
|
||||||
fprintf(stderr, " -dither none Don't use dithering in quantization\n");
|
fprintf(stderr, " -dither none Don't use dithering in quantization\n");
|
||||||
@@ -167,21 +155,14 @@ usage (void)
|
|||||||
#endif
|
#endif
|
||||||
fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n");
|
fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n");
|
||||||
fprintf(stderr, " -outfile name Specify name for output file\n");
|
fprintf(stderr, " -outfile name Specify name for output file\n");
|
||||||
#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED)
|
|
||||||
fprintf(stderr, " -memsrc Load input file into memory before decompressing\n");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fprintf(stderr, " -skip Y0,Y1 Decompress all rows except those between Y0 and Y1 (inclusive)\n");
|
|
||||||
fprintf(stderr, " -crop WxH+X+Y Decompress only a rectangular subregion of the image\n");
|
|
||||||
fprintf(stderr, " -verbose or -debug Emit debug output\n");
|
fprintf(stderr, " -verbose or -debug Emit debug output\n");
|
||||||
fprintf(stderr, " -version Print version information and exit\n");
|
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LOCAL(int)
|
LOCAL(int)
|
||||||
parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
|
parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
|
||||||
int last_file_arg_seen, boolean for_real)
|
int last_file_arg_seen, boolean for_real)
|
||||||
/* Parse optional switches.
|
/* Parse optional switches.
|
||||||
* Returns argv[] index of first file-name argument (== argc if none).
|
* Returns argv[] index of first file-name argument (== argc if none).
|
||||||
* Any file names with indexes <= last_file_arg_seen are ignored;
|
* Any file names with indexes <= last_file_arg_seen are ignored;
|
||||||
@@ -192,14 +173,11 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
|
|||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
int argn;
|
int argn;
|
||||||
char *arg;
|
char * arg;
|
||||||
|
|
||||||
/* Set up default JPEG parameters. */
|
/* Set up default JPEG parameters. */
|
||||||
requested_fmt = DEFAULT_FMT; /* set default output file format */
|
requested_fmt = DEFAULT_FMT; /* set default output file format */
|
||||||
outfilename = NULL;
|
outfilename = NULL;
|
||||||
memsrc = FALSE;
|
|
||||||
skip = FALSE;
|
|
||||||
crop = FALSE;
|
|
||||||
cinfo->err->trace_level = 0;
|
cinfo->err->trace_level = 0;
|
||||||
|
|
||||||
/* Scan command line options, adjust parameters */
|
/* Scan command line options, adjust parameters */
|
||||||
@@ -209,54 +187,54 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
|
|||||||
if (*arg != '-') {
|
if (*arg != '-') {
|
||||||
/* Not a switch, must be a file name argument */
|
/* Not a switch, must be a file name argument */
|
||||||
if (argn <= last_file_arg_seen) {
|
if (argn <= last_file_arg_seen) {
|
||||||
outfilename = NULL; /* -outfile applies to just one input file */
|
outfilename = NULL; /* -outfile applies to just one input file */
|
||||||
continue; /* ignore this name if previously processed */
|
continue; /* ignore this name if previously processed */
|
||||||
}
|
}
|
||||||
break; /* else done parsing switches */
|
break; /* else done parsing switches */
|
||||||
}
|
}
|
||||||
arg++; /* advance past switch marker character */
|
arg++; /* advance past switch marker character */
|
||||||
|
|
||||||
if (keymatch(arg, "bmp", 1)) {
|
if (keymatch(arg, "bmp", 1)) {
|
||||||
/* BMP output format. */
|
/* BMP output format. */
|
||||||
requested_fmt = FMT_BMP;
|
requested_fmt = FMT_BMP;
|
||||||
|
|
||||||
} else if (keymatch(arg, "colors", 1) || keymatch(arg, "colours", 1) ||
|
} else if (keymatch(arg, "colors", 1) || keymatch(arg, "colours", 1) ||
|
||||||
keymatch(arg, "quantize", 1) || keymatch(arg, "quantise", 1)) {
|
keymatch(arg, "quantize", 1) || keymatch(arg, "quantise", 1)) {
|
||||||
/* Do color quantization. */
|
/* Do color quantization. */
|
||||||
int val;
|
int val;
|
||||||
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
if (sscanf(argv[argn], "%d", &val) != 1)
|
if (sscanf(argv[argn], "%d", &val) != 1)
|
||||||
usage();
|
usage();
|
||||||
cinfo->desired_number_of_colors = val;
|
cinfo->desired_number_of_colors = val;
|
||||||
cinfo->quantize_colors = TRUE;
|
cinfo->quantize_colors = TRUE;
|
||||||
|
|
||||||
} else if (keymatch(arg, "dct", 2)) {
|
} else if (keymatch(arg, "dct", 2)) {
|
||||||
/* Select IDCT algorithm. */
|
/* Select IDCT algorithm. */
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
if (keymatch(argv[argn], "int", 1)) {
|
if (keymatch(argv[argn], "int", 1)) {
|
||||||
cinfo->dct_method = JDCT_ISLOW;
|
cinfo->dct_method = JDCT_ISLOW;
|
||||||
} else if (keymatch(argv[argn], "fast", 2)) {
|
} else if (keymatch(argv[argn], "fast", 2)) {
|
||||||
cinfo->dct_method = JDCT_IFAST;
|
cinfo->dct_method = JDCT_IFAST;
|
||||||
} else if (keymatch(argv[argn], "float", 2)) {
|
} else if (keymatch(argv[argn], "float", 2)) {
|
||||||
cinfo->dct_method = JDCT_FLOAT;
|
cinfo->dct_method = JDCT_FLOAT;
|
||||||
} else
|
} else
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
} else if (keymatch(arg, "dither", 2)) {
|
} else if (keymatch(arg, "dither", 2)) {
|
||||||
/* Select dithering algorithm. */
|
/* Select dithering algorithm. */
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
if (keymatch(argv[argn], "fs", 2)) {
|
if (keymatch(argv[argn], "fs", 2)) {
|
||||||
cinfo->dither_mode = JDITHER_FS;
|
cinfo->dither_mode = JDITHER_FS;
|
||||||
} else if (keymatch(argv[argn], "none", 2)) {
|
} else if (keymatch(argv[argn], "none", 2)) {
|
||||||
cinfo->dither_mode = JDITHER_NONE;
|
cinfo->dither_mode = JDITHER_NONE;
|
||||||
} else if (keymatch(argv[argn], "ordered", 2)) {
|
} else if (keymatch(argv[argn], "ordered", 2)) {
|
||||||
cinfo->dither_mode = JDITHER_ORDERED;
|
cinfo->dither_mode = JDITHER_ORDERED;
|
||||||
} else
|
} else
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
} else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) {
|
} else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) {
|
||||||
/* Enable debug printouts. */
|
/* Enable debug printouts. */
|
||||||
@@ -264,26 +242,18 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
|
|||||||
static boolean printed_version = FALSE;
|
static boolean printed_version = FALSE;
|
||||||
|
|
||||||
if (! printed_version) {
|
if (! printed_version) {
|
||||||
fprintf(stderr, "%s version %s (build %s)\n",
|
fprintf(stderr, "Independent JPEG Group's DJPEG, version %s\n%s\n",
|
||||||
PACKAGE_NAME, VERSION, BUILD);
|
JVERSION, JCOPYRIGHT);
|
||||||
fprintf(stderr, "%s\n\n", JCOPYRIGHT);
|
printed_version = TRUE;
|
||||||
fprintf(stderr, "Emulating The Independent JPEG Group's software, version %s\n\n",
|
|
||||||
JVERSION);
|
|
||||||
printed_version = TRUE;
|
|
||||||
}
|
}
|
||||||
cinfo->err->trace_level++;
|
cinfo->err->trace_level++;
|
||||||
|
|
||||||
} else if (keymatch(arg, "version", 4)) {
|
|
||||||
fprintf(stderr, "%s version %s (build %s)\n",
|
|
||||||
PACKAGE_NAME, VERSION, BUILD);
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "fast", 1)) {
|
} else if (keymatch(arg, "fast", 1)) {
|
||||||
/* Select recommended processing options for quick-and-dirty output. */
|
/* Select recommended processing options for quick-and-dirty output. */
|
||||||
cinfo->two_pass_quantize = FALSE;
|
cinfo->two_pass_quantize = FALSE;
|
||||||
cinfo->dither_mode = JDITHER_ORDERED;
|
cinfo->dither_mode = JDITHER_ORDERED;
|
||||||
if (! cinfo->quantize_colors) /* don't override an earlier -colors */
|
if (! cinfo->quantize_colors) /* don't override an earlier -colors */
|
||||||
cinfo->desired_number_of_colors = 216;
|
cinfo->desired_number_of_colors = 216;
|
||||||
cinfo->dct_method = JDCT_FASTEST;
|
cinfo->dct_method = JDCT_FASTEST;
|
||||||
cinfo->do_fancy_upsampling = FALSE;
|
cinfo->do_fancy_upsampling = FALSE;
|
||||||
|
|
||||||
@@ -295,31 +265,27 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
|
|||||||
/* Force monochrome output. */
|
/* Force monochrome output. */
|
||||||
cinfo->out_color_space = JCS_GRAYSCALE;
|
cinfo->out_color_space = JCS_GRAYSCALE;
|
||||||
|
|
||||||
} else if (keymatch(arg, "rgb", 2)) {
|
} else if (keymatch(arg, "rgb", 3)) {
|
||||||
/* Force RGB output. */
|
/* Force RGB output. */
|
||||||
cinfo->out_color_space = JCS_RGB;
|
cinfo->out_color_space = JCS_RGB;
|
||||||
|
|
||||||
} else if (keymatch(arg, "rgb565", 2)) {
|
|
||||||
/* Force RGB565 output. */
|
|
||||||
cinfo->out_color_space = JCS_RGB565;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "map", 3)) {
|
} else if (keymatch(arg, "map", 3)) {
|
||||||
/* Quantize to a color map taken from an input file. */
|
/* Quantize to a color map taken from an input file. */
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
if (for_real) { /* too expensive to do twice! */
|
if (for_real) { /* too expensive to do twice! */
|
||||||
#ifdef QUANT_2PASS_SUPPORTED /* otherwise can't quantize to supplied map */
|
#ifdef QUANT_2PASS_SUPPORTED /* otherwise can't quantize to supplied map */
|
||||||
FILE *mapfile;
|
FILE * mapfile;
|
||||||
|
|
||||||
if ((mapfile = fopen(argv[argn], READ_BINARY)) == NULL) {
|
if ((mapfile = fopen(argv[argn], READ_BINARY)) == NULL) {
|
||||||
fprintf(stderr, "%s: can't open %s\n", progname, argv[argn]);
|
fprintf(stderr, "%s: can't open %s\n", progname, argv[argn]);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
read_color_map(cinfo, mapfile);
|
read_color_map(cinfo, mapfile);
|
||||||
fclose(mapfile);
|
fclose(mapfile);
|
||||||
cinfo->quantize_colors = TRUE;
|
cinfo->quantize_colors = TRUE;
|
||||||
#else
|
#else
|
||||||
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -328,16 +294,16 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
|
|||||||
long lval;
|
long lval;
|
||||||
char ch = 'x';
|
char ch = 'x';
|
||||||
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1)
|
if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1)
|
||||||
usage();
|
usage();
|
||||||
if (ch == 'm' || ch == 'M')
|
if (ch == 'm' || ch == 'M')
|
||||||
lval *= 1000L;
|
lval *= 1000L;
|
||||||
cinfo->mem->max_memory_to_use = lval * 1000L;
|
cinfo->mem->max_memory_to_use = lval * 1000L;
|
||||||
|
|
||||||
} else if (keymatch(arg, "nosmooth", 3)) {
|
} else if (keymatch(arg, "nosmooth", 3)) {
|
||||||
/* Suppress fancy upsampling */
|
/* Suppress fancy upsampling. */
|
||||||
cinfo->do_fancy_upsampling = FALSE;
|
cinfo->do_fancy_upsampling = FALSE;
|
||||||
|
|
||||||
} else if (keymatch(arg, "onepass", 3)) {
|
} else if (keymatch(arg, "onepass", 3)) {
|
||||||
@@ -350,19 +316,9 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
|
|||||||
|
|
||||||
} else if (keymatch(arg, "outfile", 4)) {
|
} else if (keymatch(arg, "outfile", 4)) {
|
||||||
/* Set output file name. */
|
/* Set output file name. */
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
outfilename = argv[argn]; /* save it away for later use */
|
outfilename = argv[argn]; /* save it away for later use */
|
||||||
|
|
||||||
} else if (keymatch(arg, "memsrc", 2)) {
|
|
||||||
/* Use in-memory source manager */
|
|
||||||
#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED)
|
|
||||||
memsrc = TRUE;
|
|
||||||
#else
|
|
||||||
fprintf(stderr, "%s: sorry, in-memory source manager was not compiled in\n",
|
|
||||||
progname);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "pnm", 1) || keymatch(arg, "ppm", 1)) {
|
} else if (keymatch(arg, "pnm", 1) || keymatch(arg, "ppm", 1)) {
|
||||||
/* PPM/PGM output format. */
|
/* PPM/PGM output format. */
|
||||||
@@ -372,42 +328,24 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
|
|||||||
/* RLE output format. */
|
/* RLE output format. */
|
||||||
requested_fmt = FMT_RLE;
|
requested_fmt = FMT_RLE;
|
||||||
|
|
||||||
} else if (keymatch(arg, "scale", 2)) {
|
} else if (keymatch(arg, "scale", 1)) {
|
||||||
/* Scale the output image by a fraction M/N. */
|
/* Scale the output image by a fraction M/N. */
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
usage();
|
usage();
|
||||||
if (sscanf(argv[argn], "%u/%u",
|
if (sscanf(argv[argn], "%u/%u",
|
||||||
&cinfo->scale_num, &cinfo->scale_denom) != 2)
|
&cinfo->scale_num, &cinfo->scale_denom) < 1)
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
} else if (keymatch(arg, "skip", 2)) {
|
|
||||||
if (++argn >= argc)
|
|
||||||
usage();
|
|
||||||
if (sscanf(argv[argn], "%u,%u", &skip_start, &skip_end) != 2 ||
|
|
||||||
skip_start > skip_end)
|
|
||||||
usage();
|
|
||||||
skip = TRUE;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "crop", 2)) {
|
|
||||||
char c;
|
|
||||||
if (++argn >= argc)
|
|
||||||
usage();
|
|
||||||
if (sscanf(argv[argn], "%u%c%u+%u+%u", &crop_width, &c, &crop_height,
|
|
||||||
&crop_x, &crop_y) != 5 ||
|
|
||||||
(c != 'X' && c != 'x') || crop_width < 1 || crop_height < 1)
|
|
||||||
usage();
|
|
||||||
crop = TRUE;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "targa", 1)) {
|
} else if (keymatch(arg, "targa", 1)) {
|
||||||
/* Targa output format. */
|
/* Targa output format. */
|
||||||
requested_fmt = FMT_TARGA;
|
requested_fmt = FMT_TARGA;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
usage(); /* bogus switch */
|
usage(); /* bogus switch */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return argn; /* return index of next arg (file name) */
|
return argn; /* return index of next arg (file name) */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -422,7 +360,7 @@ LOCAL(unsigned int)
|
|||||||
jpeg_getc (j_decompress_ptr cinfo)
|
jpeg_getc (j_decompress_ptr cinfo)
|
||||||
/* Read next byte */
|
/* Read next byte */
|
||||||
{
|
{
|
||||||
struct jpeg_source_mgr *datasrc = cinfo->src;
|
struct jpeg_source_mgr * datasrc = cinfo->src;
|
||||||
|
|
||||||
if (datasrc->bytes_in_buffer == 0) {
|
if (datasrc->bytes_in_buffer == 0) {
|
||||||
if (! (*datasrc->fill_input_buffer) (cinfo))
|
if (! (*datasrc->fill_input_buffer) (cinfo))
|
||||||
@@ -437,20 +375,20 @@ METHODDEF(boolean)
|
|||||||
print_text_marker (j_decompress_ptr cinfo)
|
print_text_marker (j_decompress_ptr cinfo)
|
||||||
{
|
{
|
||||||
boolean traceit = (cinfo->err->trace_level >= 1);
|
boolean traceit = (cinfo->err->trace_level >= 1);
|
||||||
long length;
|
INT32 length;
|
||||||
unsigned int ch;
|
unsigned int ch;
|
||||||
unsigned int lastch = 0;
|
unsigned int lastch = 0;
|
||||||
|
|
||||||
length = jpeg_getc(cinfo) << 8;
|
length = jpeg_getc(cinfo) << 8;
|
||||||
length += jpeg_getc(cinfo);
|
length += jpeg_getc(cinfo);
|
||||||
length -= 2; /* discount the length word itself */
|
length -= 2; /* discount the length word itself */
|
||||||
|
|
||||||
if (traceit) {
|
if (traceit) {
|
||||||
if (cinfo->unread_marker == JPEG_COM)
|
if (cinfo->unread_marker == JPEG_COM)
|
||||||
fprintf(stderr, "Comment, length %ld:\n", (long) length);
|
fprintf(stderr, "Comment, length %ld:\n", (long) length);
|
||||||
else /* assume it is an APPn otherwise */
|
else /* assume it is an APPn otherwise */
|
||||||
fprintf(stderr, "APP%d, length %ld:\n",
|
fprintf(stderr, "APP%d, length %ld:\n",
|
||||||
cinfo->unread_marker - JPEG_APP0, (long) length);
|
cinfo->unread_marker - JPEG_APP0, (long) length);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (--length >= 0) {
|
while (--length >= 0) {
|
||||||
@@ -462,16 +400,16 @@ print_text_marker (j_decompress_ptr cinfo)
|
|||||||
* Newlines in CR, CR/LF, or LF form will be printed as one newline.
|
* Newlines in CR, CR/LF, or LF form will be printed as one newline.
|
||||||
*/
|
*/
|
||||||
if (ch == '\r') {
|
if (ch == '\r') {
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
} else if (ch == '\n') {
|
} else if (ch == '\n') {
|
||||||
if (lastch != '\r')
|
if (lastch != '\r')
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
} else if (ch == '\\') {
|
} else if (ch == '\\') {
|
||||||
fprintf(stderr, "\\\\");
|
fprintf(stderr, "\\\\");
|
||||||
} else if (isprint(ch)) {
|
} else if (isprint(ch)) {
|
||||||
putc(ch, stderr);
|
putc(ch, stderr);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "\\%03o", ch);
|
fprintf(stderr, "\\%03o", ch);
|
||||||
}
|
}
|
||||||
lastch = ch;
|
lastch = ch;
|
||||||
}
|
}
|
||||||
@@ -498,10 +436,8 @@ main (int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
int file_index;
|
int file_index;
|
||||||
djpeg_dest_ptr dest_mgr = NULL;
|
djpeg_dest_ptr dest_mgr = NULL;
|
||||||
FILE *input_file;
|
FILE * input_file;
|
||||||
FILE *output_file;
|
FILE * output_file;
|
||||||
unsigned char *inbuffer = NULL;
|
|
||||||
unsigned long insize = 0;
|
|
||||||
JDIMENSION num_scanlines;
|
JDIMENSION num_scanlines;
|
||||||
|
|
||||||
/* On Mac, fetch a command line. */
|
/* On Mac, fetch a command line. */
|
||||||
@@ -511,7 +447,7 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
progname = argv[0];
|
progname = argv[0];
|
||||||
if (progname == NULL || progname[0] == 0)
|
if (progname == NULL || progname[0] == 0)
|
||||||
progname = "djpeg"; /* in case C library doesn't provide it */
|
progname = "djpeg"; /* in case C library doesn't provide it */
|
||||||
|
|
||||||
/* Initialize the JPEG decompression object with default error handling. */
|
/* Initialize the JPEG decompression object with default error handling. */
|
||||||
cinfo.err = jpeg_std_error(&jerr);
|
cinfo.err = jpeg_std_error(&jerr);
|
||||||
@@ -525,11 +461,16 @@ main (int argc, char **argv)
|
|||||||
* APP12 is used by some digital camera makers for textual info,
|
* APP12 is used by some digital camera makers for textual info,
|
||||||
* so we provide the ability to display it as text.
|
* so we provide the ability to display it as text.
|
||||||
* If you like, additional APPn marker types can be selected for display,
|
* If you like, additional APPn marker types can be selected for display,
|
||||||
* but don't try to override APP0 or APP14 this way (see libjpeg.txt).
|
* but don't try to override APP0 or APP14 this way (see libjpeg.doc).
|
||||||
*/
|
*/
|
||||||
jpeg_set_marker_processor(&cinfo, JPEG_COM, print_text_marker);
|
jpeg_set_marker_processor(&cinfo, JPEG_COM, print_text_marker);
|
||||||
jpeg_set_marker_processor(&cinfo, JPEG_APP0+12, print_text_marker);
|
jpeg_set_marker_processor(&cinfo, JPEG_APP0+12, print_text_marker);
|
||||||
|
|
||||||
|
/* Now safe to enable signal catcher. */
|
||||||
|
#ifdef NEED_SIGNAL_CATCHER
|
||||||
|
enable_signal_catcher((j_common_ptr) &cinfo);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Scan command line to find file names. */
|
/* Scan command line to find file names. */
|
||||||
/* It is convenient to use just one switch-parsing routine, but the switch
|
/* It is convenient to use just one switch-parsing routine, but the switch
|
||||||
* values read here are ignored; we will rescan the switches after opening
|
* values read here are ignored; we will rescan the switches after opening
|
||||||
@@ -545,14 +486,14 @@ main (int argc, char **argv)
|
|||||||
if (outfilename == NULL) {
|
if (outfilename == NULL) {
|
||||||
if (file_index != argc-2) {
|
if (file_index != argc-2) {
|
||||||
fprintf(stderr, "%s: must name one input and one output file\n",
|
fprintf(stderr, "%s: must name one input and one output file\n",
|
||||||
progname);
|
progname);
|
||||||
usage();
|
usage();
|
||||||
}
|
}
|
||||||
outfilename = argv[file_index+1];
|
outfilename = argv[file_index+1];
|
||||||
} else {
|
} else {
|
||||||
if (file_index != argc-1) {
|
if (file_index != argc-1) {
|
||||||
fprintf(stderr, "%s: must name one input and one output file\n",
|
fprintf(stderr, "%s: must name one input and one output file\n",
|
||||||
progname);
|
progname);
|
||||||
usage();
|
usage();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -591,30 +532,7 @@ main (int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Specify data source for decompression */
|
/* Specify data source for decompression */
|
||||||
#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED)
|
jpeg_stdio_src(&cinfo, input_file);
|
||||||
if (memsrc) {
|
|
||||||
size_t nbytes;
|
|
||||||
do {
|
|
||||||
inbuffer = (unsigned char *)realloc(inbuffer, insize + INPUT_BUF_SIZE);
|
|
||||||
if (inbuffer == NULL) {
|
|
||||||
fprintf(stderr, "%s: memory allocation failure\n", progname);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
nbytes = JFREAD(input_file, &inbuffer[insize], INPUT_BUF_SIZE);
|
|
||||||
if (nbytes < INPUT_BUF_SIZE && ferror(input_file)) {
|
|
||||||
if (file_index < argc)
|
|
||||||
fprintf(stderr, "%s: can't read from %s\n", progname,
|
|
||||||
argv[file_index]);
|
|
||||||
else
|
|
||||||
fprintf(stderr, "%s: can't read from stdin\n", progname);
|
|
||||||
}
|
|
||||||
insize += (unsigned long)nbytes;
|
|
||||||
} while (nbytes == INPUT_BUF_SIZE);
|
|
||||||
fprintf(stderr, "Compressed size: %lu bytes\n", insize);
|
|
||||||
jpeg_mem_src(&cinfo, inbuffer, insize);
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
jpeg_stdio_src(&cinfo, input_file);
|
|
||||||
|
|
||||||
/* Read file header, set default decompression parameters */
|
/* Read file header, set default decompression parameters */
|
||||||
(void) jpeg_read_header(&cinfo, TRUE);
|
(void) jpeg_read_header(&cinfo, TRUE);
|
||||||
@@ -663,88 +581,14 @@ main (int argc, char **argv)
|
|||||||
/* Start decompressor */
|
/* Start decompressor */
|
||||||
(void) jpeg_start_decompress(&cinfo);
|
(void) jpeg_start_decompress(&cinfo);
|
||||||
|
|
||||||
/* Skip rows */
|
/* Write output file header */
|
||||||
if (skip) {
|
(*dest_mgr->start_output) (&cinfo, dest_mgr);
|
||||||
JDIMENSION tmp;
|
|
||||||
|
|
||||||
/* Check for valid skip_end. We cannot check this value until after
|
/* Process data */
|
||||||
* jpeg_start_decompress() is called. Note that we have already verified
|
while (cinfo.output_scanline < cinfo.output_height) {
|
||||||
* that skip_start <= skip_end.
|
num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer,
|
||||||
*/
|
dest_mgr->buffer_height);
|
||||||
if (skip_end > cinfo.output_height - 1) {
|
(*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines);
|
||||||
fprintf(stderr, "%s: skip region exceeds image height %d\n", progname,
|
|
||||||
cinfo.output_height);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write output file header. This is a hack to ensure that the destination
|
|
||||||
* manager creates an output image of the proper size.
|
|
||||||
*/
|
|
||||||
tmp = cinfo.output_height;
|
|
||||||
cinfo.output_height -= (skip_end - skip_start + 1);
|
|
||||||
(*dest_mgr->start_output) (&cinfo, dest_mgr);
|
|
||||||
cinfo.output_height = tmp;
|
|
||||||
|
|
||||||
/* Process data */
|
|
||||||
while (cinfo.output_scanline < skip_start) {
|
|
||||||
num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer,
|
|
||||||
dest_mgr->buffer_height);
|
|
||||||
(*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines);
|
|
||||||
}
|
|
||||||
jpeg_skip_scanlines(&cinfo, skip_end - skip_start + 1);
|
|
||||||
while (cinfo.output_scanline < cinfo.output_height) {
|
|
||||||
num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer,
|
|
||||||
dest_mgr->buffer_height);
|
|
||||||
(*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Decompress a subregion */
|
|
||||||
} else if (crop) {
|
|
||||||
JDIMENSION tmp;
|
|
||||||
|
|
||||||
/* Check for valid crop dimensions. We cannot check these values until
|
|
||||||
* after jpeg_start_decompress() is called.
|
|
||||||
*/
|
|
||||||
if (crop_x + crop_width > cinfo.output_width ||
|
|
||||||
crop_y + crop_height > cinfo.output_height) {
|
|
||||||
fprintf(stderr, "%s: crop dimensions exceed image dimensions %d x %d\n",
|
|
||||||
progname, cinfo.output_width, cinfo.output_height);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
jpeg_crop_scanline(&cinfo, &crop_x, &crop_width);
|
|
||||||
((ppm_dest_ptr) dest_mgr)->buffer_width = cinfo.output_width *
|
|
||||||
cinfo.out_color_components *
|
|
||||||
sizeof(JSAMPLE);
|
|
||||||
|
|
||||||
/* Write output file header. This is a hack to ensure that the destination
|
|
||||||
* manager creates an output image of the proper size.
|
|
||||||
*/
|
|
||||||
tmp = cinfo.output_height;
|
|
||||||
cinfo.output_height = crop_height;
|
|
||||||
(*dest_mgr->start_output) (&cinfo, dest_mgr);
|
|
||||||
cinfo.output_height = tmp;
|
|
||||||
|
|
||||||
/* Process data */
|
|
||||||
jpeg_skip_scanlines(&cinfo, crop_y);
|
|
||||||
while (cinfo.output_scanline < crop_y + crop_height) {
|
|
||||||
num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer,
|
|
||||||
dest_mgr->buffer_height);
|
|
||||||
(*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines);
|
|
||||||
}
|
|
||||||
jpeg_skip_scanlines(&cinfo, cinfo.output_height - crop_y - crop_height);
|
|
||||||
|
|
||||||
/* Normal full-image decompress */
|
|
||||||
} else {
|
|
||||||
/* Write output file header */
|
|
||||||
(*dest_mgr->start_output) (&cinfo, dest_mgr);
|
|
||||||
|
|
||||||
/* Process data */
|
|
||||||
while (cinfo.output_scanline < cinfo.output_height) {
|
|
||||||
num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer,
|
|
||||||
dest_mgr->buffer_height);
|
|
||||||
(*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PROGRESS_REPORT
|
#ifdef PROGRESS_REPORT
|
||||||
@@ -772,10 +616,7 @@ main (int argc, char **argv)
|
|||||||
end_progress_monitor((j_common_ptr) &cinfo);
|
end_progress_monitor((j_common_ptr) &cinfo);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (memsrc && inbuffer != NULL)
|
|
||||||
free(inbuffer);
|
|
||||||
|
|
||||||
/* All done. */
|
/* All done. */
|
||||||
exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS);
|
exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS);
|
||||||
return 0; /* suppress no-return-value warnings */
|
return 0; /* suppress no-return-value warnings */
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,104 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1"/>
|
|
||||||
<title>TurboJPEG: Data Structures</title>
|
|
||||||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
|
||||||
<script type="text/javascript" src="jquery.js"></script>
|
|
||||||
<script type="text/javascript" src="dynsections.js"></script>
|
|
||||||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
|
||||||
<script type="text/javascript" src="search/search.js"></script>
|
|
||||||
<script type="text/javascript">
|
|
||||||
$(document).ready(function() { searchBox.OnSelectItem(0); });
|
|
||||||
</script>
|
|
||||||
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
|
||||||
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
||||||
<div id="titlearea">
|
|
||||||
<table cellspacing="0" cellpadding="0">
|
|
||||||
<tbody>
|
|
||||||
<tr style="height: 56px;">
|
|
||||||
<td style="padding-left: 0.5em;">
|
|
||||||
<div id="projectname">TurboJPEG
|
|
||||||
 <span id="projectnumber">1.5</span>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<!-- end header part -->
|
|
||||||
<!-- Generated by Doxygen 1.8.3.1 -->
|
|
||||||
<script type="text/javascript">
|
|
||||||
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|
||||||
</script>
|
|
||||||
<div id="navrow1" class="tabs">
|
|
||||||
<ul class="tablist">
|
|
||||||
<li><a href="index.html"><span>Main Page</span></a></li>
|
|
||||||
<li><a href="modules.html"><span>Modules</span></a></li>
|
|
||||||
<li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
|
|
||||||
<li>
|
|
||||||
<div id="MSearchBox" class="MSearchBoxInactive">
|
|
||||||
<span class="left">
|
|
||||||
<img id="MSearchSelect" src="search/mag_sel.png"
|
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
||||||
alt=""/>
|
|
||||||
<input type="text" id="MSearchField" value="Search" accesskey="S"
|
|
||||||
onfocus="searchBox.OnSearchFieldFocus(true)"
|
|
||||||
onblur="searchBox.OnSearchFieldFocus(false)"
|
|
||||||
onkeyup="searchBox.OnSearchFieldChange(event)"/>
|
|
||||||
</span><span class="right">
|
|
||||||
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div id="navrow2" class="tabs2">
|
|
||||||
<ul class="tablist">
|
|
||||||
<li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
|
|
||||||
<li><a href="classes.html"><span>Data Structure Index</span></a></li>
|
|
||||||
<li><a href="functions.html"><span>Data Fields</span></a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div><!-- top -->
|
|
||||||
<!-- window showing the filter options -->
|
|
||||||
<div id="MSearchSelectWindow"
|
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
||||||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
||||||
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Groups</a></div>
|
|
||||||
|
|
||||||
<!-- iframe showing the search results (closed by default) -->
|
|
||||||
<div id="MSearchResultsWindow">
|
|
||||||
<iframe src="javascript:void(0)" frameborder="0"
|
|
||||||
name="MSearchResults" id="MSearchResults">
|
|
||||||
</iframe>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="header">
|
|
||||||
<div class="headertitle">
|
|
||||||
<div class="title">Data Structures</div> </div>
|
|
||||||
</div><!--header-->
|
|
||||||
<div class="contents">
|
|
||||||
<div class="textblock">Here are the data structures with brief descriptions:</div><div class="directory">
|
|
||||||
<table class="directory">
|
|
||||||
<tr id="row_0_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtjregion.html" target="_self">tjregion</a></td><td class="desc">Cropping region</td></tr>
|
|
||||||
<tr id="row_1_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtjscalingfactor.html" target="_self">tjscalingfactor</a></td><td class="desc">Scaling factor</td></tr>
|
|
||||||
<tr id="row_2_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structtjtransform.html" target="_self">tjtransform</a></td><td class="desc">Lossless transform</td></tr>
|
|
||||||
</table>
|
|
||||||
</div><!-- directory -->
|
|
||||||
</div><!-- contents -->
|
|
||||||
<!-- start footer part -->
|
|
||||||
<hr class="footer"/><address class="footer"><small>
|
|
||||||
Generated by  <a href="http://www.doxygen.org/index.html">
|
|
||||||
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
||||||
</a> 1.8.3.1
|
|
||||||
</small></address>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
Before Width: | Height: | Size: 676 B |
|
Before Width: | Height: | Size: 147 B |
@@ -1,106 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1"/>
|
|
||||||
<title>TurboJPEG: Data Structure Index</title>
|
|
||||||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
|
||||||
<script type="text/javascript" src="jquery.js"></script>
|
|
||||||
<script type="text/javascript" src="dynsections.js"></script>
|
|
||||||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
|
||||||
<script type="text/javascript" src="search/search.js"></script>
|
|
||||||
<script type="text/javascript">
|
|
||||||
$(document).ready(function() { searchBox.OnSelectItem(0); });
|
|
||||||
</script>
|
|
||||||
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
|
||||||
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
||||||
<div id="titlearea">
|
|
||||||
<table cellspacing="0" cellpadding="0">
|
|
||||||
<tbody>
|
|
||||||
<tr style="height: 56px;">
|
|
||||||
<td style="padding-left: 0.5em;">
|
|
||||||
<div id="projectname">TurboJPEG
|
|
||||||
 <span id="projectnumber">1.5</span>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<!-- end header part -->
|
|
||||||
<!-- Generated by Doxygen 1.8.3.1 -->
|
|
||||||
<script type="text/javascript">
|
|
||||||
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|
||||||
</script>
|
|
||||||
<div id="navrow1" class="tabs">
|
|
||||||
<ul class="tablist">
|
|
||||||
<li><a href="index.html"><span>Main Page</span></a></li>
|
|
||||||
<li><a href="modules.html"><span>Modules</span></a></li>
|
|
||||||
<li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
|
|
||||||
<li>
|
|
||||||
<div id="MSearchBox" class="MSearchBoxInactive">
|
|
||||||
<span class="left">
|
|
||||||
<img id="MSearchSelect" src="search/mag_sel.png"
|
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
||||||
alt=""/>
|
|
||||||
<input type="text" id="MSearchField" value="Search" accesskey="S"
|
|
||||||
onfocus="searchBox.OnSearchFieldFocus(true)"
|
|
||||||
onblur="searchBox.OnSearchFieldFocus(false)"
|
|
||||||
onkeyup="searchBox.OnSearchFieldChange(event)"/>
|
|
||||||
</span><span class="right">
|
|
||||||
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div id="navrow2" class="tabs2">
|
|
||||||
<ul class="tablist">
|
|
||||||
<li><a href="annotated.html"><span>Data Structures</span></a></li>
|
|
||||||
<li class="current"><a href="classes.html"><span>Data Structure Index</span></a></li>
|
|
||||||
<li><a href="functions.html"><span>Data Fields</span></a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div><!-- top -->
|
|
||||||
<!-- window showing the filter options -->
|
|
||||||
<div id="MSearchSelectWindow"
|
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
||||||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
||||||
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Groups</a></div>
|
|
||||||
|
|
||||||
<!-- iframe showing the search results (closed by default) -->
|
|
||||||
<div id="MSearchResultsWindow">
|
|
||||||
<iframe src="javascript:void(0)" frameborder="0"
|
|
||||||
name="MSearchResults" id="MSearchResults">
|
|
||||||
</iframe>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="header">
|
|
||||||
<div class="headertitle">
|
|
||||||
<div class="title">Data Structure Index</div> </div>
|
|
||||||
</div><!--header-->
|
|
||||||
<div class="contents">
|
|
||||||
<div class="qindex"><a class="qindex" href="#letter_T">T</a></div>
|
|
||||||
<table style="margin: 10px; white-space: nowrap;" align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
|
|
||||||
<tr><td rowspan="2" valign="bottom"><a name="letter_T"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">  T  </div></td></tr></table>
|
|
||||||
</td><td valign="top"><a class="el" href="structtjscalingfactor.html">tjscalingfactor</a>   </td><td valign="top"><a class="el" href="structtjtransform.html">tjtransform</a>   </td><td></td></tr>
|
|
||||||
<tr><td></td><td></td><td></td></tr>
|
|
||||||
<tr><td valign="top"><a class="el" href="structtjregion.html">tjregion</a>   </td><td></td><td></td><td></td></tr>
|
|
||||||
<tr><td></td><td></td><td></td><td></td></tr>
|
|
||||||
</table>
|
|
||||||
<div class="qindex"><a class="qindex" href="#letter_T">T</a></div>
|
|
||||||
</div><!-- contents -->
|
|
||||||
<!-- start footer part -->
|
|
||||||
<hr class="footer"/><address class="footer"><small>
|
|
||||||
Generated by  <a href="http://www.doxygen.org/index.html">
|
|
||||||
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
||||||
</a> 1.8.3.1
|
|
||||||
</small></address>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
Before Width: | Height: | Size: 132 B |
@@ -1,3 +0,0 @@
|
|||||||
code {
|
|
||||||
color: #4665A2;
|
|
||||||
}
|
|
||||||
1184
doc/html/doxygen.css
|
Before Width: | Height: | Size: 3.7 KiB |
@@ -1,97 +0,0 @@
|
|||||||
function toggleVisibility(linkObj)
|
|
||||||
{
|
|
||||||
var base = $(linkObj).attr('id');
|
|
||||||
var summary = $('#'+base+'-summary');
|
|
||||||
var content = $('#'+base+'-content');
|
|
||||||
var trigger = $('#'+base+'-trigger');
|
|
||||||
var src=$(trigger).attr('src');
|
|
||||||
if (content.is(':visible')===true) {
|
|
||||||
content.hide();
|
|
||||||
summary.show();
|
|
||||||
$(linkObj).addClass('closed').removeClass('opened');
|
|
||||||
$(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
|
|
||||||
} else {
|
|
||||||
content.show();
|
|
||||||
summary.hide();
|
|
||||||
$(linkObj).removeClass('closed').addClass('opened');
|
|
||||||
$(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateStripes()
|
|
||||||
{
|
|
||||||
$('table.directory tr').
|
|
||||||
removeClass('even').filter(':visible:even').addClass('even');
|
|
||||||
}
|
|
||||||
function toggleLevel(level)
|
|
||||||
{
|
|
||||||
$('table.directory tr').each(function(){
|
|
||||||
var l = this.id.split('_').length-1;
|
|
||||||
var i = $('#img'+this.id.substring(3));
|
|
||||||
var a = $('#arr'+this.id.substring(3));
|
|
||||||
if (l<level+1) {
|
|
||||||
i.attr('src','ftv2folderopen.png');
|
|
||||||
a.attr('src','ftv2mnode.png');
|
|
||||||
$(this).show();
|
|
||||||
} else if (l==level+1) {
|
|
||||||
i.attr('src','ftv2folderclosed.png');
|
|
||||||
a.attr('src','ftv2pnode.png');
|
|
||||||
$(this).show();
|
|
||||||
} else {
|
|
||||||
$(this).hide();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
updateStripes();
|
|
||||||
}
|
|
||||||
|
|
||||||
function toggleFolder(id)
|
|
||||||
{
|
|
||||||
//The clicked row
|
|
||||||
var currentRow = $('#row_'+id);
|
|
||||||
var currentRowImages = currentRow.find("img");
|
|
||||||
|
|
||||||
//All rows after the clicked row
|
|
||||||
var rows = currentRow.nextAll("tr");
|
|
||||||
|
|
||||||
//Only match elements AFTER this one (can't hide elements before)
|
|
||||||
var childRows = rows.filter(function() {
|
|
||||||
var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
|
|
||||||
return this.id.match(re);
|
|
||||||
});
|
|
||||||
|
|
||||||
//First row is visible we are HIDING
|
|
||||||
if (childRows.filter(':first').is(':visible')===true) {
|
|
||||||
currentRowImages.filter("[id^=arr]").attr('src', 'ftv2pnode.png');
|
|
||||||
currentRowImages.filter("[id^=img]").attr('src', 'ftv2folderclosed.png');
|
|
||||||
rows.filter("[id^=row_"+id+"]").hide();
|
|
||||||
} else { //We are SHOWING
|
|
||||||
//All sub images
|
|
||||||
var childImages = childRows.find("img");
|
|
||||||
var childImg = childImages.filter("[id^=img]");
|
|
||||||
var childArr = childImages.filter("[id^=arr]");
|
|
||||||
|
|
||||||
currentRow.find("[id^=arr]").attr('src', 'ftv2mnode.png'); //open row
|
|
||||||
currentRow.find("[id^=img]").attr('src', 'ftv2folderopen.png'); //open row
|
|
||||||
childImg.attr('src','ftv2folderclosed.png'); //children closed
|
|
||||||
childArr.attr('src','ftv2pnode.png'); //children closed
|
|
||||||
childRows.show(); //show all children
|
|
||||||
}
|
|
||||||
updateStripes();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function toggleInherit(id)
|
|
||||||
{
|
|
||||||
var rows = $('tr.inherit.'+id);
|
|
||||||
var img = $('tr.inherit_header.'+id+' img');
|
|
||||||
var src = $(img).attr('src');
|
|
||||||
if (rows.filter(':first').is(':visible')===true) {
|
|
||||||
rows.css('display','none');
|
|
||||||
$(img).attr('src',src.substring(0,src.length-8)+'closed.png');
|
|
||||||
} else {
|
|
||||||
rows.css('display','table-row'); // using show() causes jump in firefox
|
|
||||||
$(img).attr('src',src.substring(0,src.length-10)+'open.png');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 86 B |
|
Before Width: | Height: | Size: 453 B |
|
Before Width: | Height: | Size: 746 B |
|
Before Width: | Height: | Size: 616 B |
|
Before Width: | Height: | Size: 597 B |
|
Before Width: | Height: | Size: 86 B |
|
Before Width: | Height: | Size: 746 B |
|
Before Width: | Height: | Size: 246 B |
|
Before Width: | Height: | Size: 246 B |
|
Before Width: | Height: | Size: 403 B |
|
Before Width: | Height: | Size: 86 B |
|
Before Width: | Height: | Size: 388 B |
|
Before Width: | Height: | Size: 229 B |
|
Before Width: | Height: | Size: 229 B |
|
Before Width: | Height: | Size: 314 B |
|
Before Width: | Height: | Size: 86 B |
@@ -1,134 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1"/>
|
|
||||||
<title>TurboJPEG: Data Fields</title>
|
|
||||||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
|
||||||
<script type="text/javascript" src="jquery.js"></script>
|
|
||||||
<script type="text/javascript" src="dynsections.js"></script>
|
|
||||||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
|
||||||
<script type="text/javascript" src="search/search.js"></script>
|
|
||||||
<script type="text/javascript">
|
|
||||||
$(document).ready(function() { searchBox.OnSelectItem(0); });
|
|
||||||
</script>
|
|
||||||
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
|
||||||
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
||||||
<div id="titlearea">
|
|
||||||
<table cellspacing="0" cellpadding="0">
|
|
||||||
<tbody>
|
|
||||||
<tr style="height: 56px;">
|
|
||||||
<td style="padding-left: 0.5em;">
|
|
||||||
<div id="projectname">TurboJPEG
|
|
||||||
 <span id="projectnumber">1.5</span>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<!-- end header part -->
|
|
||||||
<!-- Generated by Doxygen 1.8.3.1 -->
|
|
||||||
<script type="text/javascript">
|
|
||||||
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|
||||||
</script>
|
|
||||||
<div id="navrow1" class="tabs">
|
|
||||||
<ul class="tablist">
|
|
||||||
<li><a href="index.html"><span>Main Page</span></a></li>
|
|
||||||
<li><a href="modules.html"><span>Modules</span></a></li>
|
|
||||||
<li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
|
|
||||||
<li>
|
|
||||||
<div id="MSearchBox" class="MSearchBoxInactive">
|
|
||||||
<span class="left">
|
|
||||||
<img id="MSearchSelect" src="search/mag_sel.png"
|
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
||||||
alt=""/>
|
|
||||||
<input type="text" id="MSearchField" value="Search" accesskey="S"
|
|
||||||
onfocus="searchBox.OnSearchFieldFocus(true)"
|
|
||||||
onblur="searchBox.OnSearchFieldFocus(false)"
|
|
||||||
onkeyup="searchBox.OnSearchFieldChange(event)"/>
|
|
||||||
</span><span class="right">
|
|
||||||
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div id="navrow2" class="tabs2">
|
|
||||||
<ul class="tablist">
|
|
||||||
<li><a href="annotated.html"><span>Data Structures</span></a></li>
|
|
||||||
<li><a href="classes.html"><span>Data Structure Index</span></a></li>
|
|
||||||
<li class="current"><a href="functions.html"><span>Data Fields</span></a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div id="navrow3" class="tabs2">
|
|
||||||
<ul class="tablist">
|
|
||||||
<li class="current"><a href="functions.html"><span>All</span></a></li>
|
|
||||||
<li><a href="functions_vars.html"><span>Variables</span></a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div><!-- top -->
|
|
||||||
<!-- window showing the filter options -->
|
|
||||||
<div id="MSearchSelectWindow"
|
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
||||||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
||||||
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Groups</a></div>
|
|
||||||
|
|
||||||
<!-- iframe showing the search results (closed by default) -->
|
|
||||||
<div id="MSearchResultsWindow">
|
|
||||||
<iframe src="javascript:void(0)" frameborder="0"
|
|
||||||
name="MSearchResults" id="MSearchResults">
|
|
||||||
</iframe>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
<div class="textblock">Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:</div><ul>
|
|
||||||
<li>customFilter
|
|
||||||
: <a class="el" href="structtjtransform.html#a43ee1bcdd2a8d7249a756774f78793c1">tjtransform</a>
|
|
||||||
</li>
|
|
||||||
<li>data
|
|
||||||
: <a class="el" href="structtjtransform.html#a688fe8f1a8ecc12a538d9e561cf338e3">tjtransform</a>
|
|
||||||
</li>
|
|
||||||
<li>denom
|
|
||||||
: <a class="el" href="structtjscalingfactor.html#aefbcdf3e9e62274b2d312c695f133ce3">tjscalingfactor</a>
|
|
||||||
</li>
|
|
||||||
<li>h
|
|
||||||
: <a class="el" href="structtjregion.html#aecefc45a26f4d8b60dd4d825c1710115">tjregion</a>
|
|
||||||
</li>
|
|
||||||
<li>num
|
|
||||||
: <a class="el" href="structtjscalingfactor.html#a9b011e57f981ee23083e2c1aa5e640ec">tjscalingfactor</a>
|
|
||||||
</li>
|
|
||||||
<li>op
|
|
||||||
: <a class="el" href="structtjtransform.html#a2525aab4ba6978a1c273f74fef50e498">tjtransform</a>
|
|
||||||
</li>
|
|
||||||
<li>options
|
|
||||||
: <a class="el" href="structtjtransform.html#ac0e74655baa4402209a21e1ae481c8f6">tjtransform</a>
|
|
||||||
</li>
|
|
||||||
<li>r
|
|
||||||
: <a class="el" href="structtjtransform.html#ac324e5e442abec8a961e5bf219db12cf">tjtransform</a>
|
|
||||||
</li>
|
|
||||||
<li>w
|
|
||||||
: <a class="el" href="structtjregion.html#ab6eb73ceef584fc23c8c8097926dce42">tjregion</a>
|
|
||||||
</li>
|
|
||||||
<li>x
|
|
||||||
: <a class="el" href="structtjregion.html#a4b6a37a93997091b26a75831fa291ad9">tjregion</a>
|
|
||||||
</li>
|
|
||||||
<li>y
|
|
||||||
: <a class="el" href="structtjregion.html#a7b3e0c24cfe87acc80e334cafdcf22c2">tjregion</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div><!-- contents -->
|
|
||||||
<!-- start footer part -->
|
|
||||||
<hr class="footer"/><address class="footer"><small>
|
|
||||||
Generated by  <a href="http://www.doxygen.org/index.html">
|
|
||||||
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
||||||
</a> 1.8.3.1
|
|
||||||
</small></address>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,134 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1"/>
|
|
||||||
<title>TurboJPEG: Data Fields - Variables</title>
|
|
||||||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
|
||||||
<script type="text/javascript" src="jquery.js"></script>
|
|
||||||
<script type="text/javascript" src="dynsections.js"></script>
|
|
||||||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
|
||||||
<script type="text/javascript" src="search/search.js"></script>
|
|
||||||
<script type="text/javascript">
|
|
||||||
$(document).ready(function() { searchBox.OnSelectItem(0); });
|
|
||||||
</script>
|
|
||||||
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
|
||||||
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
||||||
<div id="titlearea">
|
|
||||||
<table cellspacing="0" cellpadding="0">
|
|
||||||
<tbody>
|
|
||||||
<tr style="height: 56px;">
|
|
||||||
<td style="padding-left: 0.5em;">
|
|
||||||
<div id="projectname">TurboJPEG
|
|
||||||
 <span id="projectnumber">1.5</span>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<!-- end header part -->
|
|
||||||
<!-- Generated by Doxygen 1.8.3.1 -->
|
|
||||||
<script type="text/javascript">
|
|
||||||
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|
||||||
</script>
|
|
||||||
<div id="navrow1" class="tabs">
|
|
||||||
<ul class="tablist">
|
|
||||||
<li><a href="index.html"><span>Main Page</span></a></li>
|
|
||||||
<li><a href="modules.html"><span>Modules</span></a></li>
|
|
||||||
<li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
|
|
||||||
<li>
|
|
||||||
<div id="MSearchBox" class="MSearchBoxInactive">
|
|
||||||
<span class="left">
|
|
||||||
<img id="MSearchSelect" src="search/mag_sel.png"
|
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
||||||
alt=""/>
|
|
||||||
<input type="text" id="MSearchField" value="Search" accesskey="S"
|
|
||||||
onfocus="searchBox.OnSearchFieldFocus(true)"
|
|
||||||
onblur="searchBox.OnSearchFieldFocus(false)"
|
|
||||||
onkeyup="searchBox.OnSearchFieldChange(event)"/>
|
|
||||||
</span><span class="right">
|
|
||||||
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div id="navrow2" class="tabs2">
|
|
||||||
<ul class="tablist">
|
|
||||||
<li><a href="annotated.html"><span>Data Structures</span></a></li>
|
|
||||||
<li><a href="classes.html"><span>Data Structure Index</span></a></li>
|
|
||||||
<li class="current"><a href="functions.html"><span>Data Fields</span></a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div id="navrow3" class="tabs2">
|
|
||||||
<ul class="tablist">
|
|
||||||
<li><a href="functions.html"><span>All</span></a></li>
|
|
||||||
<li class="current"><a href="functions_vars.html"><span>Variables</span></a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div><!-- top -->
|
|
||||||
<!-- window showing the filter options -->
|
|
||||||
<div id="MSearchSelectWindow"
|
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
||||||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
||||||
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Groups</a></div>
|
|
||||||
|
|
||||||
<!-- iframe showing the search results (closed by default) -->
|
|
||||||
<div id="MSearchResultsWindow">
|
|
||||||
<iframe src="javascript:void(0)" frameborder="0"
|
|
||||||
name="MSearchResults" id="MSearchResults">
|
|
||||||
</iframe>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="contents">
|
|
||||||
 <ul>
|
|
||||||
<li>customFilter
|
|
||||||
: <a class="el" href="structtjtransform.html#a43ee1bcdd2a8d7249a756774f78793c1">tjtransform</a>
|
|
||||||
</li>
|
|
||||||
<li>data
|
|
||||||
: <a class="el" href="structtjtransform.html#a688fe8f1a8ecc12a538d9e561cf338e3">tjtransform</a>
|
|
||||||
</li>
|
|
||||||
<li>denom
|
|
||||||
: <a class="el" href="structtjscalingfactor.html#aefbcdf3e9e62274b2d312c695f133ce3">tjscalingfactor</a>
|
|
||||||
</li>
|
|
||||||
<li>h
|
|
||||||
: <a class="el" href="structtjregion.html#aecefc45a26f4d8b60dd4d825c1710115">tjregion</a>
|
|
||||||
</li>
|
|
||||||
<li>num
|
|
||||||
: <a class="el" href="structtjscalingfactor.html#a9b011e57f981ee23083e2c1aa5e640ec">tjscalingfactor</a>
|
|
||||||
</li>
|
|
||||||
<li>op
|
|
||||||
: <a class="el" href="structtjtransform.html#a2525aab4ba6978a1c273f74fef50e498">tjtransform</a>
|
|
||||||
</li>
|
|
||||||
<li>options
|
|
||||||
: <a class="el" href="structtjtransform.html#ac0e74655baa4402209a21e1ae481c8f6">tjtransform</a>
|
|
||||||
</li>
|
|
||||||
<li>r
|
|
||||||
: <a class="el" href="structtjtransform.html#ac324e5e442abec8a961e5bf219db12cf">tjtransform</a>
|
|
||||||
</li>
|
|
||||||
<li>w
|
|
||||||
: <a class="el" href="structtjregion.html#ab6eb73ceef584fc23c8c8097926dce42">tjregion</a>
|
|
||||||
</li>
|
|
||||||
<li>x
|
|
||||||
: <a class="el" href="structtjregion.html#a4b6a37a93997091b26a75831fa291ad9">tjregion</a>
|
|
||||||
</li>
|
|
||||||
<li>y
|
|
||||||
: <a class="el" href="structtjregion.html#a7b3e0c24cfe87acc80e334cafdcf22c2">tjregion</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div><!-- contents -->
|
|
||||||
<!-- start footer part -->
|
|
||||||
<hr class="footer"/><address class="footer"><small>
|
|
||||||
Generated by  <a href="http://www.doxygen.org/index.html">
|
|
||||||
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
||||||
</a> 1.8.3.1
|
|
||||||
</small></address>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1"/>
|
|
||||||
<title>TurboJPEG: Main Page</title>
|
|
||||||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
|
||||||
<script type="text/javascript" src="jquery.js"></script>
|
|
||||||
<script type="text/javascript" src="dynsections.js"></script>
|
|
||||||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
|
||||||
<script type="text/javascript" src="search/search.js"></script>
|
|
||||||
<script type="text/javascript">
|
|
||||||
$(document).ready(function() { searchBox.OnSelectItem(0); });
|
|
||||||
</script>
|
|
||||||
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
|
||||||
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
||||||
<div id="titlearea">
|
|
||||||
<table cellspacing="0" cellpadding="0">
|
|
||||||
<tbody>
|
|
||||||
<tr style="height: 56px;">
|
|
||||||
<td style="padding-left: 0.5em;">
|
|
||||||
<div id="projectname">TurboJPEG
|
|
||||||
 <span id="projectnumber">1.5</span>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<!-- end header part -->
|
|
||||||
<!-- Generated by Doxygen 1.8.3.1 -->
|
|
||||||
<script type="text/javascript">
|
|
||||||
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|
||||||
</script>
|
|
||||||
<div id="navrow1" class="tabs">
|
|
||||||
<ul class="tablist">
|
|
||||||
<li class="current"><a href="index.html"><span>Main Page</span></a></li>
|
|
||||||
<li><a href="modules.html"><span>Modules</span></a></li>
|
|
||||||
<li><a href="annotated.html"><span>Data Structures</span></a></li>
|
|
||||||
<li>
|
|
||||||
<div id="MSearchBox" class="MSearchBoxInactive">
|
|
||||||
<span class="left">
|
|
||||||
<img id="MSearchSelect" src="search/mag_sel.png"
|
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
||||||
alt=""/>
|
|
||||||
<input type="text" id="MSearchField" value="Search" accesskey="S"
|
|
||||||
onfocus="searchBox.OnSearchFieldFocus(true)"
|
|
||||||
onblur="searchBox.OnSearchFieldFocus(false)"
|
|
||||||
onkeyup="searchBox.OnSearchFieldChange(event)"/>
|
|
||||||
</span><span class="right">
|
|
||||||
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div><!-- top -->
|
|
||||||
<!-- window showing the filter options -->
|
|
||||||
<div id="MSearchSelectWindow"
|
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
||||||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
||||||
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Groups</a></div>
|
|
||||||
|
|
||||||
<!-- iframe showing the search results (closed by default) -->
|
|
||||||
<div id="MSearchResultsWindow">
|
|
||||||
<iframe src="javascript:void(0)" frameborder="0"
|
|
||||||
name="MSearchResults" id="MSearchResults">
|
|
||||||
</iframe>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="header">
|
|
||||||
<div class="headertitle">
|
|
||||||
<div class="title">TurboJPEG Documentation</div> </div>
|
|
||||||
</div><!--header-->
|
|
||||||
<div class="contents">
|
|
||||||
</div><!-- contents -->
|
|
||||||
<!-- start footer part -->
|
|
||||||
<hr class="footer"/><address class="footer"><small>
|
|
||||||
Generated by  <a href="http://www.doxygen.org/index.html">
|
|
||||||
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
||||||
</a> 1.8.3.1
|
|
||||||
</small></address>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
8
doc/html/jquery.js
vendored
@@ -1,95 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1"/>
|
|
||||||
<title>TurboJPEG: Modules</title>
|
|
||||||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
|
||||||
<script type="text/javascript" src="jquery.js"></script>
|
|
||||||
<script type="text/javascript" src="dynsections.js"></script>
|
|
||||||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
|
||||||
<script type="text/javascript" src="search/search.js"></script>
|
|
||||||
<script type="text/javascript">
|
|
||||||
$(document).ready(function() { searchBox.OnSelectItem(0); });
|
|
||||||
</script>
|
|
||||||
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
|
||||||
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
||||||
<div id="titlearea">
|
|
||||||
<table cellspacing="0" cellpadding="0">
|
|
||||||
<tbody>
|
|
||||||
<tr style="height: 56px;">
|
|
||||||
<td style="padding-left: 0.5em;">
|
|
||||||
<div id="projectname">TurboJPEG
|
|
||||||
 <span id="projectnumber">1.5</span>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<!-- end header part -->
|
|
||||||
<!-- Generated by Doxygen 1.8.3.1 -->
|
|
||||||
<script type="text/javascript">
|
|
||||||
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|
||||||
</script>
|
|
||||||
<div id="navrow1" class="tabs">
|
|
||||||
<ul class="tablist">
|
|
||||||
<li><a href="index.html"><span>Main Page</span></a></li>
|
|
||||||
<li class="current"><a href="modules.html"><span>Modules</span></a></li>
|
|
||||||
<li><a href="annotated.html"><span>Data Structures</span></a></li>
|
|
||||||
<li>
|
|
||||||
<div id="MSearchBox" class="MSearchBoxInactive">
|
|
||||||
<span class="left">
|
|
||||||
<img id="MSearchSelect" src="search/mag_sel.png"
|
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
||||||
alt=""/>
|
|
||||||
<input type="text" id="MSearchField" value="Search" accesskey="S"
|
|
||||||
onfocus="searchBox.OnSearchFieldFocus(true)"
|
|
||||||
onblur="searchBox.OnSearchFieldFocus(false)"
|
|
||||||
onkeyup="searchBox.OnSearchFieldChange(event)"/>
|
|
||||||
</span><span class="right">
|
|
||||||
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div><!-- top -->
|
|
||||||
<!-- window showing the filter options -->
|
|
||||||
<div id="MSearchSelectWindow"
|
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
||||||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
||||||
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Groups</a></div>
|
|
||||||
|
|
||||||
<!-- iframe showing the search results (closed by default) -->
|
|
||||||
<div id="MSearchResultsWindow">
|
|
||||||
<iframe src="javascript:void(0)" frameborder="0"
|
|
||||||
name="MSearchResults" id="MSearchResults">
|
|
||||||
</iframe>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="header">
|
|
||||||
<div class="headertitle">
|
|
||||||
<div class="title">Modules</div> </div>
|
|
||||||
</div><!--header-->
|
|
||||||
<div class="contents">
|
|
||||||
<div class="textblock">Here is a list of all modules:</div><div class="directory">
|
|
||||||
<table class="directory">
|
|
||||||
<tr id="row_0_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a class="el" href="group___turbo_j_p_e_g.html" target="_self">TurboJPEG</a></td><td class="desc">TurboJPEG API</td></tr>
|
|
||||||
</table>
|
|
||||||
</div><!-- directory -->
|
|
||||||
</div><!-- contents -->
|
|
||||||
<!-- start footer part -->
|
|
||||||
<hr class="footer"/><address class="footer"><small>
|
|
||||||
Generated by  <a href="http://www.doxygen.org/index.html">
|
|
||||||
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
||||||
</a> 1.8.3.1
|
|
||||||
</small></address>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
Before Width: | Height: | Size: 153 B |
|
Before Width: | Height: | Size: 95 B |
|
Before Width: | Height: | Size: 98 B |
|
Before Width: | Height: | Size: 123 B |
@@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html><head><title></title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
|
||||||
<script type="text/javascript" src="all_63.js"></script>
|
|
||||||
<script type="text/javascript" src="search.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="SRPage">
|
|
||||||
<div id="SRIndex">
|
|
||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
|
||||||
<div id="SRResults"></div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
createResults();
|
|
||||||
--></script>
|
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
document.getElementById("Loading").style.display="none";
|
|
||||||
document.getElementById("NoMatches").style.display="none";
|
|
||||||
var searchResults = new SearchResults("searchResults");
|
|
||||||
searchResults.Search();
|
|
||||||
--></script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['customfilter',['customFilter',['../structtjtransform.html#a43ee1bcdd2a8d7249a756774f78793c1',1,'tjtransform']]]
|
|
||||||
];
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html><head><title></title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
|
||||||
<script type="text/javascript" src="all_64.js"></script>
|
|
||||||
<script type="text/javascript" src="search.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="SRPage">
|
|
||||||
<div id="SRIndex">
|
|
||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
|
||||||
<div id="SRResults"></div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
createResults();
|
|
||||||
--></script>
|
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
document.getElementById("Loading").style.display="none";
|
|
||||||
document.getElementById("NoMatches").style.display="none";
|
|
||||||
var searchResults = new SearchResults("searchResults");
|
|
||||||
searchResults.Search();
|
|
||||||
--></script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['data',['data',['../structtjtransform.html#a688fe8f1a8ecc12a538d9e561cf338e3',1,'tjtransform']]],
|
|
||||||
['denom',['denom',['../structtjscalingfactor.html#aefbcdf3e9e62274b2d312c695f133ce3',1,'tjscalingfactor']]]
|
|
||||||
];
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html><head><title></title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
|
||||||
<script type="text/javascript" src="all_68.js"></script>
|
|
||||||
<script type="text/javascript" src="search.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="SRPage">
|
|
||||||
<div id="SRIndex">
|
|
||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
|
||||||
<div id="SRResults"></div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
createResults();
|
|
||||||
--></script>
|
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
document.getElementById("Loading").style.display="none";
|
|
||||||
document.getElementById("NoMatches").style.display="none";
|
|
||||||
var searchResults = new SearchResults("searchResults");
|
|
||||||
searchResults.Search();
|
|
||||||
--></script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['h',['h',['../structtjregion.html#aecefc45a26f4d8b60dd4d825c1710115',1,'tjregion']]]
|
|
||||||
];
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html><head><title></title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
|
||||||
<script type="text/javascript" src="all_6e.js"></script>
|
|
||||||
<script type="text/javascript" src="search.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="SRPage">
|
|
||||||
<div id="SRIndex">
|
|
||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
|
||||||
<div id="SRResults"></div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
createResults();
|
|
||||||
--></script>
|
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
document.getElementById("Loading").style.display="none";
|
|
||||||
document.getElementById("NoMatches").style.display="none";
|
|
||||||
var searchResults = new SearchResults("searchResults");
|
|
||||||
searchResults.Search();
|
|
||||||
--></script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['num',['num',['../structtjscalingfactor.html#a9b011e57f981ee23083e2c1aa5e640ec',1,'tjscalingfactor']]]
|
|
||||||
];
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html><head><title></title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
|
||||||
<script type="text/javascript" src="all_6f.js"></script>
|
|
||||||
<script type="text/javascript" src="search.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="SRPage">
|
|
||||||
<div id="SRIndex">
|
|
||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
|
||||||
<div id="SRResults"></div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
createResults();
|
|
||||||
--></script>
|
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
document.getElementById("Loading").style.display="none";
|
|
||||||
document.getElementById("NoMatches").style.display="none";
|
|
||||||
var searchResults = new SearchResults("searchResults");
|
|
||||||
searchResults.Search();
|
|
||||||
--></script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['op',['op',['../structtjtransform.html#a2525aab4ba6978a1c273f74fef50e498',1,'tjtransform']]],
|
|
||||||
['options',['options',['../structtjtransform.html#ac0e74655baa4402209a21e1ae481c8f6',1,'tjtransform']]]
|
|
||||||
];
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html><head><title></title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
|
||||||
<script type="text/javascript" src="all_72.js"></script>
|
|
||||||
<script type="text/javascript" src="search.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="SRPage">
|
|
||||||
<div id="SRIndex">
|
|
||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
|
||||||
<div id="SRResults"></div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
createResults();
|
|
||||||
--></script>
|
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
document.getElementById("Loading").style.display="none";
|
|
||||||
document.getElementById("NoMatches").style.display="none";
|
|
||||||
var searchResults = new SearchResults("searchResults");
|
|
||||||
searchResults.Search();
|
|
||||||
--></script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['r',['r',['../structtjtransform.html#ac324e5e442abec8a961e5bf219db12cf',1,'tjtransform']]]
|
|
||||||
];
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html><head><title></title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
|
||||||
<script type="text/javascript" src="all_74.js"></script>
|
|
||||||
<script type="text/javascript" src="search.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="SRPage">
|
|
||||||
<div id="SRIndex">
|
|
||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
|
||||||
<div id="SRResults"></div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
createResults();
|
|
||||||
--></script>
|
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
document.getElementById("Loading").style.display="none";
|
|
||||||
document.getElementById("NoMatches").style.display="none";
|
|
||||||
var searchResults = new SearchResults("searchResults");
|
|
||||||
searchResults.Search();
|
|
||||||
--></script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['tj_5fnumcs',['TJ_NUMCS',['../group___turbo_j_p_e_g.html#ga39f57a6fb02d9cf32e7b6890099b5a71',1,'turbojpeg.h']]],
|
|
||||||
['tj_5fnumpf',['TJ_NUMPF',['../group___turbo_j_p_e_g.html#ga7010a4402f54a45ba822ad8675a4655e',1,'turbojpeg.h']]],
|
|
||||||
['tj_5fnumsamp',['TJ_NUMSAMP',['../group___turbo_j_p_e_g.html#ga5ef3d169162ce77ce348e292a0b7477c',1,'turbojpeg.h']]],
|
|
||||||
['tj_5fnumxop',['TJ_NUMXOP',['../group___turbo_j_p_e_g.html#ga0f6dbd18adf38b7d46ac547f0f4d562c',1,'turbojpeg.h']]],
|
|
||||||
['tjalloc',['tjAlloc',['../group___turbo_j_p_e_g.html#ga5c9234bda6d993cdaffdd89bf81a00ff',1,'turbojpeg.h']]],
|
|
||||||
['tjblueoffset',['tjBlueOffset',['../group___turbo_j_p_e_g.html#ga84e2e35d3f08025f976ec1ec53693dea',1,'turbojpeg.h']]],
|
|
||||||
['tjbufsize',['tjBufSize',['../group___turbo_j_p_e_g.html#gaccc5bca7f12fcdcc302e6e1c6d4b311b',1,'turbojpeg.h']]],
|
|
||||||
['tjbufsizeyuv2',['tjBufSizeYUV2',['../group___turbo_j_p_e_g.html#gaf451664a62c1f6c7cc5a6401f32908c9',1,'turbojpeg.h']]],
|
|
||||||
['tjcompress2',['tjCompress2',['../group___turbo_j_p_e_g.html#gaf38f2ed44bdc88e730e08b632fa6e88e',1,'turbojpeg.h']]],
|
|
||||||
['tjcompressfromyuv',['tjCompressFromYUV',['../group___turbo_j_p_e_g.html#ga6f6de375d6ec0020faba627e37e5a060',1,'turbojpeg.h']]],
|
|
||||||
['tjcompressfromyuvplanes',['tjCompressFromYUVPlanes',['../group___turbo_j_p_e_g.html#ga0b84c682d8accf097d7a743c965d3464',1,'turbojpeg.h']]],
|
|
||||||
['tjcs',['TJCS',['../group___turbo_j_p_e_g.html#ga4f83ad3368e0e29d1957be0efa7c3720',1,'turbojpeg.h']]],
|
|
||||||
['tjcs_5fcmyk',['TJCS_CMYK',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a6c8b636152ac8195b869587db315ee53',1,'turbojpeg.h']]],
|
|
||||||
['tjcs_5fgray',['TJCS_GRAY',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720ab3e7d6a87f695e45b81c1b5262b5a50a',1,'turbojpeg.h']]],
|
|
||||||
['tjcs_5frgb',['TJCS_RGB',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a677cb7ccb85c4038ac41964a2e09e555',1,'turbojpeg.h']]],
|
|
||||||
['tjcs_5fycbcr',['TJCS_YCbCr',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a7389b8f65bb387ffedce3efd0d78ec75',1,'turbojpeg.h']]],
|
|
||||||
['tjcs_5fycck',['TJCS_YCCK',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a53839e0fe867b76b58d16b0a1a7c598e',1,'turbojpeg.h']]],
|
|
||||||
['tjdecodeyuv',['tjDecodeYUV',['../group___turbo_j_p_e_g.html#ga077c61027b875afecd5a1613bf18b3c1',1,'turbojpeg.h']]],
|
|
||||||
['tjdecodeyuvplanes',['tjDecodeYUVPlanes',['../group___turbo_j_p_e_g.html#gaf42f19b7a496eb18bdc84fe61ee6d3e2',1,'turbojpeg.h']]],
|
|
||||||
['tjdecompress2',['tjDecompress2',['../group___turbo_j_p_e_g.html#gad8026a417e16a76313bc0a6c9e8b2ba2',1,'turbojpeg.h']]],
|
|
||||||
['tjdecompressheader3',['tjDecompressHeader3',['../group___turbo_j_p_e_g.html#ga3fced455e504e8ff4fbad28ba94a3020',1,'turbojpeg.h']]],
|
|
||||||
['tjdecompresstoyuv2',['tjDecompressToYUV2',['../group___turbo_j_p_e_g.html#ga39e08906528db5a764670ea48d344b09',1,'turbojpeg.h']]],
|
|
||||||
['tjdecompresstoyuvplanes',['tjDecompressToYUVPlanes',['../group___turbo_j_p_e_g.html#ga38d0ef90692663b3ffb5b16da2541512',1,'turbojpeg.h']]],
|
|
||||||
['tjdestroy',['tjDestroy',['../group___turbo_j_p_e_g.html#ga674adee917b95ad4a896f1ba39e12540',1,'turbojpeg.h']]],
|
|
||||||
['tjencodeyuv3',['tjEncodeYUV3',['../group___turbo_j_p_e_g.html#gaabe05acd734990053ad1294b5ef239aa',1,'turbojpeg.h']]],
|
|
||||||
['tjencodeyuvplanes',['tjEncodeYUVPlanes',['../group___turbo_j_p_e_g.html#ga8a65ed3bd12df57c219d46afbc9008f1',1,'turbojpeg.h']]],
|
|
||||||
['tjflag_5faccuratedct',['TJFLAG_ACCURATEDCT',['../group___turbo_j_p_e_g.html#gacb233cfd722d66d1ccbf48a7de81f0e0',1,'turbojpeg.h']]],
|
|
||||||
['tjflag_5fbottomup',['TJFLAG_BOTTOMUP',['../group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec',1,'turbojpeg.h']]],
|
|
||||||
['tjflag_5ffastdct',['TJFLAG_FASTDCT',['../group___turbo_j_p_e_g.html#gaabce235db80d3f698b27f36cbd453da2',1,'turbojpeg.h']]],
|
|
||||||
['tjflag_5ffastupsample',['TJFLAG_FASTUPSAMPLE',['../group___turbo_j_p_e_g.html#ga4ee4506c81177a06f77e2504a22efd2d',1,'turbojpeg.h']]],
|
|
||||||
['tjflag_5fnorealloc',['TJFLAG_NOREALLOC',['../group___turbo_j_p_e_g.html#ga8808d403c68b62aaa58a4c1e58e98963',1,'turbojpeg.h']]],
|
|
||||||
['tjfree',['tjFree',['../group___turbo_j_p_e_g.html#ga8c4a1231dc06a450514c835f6471f137',1,'turbojpeg.h']]],
|
|
||||||
['tjgeterrorstr',['tjGetErrorStr',['../group___turbo_j_p_e_g.html#ga9af79c908ec131b1ae8d52fe40375abf',1,'turbojpeg.h']]],
|
|
||||||
['tjgetscalingfactors',['tjGetScalingFactors',['../group___turbo_j_p_e_g.html#ga6449044b9af402999ccf52f401333be8',1,'turbojpeg.h']]],
|
|
||||||
['tjgreenoffset',['tjGreenOffset',['../group___turbo_j_p_e_g.html#ga82d6e35da441112a411da41923c0ba2f',1,'turbojpeg.h']]],
|
|
||||||
['tjhandle',['tjhandle',['../group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763',1,'turbojpeg.h']]],
|
|
||||||
['tjinitcompress',['tjInitCompress',['../group___turbo_j_p_e_g.html#ga3d10c47fbe4a2489a2b30c931551d01a',1,'turbojpeg.h']]],
|
|
||||||
['tjinitdecompress',['tjInitDecompress',['../group___turbo_j_p_e_g.html#gae5408179d041e2a2f7199c8283cf649e',1,'turbojpeg.h']]],
|
|
||||||
['tjinittransform',['tjInitTransform',['../group___turbo_j_p_e_g.html#ga3155b775bfbac9dbba869b95a0367902',1,'turbojpeg.h']]],
|
|
||||||
['tjmcuheight',['tjMCUHeight',['../group___turbo_j_p_e_g.html#gabd247bb9fecb393eca57366feb8327bf',1,'turbojpeg.h']]],
|
|
||||||
['tjmcuwidth',['tjMCUWidth',['../group___turbo_j_p_e_g.html#ga9e61e7cd47a15a173283ba94e781308c',1,'turbojpeg.h']]],
|
|
||||||
['tjpad',['TJPAD',['../group___turbo_j_p_e_g.html#ga0aba955473315e405295d978f0c16511',1,'turbojpeg.h']]],
|
|
||||||
['tjpf',['TJPF',['../group___turbo_j_p_e_g.html#gac916144e26c3817ac514e64ae5d12e2a',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fabgr',['TJPF_ABGR',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa1ba1a7f1631dbeaa49a0a85fc4a40081',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fargb',['TJPF_ARGB',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aae8f846ed9d9de99b6e1dfe448848765c',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fbgr',['TJPF_BGR',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aab10624437fb8ef495a0b153e65749839',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fbgra',['TJPF_BGRA',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aac037ff1845cf9b74bb81a3659c2b9fb4',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fbgrx',['TJPF_BGRX',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa2a1fbf569ca79897eae886e3376ca4c8',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fcmyk',['TJPF_CMYK',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa7f5100ec44c91994e243f1cf55553f8b',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fgray',['TJPF_GRAY',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa5431b54b015337705f13118073711a1a',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5frgb',['TJPF_RGB',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa7ce93230bff449518ce387c17e6ed37c',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5frgba',['TJPF_RGBA',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa88d2e88fab67f6503cf972e14851cc12',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5frgbx',['TJPF_RGBX',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa83973bebb7e2dc6fa8bae89ff3f42e01',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fxbgr',['TJPF_XBGR',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aaf6603b27147de47e212e75dac027b2af',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fxrgb',['TJPF_XRGB',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aadae996905efcfa3b42a0bb3bea7f9d84',1,'turbojpeg.h']]],
|
|
||||||
['tjpixelsize',['tjPixelSize',['../group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c',1,'turbojpeg.h']]],
|
|
||||||
['tjplaneheight',['tjPlaneHeight',['../group___turbo_j_p_e_g.html#ga1a209696c6a80748f20e134b3c64789f',1,'turbojpeg.h']]],
|
|
||||||
['tjplanesizeyuv',['tjPlaneSizeYUV',['../group___turbo_j_p_e_g.html#ga6f98d977bfa9d167c97172e876ba61e2',1,'turbojpeg.h']]],
|
|
||||||
['tjplanewidth',['tjPlaneWidth',['../group___turbo_j_p_e_g.html#ga63fb66bb1e36c74008c4634360becbb1',1,'turbojpeg.h']]],
|
|
||||||
['tjredoffset',['tjRedOffset',['../group___turbo_j_p_e_g.html#gadd9b446742ac8a3923f7992c7988fea8',1,'turbojpeg.h']]],
|
|
||||||
['tjregion',['tjregion',['../structtjregion.html',1,'']]],
|
|
||||||
['tjsamp',['TJSAMP',['../group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074',1,'turbojpeg.h']]],
|
|
||||||
['tjsamp_5f411',['TJSAMP_411',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a28ec62575e5ea295c3fde3001dc628e2',1,'turbojpeg.h']]],
|
|
||||||
['tjsamp_5f420',['TJSAMP_420',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a63085dbf683cfe39e513cdb6343e3737',1,'turbojpeg.h']]],
|
|
||||||
['tjsamp_5f422',['TJSAMP_422',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a136130902cc578f11f32429b59368404',1,'turbojpeg.h']]],
|
|
||||||
['tjsamp_5f440',['TJSAMP_440',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074accf740e6f3aa6ba20ba922cad13cb974',1,'turbojpeg.h']]],
|
|
||||||
['tjsamp_5f444',['TJSAMP_444',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074afb8da4f44197837bdec0a4f593dacae3',1,'turbojpeg.h']]],
|
|
||||||
['tjsamp_5fgray',['TJSAMP_GRAY',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a3f1c9504842ddc7a48d0f690754b6248',1,'turbojpeg.h']]],
|
|
||||||
['tjscaled',['TJSCALED',['../group___turbo_j_p_e_g.html#ga84878bb65404204743aa18cac02781df',1,'turbojpeg.h']]],
|
|
||||||
['tjscalingfactor',['tjscalingfactor',['../structtjscalingfactor.html',1,'']]],
|
|
||||||
['tjtransform',['tjtransform',['../structtjtransform.html',1,'tjtransform'],['../group___turbo_j_p_e_g.html#gad02cd42b69f193a0623a9c801788df3a',1,'tjTransform(tjhandle handle, const unsigned char *jpegBuf, unsigned long jpegSize, int n, unsigned char **dstBufs, unsigned long *dstSizes, tjtransform *transforms, int flags): turbojpeg.h'],['../group___turbo_j_p_e_g.html#gaa29f3189c41be12ec5dee7caec318a31',1,'tjtransform(): turbojpeg.h']]],
|
|
||||||
['tjxop',['TJXOP',['../group___turbo_j_p_e_g.html#ga2de531af4e7e6c4f124908376b354866',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5fhflip',['TJXOP_HFLIP',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866aa0df69776caa30f0fa28e26332d311ce',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5fnone',['TJXOP_NONE',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866aad88c0366cd3f7d0eac9d7a3fa1c2c27',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5frot180',['TJXOP_ROT180',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a140952eb8dd0300accfcc22726d69692',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5frot270',['TJXOP_ROT270',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a3064ee5dfb7f032df332818587567a08',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5frot90',['TJXOP_ROT90',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a43b2bbb23bc4bd548422d43fbe9af128',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5ftranspose',['TJXOP_TRANSPOSE',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a31060aed199f886afdd417f80499c32d',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5ftransverse',['TJXOP_TRANSVERSE',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866af3b14d488aea6ece9e5b3df73a74d6a4',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5fvflip',['TJXOP_VFLIP',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a324eddfbec53b7e691f61e56929d0d5d',1,'turbojpeg.h']]],
|
|
||||||
['tjxopt_5fcrop',['TJXOPT_CROP',['../group___turbo_j_p_e_g.html#ga9c771a757fc1294add611906b89ab2d2',1,'turbojpeg.h']]],
|
|
||||||
['tjxopt_5fgray',['TJXOPT_GRAY',['../group___turbo_j_p_e_g.html#ga3acee7b48ade1b99e5588736007c2589',1,'turbojpeg.h']]],
|
|
||||||
['tjxopt_5fnooutput',['TJXOPT_NOOUTPUT',['../group___turbo_j_p_e_g.html#gafbf992bbf6e006705886333703ffab31',1,'turbojpeg.h']]],
|
|
||||||
['tjxopt_5fperfect',['TJXOPT_PERFECT',['../group___turbo_j_p_e_g.html#ga50e03cb5ed115330e212417429600b00',1,'turbojpeg.h']]],
|
|
||||||
['tjxopt_5ftrim',['TJXOPT_TRIM',['../group___turbo_j_p_e_g.html#ga319826b7eb1583c0595bbe7b95428709',1,'turbojpeg.h']]],
|
|
||||||
['turbojpeg',['TurboJPEG',['../group___turbo_j_p_e_g.html',1,'']]]
|
|
||||||
];
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html><head><title></title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
|
||||||
<script type="text/javascript" src="all_77.js"></script>
|
|
||||||
<script type="text/javascript" src="search.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="SRPage">
|
|
||||||
<div id="SRIndex">
|
|
||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
|
||||||
<div id="SRResults"></div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
createResults();
|
|
||||||
--></script>
|
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
document.getElementById("Loading").style.display="none";
|
|
||||||
document.getElementById("NoMatches").style.display="none";
|
|
||||||
var searchResults = new SearchResults("searchResults");
|
|
||||||
searchResults.Search();
|
|
||||||
--></script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['w',['w',['../structtjregion.html#ab6eb73ceef584fc23c8c8097926dce42',1,'tjregion']]]
|
|
||||||
];
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html><head><title></title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
|
||||||
<script type="text/javascript" src="all_78.js"></script>
|
|
||||||
<script type="text/javascript" src="search.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="SRPage">
|
|
||||||
<div id="SRIndex">
|
|
||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
|
||||||
<div id="SRResults"></div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
createResults();
|
|
||||||
--></script>
|
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
document.getElementById("Loading").style.display="none";
|
|
||||||
document.getElementById("NoMatches").style.display="none";
|
|
||||||
var searchResults = new SearchResults("searchResults");
|
|
||||||
searchResults.Search();
|
|
||||||
--></script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['x',['x',['../structtjregion.html#a4b6a37a93997091b26a75831fa291ad9',1,'tjregion']]]
|
|
||||||
];
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html><head><title></title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
|
||||||
<script type="text/javascript" src="all_79.js"></script>
|
|
||||||
<script type="text/javascript" src="search.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="SRPage">
|
|
||||||
<div id="SRIndex">
|
|
||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
|
||||||
<div id="SRResults"></div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
createResults();
|
|
||||||
--></script>
|
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
document.getElementById("Loading").style.display="none";
|
|
||||||
document.getElementById("NoMatches").style.display="none";
|
|
||||||
var searchResults = new SearchResults("searchResults");
|
|
||||||
searchResults.Search();
|
|
||||||
--></script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['y',['y',['../structtjregion.html#a7b3e0c24cfe87acc80e334cafdcf22c2',1,'tjregion']]]
|
|
||||||
];
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html><head><title></title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
|
||||||
<script type="text/javascript" src="classes_74.js"></script>
|
|
||||||
<script type="text/javascript" src="search.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="SRPage">
|
|
||||||
<div id="SRIndex">
|
|
||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
|
||||||
<div id="SRResults"></div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
createResults();
|
|
||||||
--></script>
|
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
document.getElementById("Loading").style.display="none";
|
|
||||||
document.getElementById("NoMatches").style.display="none";
|
|
||||||
var searchResults = new SearchResults("searchResults");
|
|
||||||
searchResults.Search();
|
|
||||||
--></script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['tjregion',['tjregion',['../structtjregion.html',1,'']]],
|
|
||||||
['tjscalingfactor',['tjscalingfactor',['../structtjscalingfactor.html',1,'']]],
|
|
||||||
['tjtransform',['tjtransform',['../structtjtransform.html',1,'']]]
|
|
||||||
];
|
|
||||||
|
Before Width: | Height: | Size: 273 B |
@@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html><head><title></title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
|
||||||
<script type="text/javascript" src="enums_74.js"></script>
|
|
||||||
<script type="text/javascript" src="search.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="SRPage">
|
|
||||||
<div id="SRIndex">
|
|
||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
|
||||||
<div id="SRResults"></div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
createResults();
|
|
||||||
--></script>
|
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
document.getElementById("Loading").style.display="none";
|
|
||||||
document.getElementById("NoMatches").style.display="none";
|
|
||||||
var searchResults = new SearchResults("searchResults");
|
|
||||||
searchResults.Search();
|
|
||||||
--></script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['tjcs',['TJCS',['../group___turbo_j_p_e_g.html#ga4f83ad3368e0e29d1957be0efa7c3720',1,'turbojpeg.h']]],
|
|
||||||
['tjpf',['TJPF',['../group___turbo_j_p_e_g.html#gac916144e26c3817ac514e64ae5d12e2a',1,'turbojpeg.h']]],
|
|
||||||
['tjsamp',['TJSAMP',['../group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074',1,'turbojpeg.h']]],
|
|
||||||
['tjxop',['TJXOP',['../group___turbo_j_p_e_g.html#ga2de531af4e7e6c4f124908376b354866',1,'turbojpeg.h']]]
|
|
||||||
];
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html><head><title></title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
|
||||||
<script type="text/javascript" src="enumvalues_74.js"></script>
|
|
||||||
<script type="text/javascript" src="search.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="SRPage">
|
|
||||||
<div id="SRIndex">
|
|
||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
|
||||||
<div id="SRResults"></div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
createResults();
|
|
||||||
--></script>
|
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
document.getElementById("Loading").style.display="none";
|
|
||||||
document.getElementById("NoMatches").style.display="none";
|
|
||||||
var searchResults = new SearchResults("searchResults");
|
|
||||||
searchResults.Search();
|
|
||||||
--></script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['tjcs_5fcmyk',['TJCS_CMYK',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a6c8b636152ac8195b869587db315ee53',1,'turbojpeg.h']]],
|
|
||||||
['tjcs_5fgray',['TJCS_GRAY',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720ab3e7d6a87f695e45b81c1b5262b5a50a',1,'turbojpeg.h']]],
|
|
||||||
['tjcs_5frgb',['TJCS_RGB',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a677cb7ccb85c4038ac41964a2e09e555',1,'turbojpeg.h']]],
|
|
||||||
['tjcs_5fycbcr',['TJCS_YCbCr',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a7389b8f65bb387ffedce3efd0d78ec75',1,'turbojpeg.h']]],
|
|
||||||
['tjcs_5fycck',['TJCS_YCCK',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a53839e0fe867b76b58d16b0a1a7c598e',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fabgr',['TJPF_ABGR',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa1ba1a7f1631dbeaa49a0a85fc4a40081',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fargb',['TJPF_ARGB',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aae8f846ed9d9de99b6e1dfe448848765c',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fbgr',['TJPF_BGR',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aab10624437fb8ef495a0b153e65749839',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fbgra',['TJPF_BGRA',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aac037ff1845cf9b74bb81a3659c2b9fb4',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fbgrx',['TJPF_BGRX',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa2a1fbf569ca79897eae886e3376ca4c8',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fcmyk',['TJPF_CMYK',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa7f5100ec44c91994e243f1cf55553f8b',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fgray',['TJPF_GRAY',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa5431b54b015337705f13118073711a1a',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5frgb',['TJPF_RGB',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa7ce93230bff449518ce387c17e6ed37c',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5frgba',['TJPF_RGBA',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa88d2e88fab67f6503cf972e14851cc12',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5frgbx',['TJPF_RGBX',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa83973bebb7e2dc6fa8bae89ff3f42e01',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fxbgr',['TJPF_XBGR',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aaf6603b27147de47e212e75dac027b2af',1,'turbojpeg.h']]],
|
|
||||||
['tjpf_5fxrgb',['TJPF_XRGB',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aadae996905efcfa3b42a0bb3bea7f9d84',1,'turbojpeg.h']]],
|
|
||||||
['tjsamp_5f411',['TJSAMP_411',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a28ec62575e5ea295c3fde3001dc628e2',1,'turbojpeg.h']]],
|
|
||||||
['tjsamp_5f420',['TJSAMP_420',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a63085dbf683cfe39e513cdb6343e3737',1,'turbojpeg.h']]],
|
|
||||||
['tjsamp_5f422',['TJSAMP_422',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a136130902cc578f11f32429b59368404',1,'turbojpeg.h']]],
|
|
||||||
['tjsamp_5f440',['TJSAMP_440',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074accf740e6f3aa6ba20ba922cad13cb974',1,'turbojpeg.h']]],
|
|
||||||
['tjsamp_5f444',['TJSAMP_444',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074afb8da4f44197837bdec0a4f593dacae3',1,'turbojpeg.h']]],
|
|
||||||
['tjsamp_5fgray',['TJSAMP_GRAY',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a3f1c9504842ddc7a48d0f690754b6248',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5fhflip',['TJXOP_HFLIP',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866aa0df69776caa30f0fa28e26332d311ce',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5fnone',['TJXOP_NONE',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866aad88c0366cd3f7d0eac9d7a3fa1c2c27',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5frot180',['TJXOP_ROT180',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a140952eb8dd0300accfcc22726d69692',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5frot270',['TJXOP_ROT270',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a3064ee5dfb7f032df332818587567a08',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5frot90',['TJXOP_ROT90',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a43b2bbb23bc4bd548422d43fbe9af128',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5ftranspose',['TJXOP_TRANSPOSE',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a31060aed199f886afdd417f80499c32d',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5ftransverse',['TJXOP_TRANSVERSE',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866af3b14d488aea6ece9e5b3df73a74d6a4',1,'turbojpeg.h']]],
|
|
||||||
['tjxop_5fvflip',['TJXOP_VFLIP',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a324eddfbec53b7e691f61e56929d0d5d',1,'turbojpeg.h']]]
|
|
||||||
];
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html><head><title></title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
|
||||||
<script type="text/javascript" src="functions_74.js"></script>
|
|
||||||
<script type="text/javascript" src="search.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="SRPage">
|
|
||||||
<div id="SRIndex">
|
|
||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
|
||||||
<div id="SRResults"></div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
createResults();
|
|
||||||
--></script>
|
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
document.getElementById("Loading").style.display="none";
|
|
||||||
document.getElementById("NoMatches").style.display="none";
|
|
||||||
var searchResults = new SearchResults("searchResults");
|
|
||||||
searchResults.Search();
|
|
||||||
--></script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['tjalloc',['tjAlloc',['../group___turbo_j_p_e_g.html#ga5c9234bda6d993cdaffdd89bf81a00ff',1,'turbojpeg.h']]],
|
|
||||||
['tjbufsize',['tjBufSize',['../group___turbo_j_p_e_g.html#gaccc5bca7f12fcdcc302e6e1c6d4b311b',1,'turbojpeg.h']]],
|
|
||||||
['tjbufsizeyuv2',['tjBufSizeYUV2',['../group___turbo_j_p_e_g.html#gaf451664a62c1f6c7cc5a6401f32908c9',1,'turbojpeg.h']]],
|
|
||||||
['tjcompress2',['tjCompress2',['../group___turbo_j_p_e_g.html#gaf38f2ed44bdc88e730e08b632fa6e88e',1,'turbojpeg.h']]],
|
|
||||||
['tjcompressfromyuv',['tjCompressFromYUV',['../group___turbo_j_p_e_g.html#ga6f6de375d6ec0020faba627e37e5a060',1,'turbojpeg.h']]],
|
|
||||||
['tjcompressfromyuvplanes',['tjCompressFromYUVPlanes',['../group___turbo_j_p_e_g.html#ga0b84c682d8accf097d7a743c965d3464',1,'turbojpeg.h']]],
|
|
||||||
['tjdecodeyuv',['tjDecodeYUV',['../group___turbo_j_p_e_g.html#ga077c61027b875afecd5a1613bf18b3c1',1,'turbojpeg.h']]],
|
|
||||||
['tjdecodeyuvplanes',['tjDecodeYUVPlanes',['../group___turbo_j_p_e_g.html#gaf42f19b7a496eb18bdc84fe61ee6d3e2',1,'turbojpeg.h']]],
|
|
||||||
['tjdecompress2',['tjDecompress2',['../group___turbo_j_p_e_g.html#gad8026a417e16a76313bc0a6c9e8b2ba2',1,'turbojpeg.h']]],
|
|
||||||
['tjdecompressheader3',['tjDecompressHeader3',['../group___turbo_j_p_e_g.html#ga3fced455e504e8ff4fbad28ba94a3020',1,'turbojpeg.h']]],
|
|
||||||
['tjdecompresstoyuv2',['tjDecompressToYUV2',['../group___turbo_j_p_e_g.html#ga39e08906528db5a764670ea48d344b09',1,'turbojpeg.h']]],
|
|
||||||
['tjdecompresstoyuvplanes',['tjDecompressToYUVPlanes',['../group___turbo_j_p_e_g.html#ga38d0ef90692663b3ffb5b16da2541512',1,'turbojpeg.h']]],
|
|
||||||
['tjdestroy',['tjDestroy',['../group___turbo_j_p_e_g.html#ga674adee917b95ad4a896f1ba39e12540',1,'turbojpeg.h']]],
|
|
||||||
['tjencodeyuv3',['tjEncodeYUV3',['../group___turbo_j_p_e_g.html#gaabe05acd734990053ad1294b5ef239aa',1,'turbojpeg.h']]],
|
|
||||||
['tjencodeyuvplanes',['tjEncodeYUVPlanes',['../group___turbo_j_p_e_g.html#ga8a65ed3bd12df57c219d46afbc9008f1',1,'turbojpeg.h']]],
|
|
||||||
['tjfree',['tjFree',['../group___turbo_j_p_e_g.html#ga8c4a1231dc06a450514c835f6471f137',1,'turbojpeg.h']]],
|
|
||||||
['tjgeterrorstr',['tjGetErrorStr',['../group___turbo_j_p_e_g.html#ga9af79c908ec131b1ae8d52fe40375abf',1,'turbojpeg.h']]],
|
|
||||||
['tjgetscalingfactors',['tjGetScalingFactors',['../group___turbo_j_p_e_g.html#ga6449044b9af402999ccf52f401333be8',1,'turbojpeg.h']]],
|
|
||||||
['tjinitcompress',['tjInitCompress',['../group___turbo_j_p_e_g.html#ga3d10c47fbe4a2489a2b30c931551d01a',1,'turbojpeg.h']]],
|
|
||||||
['tjinitdecompress',['tjInitDecompress',['../group___turbo_j_p_e_g.html#gae5408179d041e2a2f7199c8283cf649e',1,'turbojpeg.h']]],
|
|
||||||
['tjinittransform',['tjInitTransform',['../group___turbo_j_p_e_g.html#ga3155b775bfbac9dbba869b95a0367902',1,'turbojpeg.h']]],
|
|
||||||
['tjplaneheight',['tjPlaneHeight',['../group___turbo_j_p_e_g.html#ga1a209696c6a80748f20e134b3c64789f',1,'turbojpeg.h']]],
|
|
||||||
['tjplanesizeyuv',['tjPlaneSizeYUV',['../group___turbo_j_p_e_g.html#ga6f98d977bfa9d167c97172e876ba61e2',1,'turbojpeg.h']]],
|
|
||||||
['tjplanewidth',['tjPlaneWidth',['../group___turbo_j_p_e_g.html#ga63fb66bb1e36c74008c4634360becbb1',1,'turbojpeg.h']]],
|
|
||||||
['tjtransform',['tjTransform',['../group___turbo_j_p_e_g.html#gad02cd42b69f193a0623a9c801788df3a',1,'turbojpeg.h']]]
|
|
||||||
];
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<html><head><title></title>
|
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
|
||||||
<script type="text/javascript" src="groups_74.js"></script>
|
|
||||||
<script type="text/javascript" src="search.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="SRPage">
|
|
||||||
<div id="SRIndex">
|
|
||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
|
||||||
<div id="SRResults"></div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
createResults();
|
|
||||||
--></script>
|
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
||||||
<script type="text/javascript"><!--
|
|
||||||
document.getElementById("Loading").style.display="none";
|
|
||||||
document.getElementById("NoMatches").style.display="none";
|
|
||||||
var searchResults = new SearchResults("searchResults");
|
|
||||||
searchResults.Search();
|
|
||||||
--></script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||