Compare commits
304 Commits
v4.0.1-rc2
...
2.1.4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8162eddf04 | ||
|
|
2e136a7190 | ||
|
|
9f8f683e74 | ||
|
|
4dbc293125 | ||
|
|
59337a67b1 | ||
|
|
ba22c0f76d | ||
|
|
a405519e96 | ||
|
|
fac8381441 | ||
|
|
290ddbf71a | ||
|
|
9171fd4bde | ||
|
|
d0e7c4548a | ||
|
|
dfc63d42ee | ||
|
|
67cb059046 | ||
|
|
5c8cac97c0 | ||
|
|
df3c3dcb9b | ||
|
|
2ee7264d40 | ||
|
|
30cba2a2f8 | ||
|
|
a014845403 | ||
|
|
f3c716a2bc | ||
|
|
6f1534d618 | ||
|
|
9abeff46d8 | ||
|
|
932b5bb0d5 | ||
|
|
fdab4a7af4 | ||
|
|
0565548191 | ||
|
|
c5f269eb96 | ||
|
|
98bc3eeb3a | ||
|
|
147548c055 | ||
|
|
d640a45730 | ||
|
|
eb21c023ab | ||
|
|
13377e6b38 | ||
|
|
607b668ff9 | ||
|
|
ab6cae6f3b | ||
|
|
3ccb6ead23 | ||
|
|
6441ad0f83 | ||
|
|
6d2d6d3baf | ||
|
|
e1588a2a7b | ||
|
|
548490fe5e | ||
|
|
b579fc114d | ||
|
|
a3d4aadd0d | ||
|
|
d7d16df646 | ||
|
|
14ce28a92d | ||
|
|
da41ab94e7 | ||
|
|
1f55ae7b0f | ||
|
|
172972394a | ||
|
|
a7f0244e9b | ||
|
|
a01857cff6 | ||
|
|
57ba02a408 | ||
|
|
8a9a6dd15a | ||
|
|
73eff6effe | ||
|
|
2ce32e0fe5 | ||
|
|
e869a81a7a | ||
|
|
5446ff88d6 | ||
|
|
0f88060b0f | ||
|
|
ecf021bc0d | ||
|
|
4c5fa566b3 | ||
|
|
d401d62514 | ||
|
|
2fd4ae7b2c | ||
|
|
18edeff4e8 | ||
|
|
a9c41fbc4f | ||
|
|
739ecbc5ec | ||
|
|
4c313544e2 | ||
|
|
173900b1ca | ||
|
|
5d2430f4da | ||
|
|
129f0cb763 | ||
|
|
0a9b972178 | ||
|
|
2849d86aaa | ||
|
|
84d6306f64 | ||
|
|
e6e952d5d5 | ||
|
|
a72816ed07 | ||
|
|
4d9f256b01 | ||
|
|
b201838d8b | ||
|
|
a1bfc05854 | ||
|
|
2a2970af67 | ||
|
|
97a1575cb8 | ||
|
|
0081c2de20 | ||
|
|
9df5786f05 | ||
|
|
1a1fb615db | ||
|
|
5135c2e25d | ||
|
|
3932190c2e | ||
|
|
a219fd13b0 | ||
|
|
c23672ce52 | ||
|
|
4f51f36eb3 | ||
|
|
e0606dafff | ||
|
|
ffc1aa9674 | ||
|
|
55ec9b3b89 | ||
|
|
4de8f6922a | ||
|
|
785ec30eb4 | ||
|
|
d147be83e9 | ||
|
|
8fa70367ed | ||
|
|
171b875b27 | ||
|
|
3ab3234875 | ||
|
|
3e68a5ee20 | ||
|
|
4e45161654 | ||
|
|
629e96eedc | ||
|
|
ebaa67ea32 | ||
|
|
dd830b3ffe | ||
|
|
4ede2ef523 | ||
|
|
5cda8c5e31 | ||
|
|
47b66d1d1e | ||
|
|
55ab0d396c | ||
|
|
18bc4c6114 | ||
|
|
b1079002ad | ||
|
|
3311fc0001 | ||
|
|
34d264d64e | ||
|
|
f35fd27ec6 | ||
|
|
df17d398ec | ||
|
|
cd9a318502 | ||
|
|
d2d4465548 | ||
|
|
5536ace198 | ||
|
|
5dd906beff | ||
|
|
c81e91e8ca | ||
|
|
bff7959e34 | ||
|
|
6ad658be17 | ||
|
|
7b57cba6b4 | ||
|
|
2f9e8a1172 | ||
|
|
e4ec23d7ae | ||
|
|
e795afc330 | ||
|
|
2c01200c5d | ||
|
|
ed70101da2 | ||
|
|
8a2cad0201 | ||
|
|
b6772910d3 | ||
|
|
399aa374bd | ||
|
|
1719d12e51 | ||
|
|
486cdcfb9d | ||
|
|
74e6ea45e3 | ||
|
|
d2c4079959 | ||
|
|
3e8911aad5 | ||
|
|
4b838c38f9 | ||
|
|
944f5915cd | ||
|
|
3179f330b2 | ||
|
|
1388ad6757 | ||
|
|
110d8d6dca | ||
|
|
7b68764905 | ||
|
|
21d056847b | ||
|
|
6e4509a3f1 | ||
|
|
c7ca521bc8 | ||
|
|
ccaba5d789 | ||
|
|
cfc7e6e58e | ||
|
|
4e52b66f34 | ||
|
|
8cf6f716bc | ||
|
|
eb14189caa | ||
|
|
91dd3b23ad | ||
|
|
7e0d94d3a7 | ||
|
|
1c839761cf | ||
|
|
6d91e950c8 | ||
|
|
d523435e18 | ||
|
|
1ac83cd636 | ||
|
|
0ba70b6a13 | ||
|
|
e417033d84 | ||
|
|
6d2e8837b4 | ||
|
|
f7c5489244 | ||
|
|
f7a10a61e3 | ||
|
|
d111d9ff7a | ||
|
|
10ba6ed336 | ||
|
|
292d78e786 | ||
|
|
88bf1d1678 | ||
|
|
8f8305981b | ||
|
|
42f7c78fe3 | ||
|
|
33859880e9 | ||
|
|
3e9e7c7055 | ||
|
|
bbd8089297 | ||
|
|
141f26ff6d | ||
|
|
4574f01f43 | ||
|
|
ba52a3de32 | ||
|
|
240ba417aa | ||
|
|
ed581cd935 | ||
|
|
2c6b68e283 | ||
|
|
2acfb93c94 | ||
|
|
975307775c | ||
|
|
5dbd39323c | ||
|
|
0f35cd68f2 | ||
|
|
f3c3f01d23 | ||
|
|
d0004de5dd | ||
|
|
3d84668d42 | ||
|
|
951d3677eb | ||
|
|
366168aa7d | ||
|
|
f73b1dbc60 | ||
|
|
4f2216b435 | ||
|
|
0efc4858d4 | ||
|
|
02227e48a9 | ||
|
|
c7dd191271 | ||
|
|
40557b2301 | ||
|
|
a524b9b06b | ||
|
|
7c1a1789d2 | ||
|
|
6e632af9f6 | ||
|
|
cd342acf7f | ||
|
|
c3bfbde21d | ||
|
|
a8656d703d | ||
|
|
9ecb67c219 | ||
|
|
53c685b7f4 | ||
|
|
d27b935a88 | ||
|
|
88ae60986e | ||
|
|
7e4eac7021 | ||
|
|
9fc018fd1a | ||
|
|
96e4e7eb60 | ||
|
|
26e3aedbe5 | ||
|
|
b4525f9f16 | ||
|
|
59352195b2 | ||
|
|
f7ca3c5a3d | ||
|
|
1ed312eab6 | ||
|
|
b8200c6601 | ||
|
|
ea8f643c16 | ||
|
|
460dfe40e1 | ||
|
|
ae08115d4d | ||
|
|
b5a1472781 | ||
|
|
190382b75f | ||
|
|
8789a5e255 | ||
|
|
89c88c2509 | ||
|
|
2ec4a5ebe3 | ||
|
|
1d7faf84a0 | ||
|
|
8e895c79e1 | ||
|
|
2b121d39e7 | ||
|
|
2d14fc2e3b | ||
|
|
6ab61fa1d1 | ||
|
|
fe5b6a1c7c | ||
|
|
6ee5d5f568 | ||
|
|
fe79f56b77 | ||
|
|
c1037f4380 | ||
|
|
30282a878c | ||
|
|
a46c111d9f | ||
|
|
9120a24743 | ||
|
|
c965dc7a79 | ||
|
|
b9142b21f8 | ||
|
|
7d829bfa30 | ||
|
|
fb6f5e8b01 | ||
|
|
c77783ed41 | ||
|
|
4c5a15c362 | ||
|
|
b797f70012 | ||
|
|
80d77720c3 | ||
|
|
aecee25695 | ||
|
|
70040cb7ee | ||
|
|
219e8e8f65 | ||
|
|
b0f92a1d6c | ||
|
|
77ff3bd66d | ||
|
|
00d48d7e8c | ||
|
|
9a2cf32317 | ||
|
|
6aabca86d3 | ||
|
|
379edfd815 | ||
|
|
ada6ea5105 | ||
|
|
167b5a8059 | ||
|
|
4c57ad476c | ||
|
|
04d3143a65 | ||
|
|
b34c85ea4a | ||
|
|
c4675d62e8 | ||
|
|
80acd5c4a7 | ||
|
|
5000eaa3a6 | ||
|
|
e98b061282 | ||
|
|
54288598bb | ||
|
|
81b8c0eed5 | ||
|
|
52fef34928 | ||
|
|
e821464f79 | ||
|
|
b8a7680e12 | ||
|
|
f64c5508df | ||
|
|
26b4d62a65 | ||
|
|
9c6f79e919 | ||
|
|
f60b6dd36f | ||
|
|
c43a5081ce | ||
|
|
713c451f58 | ||
|
|
2234deeeed | ||
|
|
82695cfddf | ||
|
|
42825b68d5 | ||
|
|
f2d4b47315 | ||
|
|
45dff48c9f | ||
|
|
d70047fcd2 | ||
|
|
cbf0fcc8b7 | ||
|
|
bbedb4b564 | ||
|
|
087c29e07f | ||
|
|
d92ae5df0c | ||
|
|
adf9cc942f | ||
|
|
95f4d6ef8b | ||
|
|
2ae2bd66b4 | ||
|
|
b7523059c1 | ||
|
|
b4110b65fc | ||
|
|
8ef53b102f | ||
|
|
7fbfe29c65 | ||
|
|
051f4862f9 | ||
|
|
c055c88057 | ||
|
|
85d96d4478 | ||
|
|
f36d531553 | ||
|
|
8a0e35b212 | ||
|
|
afbe48c290 | ||
|
|
98ff5507d8 | ||
|
|
3ca6dba96e | ||
|
|
aaf58dabb6 | ||
|
|
a9075a17c3 | ||
|
|
bdec995839 | ||
|
|
fa905fbf7b | ||
|
|
9aada25ced | ||
|
|
73fd604161 | ||
|
|
2f9e7c84d1 | ||
|
|
3c7199ff06 | ||
|
|
73b98acd8b | ||
|
|
bb0d170288 | ||
|
|
db84125fcb | ||
|
|
ae4221f905 | ||
|
|
674343ab14 | ||
|
|
6fac90945a | ||
|
|
01e3032354 | ||
|
|
42d62bf114 | ||
|
|
a39c970d27 | ||
|
|
12f3d0be84 | ||
|
|
2cc4f93c88 | ||
|
|
133e4af070 | ||
|
|
995eb29dc3 |
4
.gitattributes
vendored
@@ -1,4 +1,4 @@
|
|||||||
/.travis.yml export-ignore
|
|
||||||
/appveyor.yml export-ignore
|
/appveyor.yml export-ignore
|
||||||
/ci export-ignore
|
|
||||||
/.gitattributes export-ignore
|
/.gitattributes export-ignore
|
||||||
|
/.github export-ignore
|
||||||
|
*.ppm binary
|
||||||
|
|||||||
95
.github/CONTRIBUTING.md
vendored
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
Contributing to libjpeg-turbo
|
||||||
|
=============================
|
||||||
|
|
||||||
|
libjpeg-turbo is a stable and mature product with a worldwide reach, it is an
|
||||||
|
ISO/ITU-T reference implementation of the JPEG standard, and its maintainer
|
||||||
|
does not earn a salary for maintaining it. Thus, not every code contribution
|
||||||
|
can or will be accepted into the libjpeg-turbo code base. In order to maximize
|
||||||
|
the chances that a code contribution is acceptable, please adhere to the
|
||||||
|
following guidelines:
|
||||||
|
|
||||||
|
1. If the code contribution is a bug fix, then please ensure that enough
|
||||||
|
information is provided so that the maintainer can readily reproduce and
|
||||||
|
document the bug. That information should include:
|
||||||
|
- A clear and concise description of the bug
|
||||||
|
- The steps and (if applicable) images necessary to reproduce the bug
|
||||||
|
- The compilers, operating systems, and CPUs with which the bug was
|
||||||
|
observed
|
||||||
|
- The versions of libjpeg-turbo with which the bug was observed
|
||||||
|
- If the bug is a regression, the specific commit that introduced the bug
|
||||||
|
(use `git bisect` to determine this)
|
||||||
|
|
||||||
|
2. If the code contribution will implement a major new feature, then please
|
||||||
|
contact the project maintainer (through a
|
||||||
|
[GitHub issue](https://github.com/libjpeg-turbo/libjpeg-turbo/issues/new),
|
||||||
|
[direct e-mail](https://libjpeg-turbo.org/About/Contact), or the
|
||||||
|
[libjpeg-turbo-devel mailing list](https://libjpeg-turbo.org/About/MailingLists))
|
||||||
|
prior to implementing the feature. In general, major new features that are
|
||||||
|
potentially disruptive to the quality of libjpeg-turbo are unlikely to be
|
||||||
|
accepted unless:
|
||||||
|
- The new feature is within the existing scope of libjpeg-turbo.
|
||||||
|
- The new feature has been thoroughly regression tested and benchmarked on
|
||||||
|
all of the supported platforms that are potentially affected by it.
|
||||||
|
- The new feature has been documented clearly and concisely in the change
|
||||||
|
log and (if applicable) the libjpeg and TurboJPEG API documentation and
|
||||||
|
man pages.
|
||||||
|
- The code implementing the new feature is formatted consistently with the
|
||||||
|
rest of the libjpeg-turbo code base (use
|
||||||
|
[checkstyle](https://github.com/libjpeg-turbo/checkstyle) to validate
|
||||||
|
this.)
|
||||||
|
- The new feature does not introduce new members into the exposed libjpeg
|
||||||
|
API structures (doing so would break backward ABI compatibility.)
|
||||||
|
- The new feature does not alter existing libjpeg-turbo usage or
|
||||||
|
development workflows.
|
||||||
|
- The code implementing the new feature is elegant, easily maintainable,
|
||||||
|
and causes the least possible amount of disruption to the libjpeg-turbo
|
||||||
|
code base.
|
||||||
|
- The new feature is based on the dev branch of the libjpeg-turbo
|
||||||
|
repository.
|
||||||
|
|
||||||
|
... OR ...
|
||||||
|
|
||||||
|
- Your organization is prepared to pay for the labor necessary to ensure
|
||||||
|
all of the above. Even the most well-written patches can still require
|
||||||
|
a significant amount of labor to clean up, test, and integrate. (See
|
||||||
|
above RE: the maintainer not earning a salary.)
|
||||||
|
|
||||||
|
Specific types of features that *will not* be accepted:
|
||||||
|
|
||||||
|
- Features that extend the scope of libjpeg-turbo to support image formats
|
||||||
|
other than DCT-based JPEG and JFIF
|
||||||
|
- Features that extend the scope of libjpeg-turbo to support image
|
||||||
|
processing algorithms that are not necessary for JPEG compression or
|
||||||
|
decompression
|
||||||
|
- Extensions to the JPEG format that have not been approved by the
|
||||||
|
appropriate standards bodies
|
||||||
|
- Non-trivial performance enhancements that have less than a 5% overall
|
||||||
|
impact on performance
|
||||||
|
|
||||||
|
3. If the code contribution is a build system enhancement, then please be
|
||||||
|
prepared to justify the enhancement. In general, build system enhancements
|
||||||
|
are unlikely to be accepted unless:
|
||||||
|
- The enhancement is potentially beneficial to a significant number of
|
||||||
|
upstream libjpeg-turbo users/developers. (If the enhancement is only
|
||||||
|
beneficial to a downstream project, then it does not belong here.)
|
||||||
|
- The enhancement has been tested with the following CMake versions:
|
||||||
|
- The earliest version of CMake that libjpeg-turbo currently supports
|
||||||
|
(refer to CMakeLists.txt)
|
||||||
|
- The most recent major version of CMake
|
||||||
|
- (if applicable) The earliest version of CMake with which the
|
||||||
|
enhancement can be used
|
||||||
|
- The enhancement has been tested on all of the major platforms (Mac,
|
||||||
|
Linux, Windows/Visual C++, Windows/MinGW) that are potentially affected
|
||||||
|
by it.
|
||||||
|
- The enhancement does not introduce new build system requirements or CMake
|
||||||
|
variables unless absolutely necessary.
|
||||||
|
- The enhancement does not alter existing libjpeg-turbo development
|
||||||
|
workflows.
|
||||||
|
|
||||||
|
Specific types of build system enhancements that *will not* be accepted:
|
||||||
|
|
||||||
|
- Enhancements that allow libjpeg-turbo to be built from a subdirectory
|
||||||
|
of a downstream repository. These enhancements are not maintainable in
|
||||||
|
the upstream libjpeg-turbo build system. Use the CMake
|
||||||
|
`ExternalProject_Add()` function instead.
|
||||||
|
- Enhancements that introduce new (non-CMake-based) build systems
|
||||||
1
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
github: libjpeg-turbo
|
||||||
40
.github/ISSUE_TEMPLATE/bug-report.md
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
name: Bug Report
|
||||||
|
about: Inform the libjpeg-turbo maintainer about unexpected, reproducible behavior
|
||||||
|
title: ''
|
||||||
|
labels: bug
|
||||||
|
assignees: dcommander
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Have you searched the existing issues (both open and closed) in the libjpeg-turbo issue tracker to ensure that this bug report is not a duplicate?**
|
||||||
|
|
||||||
|
|
||||||
|
**Does this bug report describe one of the [two known and unsolvable issues with the JPEG format](https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf)?**
|
||||||
|
|
||||||
|
|
||||||
|
**Clear and concise description of the bug:**
|
||||||
|
|
||||||
|
|
||||||
|
**Steps to reproduce the bug (using *only* libjpeg-turbo):**
|
||||||
|
|
||||||
|
|
||||||
|
**Image(s) needed in order to reproduce the bug (if applicable):**
|
||||||
|
|
||||||
|
|
||||||
|
**Expected behavior:**
|
||||||
|
|
||||||
|
|
||||||
|
**Observed behavior:**
|
||||||
|
|
||||||
|
|
||||||
|
**Platform(s) (compiler version, operating system version, CPU) on which the bug was observed:**
|
||||||
|
|
||||||
|
|
||||||
|
**libjpeg-turbo release(s), commit(s), or branch(es) in which the bug was observed (always test the tip of the main branch or the latest [stable pre-release](https://libjpeg-turbo.org/DeveloperInfo/PreReleases) to verify that the bug hasn't already been fixed):**
|
||||||
|
|
||||||
|
|
||||||
|
**If the bug is a regression, the specific commit that introduced the regression (use `git bisect` to determine this):**
|
||||||
|
|
||||||
|
|
||||||
|
**Additional information:**
|
||||||
8
.github/ISSUE_TEMPLATE/feature-request.md
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
name: Feature Request
|
||||||
|
about: Suggest new libjpeg-turbo functionality
|
||||||
|
title: ''
|
||||||
|
labels: enhancement
|
||||||
|
assignees: dcommander
|
||||||
|
|
||||||
|
---
|
||||||
193
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
name: Build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
tags-ignore:
|
||||||
|
- '**'
|
||||||
|
pull_request:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
linux:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Set global environment variables
|
||||||
|
run: |
|
||||||
|
echo "BRANCH=${GITHUB_BASE_REF:-${GITHUB_REF#refs/heads/}}" >$GITHUB_ENV
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Set up build
|
||||||
|
run: |
|
||||||
|
mkdir -p $HOME/src/ljt.nightly
|
||||||
|
docker pull dcommander/buildljt:$BRANCH
|
||||||
|
git clone --depth=1 https://github.com/libjpeg-turbo/buildscripts.git -b $BRANCH $HOME/src/buildscripts
|
||||||
|
mkdir $HOME/rpmkeys
|
||||||
|
wget --no-check-certificate "http://www.libjpeg-turbo.org/key/LJTPR-GPG-KEY" -O $HOME/rpmkeys/LJTPR-GPG-KEY
|
||||||
|
- name: Configure GPG signing
|
||||||
|
if: ${{github.event_name != 'pull_request'}}
|
||||||
|
run: |
|
||||||
|
sudo apt install -y gnupg1
|
||||||
|
printf "${{secrets.GPG_KEY}}" | base64 --decode | gpg1 --batch --import -
|
||||||
|
chmod 600 $HOME/.gnupg/gpg.conf
|
||||||
|
echo "GPG_KEY_NAME=\"${{secrets.GPG_KEY_NAME}}\"" >$HOME/src/buildscripts/gpgsign
|
||||||
|
echo "GPG_KEY_ID=${{secrets.GPG_KEY_ID}}" >>$HOME/src/buildscripts/gpgsign
|
||||||
|
echo "GPG_KEY_PASS=${{secrets.GPG_KEY_PASS}}" >>$HOME/src/buildscripts/gpgsign
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
docker run -v $HOME/src/ljt.nightly:/root/src/ljt.nightly -v $HOME/src/buildscripts:/root/src/buildscripts -v $GITHUB_WORKSPACE:/root/src/libjpeg-turbo -v $HOME/.gnupg:/root/.gnupg -v $HOME/rpmkeys:/rpmkeys -t dcommander/buildljt:$BRANCH bash -c "rpm --import /rpmkeys/LJTPR-GPG-KEY && ~/src/buildscripts/buildljt -d /root/src/libjpeg-turbo -v"
|
||||||
|
sudo chown -R runner:runner $HOME/src/ljt.nightly
|
||||||
|
mv $HOME/src/ljt.nightly/latest/log-${{github.job}}.txt $HOME/src/ljt.nightly/latest/files/
|
||||||
|
- name: Configure AWS
|
||||||
|
if: ${{github.event_name != 'pull_request'}}
|
||||||
|
uses: aws-actions/configure-aws-credentials@v1
|
||||||
|
with:
|
||||||
|
aws-access-key-id: ${{secrets.AWS_ACCESS_KEY_ID}}
|
||||||
|
aws-secret-access-key: ${{secrets.AWS_SECRET_ACCESS_KEY}}
|
||||||
|
aws-region: ${{secrets.AWS_REGION}}
|
||||||
|
- name: Deploy
|
||||||
|
if: ${{github.event_name != 'pull_request'}}
|
||||||
|
run: |
|
||||||
|
aws s3 sync --acl public-read --delete $HOME/src/ljt.nightly/latest/files/ s3://libjpeg-turbo-pr/${{env.BRANCH}}/${{github.job}}/
|
||||||
|
macos:
|
||||||
|
runs-on: macos-10.15
|
||||||
|
steps:
|
||||||
|
- name: Set global environment variables
|
||||||
|
run: |
|
||||||
|
echo "BRANCH=${GITHUB_BASE_REF:-${GITHUB_REF#refs/heads/}}" >$GITHUB_ENV
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Set up build
|
||||||
|
run: |
|
||||||
|
brew install yasm md5sha1sum
|
||||||
|
mkdir -p $HOME/src/ljt.nightly
|
||||||
|
git clone --depth=1 https://github.com/libjpeg-turbo/buildscripts.git -b $BRANCH $HOME/src/buildscripts
|
||||||
|
- name: Configure GPG signing
|
||||||
|
if: ${{github.event_name != 'pull_request'}}
|
||||||
|
run: |
|
||||||
|
printf "${{secrets.GPG_KEY}}" | base64 --decode | gpg --batch --import -
|
||||||
|
echo "GPG_KEY_NAME=\"${{secrets.GPG_KEY_NAME}}\"" >$HOME/src/buildscripts/gpgsign
|
||||||
|
echo "GPG_KEY_ID=${{secrets.GPG_KEY_ID}}" >>$HOME/src/buildscripts/gpgsign
|
||||||
|
echo "GPG_KEY_PASS=${{secrets.GPG_KEY_PASS}}" >>$HOME/src/buildscripts/gpgsign
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
$HOME/src/buildscripts/buildljt -d $GITHUB_WORKSPACE -v
|
||||||
|
mv $HOME/src/ljt.nightly/latest/log-${{github.job}}.txt $HOME/src/ljt.nightly/latest/files/
|
||||||
|
- name: Configure AWS
|
||||||
|
if: ${{github.event_name != 'pull_request'}}
|
||||||
|
uses: aws-actions/configure-aws-credentials@v1
|
||||||
|
with:
|
||||||
|
aws-access-key-id: ${{secrets.AWS_ACCESS_KEY_ID}}
|
||||||
|
aws-secret-access-key: ${{secrets.AWS_SECRET_ACCESS_KEY}}
|
||||||
|
aws-region: ${{secrets.AWS_REGION}}
|
||||||
|
- name: Deploy
|
||||||
|
if: ${{github.event_name != 'pull_request'}}
|
||||||
|
run: |
|
||||||
|
aws s3 sync --acl public-read --delete $HOME/src/ljt.nightly/latest/files/ s3://libjpeg-turbo-pr/${{env.BRANCH}}/${{github.job}}/
|
||||||
|
linux-asan-ubsan:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Set up build
|
||||||
|
run: |
|
||||||
|
sudo apt install -y nasm
|
||||||
|
- name: Build
|
||||||
|
env:
|
||||||
|
ASAN_OPTIONS: "detect_leaks=1 symbolize=1"
|
||||||
|
CTEST_OUTPUT_ON_FAILURE: 1
|
||||||
|
run: |
|
||||||
|
mkdir build
|
||||||
|
pushd build
|
||||||
|
cmake -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_C_COMPILER=clang -DCMAKE_C_FLAGS_RELWITHDEBINFO="-O1 -g -fsanitize=address,undefined -fno-sanitize-recover=all -fno-omit-frame-pointer" -DENABLE_SHARED=0 ..
|
||||||
|
export NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
|
||||||
|
make -j$NUMCPUS --load-average=$NUMCPUS
|
||||||
|
make test
|
||||||
|
JSIMD_FORCESSE2=1 make test
|
||||||
|
cmake -DFLOATTEST=no-fp-contract ..
|
||||||
|
JSIMD_FORCENONE=1 make test
|
||||||
|
popd
|
||||||
|
linux-12bit:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Build
|
||||||
|
env:
|
||||||
|
CTEST_OUTPUT_ON_FAILURE: 1
|
||||||
|
run: |
|
||||||
|
mkdir build
|
||||||
|
pushd build
|
||||||
|
cmake -G"Unix Makefiles" -DWITH_12BIT=1 \
|
||||||
|
-DCMAKE_C_FLAGS='--std=gnu90 -Wall -Werror -Wextra -Wpedantic -pedantic-errors -Wdouble-promotion -Wformat-overflow=2 -Wformat-security -Wformat-signedness -Wformat-truncation=2 -Wformat-y2k -Wmissing-include-dirs -Wshift-overflow=2 -Wswitch-bool -Wno-unused-parameter -Wuninitialized -Wstrict-overflow=2 -Wstringop-overflow=4 -Wstringop-truncation -Wduplicated-branches -Wduplicated-cond -Wdeclaration-after-statement -Wshadow -Wunsafe-loop-optimizations -Wundef -Wcast-align -Wno-clobbered -Wjump-misses-init -Wno-sign-compare -Wlogical-op -Waggregate-return -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wno-long-long -Wdisabled-optimization -Wno-overlength-strings' \
|
||||||
|
..
|
||||||
|
export NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
|
||||||
|
make -j$NUMCPUS --load-average=$NUMCPUS
|
||||||
|
make test
|
||||||
|
popd
|
||||||
|
linux-jpeg7-x32:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Set up build
|
||||||
|
run: |
|
||||||
|
sudo apt update
|
||||||
|
sudo apt -y --install-recommends install libc6-dev-x32 nasm
|
||||||
|
- name: Build
|
||||||
|
env:
|
||||||
|
CTEST_OUTPUT_ON_FAILURE: 1
|
||||||
|
run: |
|
||||||
|
mkdir build
|
||||||
|
pushd build
|
||||||
|
cmake -G"Unix Makefiles" -DWITH_JPEG7=1 -DCMAKE_C_FLAGS=-mx32 \
|
||||||
|
-DCMAKE_C_FLAGS='--std=gnu90 -Wall -Werror -Wextra -Wpedantic -pedantic-errors -Wdouble-promotion -Wformat-overflow=2 -Wformat-security -Wformat-signedness -Wformat-truncation=2 -Wformat-y2k -Wmissing-include-dirs -Wshift-overflow=2 -Wswitch-bool -Wno-unused-parameter -Wuninitialized -Wstrict-overflow=2 -Wstringop-overflow=4 -Wstringop-truncation -Wduplicated-branches -Wduplicated-cond -Wdeclaration-after-statement -Wshadow -Wunsafe-loop-optimizations -Wundef -Wcast-align -Wno-clobbered -Wjump-misses-init -Wno-sign-compare -Wlogical-op -Waggregate-return -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wno-long-long -Wdisabled-optimization -Wno-overlength-strings' \
|
||||||
|
..
|
||||||
|
export NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
|
||||||
|
make -j$NUMCPUS --load-average=$NUMCPUS
|
||||||
|
make test
|
||||||
|
JSIMD_FORCESSE2=1 make test
|
||||||
|
cmake -DFLOATTEST=no-fp-contract ..
|
||||||
|
JSIMD_FORCENONE=1 make test
|
||||||
|
popd
|
||||||
|
linux-jpeg8:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Set up build
|
||||||
|
run: |
|
||||||
|
sudo apt -y install nasm
|
||||||
|
- name: Build
|
||||||
|
env:
|
||||||
|
CTEST_OUTPUT_ON_FAILURE: 1
|
||||||
|
run: |
|
||||||
|
mkdir build
|
||||||
|
pushd build
|
||||||
|
cmake -G"Unix Makefiles" -DWITH_JPEG8=1 \
|
||||||
|
-DCMAKE_C_FLAGS='--std=gnu90 -Wall -Werror -Wextra -Wpedantic -pedantic-errors -Wdouble-promotion -Wformat-overflow=2 -Wformat-security -Wformat-signedness -Wformat-truncation=2 -Wformat-y2k -Wmissing-include-dirs -Wshift-overflow=2 -Wswitch-bool -Wno-unused-parameter -Wuninitialized -Wstrict-overflow=2 -Wstringop-overflow=4 -Wstringop-truncation -Wduplicated-branches -Wduplicated-cond -Wdeclaration-after-statement -Wshadow -Wunsafe-loop-optimizations -Wundef -Wcast-align -Wno-clobbered -Wjump-misses-init -Wno-sign-compare -Wlogical-op -Waggregate-return -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wno-long-long -Wdisabled-optimization -Wno-overlength-strings' \
|
||||||
|
..
|
||||||
|
export NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
|
||||||
|
make -j$NUMCPUS --load-average=$NUMCPUS
|
||||||
|
make test
|
||||||
|
JSIMD_FORCESSE2=1 make test
|
||||||
|
cmake -DFLOATTEST=no-fp-contract ..
|
||||||
|
JSIMD_FORCENONE=1 make test
|
||||||
|
popd
|
||||||
|
linux-msan:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Build
|
||||||
|
env:
|
||||||
|
CTEST_OUTPUT_ON_FAILURE: 1
|
||||||
|
run: |
|
||||||
|
mkdir build
|
||||||
|
pushd build
|
||||||
|
cmake -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_C_COMPILER=clang -DCMAKE_C_FLAGS_RELWITHDEBINFO="-O3 -g -fsanitize=memory -fno-sanitize-recover=all -fPIE" -DWITH_SIMD=0 ..
|
||||||
|
export NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
|
||||||
|
make -j$NUMCPUS --load-average=$NUMCPUS
|
||||||
|
make test
|
||||||
|
popd
|
||||||
48
.gitignore
vendored
@@ -1,48 +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
|
|
||||||
test_yuv*.jpg
|
|
||||||
CMakeCache.txt
|
|
||||||
CTestTestfile.cmake
|
|
||||||
258
BUILDING.md
@@ -10,38 +10,24 @@ Build Requirements
|
|||||||
|
|
||||||
- [CMake](http://www.cmake.org) v2.8.12 or later
|
- [CMake](http://www.cmake.org) v2.8.12 or later
|
||||||
|
|
||||||
- [NASM](http://www.nasm.us) or [YASM](http://yasm.tortall.net)
|
- [NASM](http://www.nasm.us) or [Yasm](http://yasm.tortall.net)
|
||||||
(if building x86 or x86-64 SIMD extensions)
|
(if building x86 or x86-64 SIMD extensions)
|
||||||
* If using NASM, 2.10 or later is required.
|
* If using NASM, 2.13 or later is required.
|
||||||
* If using NASM, 2.10 or later (except 2.11.08) is required for an x86-64 Mac
|
* If using Yasm, 1.2.0 or later is required.
|
||||||
build (2.11.08 does not work properly with libjpeg-turbo's x86-64 SIMD code
|
* If building on macOS, NASM or Yasm can be obtained from
|
||||||
when building macho64 objects.)
|
|
||||||
* If using YASM, 1.2.0 or later is required.
|
|
||||||
* If building on macOS, NASM or YASM can be obtained from
|
|
||||||
[MacPorts](http://www.macports.org/) or [Homebrew](http://brew.sh/).
|
[MacPorts](http://www.macports.org/) or [Homebrew](http://brew.sh/).
|
||||||
- NOTE: Currently, if it is desirable to hide the SIMD function symbols in
|
- NOTE: Currently, if it is desirable to hide the SIMD function symbols in
|
||||||
Mac executables or shared libraries that statically link with
|
Mac executables or shared libraries that statically link with
|
||||||
libjpeg-turbo, then NASM 2.14 or later or YASM must be used when
|
libjpeg-turbo, then NASM 2.14 or later or Yasm must be used when
|
||||||
building libjpeg-turbo.
|
building libjpeg-turbo.
|
||||||
* If building on Windows, **nasm.exe**/**yasm.exe** should be in your `PATH`.
|
* If NASM or Yasm is not in your `PATH`, then you can specify the full path
|
||||||
* NASM and YASM are located in the CRB (Code Ready Builder) repository on
|
to the assembler by using either the `CMAKE_ASM_NASM_COMPILER` CMake
|
||||||
Red Hat Enterprise Linux 8 and in the PowerTools repository on CentOS 8,
|
variable or the `ASM_NASM` environment variable. On Windows, use forward
|
||||||
which is not enabled by default.
|
slashes rather than backslashes in the path (for example,
|
||||||
|
**c:/nasm/nasm.exe**).
|
||||||
The binary RPMs released by the NASM project do not work on older Linux
|
* NASM and Yasm are located in the CRB (Code Ready Builder) repository on
|
||||||
systems, such as Red Hat Enterprise Linux 5. On such systems, you can easily
|
Red Hat Enterprise Linux 8 and in the PowerTools repository on RHEL
|
||||||
build and install NASM from a source RPM by downloading one of the SRPMs from
|
derivatives, which is not enabled by default.
|
||||||
|
|
||||||
<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.
|
|
||||||
|
|
||||||
|
|
||||||
### Un*x Platforms (including Linux, Mac, FreeBSD, Solaris, and Cygwin)
|
### Un*x Platforms (including Linux, Mac, FreeBSD, Solaris, and Cygwin)
|
||||||
|
|
||||||
@@ -49,10 +35,8 @@ Build Requirements
|
|||||||
|
|
||||||
- If building the TurboJPEG Java wrapper, JDK or OpenJDK 1.5 or later is
|
- If building the TurboJPEG Java wrapper, JDK or OpenJDK 1.5 or later is
|
||||||
required. Most modern Linux distributions, as well as Solaris 10 and later,
|
required. Most modern Linux distributions, as well as Solaris 10 and later,
|
||||||
include JDK or OpenJDK. On OS X 10.5 and 10.6, it will be necessary to
|
include JDK or OpenJDK. For other systems, you can obtain the Oracle Java
|
||||||
install the Java Developer Package, which can be downloaded from
|
Development Kit from
|
||||||
<http://developer.apple.com/downloads> (Apple ID required.) For other
|
|
||||||
systems, you can obtain the Oracle Java Development Kit from
|
|
||||||
<http://www.oracle.com/technetwork/java/javase/downloads>.
|
<http://www.oracle.com/technetwork/java/javase/downloads>.
|
||||||
|
|
||||||
* If using JDK 11 or later, CMake 3.10.x or later must also be used.
|
* If using JDK 11 or later, CMake 3.10.x or later must also be used.
|
||||||
@@ -62,22 +46,22 @@ Build Requirements
|
|||||||
- Microsoft Visual C++ 2005 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
|
If you don't already have Visual C++, then the easiest way to get it is by
|
||||||
installing the
|
installing
|
||||||
[Windows SDK](http://msdn.microsoft.com/en-us/windows/bb980924.aspx).
|
[Visual Studio Community Edition](https://visualstudio.microsoft.com),
|
||||||
The Windows SDK includes both 32-bit and 64-bit Visual C++ compilers and
|
which includes everything necessary to build libjpeg-turbo.
|
||||||
everything necessary to build libjpeg-turbo.
|
|
||||||
|
|
||||||
* You can also use Microsoft Visual Studio Express/Community Edition, which
|
* You can also download and install the standalone Windows SDK (for Windows 7
|
||||||
is a free download. (NOTE: versions prior to 2012 can only be used to
|
or later), which includes command-line versions of the 32-bit and 64-bit
|
||||||
build 32-bit code.)
|
Visual C++ compilers.
|
||||||
* If you intend to build libjpeg-turbo from the command line, then add the
|
* If you intend to build libjpeg-turbo from the command line, then add the
|
||||||
appropriate compiler and SDK directories to the `INCLUDE`, `LIB`, and
|
appropriate compiler and SDK directories to the `INCLUDE`, `LIB`, and
|
||||||
`PATH` environment variables. This is generally accomplished by
|
`PATH` environment variables. This is generally accomplished by
|
||||||
executing `vcvars32.bat` or `vcvars64.bat` and `SetEnv.cmd`.
|
executing `vcvars32.bat` or `vcvars64.bat`, which are located in the same
|
||||||
`vcvars32.bat` and `vcvars64.bat` are part of Visual C++ and are located in
|
directory as the compiler.
|
||||||
the same directory as the compiler. `SetEnv.cmd` is part of the Windows
|
* If built with Visual C++ 2015 or later, the libjpeg-turbo static libraries
|
||||||
SDK. You can pass optional arguments to `SetEnv.cmd` to specify a 32-bit
|
cannot be used with earlier versions of Visual C++, and vice versa.
|
||||||
or 64-bit build environment.
|
* The libjpeg API DLL (**jpeg{version}.dll**) will depend on the C run-time
|
||||||
|
DLLs corresponding to the version of Visual C++ that was used to build it.
|
||||||
|
|
||||||
... OR ...
|
... OR ...
|
||||||
|
|
||||||
@@ -94,17 +78,13 @@ Build Requirements
|
|||||||
|
|
||||||
* If using JDK 11 or later, CMake 3.10.x or later must also be used.
|
* If using JDK 11 or later, CMake 3.10.x or later must also be used.
|
||||||
|
|
||||||
- Vcpkg
|
|
||||||
|
|
||||||
You can download and install mozjpeg using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager:
|
Sub-Project Builds
|
||||||
|
------------------
|
||||||
|
|
||||||
git clone https://github.com/Microsoft/vcpkg.git
|
The libjpeg-turbo build system does not support being included as a sub-project
|
||||||
cd vcpkg
|
using the CMake `add_subdirectory()` function. Use the CMake
|
||||||
./bootstrap-vcpkg.sh
|
`ExternalProject_Add()` function instead.
|
||||||
./vcpkg integrate install
|
|
||||||
vcpkg install mozjpeg
|
|
||||||
|
|
||||||
The mozjpeg port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.
|
|
||||||
|
|
||||||
|
|
||||||
Out-of-Tree Builds
|
Out-of-Tree Builds
|
||||||
@@ -120,6 +100,14 @@ directory, whereas *{source_directory}* refers to the libjpeg-turbo source
|
|||||||
directory. For in-tree builds, these directories are the same.
|
directory. For in-tree builds, these directories are the same.
|
||||||
|
|
||||||
|
|
||||||
|
Ninja
|
||||||
|
-----
|
||||||
|
|
||||||
|
If using Ninja, then replace `make` or `nmake` with `ninja`, and replace the
|
||||||
|
CMake generator (specified with the `-G` option) with `Ninja`, in all of the
|
||||||
|
procedures and recipes below.
|
||||||
|
|
||||||
|
|
||||||
Build Procedure
|
Build Procedure
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
@@ -345,7 +333,7 @@ Build Recipes
|
|||||||
-------------
|
-------------
|
||||||
|
|
||||||
|
|
||||||
### 32-bit Build on 64-bit Linux/Unix/Mac
|
### 32-bit Build on 64-bit Linux/Unix
|
||||||
|
|
||||||
Use export/setenv to set the following environment variables before running
|
Use export/setenv to set the following environment variables before running
|
||||||
CMake:
|
CMake:
|
||||||
@@ -410,117 +398,23 @@ located (usually **/usr/bin**.) Next, execute the following commands:
|
|||||||
Building libjpeg-turbo for iOS
|
Building libjpeg-turbo for iOS
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
iOS platforms, such as the iPhone and iPad, use ARM processors, and all
|
iOS platforms, such as the iPhone and iPad, use Arm processors, and all
|
||||||
currently supported models include NEON instructions. Thus, they can take
|
currently supported models include Neon instructions. Thus, they can take
|
||||||
advantage of libjpeg-turbo's SIMD extensions to significantly accelerate JPEG
|
advantage of libjpeg-turbo's SIMD extensions to significantly accelerate JPEG
|
||||||
compression/decompression. This section describes how to build libjpeg-turbo
|
compression/decompression. This section describes how to build libjpeg-turbo
|
||||||
for these platforms.
|
for these platforms.
|
||||||
|
|
||||||
|
|
||||||
### Additional build requirements
|
### Armv8 (64-bit)
|
||||||
|
|
||||||
- For configurations that require [gas-preprocessor.pl]
|
**Xcode 5 or later required, Xcode 6.3.x or later recommended**
|
||||||
(https://raw.githubusercontent.com/libjpeg-turbo/gas-preprocessor/master/gas-preprocessor.pl),
|
|
||||||
it should be installed in your `PATH`.
|
|
||||||
|
|
||||||
|
|
||||||
### ARMv7 (32-bit)
|
|
||||||
|
|
||||||
**gas-preprocessor.pl required**
|
|
||||||
|
|
||||||
The following scripts demonstrate how to build libjpeg-turbo to run on the
|
|
||||||
iPhone 3GS-4S/iPad 1st-3rd Generation and newer:
|
|
||||||
|
|
||||||
#### Xcode 4.2 and earlier (LLVM-GCC)
|
|
||||||
|
|
||||||
IOS_PLATFORMDIR=/Developer/Platforms/iPhoneOS.platform
|
|
||||||
IOS_SYSROOT=($IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS*.sdk)
|
|
||||||
export CFLAGS="-mfloat-abi=softfp -march=armv7 -mcpu=cortex-a8 -mtune=cortex-a8 -mfpu=neon -miphoneos-version-min=3.0"
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
|
|
||||||
cat <<EOF >toolchain.cmake
|
|
||||||
set(CMAKE_SYSTEM_NAME Darwin)
|
|
||||||
set(CMAKE_SYSTEM_PROCESSOR arm)
|
|
||||||
set(CMAKE_C_COMPILER ${IOS_PLATFORMDIR}/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2)
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cmake -G"Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake \
|
|
||||||
-DCMAKE_OSX_SYSROOT=${IOS_SYSROOT[0]} \
|
|
||||||
[additional CMake flags] {source_directory}
|
|
||||||
make
|
|
||||||
|
|
||||||
#### Xcode 4.3-4.6 (LLVM-GCC)
|
|
||||||
|
|
||||||
Same as above, but replace the first line with:
|
|
||||||
|
|
||||||
IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
|
|
||||||
|
|
||||||
#### Xcode 5 and later (Clang)
|
|
||||||
|
|
||||||
IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
|
|
||||||
IOS_SYSROOT=($IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS*.sdk)
|
|
||||||
export CFLAGS="-mfloat-abi=softfp -arch armv7 -miphoneos-version-min=3.0"
|
|
||||||
export ASMFLAGS="-no-integrated-as"
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
|
|
||||||
cat <<EOF >toolchain.cmake
|
|
||||||
set(CMAKE_SYSTEM_NAME Darwin)
|
|
||||||
set(CMAKE_SYSTEM_PROCESSOR arm)
|
|
||||||
set(CMAKE_C_COMPILER /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang)
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cmake -G"Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake \
|
|
||||||
-DCMAKE_OSX_SYSROOT=${IOS_SYSROOT[0]} \
|
|
||||||
[additional CMake flags] {source_directory}
|
|
||||||
make
|
|
||||||
|
|
||||||
|
|
||||||
### ARMv7s (32-bit)
|
|
||||||
|
|
||||||
**gas-preprocessor.pl required**
|
|
||||||
|
|
||||||
The following scripts demonstrate how to build libjpeg-turbo to run on the
|
|
||||||
iPhone 5/iPad 4th Generation and newer:
|
|
||||||
|
|
||||||
#### Xcode 4.5-4.6 (LLVM-GCC)
|
|
||||||
|
|
||||||
IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
|
|
||||||
IOS_SYSROOT=($IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS*.sdk)
|
|
||||||
export CFLAGS="-Wall -mfloat-abi=softfp -march=armv7s -mcpu=swift -mtune=swift -mfpu=neon -miphoneos-version-min=6.0"
|
|
||||||
|
|
||||||
cd {build_directory}
|
|
||||||
|
|
||||||
cat <<EOF >toolchain.cmake
|
|
||||||
set(CMAKE_SYSTEM_NAME Darwin)
|
|
||||||
set(CMAKE_SYSTEM_PROCESSOR arm)
|
|
||||||
set(CMAKE_C_COMPILER ${IOS_PLATFORMDIR}/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2)
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cmake -G"Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake \
|
|
||||||
-DCMAKE_OSX_SYSROOT=${IOS_SYSROOT[0]} \
|
|
||||||
[additional CMake flags] {source_directory}
|
|
||||||
make
|
|
||||||
|
|
||||||
#### Xcode 5 and later (Clang)
|
|
||||||
|
|
||||||
Same as the ARMv7 build procedure for Xcode 5 and later, except replace the
|
|
||||||
compiler flags as follows:
|
|
||||||
|
|
||||||
export CFLAGS="-Wall -mfloat-abi=softfp -arch armv7s -miphoneos-version-min=6.0"
|
|
||||||
|
|
||||||
|
|
||||||
### ARMv8 (64-bit)
|
|
||||||
|
|
||||||
**gas-preprocessor.pl required if using Xcode < 6**
|
|
||||||
|
|
||||||
The following script demonstrates how to build libjpeg-turbo to run on the
|
The following script demonstrates how to build libjpeg-turbo to run on the
|
||||||
iPhone 5S/iPad Mini 2/iPad Air and newer.
|
iPhone 5S/iPad Mini 2/iPad Air and newer.
|
||||||
|
|
||||||
IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
|
IOS_PLATFORMDIR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
|
||||||
IOS_SYSROOT=($IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS*.sdk)
|
IOS_SYSROOT=($IOS_PLATFORMDIR/Developer/SDKs/iPhoneOS*.sdk)
|
||||||
export CFLAGS="-Wall -arch arm64 -miphoneos-version-min=7.0 -funwind-tables"
|
export CFLAGS="-Wall -arch arm64 -miphoneos-version-min=8.0 -funwind-tables"
|
||||||
|
|
||||||
cd {build_directory}
|
cd {build_directory}
|
||||||
|
|
||||||
@@ -535,9 +429,6 @@ iPhone 5S/iPad Mini 2/iPad Air and newer.
|
|||||||
[additional CMake flags] {source_directory}
|
[additional CMake flags] {source_directory}
|
||||||
make
|
make
|
||||||
|
|
||||||
Once built, lipo can be used to combine the ARMv7, v7s, and/or v8 variants into
|
|
||||||
a universal library.
|
|
||||||
|
|
||||||
|
|
||||||
Building libjpeg-turbo for Android
|
Building libjpeg-turbo for Android
|
||||||
----------------------------------
|
----------------------------------
|
||||||
@@ -546,7 +437,9 @@ Building libjpeg-turbo for Android platforms requires v13b or later of the
|
|||||||
[Android NDK](https://developer.android.com/tools/sdk/ndk).
|
[Android NDK](https://developer.android.com/tools/sdk/ndk).
|
||||||
|
|
||||||
|
|
||||||
### ARMv7 (32-bit)
|
### Armv7 (32-bit)
|
||||||
|
|
||||||
|
**NDK r19 or later with Clang recommended**
|
||||||
|
|
||||||
The following is a general recipe script that can be modified for your specific
|
The following is a general recipe script that can be modified for your specific
|
||||||
needs.
|
needs.
|
||||||
@@ -571,7 +464,9 @@ needs.
|
|||||||
make
|
make
|
||||||
|
|
||||||
|
|
||||||
### ARMv8 (64-bit)
|
### Armv8 (64-bit)
|
||||||
|
|
||||||
|
**Clang recommended**
|
||||||
|
|
||||||
The following is a general recipe script that can be modified for your specific
|
The following is a general recipe script that can be modified for your specific
|
||||||
needs.
|
needs.
|
||||||
@@ -747,44 +642,23 @@ Mac
|
|||||||
make dmg
|
make dmg
|
||||||
|
|
||||||
Create Mac package/disk image. This requires pkgbuild and productbuild, which
|
Create Mac 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
|
are installed by default on OS X/macOS 10.7 and later.
|
||||||
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
|
In order to create a Mac package/disk image that contains universal
|
||||||
|
x86-64/Arm binaries, set the following CMake variable:
|
||||||
|
|
||||||
This creates a Mac package/disk image that contains universal x86-64/i386/ARM
|
* `ARMV8_BUILD`: Directory containing an Armv8 (64-bit) iOS or macOS build of
|
||||||
binaries. The following CMake variables control which architectures are
|
libjpeg-turbo to include in the universal binaries
|
||||||
included in the universal binaries. Setting any of these variables to an empty
|
|
||||||
string excludes that architecture from the package.
|
|
||||||
|
|
||||||
* `OSX_32BIT_BUILD`: Directory containing an i386 (32-bit) Mac build of
|
You should first use CMake to configure an Armv8 sub-build of libjpeg-turbo
|
||||||
libjpeg-turbo (default: *{source_directory}*/osxx86)
|
(see "Building libjpeg-turbo for iOS" above, if applicable) in a build
|
||||||
* `IOS_ARMV7_BUILD`: Directory containing an ARMv7 (32-bit) iOS build of
|
directory that matches the one specified in the aforementioned CMake variable.
|
||||||
libjpeg-turbo (default: *{source_directory}*/iosarmv7)
|
Next, configure the primary (x86-64) build of libjpeg-turbo as an out-of-tree
|
||||||
* `IOS_ARMV7S_BUILD`: Directory containing an ARMv7s (32-bit) iOS build of
|
build, specifying the aforementioned CMake variable, and build it. Once the
|
||||||
libjpeg-turbo (default: *{source_directory}*/iosarmv7s)
|
primary build has been built, run `make dmg` from the build directory. The
|
||||||
* `IOS_ARMV8_BUILD`: Directory containing an ARMv8 (64-bit) iOS build of
|
packaging system will build the sub-build, use lipo to combine it with the
|
||||||
libjpeg-turbo (default: *{source_directory}*/iosarmv8)
|
primary build into a single set of universal binaries, then package the
|
||||||
|
universal binaries.
|
||||||
You should first use CMake to configure i386, ARMv7, ARMv7s, and/or ARMv8
|
|
||||||
sub-builds of libjpeg-turbo (see "Build Recipes" and "Building libjpeg-turbo
|
|
||||||
for iOS" above) in build directories that match those specified in the
|
|
||||||
aforementioned CMake variables. Next, configure the primary build of
|
|
||||||
libjpeg-turbo as an out-of-tree build, and build it. Once the primary build
|
|
||||||
has been built, run `make udmg` from the build directory. The packaging system
|
|
||||||
will build the sub-builds, use lipo to combine them into a single set of
|
|
||||||
universal binaries, then package the universal binaries in the same manner as
|
|
||||||
`make dmg`.
|
|
||||||
|
|
||||||
|
|
||||||
Cygwin
|
|
||||||
------
|
|
||||||
|
|
||||||
make cygwinpkg
|
|
||||||
|
|
||||||
Build a Cygwin binary package.
|
|
||||||
|
|
||||||
|
|
||||||
Windows
|
Windows
|
||||||
|
|||||||
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.
|
|
||||||
311
CMakeLists.txt
@@ -1,11 +1,17 @@
|
|||||||
cmake_minimum_required(VERSION 2.8.12)
|
cmake_minimum_required(VERSION 2.8.12)
|
||||||
|
# When using CMake 3.4 and later, don't export symbols from executables unless
|
||||||
|
# the CMAKE_ENABLE_EXPORTS variable is set.
|
||||||
|
if(POLICY CMP0065)
|
||||||
|
cmake_policy(SET CMP0065 NEW)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(CMAKE_EXECUTABLE_SUFFIX)
|
if(CMAKE_EXECUTABLE_SUFFIX)
|
||||||
set(CMAKE_EXECUTABLE_SUFFIX_TMP ${CMAKE_EXECUTABLE_SUFFIX})
|
set(CMAKE_EXECUTABLE_SUFFIX_TMP ${CMAKE_EXECUTABLE_SUFFIX})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
project(mozjpeg C)
|
project(libjpeg-turbo C)
|
||||||
set(VERSION 4.0.1)
|
set(VERSION 2.1.4)
|
||||||
|
set(COPYRIGHT_YEAR "1991-2022")
|
||||||
string(REPLACE "." ";" VERSION_TRIPLET ${VERSION})
|
string(REPLACE "." ";" VERSION_TRIPLET ${VERSION})
|
||||||
list(GET VERSION_TRIPLET 0 VERSION_MAJOR)
|
list(GET VERSION_TRIPLET 0 VERSION_MAJOR)
|
||||||
list(GET VERSION_TRIPLET 1 VERSION_MINOR)
|
list(GET VERSION_TRIPLET 1 VERSION_MINOR)
|
||||||
@@ -25,6 +31,15 @@ pad_number(VERSION_MINOR 3)
|
|||||||
pad_number(VERSION_REVISION 3)
|
pad_number(VERSION_REVISION 3)
|
||||||
set(LIBJPEG_TURBO_VERSION_NUMBER ${VERSION_MAJOR}${VERSION_MINOR}${VERSION_REVISION})
|
set(LIBJPEG_TURBO_VERSION_NUMBER ${VERSION_MAJOR}${VERSION_MINOR}${VERSION_REVISION})
|
||||||
|
|
||||||
|
# CMake 3.14 and later sets CMAKE_MACOSX_BUNDLE to TRUE by default when
|
||||||
|
# CMAKE_SYSTEM_NAME is iOS, tvOS, or watchOS, which breaks the libjpeg-turbo
|
||||||
|
# build. (Specifically, when CMAKE_MACOSX_BUNDLE is TRUE, executables for
|
||||||
|
# Apple platforms are built as application bundles, which causes CMake to
|
||||||
|
# complain that our install() directives for executables do not specify a
|
||||||
|
# BUNDLE DESTINATION. Even if CMake did not complain, building executables as
|
||||||
|
# application bundles would break our iOS packages.)
|
||||||
|
set(CMAKE_MACOSX_BUNDLE FALSE)
|
||||||
|
|
||||||
string(TIMESTAMP DEFAULT_BUILD "%Y%m%d")
|
string(TIMESTAMP DEFAULT_BUILD "%Y%m%d")
|
||||||
set(BUILD ${DEFAULT_BUILD} CACHE STRING "Build string (default: ${DEFAULT_BUILD})")
|
set(BUILD ${DEFAULT_BUILD} CACHE STRING "Build string (default: ${DEFAULT_BUILD})")
|
||||||
|
|
||||||
@@ -38,15 +53,24 @@ message(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
|
|||||||
|
|
||||||
message(STATUS "VERSION = ${VERSION}, BUILD = ${BUILD}")
|
message(STATUS "VERSION = ${VERSION}, BUILD = ${BUILD}")
|
||||||
|
|
||||||
|
include(cmakescripts/PackageInfo.cmake)
|
||||||
|
|
||||||
# Detect CPU type and whether we're building 64-bit or 32-bit code
|
# Detect CPU type and whether we're building 64-bit or 32-bit code
|
||||||
math(EXPR BITS "${CMAKE_SIZEOF_VOID_P} * 8")
|
math(EXPR BITS "${CMAKE_SIZEOF_VOID_P} * 8")
|
||||||
string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} CMAKE_SYSTEM_PROCESSOR_LC)
|
string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} CMAKE_SYSTEM_PROCESSOR_LC)
|
||||||
|
set(COUNT 1)
|
||||||
|
foreach(ARCH ${CMAKE_OSX_ARCHITECTURES})
|
||||||
|
if(COUNT GREATER 1)
|
||||||
|
message(FATAL_ERROR "The libjpeg-turbo build system does not support multiple values in CMAKE_OSX_ARCHITECTURES.")
|
||||||
|
endif()
|
||||||
|
math(EXPR COUNT "${COUNT}+1")
|
||||||
|
endforeach()
|
||||||
if(CMAKE_SYSTEM_PROCESSOR_LC MATCHES "x86_64" OR
|
if(CMAKE_SYSTEM_PROCESSOR_LC MATCHES "x86_64" OR
|
||||||
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "amd64" OR
|
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "amd64" OR
|
||||||
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "i[0-9]86" OR
|
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "i[0-9]86" OR
|
||||||
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "x86" OR
|
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "x86" OR
|
||||||
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "ia32")
|
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "ia32")
|
||||||
if(BITS EQUAL 64)
|
if(BITS EQUAL 64 OR CMAKE_C_COMPILER_ABI MATCHES "ELF X32")
|
||||||
set(CPU_TYPE x86_64)
|
set(CPU_TYPE x86_64)
|
||||||
else()
|
else()
|
||||||
set(CPU_TYPE i386)
|
set(CPU_TYPE i386)
|
||||||
@@ -55,16 +79,30 @@ if(CMAKE_SYSTEM_PROCESSOR_LC MATCHES "x86_64" OR
|
|||||||
set(CMAKE_SYSTEM_PROCESSOR ${CPU_TYPE})
|
set(CMAKE_SYSTEM_PROCESSOR ${CPU_TYPE})
|
||||||
endif()
|
endif()
|
||||||
elseif(CMAKE_SYSTEM_PROCESSOR_LC STREQUAL "aarch64" OR
|
elseif(CMAKE_SYSTEM_PROCESSOR_LC STREQUAL "aarch64" OR
|
||||||
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "arm*64*")
|
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "^arm")
|
||||||
|
if(BITS EQUAL 64)
|
||||||
set(CPU_TYPE arm64)
|
set(CPU_TYPE arm64)
|
||||||
elseif(CMAKE_SYSTEM_PROCESSOR_LC MATCHES "arm*")
|
else()
|
||||||
set(CPU_TYPE arm)
|
set(CPU_TYPE arm)
|
||||||
elseif(CMAKE_SYSTEM_PROCESSOR_LC MATCHES "ppc*" OR
|
endif()
|
||||||
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "powerpc*")
|
elseif(CMAKE_SYSTEM_PROCESSOR_LC MATCHES "^ppc" OR
|
||||||
|
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "^powerpc")
|
||||||
set(CPU_TYPE powerpc)
|
set(CPU_TYPE powerpc)
|
||||||
else()
|
else()
|
||||||
set(CPU_TYPE ${CMAKE_SYSTEM_PROCESSOR_LC})
|
set(CPU_TYPE ${CMAKE_SYSTEM_PROCESSOR_LC})
|
||||||
endif()
|
endif()
|
||||||
|
if(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" OR
|
||||||
|
CMAKE_OSX_ARCHITECTURES MATCHES "arm64" OR
|
||||||
|
CMAKE_OSX_ARCHITECTURES MATCHES "i386")
|
||||||
|
set(CPU_TYPE ${CMAKE_OSX_ARCHITECTURES})
|
||||||
|
endif()
|
||||||
|
if(CMAKE_OSX_ARCHITECTURES MATCHES "ppc")
|
||||||
|
set(CPU_TYPE powerpc)
|
||||||
|
endif()
|
||||||
|
if(MSVC_IDE AND CMAKE_GENERATOR_PLATFORM MATCHES "arm64")
|
||||||
|
set(CPU_TYPE arm64)
|
||||||
|
endif()
|
||||||
|
|
||||||
message(STATUS "${BITS}-bit build (${CPU_TYPE})")
|
message(STATUS "${BITS}-bit build (${CPU_TYPE})")
|
||||||
|
|
||||||
|
|
||||||
@@ -82,7 +120,9 @@ if(WIN32)
|
|||||||
set(CMAKE_INSTALL_DEFAULT_PREFIX "${CMAKE_INSTALL_DEFAULT_PREFIX}64")
|
set(CMAKE_INSTALL_DEFAULT_PREFIX "${CMAKE_INSTALL_DEFAULT_PREFIX}64")
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
|
if(NOT CMAKE_INSTALL_DEFAULT_PREFIX)
|
||||||
set(CMAKE_INSTALL_DEFAULT_PREFIX /opt/${CMAKE_PROJECT_NAME})
|
set(CMAKE_INSTALL_DEFAULT_PREFIX /opt/${CMAKE_PROJECT_NAME})
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
||||||
set(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_DEFAULT_PREFIX}" CACHE PATH
|
set(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_DEFAULT_PREFIX}" CACHE PATH
|
||||||
@@ -101,6 +141,8 @@ if(CMAKE_INSTALL_PREFIX STREQUAL "${CMAKE_INSTALL_DEFAULT_PREFIX}")
|
|||||||
if(UNIX AND NOT APPLE)
|
if(UNIX AND NOT APPLE)
|
||||||
if(BITS EQUAL 64)
|
if(BITS EQUAL 64)
|
||||||
set(CMAKE_INSTALL_DEFAULT_LIBDIR "lib64")
|
set(CMAKE_INSTALL_DEFAULT_LIBDIR "lib64")
|
||||||
|
elseif(CMAKE_C_COMPILER_ABI MATCHES "ELF X32")
|
||||||
|
set(CMAKE_INSTALL_DEFAULT_LIBDIR "libx32")
|
||||||
else()
|
else()
|
||||||
set(CMAKE_INSTALL_DEFAULT_LIBDIR "lib32")
|
set(CMAKE_INSTALL_DEFAULT_LIBDIR "lib32")
|
||||||
endif()
|
endif()
|
||||||
@@ -133,9 +175,9 @@ endforeach()
|
|||||||
|
|
||||||
macro(boolean_number var)
|
macro(boolean_number var)
|
||||||
if(${var})
|
if(${var})
|
||||||
set(${var} 1)
|
set(${var} 1 ${ARGN})
|
||||||
else()
|
else()
|
||||||
set(${var} 0)
|
set(${var} 0 ${ARGN})
|
||||||
endif()
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
@@ -145,16 +187,18 @@ option(ENABLE_STATIC "Build static libraries" TRUE)
|
|||||||
boolean_number(ENABLE_STATIC)
|
boolean_number(ENABLE_STATIC)
|
||||||
option(REQUIRE_SIMD "Generate a fatal error if SIMD extensions are not available for this platform (default is to fall back to a non-SIMD build)" FALSE)
|
option(REQUIRE_SIMD "Generate a fatal error if SIMD extensions are not available for this platform (default is to fall back to a non-SIMD build)" FALSE)
|
||||||
boolean_number(REQUIRE_SIMD)
|
boolean_number(REQUIRE_SIMD)
|
||||||
option(PNG_SUPPORTED "Enable PNG support (requires libpng)" TRUE)
|
|
||||||
boolean_number(PNG_SUPPORTED)
|
|
||||||
option(WITH_12BIT "Encode/decode JPEG images with 12-bit samples (implies WITH_ARITH_DEC=0 WITH_ARITH_ENC=0 WITH_JAVA=0 WITH_SIMD=0 WITH_TURBOJPEG=0 )" FALSE)
|
option(WITH_12BIT "Encode/decode JPEG images with 12-bit samples (implies WITH_ARITH_DEC=0 WITH_ARITH_ENC=0 WITH_JAVA=0 WITH_SIMD=0 WITH_TURBOJPEG=0 )" FALSE)
|
||||||
boolean_number(WITH_12BIT)
|
boolean_number(WITH_12BIT)
|
||||||
option(WITH_ARITH_DEC "Include arithmetic decoding support when emulating the libjpeg v6b API/ABI" FALSE)
|
option(WITH_ARITH_DEC "Include arithmetic decoding support when emulating the libjpeg v6b API/ABI" TRUE)
|
||||||
boolean_number(WITH_ARITH_DEC)
|
boolean_number(WITH_ARITH_DEC)
|
||||||
option(WITH_ARITH_ENC "Include arithmetic encoding support when emulating the libjpeg v6b API/ABI" FALSE)
|
option(WITH_ARITH_ENC "Include arithmetic encoding support when emulating the libjpeg v6b API/ABI" TRUE)
|
||||||
boolean_number(WITH_ARITH_ENC)
|
boolean_number(WITH_ARITH_ENC)
|
||||||
option(WITH_JAVA "Build Java wrapper for the TurboJPEG API library (implies ENABLE_SHARED=1)" FALSE)
|
if(CMAKE_C_COMPILER_ABI MATCHES "ELF X32")
|
||||||
boolean_number(WITH_JAVA)
|
set(WITH_JAVA 0)
|
||||||
|
else()
|
||||||
|
option(WITH_JAVA "Build Java wrapper for the TurboJPEG API library (implies ENABLE_SHARED=1)" FALSE)
|
||||||
|
boolean_number(WITH_JAVA)
|
||||||
|
endif()
|
||||||
option(WITH_JPEG7 "Emulate libjpeg v7 API/ABI (this makes ${CMAKE_PROJECT_NAME} backward-incompatible with libjpeg v6b)" FALSE)
|
option(WITH_JPEG7 "Emulate libjpeg v7 API/ABI (this makes ${CMAKE_PROJECT_NAME} backward-incompatible with libjpeg v6b)" FALSE)
|
||||||
boolean_number(WITH_JPEG7)
|
boolean_number(WITH_JPEG7)
|
||||||
option(WITH_JPEG8 "Emulate libjpeg v8 API/ABI (this makes ${CMAKE_PROJECT_NAME} backward-incompatible with libjpeg v6b)" FALSE)
|
option(WITH_JPEG8 "Emulate libjpeg v8 API/ABI (this makes ${CMAKE_PROJECT_NAME} backward-incompatible with libjpeg v6b)" FALSE)
|
||||||
@@ -165,6 +209,7 @@ option(WITH_SIMD "Include SIMD extensions, if available for this platform" TRUE)
|
|||||||
boolean_number(WITH_SIMD)
|
boolean_number(WITH_SIMD)
|
||||||
option(WITH_TURBOJPEG "Include the TurboJPEG API library and associated test programs" TRUE)
|
option(WITH_TURBOJPEG "Include the TurboJPEG API library and associated test programs" TRUE)
|
||||||
boolean_number(WITH_TURBOJPEG)
|
boolean_number(WITH_TURBOJPEG)
|
||||||
|
option(WITH_FUZZ "Build fuzz targets" FALSE)
|
||||||
|
|
||||||
macro(report_option var desc)
|
macro(report_option var desc)
|
||||||
if(${var})
|
if(${var})
|
||||||
@@ -195,6 +240,14 @@ if(ENABLE_SHARED)
|
|||||||
set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_FULL_LIBDIR})
|
set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_FULL_LIBDIR})
|
||||||
endif()
|
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 0)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(WITH_12BIT)
|
if(WITH_12BIT)
|
||||||
set(WITH_ARITH_DEC 0)
|
set(WITH_ARITH_DEC 0)
|
||||||
set(WITH_ARITH_ENC 0)
|
set(WITH_ARITH_ENC 0)
|
||||||
@@ -207,14 +260,6 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
report_option(WITH_12BIT "12-bit JPEG support")
|
report_option(WITH_12BIT "12-bit JPEG support")
|
||||||
|
|
||||||
if(WITH_JPEG8 OR WITH_JPEG7)
|
|
||||||
set(WITH_ARITH_ENC 1)
|
|
||||||
set(WITH_ARITH_DEC 1)
|
|
||||||
endif()
|
|
||||||
if(WITH_JPEG8)
|
|
||||||
set(WITH_MEM_SRCDST 0)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_ARITH_DEC)
|
if(WITH_ARITH_DEC)
|
||||||
set(D_ARITH_CODING_SUPPORTED 1)
|
set(D_ARITH_CODING_SUPPORTED 1)
|
||||||
endif()
|
endif()
|
||||||
@@ -294,7 +339,8 @@ message(STATUS "libjpeg API shared library version = ${SO_MAJOR_VERSION}.${SO_AG
|
|||||||
# minor SO versions don't change. However, we increase the middle number (the
|
# minor SO versions don't change. However, we increase the middle number (the
|
||||||
# SO "age") whenever functions are added to the API.
|
# SO "age") whenever functions are added to the API.
|
||||||
set(TURBOJPEG_SO_MAJOR_VERSION 0)
|
set(TURBOJPEG_SO_MAJOR_VERSION 0)
|
||||||
set(TURBOJPEG_SO_VERSION 0.2.0)
|
set(TURBOJPEG_SO_AGE 2)
|
||||||
|
set(TURBOJPEG_SO_VERSION 0.${TURBOJPEG_SO_AGE}.0)
|
||||||
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@@ -314,7 +360,7 @@ if(MSVC)
|
|||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
endif()
|
endif()
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /wd4996")
|
add_definitions(-D_CRT_NONSTDC_NO_WARNINGS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||||
@@ -364,34 +410,6 @@ if(MSVC)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
# Check for headers
|
|
||||||
check_include_files(locale.h HAVE_LOCALE_H)
|
|
||||||
check_include_files(stddef.h HAVE_STDDEF_H)
|
|
||||||
check_include_files(stdlib.h HAVE_STDLIB_H)
|
|
||||||
check_include_files(sys/types.h NEED_SYS_TYPES_H)
|
|
||||||
|
|
||||||
# Check for functions
|
|
||||||
include(CheckSymbolExists)
|
|
||||||
check_symbol_exists(memset string.h HAVE_MEMSET)
|
|
||||||
check_symbol_exists(memcpy string.h HAVE_MEMCPY)
|
|
||||||
if(NOT HAVE_MEMSET AND NOT HAVE_MEMCPY)
|
|
||||||
set(NEED_BSD_STRINGS 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Check for types
|
|
||||||
check_type_size("unsigned char" UNSIGNED_CHAR)
|
|
||||||
check_type_size("unsigned short" UNSIGNED_SHORT)
|
|
||||||
|
|
||||||
# Check for compiler features
|
|
||||||
check_c_source_compiles("int main(void) { typedef struct undefined_structure *undef_struct_ptr; undef_struct_ptr ptr = 0; return ptr != 0; }"
|
|
||||||
INCOMPLETE_TYPES)
|
|
||||||
if(INCOMPLETE_TYPES)
|
|
||||||
message(STATUS "Compiler supports pointers to undefined structures.")
|
|
||||||
else()
|
|
||||||
set(INCOMPLETE_TYPES_BROKEN 1)
|
|
||||||
message(STATUS "Compiler does not support pointers to undefined structures.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(CMAKE_CROSSCOMPILING)
|
if(CMAKE_CROSSCOMPILING)
|
||||||
set(RIGHT_SHIFT_IS_UNSIGNED 0)
|
set(RIGHT_SHIFT_IS_UNSIGNED 0)
|
||||||
else()
|
else()
|
||||||
@@ -416,13 +434,6 @@ if(UNIX)
|
|||||||
exit(is_shifting_signed(-0x7F7E80B1L));
|
exit(is_shifting_signed(-0x7F7E80B1L));
|
||||||
}" RIGHT_SHIFT_IS_UNSIGNED)
|
}" RIGHT_SHIFT_IS_UNSIGNED)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_CROSSCOMPILING)
|
|
||||||
set(__CHAR_UNSIGNED__ 0)
|
|
||||||
else()
|
|
||||||
check_c_source_runs("int main(void) { return ((char) -1 < 0); }"
|
|
||||||
__CHAR_UNSIGNED__)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
@@ -509,6 +520,7 @@ else()
|
|||||||
configure_file(jconfig.h.in jconfig.h)
|
configure_file(jconfig.h.in jconfig.h)
|
||||||
endif()
|
endif()
|
||||||
configure_file(jconfigint.h.in jconfigint.h)
|
configure_file(jconfigint.h.in jconfigint.h)
|
||||||
|
configure_file(jversion.h.in jversion.h)
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
configure_file(libjpeg.map.in libjpeg.map)
|
configure_file(libjpeg.map.in libjpeg.map)
|
||||||
endif()
|
endif()
|
||||||
@@ -526,7 +538,7 @@ if(CMAKE_EXECUTABLE_SUFFIX_TMP)
|
|||||||
endif()
|
endif()
|
||||||
message(STATUS "CMAKE_EXECUTABLE_SUFFIX = ${CMAKE_EXECUTABLE_SUFFIX}")
|
message(STATUS "CMAKE_EXECUTABLE_SUFFIX = ${CMAKE_EXECUTABLE_SUFFIX}")
|
||||||
|
|
||||||
set(JPEG_SOURCES jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jchuff.c jcext.c
|
set(JPEG_SOURCES jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jchuff.c
|
||||||
jcicc.c jcinit.c jcmainct.c jcmarker.c jcmaster.c jcomapi.c jcparam.c
|
jcicc.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
|
jcphuff.c jcprepct.c jcsample.c jctrans.c jdapimin.c jdapistd.c jdatadst.c
|
||||||
jdatasrc.c jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c jdicc.c jdinput.c
|
jdatasrc.c jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c jdicc.c jdinput.c
|
||||||
@@ -548,6 +560,9 @@ endif()
|
|||||||
|
|
||||||
if(WITH_SIMD)
|
if(WITH_SIMD)
|
||||||
add_subdirectory(simd)
|
add_subdirectory(simd)
|
||||||
|
if(NEON_INTRINSICS)
|
||||||
|
add_definitions(-DNEON_INTRINSICS)
|
||||||
|
endif()
|
||||||
elseif(NOT WITH_12BIT)
|
elseif(NOT WITH_12BIT)
|
||||||
message(STATUS "SIMD extensions: None (WITH_SIMD = ${WITH_SIMD})")
|
message(STATUS "SIMD extensions: None (WITH_SIMD = ${WITH_SIMD})")
|
||||||
endif()
|
endif()
|
||||||
@@ -558,6 +573,9 @@ if(WITH_SIMD)
|
|||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
add_library(simd OBJECT jsimd_none.c)
|
add_library(simd OBJECT jsimd_none.c)
|
||||||
|
if(NOT WIN32 AND (CMAKE_POSITION_INDEPENDENT_CODE OR ENABLE_SHARED))
|
||||||
|
set_target_properties(simd PROPERTIES POSITION_INDEPENDENT_CODE 1)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(WITH_JAVA)
|
if(WITH_JAVA)
|
||||||
@@ -587,6 +605,12 @@ if(WITH_TURBOJPEG)
|
|||||||
include_directories(${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})
|
include_directories(${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})
|
||||||
set(TJMAPFILE ${CMAKE_CURRENT_SOURCE_DIR}/turbojpeg-mapfile.jni)
|
set(TJMAPFILE ${CMAKE_CURRENT_SOURCE_DIR}/turbojpeg-mapfile.jni)
|
||||||
endif()
|
endif()
|
||||||
|
if(MSVC)
|
||||||
|
configure_file(${CMAKE_SOURCE_DIR}/win/turbojpeg.rc.in
|
||||||
|
${CMAKE_BINARY_DIR}/win/turbojpeg.rc)
|
||||||
|
set(TURBOJPEG_SOURCES ${TURBOJPEG_SOURCES}
|
||||||
|
${CMAKE_BINARY_DIR}/win/turbojpeg.rc)
|
||||||
|
endif()
|
||||||
add_library(turbojpeg SHARED ${TURBOJPEG_SOURCES})
|
add_library(turbojpeg SHARED ${TURBOJPEG_SOURCES})
|
||||||
set_property(TARGET turbojpeg PROPERTY COMPILE_FLAGS
|
set_property(TARGET turbojpeg PROPERTY COMPILE_FLAGS
|
||||||
"-DBMP_SUPPORTED -DPPM_SUPPORTED")
|
"-DBMP_SUPPORTED -DPPM_SUPPORTED")
|
||||||
@@ -612,9 +636,6 @@ if(WITH_TURBOJPEG)
|
|||||||
|
|
||||||
add_executable(tjunittest tjunittest.c tjutil.c md5/md5.c md5/md5hl.c)
|
add_executable(tjunittest tjunittest.c tjutil.c md5/md5.c md5/md5hl.c)
|
||||||
target_link_libraries(tjunittest turbojpeg)
|
target_link_libraries(tjunittest turbojpeg)
|
||||||
if(UNIX)
|
|
||||||
target_link_libraries(tjunittest m)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_executable(tjbench tjbench.c tjutil.c)
|
add_executable(tjbench tjbench.c tjutil.c)
|
||||||
target_link_libraries(tjbench turbojpeg)
|
target_link_libraries(tjbench turbojpeg)
|
||||||
@@ -624,9 +645,6 @@ if(WITH_TURBOJPEG)
|
|||||||
|
|
||||||
add_executable(tjexample tjexample.c)
|
add_executable(tjexample tjexample.c)
|
||||||
target_link_libraries(tjexample turbojpeg)
|
target_link_libraries(tjexample turbojpeg)
|
||||||
if(UNIX)
|
|
||||||
target_link_libraries(tjexample m)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(ENABLE_STATIC)
|
if(ENABLE_STATIC)
|
||||||
@@ -642,9 +660,6 @@ if(WITH_TURBOJPEG)
|
|||||||
add_executable(tjunittest-static tjunittest.c tjutil.c md5/md5.c
|
add_executable(tjunittest-static tjunittest.c tjutil.c md5/md5.c
|
||||||
md5/md5hl.c)
|
md5/md5hl.c)
|
||||||
target_link_libraries(tjunittest-static turbojpeg-static)
|
target_link_libraries(tjunittest-static turbojpeg-static)
|
||||||
if(UNIX)
|
|
||||||
target_link_libraries(tjunittest-static m)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_executable(tjbench-static tjbench.c tjutil.c)
|
add_executable(tjbench-static tjbench.c tjutil.c)
|
||||||
target_link_libraries(tjbench-static turbojpeg-static)
|
target_link_libraries(tjbench-static turbojpeg-static)
|
||||||
@@ -663,58 +678,21 @@ else()
|
|||||||
set(COMPILE_FLAGS "-DBMP_SUPPORTED -DGIF_SUPPORTED -DPPM_SUPPORTED -DTARGA_SUPPORTED ${USE_SETMODE}")
|
set(COMPILE_FLAGS "-DBMP_SUPPORTED -DGIF_SUPPORTED -DPPM_SUPPORTED -DTARGA_SUPPORTED ${USE_SETMODE}")
|
||||||
set(CJPEG_BMP_SOURCES rdbmp.c rdtarga.c)
|
set(CJPEG_BMP_SOURCES rdbmp.c rdtarga.c)
|
||||||
set(DJPEG_BMP_SOURCES wrbmp.c wrtarga.c)
|
set(DJPEG_BMP_SOURCES wrbmp.c wrtarga.c)
|
||||||
|
|
||||||
if(PNG_SUPPORTED)
|
|
||||||
report_option(PNG_SUPPORTED "PNG reading support")
|
|
||||||
set(COMPILE_FLAGS "${COMPILE_FLAGS} -DPNG_SUPPORTED")
|
|
||||||
set(CJPEG_BMP_SOURCES ${CJPEG_BMP_SOURCES} rdpng.c)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(ENABLE_STATIC)
|
if(ENABLE_STATIC)
|
||||||
add_executable(cjpeg-static cjpeg.c cdjpeg.c rdgif.c rdppm.c rdjpeg.c rdswitch.c
|
add_executable(cjpeg-static cjpeg.c cdjpeg.c rdgif.c rdppm.c rdswitch.c
|
||||||
${CJPEG_BMP_SOURCES})
|
${CJPEG_BMP_SOURCES})
|
||||||
set_property(TARGET cjpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
|
set_property(TARGET cjpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
|
||||||
target_link_libraries(cjpeg-static jpeg-static)
|
target_link_libraries(cjpeg-static jpeg-static)
|
||||||
if(UNIX)
|
|
||||||
target_link_libraries(cjpeg-static m)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(PNG_SUPPORTED)
|
|
||||||
# to avoid finding shared library from CMake cache
|
|
||||||
unset(PNG_LIBRARY CACHE)
|
|
||||||
unset(PNG_LIBRARY_RELEASE CACHE)
|
|
||||||
unset(PNG_LIBRARY_DEBUG CACHE)
|
|
||||||
unset(ZLIB_LIBRARY CACHE)
|
|
||||||
unset(ZLIB_LIBRARY_RELEASE CACHE)
|
|
||||||
unset(ZLIB_LIBRARY_DEBUG CACHE)
|
|
||||||
|
|
||||||
if (APPLE)
|
|
||||||
find_package(ZLIB REQUIRED) # macos doesn't have static zlib
|
|
||||||
endif()
|
|
||||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
|
|
||||||
find_package(PNG 1.6 REQUIRED)
|
|
||||||
if (NOT APPLE)
|
|
||||||
find_package(ZLIB REQUIRED)
|
|
||||||
endif()
|
|
||||||
target_include_directories(cjpeg-static PUBLIC ${PNG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR})
|
|
||||||
target_link_libraries(cjpeg-static ${PNG_LIBRARY} ${ZLIB_LIBRARY})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_executable(djpeg-static djpeg.c cdjpeg.c rdcolmap.c rdswitch.c wrgif.c
|
add_executable(djpeg-static djpeg.c cdjpeg.c rdcolmap.c rdswitch.c wrgif.c
|
||||||
wrppm.c ${DJPEG_BMP_SOURCES})
|
wrppm.c ${DJPEG_BMP_SOURCES})
|
||||||
set_property(TARGET djpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
|
set_property(TARGET djpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
|
||||||
target_link_libraries(djpeg-static jpeg-static)
|
target_link_libraries(djpeg-static jpeg-static)
|
||||||
if(UNIX)
|
|
||||||
target_link_libraries(djpeg-static m)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_executable(jpegtran-static jpegtran.c cdjpeg.c rdswitch.c transupp.c)
|
add_executable(jpegtran-static jpegtran.c cdjpeg.c rdswitch.c transupp.c)
|
||||||
target_link_libraries(jpegtran-static jpeg-static)
|
target_link_libraries(jpegtran-static jpeg-static)
|
||||||
if(UNIX)
|
|
||||||
target_link_libraries(jpegtran-static m)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set_property(TARGET jpegtran-static PROPERTY COMPILE_FLAGS "${USE_SETMODE}")
|
set_property(TARGET jpegtran-static PROPERTY COMPILE_FLAGS "${USE_SETMODE}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -727,6 +705,12 @@ add_executable(wrjpgcom wrjpgcom.c)
|
|||||||
# TESTS
|
# TESTS
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
|
if(WITH_FUZZ)
|
||||||
|
add_subdirectory(fuzz)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_executable(strtest strtest.c)
|
||||||
|
|
||||||
add_subdirectory(md5)
|
add_subdirectory(md5)
|
||||||
|
|
||||||
if(MSVC_IDE OR XCODE)
|
if(MSVC_IDE OR XCODE)
|
||||||
@@ -744,8 +728,10 @@ if(WITH_12BIT)
|
|||||||
set(MD5_PPM_RGB_ISLOW f3301d2219783b8b3d942b7239fa50c0)
|
set(MD5_PPM_RGB_ISLOW f3301d2219783b8b3d942b7239fa50c0)
|
||||||
set(MD5_JPEG_422_IFAST_OPT 7322e3bd2f127f7de4b40d4480ce60e4)
|
set(MD5_JPEG_422_IFAST_OPT 7322e3bd2f127f7de4b40d4480ce60e4)
|
||||||
set(MD5_PPM_422_IFAST 79807fa552899e66a04708f533e16950)
|
set(MD5_PPM_422_IFAST 79807fa552899e66a04708f533e16950)
|
||||||
|
set(MD5_JPEG_440_ISLOW e25c1912e38367be505a89c410c1c2d2)
|
||||||
|
set(MD5_PPM_440_ISLOW e7d2e26288870cfcb30f3114ad01e380)
|
||||||
set(MD5_PPM_422M_IFAST 07737bfe8a7c1c87aaa393a0098d16b0)
|
set(MD5_PPM_422M_IFAST 07737bfe8a7c1c87aaa393a0098d16b0)
|
||||||
set(MD5_JPEG_420_IFAST_Q100_PROG 008ab68d6ddbba04a8f01deee4e0f9f8)
|
set(MD5_JPEG_420_IFAST_Q100_PROG 9447cef4803d9b0f74bcf333cc710a29)
|
||||||
set(MD5_PPM_420_Q100_IFAST 1b3730122709f53d007255e8dfd3305e)
|
set(MD5_PPM_420_Q100_IFAST 1b3730122709f53d007255e8dfd3305e)
|
||||||
set(MD5_PPM_420M_Q100_IFAST 980a1a3c5bf9510022869d30b7d26566)
|
set(MD5_PPM_420M_Q100_IFAST 980a1a3c5bf9510022869d30b7d26566)
|
||||||
set(MD5_JPEG_GRAY_ISLOW 235c90707b16e2e069f37c888b2636d9)
|
set(MD5_JPEG_GRAY_ISLOW 235c90707b16e2e069f37c888b2636d9)
|
||||||
@@ -755,10 +741,11 @@ if(WITH_12BIT)
|
|||||||
|
|
||||||
set(MD5_JPEG_3x2_FLOAT_PROG_SSE a8c17daf77b457725ec929e215b603f8)
|
set(MD5_JPEG_3x2_FLOAT_PROG_SSE a8c17daf77b457725ec929e215b603f8)
|
||||||
set(MD5_PPM_3x2_FLOAT_SSE 42876ab9e5c2f76a87d08db5fbd57956)
|
set(MD5_PPM_3x2_FLOAT_SSE 42876ab9e5c2f76a87d08db5fbd57956)
|
||||||
set(MD5_JPEG_3x2_FLOAT_PROG_32BIT a8c17daf77b457725ec929e215b603f8)
|
set(MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT a8c17daf77b457725ec929e215b603f8)
|
||||||
set(MD5_PPM_3x2_FLOAT_32BIT ${MD5_PPM_3x2_FLOAT_SSE})
|
set(MD5_PPM_3x2_FLOAT_NO_FP_CONTRACT ${MD5_PPM_3x2_FLOAT_SSE})
|
||||||
set(MD5_JPEG_3x2_FLOAT_PROG_64BIT ${MD5_JPEG_3x2_FLOAT_PROG_32BIT})
|
set(MD5_JPEG_3x2_FLOAT_PROG_FP_CONTRACT
|
||||||
set(MD5_PPM_3x2_FLOAT_64BIT ${MD5_PPM_3x2_FLOAT_SSE})
|
${MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT})
|
||||||
|
set(MD5_PPM_3x2_FLOAT_FP_CONTRACT ${MD5_PPM_3x2_FLOAT_SSE})
|
||||||
set(MD5_JPEG_3x2_FLOAT_PROG_387 bc6dbbefac2872f6b9d6c4a0ae60c3c0)
|
set(MD5_JPEG_3x2_FLOAT_PROG_387 bc6dbbefac2872f6b9d6c4a0ae60c3c0)
|
||||||
set(MD5_PPM_3x2_FLOAT_387 bcc5723c61560463ac60f772e742d092)
|
set(MD5_PPM_3x2_FLOAT_387 bcc5723c61560463ac60f772e742d092)
|
||||||
set(MD5_JPEG_3x2_FLOAT_PROG_MSVC e27840755870fa849872e58aa0cd1400)
|
set(MD5_JPEG_3x2_FLOAT_PROG_MSVC e27840755870fa849872e58aa0cd1400)
|
||||||
@@ -792,10 +779,12 @@ else()
|
|||||||
set(MD5_BMP_RGB_ISLOW_565D 4cfa0928ef3e6bb626d7728c924cfda4)
|
set(MD5_BMP_RGB_ISLOW_565D 4cfa0928ef3e6bb626d7728c924cfda4)
|
||||||
set(MD5_JPEG_422_IFAST_OPT 2540287b79d913f91665e660303ab2c8)
|
set(MD5_JPEG_422_IFAST_OPT 2540287b79d913f91665e660303ab2c8)
|
||||||
set(MD5_PPM_422_IFAST 35bd6b3f833bad23de82acea847129fa)
|
set(MD5_PPM_422_IFAST 35bd6b3f833bad23de82acea847129fa)
|
||||||
|
set(MD5_JPEG_440_ISLOW 538bc02bd4b4658fd85de6ece6cbeda6)
|
||||||
|
set(MD5_PPM_440_ISLOW 11e7eab7ef7ef3276934bb7e7b6bb377)
|
||||||
set(MD5_PPM_422M_IFAST 8dbc65323d62cca7c91ba02dd1cfa81d)
|
set(MD5_PPM_422M_IFAST 8dbc65323d62cca7c91ba02dd1cfa81d)
|
||||||
set(MD5_BMP_422M_IFAST_565 3294bd4d9a1f2b3d08ea6020d0db7065)
|
set(MD5_BMP_422M_IFAST_565 3294bd4d9a1f2b3d08ea6020d0db7065)
|
||||||
set(MD5_BMP_422M_IFAST_565D da98c9c7b6039511be4a79a878a9abc1)
|
set(MD5_BMP_422M_IFAST_565D da98c9c7b6039511be4a79a878a9abc1)
|
||||||
set(MD5_JPEG_420_IFAST_Q100_PROG e59bb462016a8d9a748c330a3474bb55)
|
set(MD5_JPEG_420_IFAST_Q100_PROG 0ba15f9dab81a703505f835f9dbbac6d)
|
||||||
set(MD5_PPM_420_Q100_IFAST 5a732542015c278ff43635e473a8a294)
|
set(MD5_PPM_420_Q100_IFAST 5a732542015c278ff43635e473a8a294)
|
||||||
set(MD5_PPM_420M_Q100_IFAST ff692ee9323a3b424894862557c092f1)
|
set(MD5_PPM_420M_Q100_IFAST ff692ee9323a3b424894862557c092f1)
|
||||||
set(MD5_JPEG_GRAY_ISLOW 72b51f894b8f4a10b3ee3066770aa38d)
|
set(MD5_JPEG_GRAY_ISLOW 72b51f894b8f4a10b3ee3066770aa38d)
|
||||||
@@ -807,10 +796,11 @@ else()
|
|||||||
|
|
||||||
set(MD5_JPEG_3x2_FLOAT_PROG_SSE 343e3f8caf8af5986ebaf0bdc13b5c71)
|
set(MD5_JPEG_3x2_FLOAT_PROG_SSE 343e3f8caf8af5986ebaf0bdc13b5c71)
|
||||||
set(MD5_PPM_3x2_FLOAT_SSE 1a75f36e5904d6fc3a85a43da9ad89bb)
|
set(MD5_PPM_3x2_FLOAT_SSE 1a75f36e5904d6fc3a85a43da9ad89bb)
|
||||||
set(MD5_JPEG_3x2_FLOAT_PROG_32BIT 9bca803d2042bd1eb03819e2bf92b3e5)
|
set(MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT 9bca803d2042bd1eb03819e2bf92b3e5)
|
||||||
set(MD5_PPM_3x2_FLOAT_32BIT f6bfab038438ed8f5522fbd33595dcdc)
|
set(MD5_PPM_3x2_FLOAT_NO_FP_CONTRACT f6bfab038438ed8f5522fbd33595dcdc)
|
||||||
set(MD5_JPEG_3x2_FLOAT_PROG_64BIT ${MD5_JPEG_3x2_FLOAT_PROG_32BIT})
|
set(MD5_JPEG_3x2_FLOAT_PROG_FP_CONTRACT
|
||||||
set(MD5_PPM_3x2_FLOAT_64BIT 0e917a34193ef976b679a6b069b1be26)
|
${MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT})
|
||||||
|
set(MD5_PPM_3x2_FLOAT_FP_CONTRACT 0e917a34193ef976b679a6b069b1be26)
|
||||||
set(MD5_JPEG_3x2_FLOAT_PROG_387 1657664a410e0822c924b54f6f65e6e9)
|
set(MD5_JPEG_3x2_FLOAT_PROG_387 1657664a410e0822c924b54f6f65e6e9)
|
||||||
set(MD5_PPM_3x2_FLOAT_387 cb0a1f027f3d2917c902b5640214e025)
|
set(MD5_PPM_3x2_FLOAT_387 cb0a1f027f3d2917c902b5640214e025)
|
||||||
set(MD5_JPEG_3x2_FLOAT_PROG_MSVC 7999ce9cd0ee9b6c7043b7351ab7639d)
|
set(MD5_JPEG_3x2_FLOAT_PROG_MSVC 7999ce9cd0ee9b6c7043b7351ab7639d)
|
||||||
@@ -820,7 +810,7 @@ else()
|
|||||||
set(MD5_PPM_3x2_IFAST fd283664b3b49127984af0a7f118fccd)
|
set(MD5_PPM_3x2_IFAST fd283664b3b49127984af0a7f118fccd)
|
||||||
set(MD5_JPEG_420_ISLOW_ARI e986fb0a637a8d833d96e8a6d6d84ea1)
|
set(MD5_JPEG_420_ISLOW_ARI e986fb0a637a8d833d96e8a6d6d84ea1)
|
||||||
set(MD5_JPEG_444_ISLOW_PROGARI 0a8f1c8f66e113c3cf635df0a475a617)
|
set(MD5_JPEG_444_ISLOW_PROGARI 0a8f1c8f66e113c3cf635df0a475a617)
|
||||||
set(MD5_PPM_420M_IFAST_ARI 72b59a99bcf1de24c5b27d151bde2437)
|
set(MD5_PPM_420M_IFAST_ARI 57251da28a35b46eecb7177d82d10e0e)
|
||||||
set(MD5_JPEG_420_ISLOW 9a68f56bc76e466aa7e52f415d0f4a5f)
|
set(MD5_JPEG_420_ISLOW 9a68f56bc76e466aa7e52f415d0f4a5f)
|
||||||
set(MD5_PPM_420M_ISLOW_2_1 9f9de8c0612f8d06869b960b05abf9c9)
|
set(MD5_PPM_420M_ISLOW_2_1 9f9de8c0612f8d06869b960b05abf9c9)
|
||||||
set(MD5_PPM_420M_ISLOW_15_8 b6875bc070720b899566cc06459b63b7)
|
set(MD5_PPM_420M_ISLOW_15_8 b6875bc070720b899566cc06459b63b7)
|
||||||
@@ -898,11 +888,16 @@ endif()
|
|||||||
#
|
#
|
||||||
# sse = validate against the expected results from the libjpeg-turbo SSE SIMD
|
# sse = validate against the expected results from the libjpeg-turbo SSE SIMD
|
||||||
# extensions
|
# extensions
|
||||||
# 32bit = validate against the expected results from the C code when running on
|
# no-fp-contract = validate against the expected results from the C code when
|
||||||
# a 32-bit FPU (or when SSE is being used for floating point math,
|
# floating point expression contraction is disabled (the
|
||||||
# which is generally the default with x86-64 compilers)
|
# default with Clang, with GCC when building for platforms
|
||||||
# 64bit = validate against the expected results from the C code when running
|
# that lack fused multiply-add [FMA] instructions, or when
|
||||||
# on a 64-bit FPU
|
# passing -ffp-contract=off to the compiler)
|
||||||
|
# fp-contract = validate against the expected results from the C code when
|
||||||
|
# floating point expression contraction is enabled (the default
|
||||||
|
# with GCC when building for platforms that have fused multiply-
|
||||||
|
# add [FMA] instructions or when passing -ffp-contract=fast to
|
||||||
|
# the compiler)
|
||||||
# 387 = validate against the expected results from the C code when the 387 FPU
|
# 387 = validate against the expected results from the C code when the 387 FPU
|
||||||
# is being used for floating point math (which is generally the default
|
# is being used for floating point math (which is generally the default
|
||||||
# with x86 compilers)
|
# with x86 compilers)
|
||||||
@@ -913,15 +908,18 @@ if(CPU_TYPE STREQUAL "x86_64" OR CPU_TYPE STREQUAL "i386")
|
|||||||
if(WITH_SIMD)
|
if(WITH_SIMD)
|
||||||
set(DEFAULT_FLOATTEST sse)
|
set(DEFAULT_FLOATTEST sse)
|
||||||
elseif(CPU_TYPE STREQUAL "x86_64")
|
elseif(CPU_TYPE STREQUAL "x86_64")
|
||||||
set(DEFAULT_FLOATTEST 32bit)
|
set(DEFAULT_FLOATTEST no-fp-contract)
|
||||||
elseif(CPU_TYPE STREQUAL "i386" AND MSVC)
|
# else we can't really set an intelligent default for i386. The appropriate
|
||||||
set(DEFAULT_FLOATTEST msvc)
|
# value could be no-fp-contract, fp-contract, 387, or msvc, depending on the
|
||||||
|
# compiler and compiler options. We leave it to the user to set FLOATTEST
|
||||||
|
# manually.
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
if(BITS EQUAL 64)
|
if((CPU_TYPE STREQUAL "powerpc" OR CPU_TYPE STREQUAL "arm64") AND
|
||||||
set(DEFAULT_FLOATTEST 64bit)
|
NOT CMAKE_C_COMPILER_ID STREQUAL "Clang" AND NOT MSVC)
|
||||||
elseif(BITS EQUAL 32)
|
set(DEFAULT_FLOATTEST fp-contract)
|
||||||
set(DEFAULT_FLOATTEST 32bit)
|
else()
|
||||||
|
set(DEFAULT_FLOATTEST no-fp-contract)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -932,15 +930,17 @@ if(DEFINED WITH_SIMD_INT AND NOT WITH_SIMD EQUAL WITH_SIMD_INT)
|
|||||||
endif()
|
endif()
|
||||||
set(WITH_SIMD_INT ${WITH_SIMD} CACHE INTERNAL "")
|
set(WITH_SIMD_INT ${WITH_SIMD} CACHE INTERNAL "")
|
||||||
set(FLOATTEST ${DEFAULT_FLOATTEST} CACHE STRING
|
set(FLOATTEST ${DEFAULT_FLOATTEST} CACHE STRING
|
||||||
"The type of floating point math used by the floating point DCT/IDCT algorithms. This tells the testing system which numerical results it should expect from those tests. [sse = libjpeg-turbo x86/x86-64 SIMD extensions, 32bit = generic 32-bit FPU or SSE, 64bit = generic 64-bit FPU, 387 = 387 FPU, msvc = 32-bit Visual Studio] (default = ${DEFAULT_FLOATTEST})"
|
"The type of floating point math used by the floating point DCT/IDCT algorithms. This tells the testing system which numerical results it should expect from those tests. [sse = libjpeg-turbo x86/x86-64 SIMD extensions, no-fp-contract = generic FPU with floating point expression contraction disabled, fp-contract = generic FPU with floating point expression contraction enabled, 387 = 387 FPU, msvc = 32-bit Visual Studio] (default = ${DEFAULT_FLOATTEST})"
|
||||||
${FORCE_FLOATTEST})
|
${FORCE_FLOATTEST})
|
||||||
message(STATUS "FLOATTEST = ${FLOATTEST}")
|
message(STATUS "FLOATTEST = ${FLOATTEST}")
|
||||||
|
|
||||||
if(FLOATTEST)
|
if(FLOATTEST)
|
||||||
string(TOUPPER ${FLOATTEST} FLOATTEST_UC)
|
string(TOUPPER ${FLOATTEST} FLOATTEST_UC)
|
||||||
|
string(REGEX REPLACE "-" "_" FLOATTEST_UC ${FLOATTEST_UC})
|
||||||
string(TOLOWER ${FLOATTEST} FLOATTEST)
|
string(TOLOWER ${FLOATTEST} FLOATTEST)
|
||||||
if(NOT FLOATTEST STREQUAL "sse" AND NOT FLOATTEST STREQUAL "32bit" AND
|
if(NOT FLOATTEST STREQUAL "sse" AND
|
||||||
NOT FLOATTEST STREQUAL "64bit" AND NOT FLOATTEST STREQUAL "387" AND
|
NOT FLOATTEST STREQUAL "no-fp-contract" AND
|
||||||
|
NOT FLOATTEST STREQUAL "fp-contract" AND NOT FLOATTEST STREQUAL "387" AND
|
||||||
NOT FLOATTEST STREQUAL "msvc")
|
NOT FLOATTEST STREQUAL "msvc")
|
||||||
message(FATAL_ERROR "\"${FLOATTEST}\" is not a valid value for FLOATTEST.")
|
message(FATAL_ERROR "\"${FLOATTEST}\" is not a valid value for FLOATTEST.")
|
||||||
endif()
|
endif()
|
||||||
@@ -1103,6 +1103,16 @@ foreach(libtype ${TEST_LIBTYPES})
|
|||||||
testout_422_ifast.ppm testout_422_ifast_opt.jpg
|
testout_422_ifast.ppm testout_422_ifast_opt.jpg
|
||||||
${MD5_PPM_422_IFAST} cjpeg-${libtype}-422-ifast-opt)
|
${MD5_PPM_422_IFAST} cjpeg-${libtype}-422-ifast-opt)
|
||||||
|
|
||||||
|
# CC: RGB->YCC SAMP: fullsize/h1v2 FDCT: islow ENT: huff
|
||||||
|
add_bittest(cjpeg 440-islow "-sample;1x2;-dct;int"
|
||||||
|
testout_440_islow.jpg ${TESTIMAGES}/testorig.ppm
|
||||||
|
${MD5_JPEG_440_ISLOW})
|
||||||
|
|
||||||
|
# CC: YCC->RGB SAMP: fullsize/h1v2 fancy IDCT: islow ENT: huff
|
||||||
|
add_bittest(djpeg 440-islow "-dct;int"
|
||||||
|
testout_440_islow.ppm testout_440_islow.jpg
|
||||||
|
${MD5_PPM_440_ISLOW} cjpeg-${libtype}-440-islow)
|
||||||
|
|
||||||
# CC: YCC->RGB SAMP: h2v1 merged IDCT: ifast ENT: huff
|
# CC: YCC->RGB SAMP: h2v1 merged IDCT: ifast ENT: huff
|
||||||
add_bittest(djpeg 422m-ifast "-dct;fast;-nosmooth"
|
add_bittest(djpeg 422m-ifast "-dct;fast;-nosmooth"
|
||||||
testout_422m_ifast.ppm testout_422_ifast_opt.jpg
|
testout_422m_ifast.ppm testout_422_ifast_opt.jpg
|
||||||
@@ -1211,7 +1221,7 @@ foreach(libtype ${TEST_LIBTYPES})
|
|||||||
|
|
||||||
if(WITH_ARITH_DEC)
|
if(WITH_ARITH_DEC)
|
||||||
# CC: RGB->YCC SAMP: h2v2 merged IDCT: ifast ENT: arith
|
# CC: RGB->YCC SAMP: h2v2 merged IDCT: ifast ENT: arith
|
||||||
add_bittest(djpeg 420m-ifast-ari "-fast;-ppm"
|
add_bittest(djpeg 420m-ifast-ari "-fast;-skip;1,20;-ppm"
|
||||||
testout_420m_ifast_ari.ppm ${TESTIMAGES}/testimgari.jpg
|
testout_420m_ifast_ari.ppm ${TESTIMAGES}/testimgari.jpg
|
||||||
${MD5_PPM_420M_IFAST_ARI})
|
${MD5_PPM_420M_IFAST_ARI})
|
||||||
|
|
||||||
@@ -1347,6 +1357,11 @@ endforeach()
|
|||||||
add_custom_target(testclean COMMAND ${CMAKE_COMMAND} -P
|
add_custom_target(testclean COMMAND ${CMAKE_COMMAND} -P
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/cmakescripts/testclean.cmake)
|
${CMAKE_CURRENT_SOURCE_DIR}/cmakescripts/testclean.cmake)
|
||||||
|
|
||||||
|
configure_file(croptest.in croptest @ONLY)
|
||||||
|
add_custom_target(croptest
|
||||||
|
COMMAND echo croptest
|
||||||
|
COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/croptest)
|
||||||
|
|
||||||
if(WITH_TURBOJPEG)
|
if(WITH_TURBOJPEG)
|
||||||
configure_file(tjbenchtest.in tjbenchtest @ONLY)
|
configure_file(tjbenchtest.in tjbenchtest @ONLY)
|
||||||
configure_file(tjexampletest.in tjexampletest @ONLY)
|
configure_file(tjexampletest.in tjexampletest @ONLY)
|
||||||
@@ -1414,10 +1429,13 @@ set(EXE ${CMAKE_EXECUTABLE_SUFFIX})
|
|||||||
|
|
||||||
if(WITH_TURBOJPEG)
|
if(WITH_TURBOJPEG)
|
||||||
if(ENABLE_SHARED)
|
if(ENABLE_SHARED)
|
||||||
install(TARGETS turbojpeg tjbench
|
install(TARGETS turbojpeg EXPORT ${CMAKE_PROJECT_NAME}Targets
|
||||||
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
|
install(TARGETS tjbench
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
if(NOT CMAKE_VERSION VERSION_LESS "3.1" AND MSVC AND
|
if(NOT CMAKE_VERSION VERSION_LESS "3.1" AND MSVC AND
|
||||||
CMAKE_C_LINKER_SUPPORTS_PDB)
|
CMAKE_C_LINKER_SUPPORTS_PDB)
|
||||||
install(FILES "$<TARGET_PDB_FILE:turbojpeg>"
|
install(FILES "$<TARGET_PDB_FILE:turbojpeg>"
|
||||||
@@ -1425,8 +1443,9 @@ if(WITH_TURBOJPEG)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
if(ENABLE_STATIC)
|
if(ENABLE_STATIC)
|
||||||
install(TARGETS turbojpeg-static ARCHIVE
|
install(TARGETS turbojpeg-static EXPORT ${CMAKE_PROJECT_NAME}Targets
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
if(NOT ENABLE_SHARED)
|
if(NOT ENABLE_SHARED)
|
||||||
if(MSVC_IDE OR XCODE)
|
if(MSVC_IDE OR XCODE)
|
||||||
set(DIR "${CMAKE_CURRENT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
|
set(DIR "${CMAKE_CURRENT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
|
||||||
@@ -1442,7 +1461,9 @@ if(WITH_TURBOJPEG)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(ENABLE_STATIC)
|
if(ENABLE_STATIC)
|
||||||
install(TARGETS jpeg-static ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
install(TARGETS jpeg-static EXPORT ${CMAKE_PROJECT_NAME}Targets
|
||||||
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
if(NOT ENABLE_SHARED)
|
if(NOT ENABLE_SHARED)
|
||||||
if(MSVC_IDE OR XCODE)
|
if(MSVC_IDE OR XCODE)
|
||||||
set(DIR "${CMAKE_CURRENT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
|
set(DIR "${CMAKE_CURRENT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
|
||||||
@@ -1480,8 +1501,18 @@ if(UNIX OR MINGW)
|
|||||||
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
|
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
|
||||||
endif()
|
endif()
|
||||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pkgscripts/libjpeg.pc
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pkgscripts/libjpeg.pc
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/pkgscripts/libturbojpeg.pc
|
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
|
if(WITH_TURBOJPEG)
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pkgscripts/libturbojpeg.pc
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
|
endif()
|
||||||
|
install(FILES
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/pkgscripts/${CMAKE_PROJECT_NAME}Config.cmake
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/pkgscripts/${CMAKE_PROJECT_NAME}ConfigVersion.cmake
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME})
|
||||||
|
install(EXPORT ${CMAKE_PROJECT_NAME}Targets
|
||||||
|
NAMESPACE ${CMAKE_PROJECT_NAME}::
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME})
|
||||||
|
|
||||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/jconfig.h
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/jconfig.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/jerror.h ${CMAKE_CURRENT_SOURCE_DIR}/jmorecfg.h
|
${CMAKE_CURRENT_SOURCE_DIR}/jerror.h ${CMAKE_CURRENT_SOURCE_DIR}/jmorecfg.h
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
# Community Participation Guidelines
|
|
||||||
|
|
||||||
This repository is governed by Mozilla's code of conduct and etiquette guidelines.
|
|
||||||
For more details, please read the
|
|
||||||
[Mozilla Community Participation Guidelines](https://www.mozilla.org/about/governance/policies/participation/).
|
|
||||||
|
|
||||||
## How to Report
|
|
||||||
For more information on how to report violations of the Community Participation Guidelines, please read our '[How to Report](https://www.mozilla.org/about/governance/policies/participation/reporting/)' page.
|
|
||||||
|
|
||||||
<!--
|
|
||||||
## Project Specific Etiquette
|
|
||||||
|
|
||||||
In some cases, there will be additional project etiquette i.e.: (https://bugzilla.mozilla.org/page.cgi?id=etiquette.html).
|
|
||||||
Please update for your project.
|
|
||||||
-->
|
|
||||||
412
ChangeLog.md
@@ -1,3 +1,353 @@
|
|||||||
|
2.1.4
|
||||||
|
=====
|
||||||
|
|
||||||
|
### Significant changes relative to 2.1.3
|
||||||
|
|
||||||
|
1. Fixed a regression introduced in 2.1.3 that caused build failures with
|
||||||
|
Visual Studio 2010.
|
||||||
|
|
||||||
|
2. The `tjDecompressHeader3()` function in the TurboJPEG C API and the
|
||||||
|
`TJDecompressor.setSourceImage()` method in the TurboJPEG Java API now accept
|
||||||
|
"abbreviated table specification" (AKA "tables-only") datastreams, which can be
|
||||||
|
used to prime the decompressor with quantization and Huffman tables that can be
|
||||||
|
used when decompressing subsequent "abbreviated image" datastreams.
|
||||||
|
|
||||||
|
3. libjpeg-turbo now performs run-time detection of AltiVec instructions on
|
||||||
|
OS X/PowerPC systems if AltiVec instructions are not enabled at compile time.
|
||||||
|
This allows both AltiVec-equipped (PowerPC G4 and G5) and non-AltiVec-equipped
|
||||||
|
(PowerPC G3) CPUs to be supported using the same build of libjpeg-turbo.
|
||||||
|
|
||||||
|
4. Fixed an error ("Bogus virtual array access") that occurred when attempting
|
||||||
|
to decompress a progressive JPEG image with a height less than or equal to one
|
||||||
|
iMCU (8 * the vertical sampling factor) using buffered-image mode with
|
||||||
|
interblock smoothing enabled. This was a regression introduced by
|
||||||
|
2.1 beta1[6(b)].
|
||||||
|
|
||||||
|
5. Fixed two issues that prevented partial image decompression from working
|
||||||
|
properly with buffered-image mode:
|
||||||
|
|
||||||
|
- Attempting to call `jpeg_crop_scanline()` after
|
||||||
|
`jpeg_start_decompress()` but before `jpeg_start_output()` resulted in an error
|
||||||
|
("Improper call to JPEG library in state 207".)
|
||||||
|
- Attempting to use `jpeg_skip_scanlines()` resulted in an error ("Bogus
|
||||||
|
virtual array access") under certain circumstances.
|
||||||
|
|
||||||
|
|
||||||
|
2.1.3
|
||||||
|
=====
|
||||||
|
|
||||||
|
### Significant changes relative to 2.1.2
|
||||||
|
|
||||||
|
1. Fixed a regression introduced by 2.0 beta1[7] whereby cjpeg compressed PGM
|
||||||
|
input files into full-color JPEG images unless the `-grayscale` option was
|
||||||
|
used.
|
||||||
|
|
||||||
|
2. cjpeg now automatically compresses GIF and 8-bit BMP input files into
|
||||||
|
grayscale JPEG images if the input files contain only shades of gray.
|
||||||
|
|
||||||
|
3. The build system now enables the intrinsics implementation of the AArch64
|
||||||
|
(Arm 64-bit) Neon SIMD extensions by default when using GCC 12 or later.
|
||||||
|
|
||||||
|
4. Fixed a segfault that occurred while decompressing a 4:2:0 JPEG image using
|
||||||
|
the merged (non-fancy) upsampling algorithms (that is, with
|
||||||
|
`cinfo.do_fancy_upsampling` set to `FALSE`) along with `jpeg_crop_scanline()`.
|
||||||
|
Specifically, the segfault occurred if the number of bytes remaining in the
|
||||||
|
output buffer was less than the number of bytes required to represent one
|
||||||
|
uncropped scanline of the output image. For that reason, the issue could only
|
||||||
|
be reproduced using the libjpeg API, not using djpeg.
|
||||||
|
|
||||||
|
|
||||||
|
2.1.2
|
||||||
|
=====
|
||||||
|
|
||||||
|
### Significant changes relative to 2.1.1
|
||||||
|
|
||||||
|
1. Fixed a regression introduced by 2.1 beta1[13] that caused the remaining
|
||||||
|
GAS implementations of AArch64 (Arm 64-bit) Neon SIMD functions (which are used
|
||||||
|
by default with GCC for performance reasons) to be placed in the `.rodata`
|
||||||
|
section rather than in the `.text` section. This caused the GNU linker to
|
||||||
|
automatically place the `.rodata` section in an executable segment, which
|
||||||
|
prevented libjpeg-turbo from working properly with other linkers and also
|
||||||
|
represented a potential security risk.
|
||||||
|
|
||||||
|
2. Fixed an issue whereby the `tjTransform()` function incorrectly computed the
|
||||||
|
MCU block size for 4:4:4 JPEG images with non-unary sampling factors and thus
|
||||||
|
unduly rejected some cropping regions, even though those regions aligned with
|
||||||
|
8x8 MCU block boundaries.
|
||||||
|
|
||||||
|
3. Fixed a regression introduced by 2.1 beta1[13] that caused the build system
|
||||||
|
to enable the Arm Neon SIMD extensions when targetting Armv6 and other legacy
|
||||||
|
architectures that do not support Neon instructions.
|
||||||
|
|
||||||
|
4. libjpeg-turbo now performs run-time detection of AltiVec instructions on
|
||||||
|
FreeBSD/PowerPC systems if AltiVec instructions are not enabled at compile
|
||||||
|
time. This allows both AltiVec-equipped and non-AltiVec-equipped CPUs to be
|
||||||
|
supported using the same build of libjpeg-turbo.
|
||||||
|
|
||||||
|
5. cjpeg now accepts a `-strict` argument similar to that of djpeg and
|
||||||
|
jpegtran, which causes the compressor to abort if an LZW-compressed GIF input
|
||||||
|
image contains incomplete or corrupt image data.
|
||||||
|
|
||||||
|
|
||||||
|
2.1.1
|
||||||
|
=====
|
||||||
|
|
||||||
|
### Significant changes relative to 2.1.0
|
||||||
|
|
||||||
|
1. Fixed a regression introduced in 2.1.0 that caused build failures with
|
||||||
|
non-GCC-compatible compilers for Un*x/Arm platforms.
|
||||||
|
|
||||||
|
2. Fixed a regression introduced by 2.1 beta1[13] that prevented the Arm 32-bit
|
||||||
|
(AArch32) Neon SIMD extensions from building unless the C compiler flags
|
||||||
|
included `-mfloat-abi=softfp` or `-mfloat-abi=hard`.
|
||||||
|
|
||||||
|
3. Fixed an issue in the AArch32 Neon SIMD Huffman encoder whereby reliance on
|
||||||
|
undefined C compiler behavior led to crashes ("SIGBUS: illegal alignment") on
|
||||||
|
Android systems when running AArch32/Thumb builds of libjpeg-turbo built with
|
||||||
|
recent versions of Clang.
|
||||||
|
|
||||||
|
4. Added a command-line argument (`-copy icc`) to jpegtran that causes it to
|
||||||
|
copy only the ICC profile markers from the source file and discard any other
|
||||||
|
metadata.
|
||||||
|
|
||||||
|
5. libjpeg-turbo should now build and run on CHERI-enabled architectures, which
|
||||||
|
use capability pointers that are larger than the size of `size_t`.
|
||||||
|
|
||||||
|
6. Fixed a regression (CVE-2021-37972) introduced by 2.1 beta1[5] that caused a
|
||||||
|
segfault in the 64-bit SSE2 Huffman encoder when attempting to losslessly
|
||||||
|
transform a specially-crafted malformed JPEG image.
|
||||||
|
|
||||||
|
|
||||||
|
2.1.0
|
||||||
|
=====
|
||||||
|
|
||||||
|
### Significant changes relative to 2.1 beta1
|
||||||
|
|
||||||
|
1. Fixed a regression introduced by 2.1 beta1[6(b)] whereby attempting to
|
||||||
|
decompress certain progressive JPEG images with one or more component planes of
|
||||||
|
width 8 or less caused a buffer overrun.
|
||||||
|
|
||||||
|
2. Fixed a regression introduced by 2.1 beta1[6(b)] whereby attempting to
|
||||||
|
decompress a specially-crafted malformed progressive JPEG image caused the
|
||||||
|
block smoothing algorithm to read from uninitialized memory.
|
||||||
|
|
||||||
|
3. Fixed an issue in the Arm Neon SIMD Huffman encoders that caused the
|
||||||
|
encoders to generate incorrect results when using the Clang compiler with
|
||||||
|
Visual Studio.
|
||||||
|
|
||||||
|
4. Fixed a floating point exception (CVE-2021-20205) that occurred when
|
||||||
|
attempting to compress a specially-crafted malformed GIF image with a specified
|
||||||
|
image width of 0 using cjpeg.
|
||||||
|
|
||||||
|
5. Fixed a regression introduced by 2.0 beta1[15] whereby attempting to
|
||||||
|
generate a progressive JPEG image on an SSE2-capable CPU using a scan script
|
||||||
|
containing one or more scans with lengths divisible by 32 and non-zero
|
||||||
|
successive approximation low bit positions would, under certain circumstances,
|
||||||
|
result in an error ("Missing Huffman code table entry") and an invalid JPEG
|
||||||
|
image.
|
||||||
|
|
||||||
|
6. Introduced a new flag (`TJFLAG_LIMITSCANS` in the TurboJPEG C API and
|
||||||
|
`TJ.FLAG_LIMIT_SCANS` in the TurboJPEG Java API) and a corresponding TJBench
|
||||||
|
command-line argument (`-limitscans`) that causes the TurboJPEG decompression
|
||||||
|
and transform functions/operations to return/throw an error if a progressive
|
||||||
|
JPEG image contains an unreasonably large number of scans. This allows
|
||||||
|
applications that use the TurboJPEG API to guard against an exploit of the
|
||||||
|
progressive JPEG format described in the report
|
||||||
|
["Two Issues with the JPEG Standard"](https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf).
|
||||||
|
|
||||||
|
7. The PPM reader now throws an error, rather than segfaulting (due to a buffer
|
||||||
|
overrun) or generating incorrect pixels, if an application attempts to use the
|
||||||
|
`tjLoadImage()` function to load a 16-bit binary PPM file (a binary PPM file
|
||||||
|
with a maximum value greater than 255) into a grayscale image buffer or to load
|
||||||
|
a 16-bit binary PGM file into an RGB image buffer.
|
||||||
|
|
||||||
|
8. Fixed an issue in the PPM reader that caused incorrect pixels to be
|
||||||
|
generated when using the `tjLoadImage()` function to load a 16-bit binary PPM
|
||||||
|
file into an extended RGB image buffer.
|
||||||
|
|
||||||
|
9. Fixed an issue whereby, if a JPEG buffer was automatically re-allocated by
|
||||||
|
one of the TurboJPEG compression or transform functions and an error
|
||||||
|
subsequently occurred during compression or transformation, the JPEG buffer
|
||||||
|
pointer passed by the application was not updated when the function returned.
|
||||||
|
|
||||||
|
|
||||||
|
2.0.90 (2.1 beta1)
|
||||||
|
==================
|
||||||
|
|
||||||
|
### Significant changes relative to 2.0.6:
|
||||||
|
|
||||||
|
1. The build system, x86-64 SIMD extensions, and accelerated Huffman codec now
|
||||||
|
support the x32 ABI on Linux, which allows for using x86-64 instructions with
|
||||||
|
32-bit pointers. The x32 ABI is generally enabled by adding `-mx32` to the
|
||||||
|
compiler flags.
|
||||||
|
|
||||||
|
Caveats:
|
||||||
|
- CMake 3.9.0 or later is required in order for the build system to
|
||||||
|
automatically detect an x32 build.
|
||||||
|
- Java does not support the x32 ABI, and thus the TurboJPEG Java API will
|
||||||
|
automatically be disabled with x32 builds.
|
||||||
|
|
||||||
|
2. Added Loongson MMI SIMD implementations of the RGB-to-grayscale, 4:2:2 fancy
|
||||||
|
chroma upsampling, 4:2:2 and 4:2:0 merged chroma upsampling/color conversion,
|
||||||
|
and fast integer DCT/IDCT algorithms. Relative to libjpeg-turbo 2.0.x, this
|
||||||
|
speeds up:
|
||||||
|
|
||||||
|
- the compression of RGB source images into grayscale JPEG images by
|
||||||
|
approximately 20%
|
||||||
|
- the decompression of 4:2:2 JPEG images by approximately 40-60% when
|
||||||
|
using fancy upsampling
|
||||||
|
- the decompression of 4:2:2 and 4:2:0 JPEG images by approximately
|
||||||
|
15-20% when using merged upsampling
|
||||||
|
- the compression of RGB source images by approximately 30-45% when using
|
||||||
|
the fast integer DCT
|
||||||
|
- the decompression of JPEG images into RGB destination images by
|
||||||
|
approximately 2x when using the fast integer IDCT
|
||||||
|
|
||||||
|
The overall decompression speedup for RGB images is now approximately
|
||||||
|
2.3-3.7x (compared to 2-3.5x with libjpeg-turbo 2.0.x.)
|
||||||
|
|
||||||
|
3. 32-bit (Armv7 or Armv7s) iOS builds of libjpeg-turbo are no longer
|
||||||
|
supported, and the libjpeg-turbo build system can no longer be used to package
|
||||||
|
such builds. 32-bit iOS apps cannot run in iOS 11 and later, and the App Store
|
||||||
|
no longer allows them.
|
||||||
|
|
||||||
|
4. 32-bit (i386) OS X/macOS builds of libjpeg-turbo are no longer supported,
|
||||||
|
and the libjpeg-turbo build system can no longer be used to package such
|
||||||
|
builds. 32-bit Mac applications cannot run in macOS 10.15 "Catalina" and
|
||||||
|
later, and the App Store no longer allows them.
|
||||||
|
|
||||||
|
5. The SSE2 (x86 SIMD) and C Huffman encoding algorithms have been
|
||||||
|
significantly optimized, resulting in a measured average overall compression
|
||||||
|
speedup of 12-28% for 64-bit code and 22-52% for 32-bit code on various Intel
|
||||||
|
and AMD CPUs, as well as a measured average overall compression speedup of
|
||||||
|
0-23% on platforms that do not have a SIMD-accelerated Huffman encoding
|
||||||
|
implementation.
|
||||||
|
|
||||||
|
6. The block smoothing algorithm that is applied by default when decompressing
|
||||||
|
progressive Huffman-encoded JPEG images has been improved in the following
|
||||||
|
ways:
|
||||||
|
|
||||||
|
- The algorithm is now more fault-tolerant. Previously, if a particular
|
||||||
|
scan was incomplete, then the smoothing parameters for the incomplete scan
|
||||||
|
would be applied to the entire output image, including the parts of the image
|
||||||
|
that were generated by the prior (complete) scan. Visually, this had the
|
||||||
|
effect of removing block smoothing from lower-frequency scans if they were
|
||||||
|
followed by an incomplete higher-frequency scan. libjpeg-turbo now applies
|
||||||
|
block smoothing parameters to each iMCU row based on which scan generated the
|
||||||
|
pixels in that row, rather than always using the block smoothing parameters for
|
||||||
|
the most recent scan.
|
||||||
|
- When applying block smoothing to DC scans, a Gaussian-like kernel with a
|
||||||
|
5x5 window is used to reduce the "blocky" appearance.
|
||||||
|
|
||||||
|
7. Added SIMD acceleration for progressive Huffman encoding on Arm platforms.
|
||||||
|
This speeds up the compression of full-color progressive JPEGs by about 30-40%
|
||||||
|
on average (relative to libjpeg-turbo 2.0.x) when using modern Arm CPUs.
|
||||||
|
|
||||||
|
8. Added configure-time and run-time auto-detection of Loongson MMI SIMD
|
||||||
|
instructions, so that the Loongson MMI SIMD extensions can be included in any
|
||||||
|
MIPS64 libjpeg-turbo build.
|
||||||
|
|
||||||
|
9. Added fault tolerance features to djpeg and jpegtran, mainly to demonstrate
|
||||||
|
methods by which applications can guard against the exploits of the JPEG format
|
||||||
|
described in the report
|
||||||
|
["Two Issues with the JPEG Standard"](https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf).
|
||||||
|
|
||||||
|
- Both programs now accept a `-maxscans` argument, which can be used to
|
||||||
|
limit the number of allowable scans in the input file.
|
||||||
|
- Both programs now accept a `-strict` argument, which can be used to
|
||||||
|
treat all warnings as fatal.
|
||||||
|
|
||||||
|
10. CMake package config files are now included for both the libjpeg and
|
||||||
|
TurboJPEG API libraries. This facilitates using libjpeg-turbo with CMake's
|
||||||
|
`find_package()` function. For example:
|
||||||
|
|
||||||
|
find_package(libjpeg-turbo CONFIG REQUIRED)
|
||||||
|
|
||||||
|
add_executable(libjpeg_program libjpeg_program.c)
|
||||||
|
target_link_libraries(libjpeg_program PUBLIC libjpeg-turbo::jpeg)
|
||||||
|
|
||||||
|
add_executable(libjpeg_program_static libjpeg_program.c)
|
||||||
|
target_link_libraries(libjpeg_program_static PUBLIC
|
||||||
|
libjpeg-turbo::jpeg-static)
|
||||||
|
|
||||||
|
add_executable(turbojpeg_program turbojpeg_program.c)
|
||||||
|
target_link_libraries(turbojpeg_program PUBLIC
|
||||||
|
libjpeg-turbo::turbojpeg)
|
||||||
|
|
||||||
|
add_executable(turbojpeg_program_static turbojpeg_program.c)
|
||||||
|
target_link_libraries(turbojpeg_program_static PUBLIC
|
||||||
|
libjpeg-turbo::turbojpeg-static)
|
||||||
|
|
||||||
|
11. Since the Unisys LZW patent has long expired, cjpeg and djpeg can now
|
||||||
|
read/write both LZW-compressed and uncompressed GIF files (feature ported from
|
||||||
|
jpeg-6a and jpeg-9d.)
|
||||||
|
|
||||||
|
12. jpegtran now includes the `-wipe` and `-drop` options from jpeg-9a and
|
||||||
|
jpeg-9d, as well as the ability to expand the image size using the `-crop`
|
||||||
|
option. Refer to jpegtran.1 or usage.txt for more details.
|
||||||
|
|
||||||
|
13. Added a complete intrinsics implementation of the Arm Neon SIMD extensions,
|
||||||
|
thus providing SIMD acceleration on Arm platforms for all of the algorithms
|
||||||
|
that are SIMD-accelerated on x86 platforms. This new implementation is
|
||||||
|
significantly faster in some cases than the old GAS implementation--
|
||||||
|
depending on the algorithms used, the type of CPU core, and the compiler. GCC,
|
||||||
|
as of this writing, does not provide a full or optimal set of Neon intrinsics,
|
||||||
|
so for performance reasons, the default when building libjpeg-turbo with GCC is
|
||||||
|
to continue using the GAS implementation of the following algorithms:
|
||||||
|
|
||||||
|
- 32-bit RGB-to-YCbCr color conversion
|
||||||
|
- 32-bit fast and accurate inverse DCT
|
||||||
|
- 64-bit RGB-to-YCbCr and YCbCr-to-RGB color conversion
|
||||||
|
- 64-bit accurate forward and inverse DCT
|
||||||
|
- 64-bit Huffman encoding
|
||||||
|
|
||||||
|
A new CMake variable (`NEON_INTRINSICS`) can be used to override this
|
||||||
|
default.
|
||||||
|
|
||||||
|
Since the new intrinsics implementation includes SIMD acceleration
|
||||||
|
for merged upsampling/color conversion, 1.5.1[5] is no longer necessary and has
|
||||||
|
been reverted.
|
||||||
|
|
||||||
|
14. The Arm Neon SIMD extensions can now be built using Visual Studio.
|
||||||
|
|
||||||
|
15. The build system can now be used to generate a universal x86-64 + Armv8
|
||||||
|
libjpeg-turbo SDK package for both iOS and macOS.
|
||||||
|
|
||||||
|
|
||||||
|
2.0.6
|
||||||
|
=====
|
||||||
|
|
||||||
|
### Significant changes relative to 2.0.5:
|
||||||
|
|
||||||
|
1. Fixed "using JNI after critical get" errors that occurred on Android
|
||||||
|
platforms when using any of the YUV encoding/compression/decompression/decoding
|
||||||
|
methods in the TurboJPEG Java API.
|
||||||
|
|
||||||
|
2. Fixed or worked around multiple issues with `jpeg_skip_scanlines()`:
|
||||||
|
|
||||||
|
- Fixed segfaults or "Corrupt JPEG data: premature end of data segment"
|
||||||
|
errors in `jpeg_skip_scanlines()` that occurred when decompressing 4:2:2 or
|
||||||
|
4:2:0 JPEG images using merged (non-fancy) upsampling/color conversion (that
|
||||||
|
is, when setting `cinfo.do_fancy_upsampling` to `FALSE`.) 2.0.0[6] was a
|
||||||
|
similar fix, but it did not cover all cases.
|
||||||
|
- `jpeg_skip_scanlines()` now throws an error if two-pass color
|
||||||
|
quantization is enabled. Two-pass color quantization never worked properly
|
||||||
|
with `jpeg_skip_scanlines()`, and the issues could not readily be fixed.
|
||||||
|
- Fixed an issue whereby `jpeg_skip_scanlines()` always returned 0 when
|
||||||
|
skipping past the end of an image.
|
||||||
|
|
||||||
|
3. The Arm 64-bit (Armv8) Neon SIMD extensions can now be built using MinGW
|
||||||
|
toolchains targetting Arm64 (AArch64) Windows binaries.
|
||||||
|
|
||||||
|
4. Fixed unexpected visual artifacts that occurred when using
|
||||||
|
`jpeg_crop_scanline()` and interblock smoothing while decompressing only the DC
|
||||||
|
scan of a progressive JPEG image.
|
||||||
|
|
||||||
|
5. Fixed an issue whereby libjpeg-turbo would not build if 12-bit-per-component
|
||||||
|
JPEG support (`WITH_12BIT`) was enabled along with libjpeg v7 or libjpeg v8
|
||||||
|
API/ABI emulation (`WITH_JPEG7` or `WITH_JPEG8`.)
|
||||||
|
|
||||||
|
|
||||||
2.0.5
|
2.0.5
|
||||||
=====
|
=====
|
||||||
|
|
||||||
@@ -54,17 +404,17 @@ JPEG images. This was known to cause a buffer overflow when attempting to
|
|||||||
decompress some such images using `tjDecompressToYUV2()` or
|
decompress some such images using `tjDecompressToYUV2()` or
|
||||||
`tjDecompressToYUVPlanes()`.
|
`tjDecompressToYUVPlanes()`.
|
||||||
|
|
||||||
5. Fixed an issue, detected by ASan, whereby attempting to losslessly transform
|
5. Fixed an issue (CVE-2020-17541), detected by ASan, whereby attempting to
|
||||||
a specially-crafted malformed JPEG image containing an extremely-high-frequency
|
losslessly transform a specially-crafted malformed JPEG image containing an
|
||||||
coefficient block (junk image data that could never be generated by a
|
extremely-high-frequency coefficient block (junk image data that could never be
|
||||||
legitimate JPEG compressor) could cause the Huffman encoder's local buffer to
|
generated by a legitimate JPEG compressor) could cause the Huffman encoder's
|
||||||
be overrun. (Refer to 1.4.0[9] and 1.4beta1[15].) Given that the buffer
|
local buffer to be overrun. (Refer to 1.4.0[9] and 1.4beta1[15].) Given that
|
||||||
overrun was fully contained within the stack and did not cause a segfault or
|
the buffer overrun was fully contained within the stack and did not cause a
|
||||||
other user-visible errant behavior, and given that the lossless transformer
|
segfault or other user-visible errant behavior, and given that the lossless
|
||||||
(unlike the decompressor) is not generally exposed to arbitrary data exploits,
|
transformer (unlike the decompressor) is not generally exposed to arbitrary
|
||||||
this issue did not likely pose a security risk.
|
data exploits, this issue did not likely pose a security risk.
|
||||||
|
|
||||||
6. The ARM 64-bit (ARMv8) NEON SIMD assembly code now stores constants in a
|
6. The Arm 64-bit (Armv8) Neon SIMD assembly code now stores constants in a
|
||||||
separate read-only data section rather than in the text section, to support
|
separate read-only data section rather than in the text section, to support
|
||||||
execute-only memory layouts.
|
execute-only memory layouts.
|
||||||
|
|
||||||
@@ -246,7 +596,7 @@ detect actual security issues, should they arise in the future.
|
|||||||
|
|
||||||
1. Added AVX2 SIMD implementations of the colorspace conversion, chroma
|
1. Added AVX2 SIMD implementations of the colorspace conversion, chroma
|
||||||
downsampling and upsampling, integer quantization and sample conversion, and
|
downsampling and upsampling, integer quantization and sample conversion, and
|
||||||
slow integer DCT/IDCT algorithms. When using the slow integer DCT/IDCT
|
accurate integer DCT/IDCT algorithms. When using the accurate integer DCT/IDCT
|
||||||
algorithms on AVX2-equipped CPUs, the compression of RGB images is
|
algorithms on AVX2-equipped CPUs, the compression of RGB images is
|
||||||
approximately 13-36% (avg. 22%) faster (relative to libjpeg-turbo 1.5.x) with
|
approximately 13-36% (avg. 22%) faster (relative to libjpeg-turbo 1.5.x) with
|
||||||
64-bit code and 11-21% (avg. 17%) faster with 32-bit code, and the
|
64-bit code and 11-21% (avg. 17%) faster with 32-bit code, and the
|
||||||
@@ -350,16 +700,16 @@ algorithm that caused incorrect dithering in the output image. This algorithm
|
|||||||
now produces bitwise-identical results to the unmerged algorithms.
|
now produces bitwise-identical results to the unmerged algorithms.
|
||||||
|
|
||||||
12. The SIMD function symbols for x86[-64]/ELF, MIPS/ELF, macOS/x86[-64] (if
|
12. The SIMD function symbols for x86[-64]/ELF, MIPS/ELF, macOS/x86[-64] (if
|
||||||
libjpeg-turbo is built with YASM), and iOS/ARM[64] builds are now private.
|
libjpeg-turbo is built with Yasm), and iOS/Arm[64] builds are now private.
|
||||||
This prevents those symbols from being exposed in applications or shared
|
This prevents those symbols from being exposed in applications or shared
|
||||||
libraries that link statically with libjpeg-turbo.
|
libraries that link statically with libjpeg-turbo.
|
||||||
|
|
||||||
13. Added Loongson MMI SIMD implementations of the RGB-to-YCbCr and
|
13. Added Loongson MMI SIMD implementations of the RGB-to-YCbCr and
|
||||||
YCbCr-to-RGB colorspace conversion, 4:2:0 chroma downsampling, 4:2:0 fancy
|
YCbCr-to-RGB colorspace conversion, 4:2:0 chroma downsampling, 4:2:0 fancy
|
||||||
chroma upsampling, integer quantization, and slow integer DCT/IDCT algorithms.
|
chroma upsampling, integer quantization, and accurate integer DCT/IDCT
|
||||||
When using the slow integer DCT/IDCT, this speeds up the compression of RGB
|
algorithms. When using the accurate integer DCT/IDCT, this speeds up the
|
||||||
images by approximately 70-100% and the decompression of RGB images by
|
compression of RGB images by approximately 70-100% and the decompression of RGB
|
||||||
approximately 2-3.5x.
|
images by approximately 2-3.5x.
|
||||||
|
|
||||||
14. Fixed a build error when building with older MinGW releases (regression
|
14. Fixed a build error when building with older MinGW releases (regression
|
||||||
caused by 1.5.1[7].)
|
caused by 1.5.1[7].)
|
||||||
@@ -409,9 +759,9 @@ end of a single-scan (non-progressive) image, subsequent calls to
|
|||||||
`jpeg_consume_input()` would return `JPEG_SUSPENDED` rather than
|
`jpeg_consume_input()` would return `JPEG_SUSPENDED` rather than
|
||||||
`JPEG_REACHED_EOI`.
|
`JPEG_REACHED_EOI`.
|
||||||
|
|
||||||
9. `jpeg_crop_scanlines()` now works correctly when decompressing grayscale
|
9. `jpeg_crop_scanline()` now works correctly when decompressing grayscale JPEG
|
||||||
JPEG images that were compressed with a sampling factor other than 1 (for
|
images that were compressed with a sampling factor other than 1 (for instance,
|
||||||
instance, with `cjpeg -grayscale -sample 2x2`).
|
with `cjpeg -grayscale -sample 2x2`).
|
||||||
|
|
||||||
|
|
||||||
1.5.2
|
1.5.2
|
||||||
@@ -435,7 +785,7 @@ on PowerPC-based AmigaOS 4 and OpenBSD systems.
|
|||||||
5. Fixed build and runtime errors on Windows that occurred when building
|
5. Fixed build and runtime errors on Windows that occurred when building
|
||||||
libjpeg-turbo with libjpeg v7 API/ABI emulation and the in-memory
|
libjpeg-turbo with libjpeg v7 API/ABI emulation and the in-memory
|
||||||
source/destination managers. Due to an oversight, the `jpeg_skip_scanlines()`
|
source/destination managers. Due to an oversight, the `jpeg_skip_scanlines()`
|
||||||
and `jpeg_crop_scanlines()` functions were not being included in jpeg7.dll when
|
and `jpeg_crop_scanline()` functions were not being included in jpeg7.dll when
|
||||||
libjpeg-turbo was built with `-DWITH_JPEG7=1` and `-DWITH_MEMSRCDST=1`.
|
libjpeg-turbo was built with `-DWITH_JPEG7=1` and `-DWITH_MEMSRCDST=1`.
|
||||||
|
|
||||||
6. Fixed "Bogus virtual array access" error that occurred when using the
|
6. Fixed "Bogus virtual array access" error that occurred when using the
|
||||||
@@ -691,8 +1041,8 @@ benchmarking or regression testing, SIMD-accelerated Huffman encoding can be
|
|||||||
disabled by setting the `JSIMD_NOHUFFENC` environment variable to `1`.
|
disabled by setting the `JSIMD_NOHUFFENC` environment variable to `1`.
|
||||||
|
|
||||||
13. Added ARM 64-bit (ARMv8) NEON SIMD implementations of the commonly-used
|
13. Added ARM 64-bit (ARMv8) NEON SIMD implementations of the commonly-used
|
||||||
compression algorithms (including the slow integer forward DCT and h2v2 & h2v1
|
compression algorithms (including the accurate integer forward DCT and h2v2 &
|
||||||
downsampling algorithms, which are not accelerated in the 32-bit NEON
|
h2v1 downsampling algorithms, which are not accelerated in the 32-bit NEON
|
||||||
implementation.) This speeds up the compression of full-color JPEGs by about
|
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
|
75% on average on a Cavium ThunderX processor and by about 2-2.5x on average on
|
||||||
Cortex-A53 and Cortex-A57 cores.
|
Cortex-A53 and Cortex-A57 cores.
|
||||||
@@ -823,8 +1173,8 @@ platforms other than Windows or Linux. Oops.
|
|||||||
|
|
||||||
7. Fixed an extremely rare bug in the Huffman encoder that caused 64-bit
|
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
|
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
|
quality=98, an optimized Huffman table, and the accurate integer forward DCT
|
||||||
used.
|
were used.
|
||||||
|
|
||||||
8. The Windows (CMake) build system now supports building only static or only
|
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
|
shared libraries. This is accomplished by adding either `-DENABLE_STATIC=0` or
|
||||||
@@ -983,8 +1333,8 @@ 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
|
The accuracy of this implementation now matches the accuracy of the SSE/SSE2
|
||||||
implementation. Note, however, that the floating point DCT/IDCT algorithms are
|
implementation. Note, however, that the floating point DCT/IDCT algorithms are
|
||||||
mainly a legacy feature. They generally do not produce significantly better
|
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
|
accuracy than the accurate integer DCT/IDCT algorithms, and they are quite a
|
||||||
slower.
|
bit slower.
|
||||||
|
|
||||||
8. Added a new output colorspace (`JCS_RGB565`) to the libjpeg API that allows
|
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
|
for decompressing JPEG images into RGB565 (16-bit) pixels. If dithering is not
|
||||||
@@ -1235,8 +1585,8 @@ either the fast or the accurate DCT/IDCT algorithms in the underlying codec.
|
|||||||
|
|
||||||
### Significant changes relative to 1.2 beta1:
|
### Significant changes relative to 1.2 beta1:
|
||||||
|
|
||||||
1. Fixed build issue with YASM on Unix systems (the libjpeg-turbo build system
|
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 adding the current directory to the assembler include path, so Yasm
|
||||||
was not able to find jsimdcfg.inc.)
|
was not able to find jsimdcfg.inc.)
|
||||||
|
|
||||||
2. Fixed out-of-bounds read in SSE2 SIMD code that occurred when decompressing
|
2. Fixed out-of-bounds read in SSE2 SIMD code that occurred when decompressing
|
||||||
@@ -1304,7 +1654,7 @@ transposed or rotated 90 degrees.
|
|||||||
8. All legacy VirtualGL code has been re-factored, and this has allowed
|
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.
|
libjpeg-turbo, in its entirety, to be re-licensed under a BSD-style license.
|
||||||
|
|
||||||
9. libjpeg-turbo can now be built with YASM.
|
9. libjpeg-turbo can now be built with Yasm.
|
||||||
|
|
||||||
10. Added SIMD acceleration for ARM Linux and iOS platforms that support
|
10. Added SIMD acceleration for ARM Linux and iOS platforms that support
|
||||||
NEON instructions.
|
NEON instructions.
|
||||||
@@ -1394,8 +1744,8 @@ cases.
|
|||||||
|
|
||||||
2. Despite the above, the fast integer forward DCT still degrades somewhat for
|
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
|
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
|
use the accurate integer forward DCT when generating JPEG images of quality 96
|
||||||
greater. This reduces compression performance by as much as 15% for these
|
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
|
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
|
lossless. It also ensures that the library can avoid the performance pitfall
|
||||||
created by [1].
|
created by [1].
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ best of our understanding.
|
|||||||
The Modified (3-clause) BSD License
|
The Modified (3-clause) BSD License
|
||||||
===================================
|
===================================
|
||||||
|
|
||||||
Copyright (C)2009-2020 D. R. Commander. All Rights Reserved.
|
Copyright (C)2009-2022 D. R. Commander. All Rights Reserved.<br>
|
||||||
Copyright (C)2015 Viktor Szathmáry. All Rights Reserved.
|
Copyright (C)2015 Viktor Szathmáry. All Rights Reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
|||||||
@@ -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
|
|
||||||
346
README-turbo.txt
@@ -1,346 +0,0 @@
|
|||||||
Background
|
|
||||||
==========
|
|
||||||
|
|
||||||
libjpeg-turbo is a JPEG image codec that uses SIMD instructions (MMX, SSE2,
|
|
||||||
AVX2, NEON, AltiVec) to accelerate baseline JPEG compression and decompression
|
|
||||||
on x86, x86-64, ARM, and PowerPC systems, as well as progressive JPEG
|
|
||||||
compression on x86 and x86-64 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**<br>
|
|
||||||
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. The TurboJPEG API is recommended for first-time
|
|
||||||
users of libjpeg-turbo. Refer to [tjexample.c](tjexample.c) and
|
|
||||||
[TJExample.java](java/TJExample.java) for examples of its usage and to
|
|
||||||
<http://libjpeg-turbo.org/Documentation/Documentation> for API documentation.
|
|
||||||
|
|
||||||
- **libjpeg API**<br>
|
|
||||||
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.) Refer to [cjpeg.c](cjpeg.c) and [djpeg.c](djpeg.c) for examples
|
|
||||||
of its usage and to [libjpeg.txt](libjpeg.txt) for API documentation.
|
|
||||||
|
|
||||||
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**<br>
|
|
||||||
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**<br>
|
|
||||||
See notes below.
|
|
||||||
|
|
||||||
- **cjpeg: Separate quality settings for luminance and chrominance**<br>
|
|
||||||
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**<br>
|
|
||||||
`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**<br>
|
|
||||||
`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**<br>
|
|
||||||
`cinfo.do_fancy_downsampling` is silently ignored.
|
|
||||||
This requires the DCT scaling feature, which is not supported.
|
|
||||||
|
|
||||||
- **jpegtran: Scaling**<br>
|
|
||||||
This requires both the DCT scaling and SmartScale features, which are not
|
|
||||||
supported.
|
|
||||||
|
|
||||||
- **Lossless RGB JPEG files**<br>
|
|
||||||
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
|
|
||||||
technical 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.1.0 to 62.2.0 if using libjpeg v6b API/ABI
|
|
||||||
emulation and from 7.1.0 to 7.2.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.
|
|
||||||
37
README.ijg
@@ -128,7 +128,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-2020, 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
|
||||||
@@ -159,19 +159,6 @@ commercial products, provided that all warranty or liability claims are
|
|||||||
assumed by the product vendor.
|
assumed by the product vendor.
|
||||||
|
|
||||||
|
|
||||||
The IJG distribution formerly included code to read and write GIF files.
|
|
||||||
To avoid entanglement with the Unisys LZW patent (now expired), GIF reading
|
|
||||||
support has been removed altogether, and the GIF writer has been simplified
|
|
||||||
to produce "uncompressed GIFs". This technique does not use the LZW
|
|
||||||
algorithm; the resulting GIF files are larger than usual, but are readable
|
|
||||||
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
|
||||||
==========
|
==========
|
||||||
|
|
||||||
@@ -223,12 +210,12 @@ https://www.iso.org/standard/54989.html and http://www.itu.int/rec/T-REC-T.871.
|
|||||||
A PDF file of the older JFIF 1.02 specification is available at
|
A PDF file of the older JFIF 1.02 specification is available at
|
||||||
http://www.w3.org/Graphics/JPEG/jfif3.pdf.
|
http://www.w3.org/Graphics/JPEG/jfif3.pdf.
|
||||||
|
|
||||||
The TIFF 6.0 file format specification can be obtained by FTP from
|
The TIFF 6.0 file format specification can be obtained from
|
||||||
ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme
|
http://mirrors.ctan.org/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation
|
||||||
found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems.
|
scheme found in the TIFF 6.0 spec of 3-June-92 has a number of serious
|
||||||
IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6).
|
problems. IJG does not recommend use of the TIFF 6.0 design (TIFF Compression
|
||||||
Instead, we recommend the JPEG design proposed by TIFF Technical Note #2
|
tag 6). Instead, we recommend the JPEG design proposed by TIFF Technical Note
|
||||||
(Compression tag 7). Copies of this Note can be obtained from
|
#2 (Compression tag 7). Copies of this Note can be obtained from
|
||||||
http://www.ijg.org/files/. It is expected that the next revision
|
http://www.ijg.org/files/. It is expected that the next revision
|
||||||
of the TIFF spec will replace the 6.0 JPEG design with the Note's design.
|
of the TIFF spec will replace the 6.0 JPEG design with the Note's design.
|
||||||
Although IJG's own code does not support TIFF/JPEG, the free libtiff library
|
Although IJG's own code does not support TIFF/JPEG, the free libtiff library
|
||||||
@@ -243,14 +230,8 @@ The most recent released version can always be found there in
|
|||||||
directory "files".
|
directory "files".
|
||||||
|
|
||||||
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. It is available at
|
||||||
It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/
|
http://www.faqs.org/faqs/jpeg-faq.
|
||||||
and other news.answers archive sites, including the official news.answers
|
|
||||||
archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/.
|
|
||||||
If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu
|
|
||||||
with body
|
|
||||||
send usenet/news.answers/jpeg-faq/part1
|
|
||||||
send usenet/news.answers/jpeg-faq/part2
|
|
||||||
|
|
||||||
|
|
||||||
FILE FORMAT COMPATIBILITY
|
FILE FORMAT COMPATIBILITY
|
||||||
|
|||||||
368
README.md
@@ -1,37 +1,357 @@
|
|||||||
> ## News: About Instagram's flaw
|
Background
|
||||||
>
|
==========
|
||||||
> Instagram had [a security vulnerability](https://m.facebook.com/security/advisories/cve-2020-1895). Instagram uses MozJPEG. These two facts were somewhat conflated in the [vulnerability report](https://research.checkpoint.com/2020/instagram_rce-code-execution-vulnerability-in-instagram-app-for-android-and-ios/) that gets reposted all over the Internet right now.
|
|
||||||
|
|
||||||
> MozJPEG is **NOT** affected by this vulnerability. The issue was in Facebook's own integration code, unique to only Instagram, and not in MozJPEG. There will be no MozJPEG patches in response to that report, because it's not a MozJPEG issue.
|
libjpeg-turbo is a JPEG image codec that uses SIMD instructions to accelerate
|
||||||
|
baseline JPEG compression and decompression on x86, x86-64, Arm, PowerPC, and
|
||||||
|
MIPS systems, as well as progressive JPEG compression on x86, x86-64, and Arm
|
||||||
|
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.
|
||||||
|
|
||||||
Mozilla JPEG Encoder Project [](https://ci.appveyor.com/project/kornel/mozjpeg-4ekrx)
|
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.
|
||||||
|
|
||||||
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). **Please send pull requests to libjpeg-turbo** if the changes aren't specific to newly-added MozJPEG-only compression code. This project aims to keep differences with libjpeg-turbo minimal, so whenever possible, improvements and bug fixes should go there first.
|
License
|
||||||
|
=======
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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
|
Building libjpeg-turbo
|
||||||
|
======================
|
||||||
|
|
||||||
* Progressive encoding with "jpegrescan" optimization. It can be applied to any JPEG file (with `jpegtran`) to losslessly reduce file size.
|
Refer to [BUILDING.md](BUILDING.md) for complete instructions.
|
||||||
* 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)
|
Using libjpeg-turbo
|
||||||
* [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/)
|
|
||||||
|
|
||||||
## Compiling
|
libjpeg-turbo includes two APIs that can be used to compress and decompress
|
||||||
|
JPEG images:
|
||||||
|
|
||||||
See [BUILDING](BUILDING.md).
|
- **TurboJPEG API**<br>
|
||||||
|
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. The TurboJPEG API is recommended for first-time
|
||||||
|
users of libjpeg-turbo. Refer to [tjexample.c](tjexample.c) and
|
||||||
|
[TJExample.java](java/TJExample.java) for examples of its usage and to
|
||||||
|
<http://libjpeg-turbo.org/Documentation/Documentation> for API documentation.
|
||||||
|
|
||||||
|
- **libjpeg API**<br>
|
||||||
|
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.) Refer to [cjpeg.c](cjpeg.c) and [djpeg.c](djpeg.c) for examples
|
||||||
|
of its usage and to [libjpeg.txt](libjpeg.txt) for API documentation.
|
||||||
|
|
||||||
|
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 `-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 API: IDCT scaling extensions in decompressor**<br>
|
||||||
|
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 API: Arithmetic coding**
|
||||||
|
|
||||||
|
- **libjpeg API: In-memory source and destination managers**<br>
|
||||||
|
See notes below.
|
||||||
|
|
||||||
|
- **cjpeg: Separate quality settings for luminance and chrominance**<br>
|
||||||
|
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. Readers are invited to peruse the research at
|
||||||
|
<http://www.libjpeg-turbo.org/About/SmartScale> and draw their 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 API: DCT scaling in compressor**<br>
|
||||||
|
`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 API: SmartScale**<br>
|
||||||
|
`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 API: Fancy downsampling in compressor**<br>
|
||||||
|
`cinfo.do_fancy_downsampling` is silently ignored.
|
||||||
|
This requires the DCT scaling feature, which is not supported.
|
||||||
|
|
||||||
|
- **jpegtran: Scaling**<br>
|
||||||
|
This requires both the DCT scaling and SmartScale features, which are not
|
||||||
|
supported.
|
||||||
|
|
||||||
|
- **Lossless RGB JPEG files**<br>
|
||||||
|
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
|
||||||
|
technical 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 `-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.2.0 to 62.3.0 if using libjpeg v6b API/ABI
|
||||||
|
emulation and from 7.2.0 to 7.3.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 accurate integer IDCT. The
|
||||||
|
floating point DCT/IDCT algorithms are mainly a legacy feature, and they do
|
||||||
|
not produce significantly more accuracy than the accurate 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 accurate integer forward DCT
|
||||||
|
whenever encoding images with a JPEG quality of 98 or higher.
|
||||||
|
|
||||||
|
|
||||||
|
Memory Debugger Pitfalls
|
||||||
|
========================
|
||||||
|
|
||||||
|
Valgrind and Memory Sanitizer (MSan) can generate false positives
|
||||||
|
(specifically, incorrect reports of uninitialized memory accesses) when used
|
||||||
|
with libjpeg-turbo's SIMD extensions. It is generally recommended that the
|
||||||
|
SIMD extensions be disabled, either by passing an argument of `-DWITH_SIMD=0`
|
||||||
|
to `cmake` when configuring the build or by setting the environment variable
|
||||||
|
`JSIMD_FORCENONE` to `1` at run time, when testing libjpeg-turbo with Valgrind,
|
||||||
|
MSan, or other memory debuggers.
|
||||||
|
|||||||
137
appveyor.yml
@@ -1,62 +1,99 @@
|
|||||||
image: Visual Studio 2017
|
|
||||||
configuration: Release
|
|
||||||
platform:
|
|
||||||
- Win32
|
|
||||||
- x64
|
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- if %PLATFORM% == Win32 (set ARCH=x86)
|
- cmd: >-
|
||||||
- if %PLATFORM% == x64 (set ARCH=x64)
|
if not exist c:\installers mkdir c:\installers
|
||||||
## Set up nasm
|
|
||||||
- choco install nasm
|
|
||||||
- set PATH=%PATH%;C:\Program Files\NASM
|
|
||||||
## Set up libpng
|
|
||||||
- cd C:\Tools\vcpkg
|
|
||||||
- vcpkg install libpng:%ARCH%-windows
|
|
||||||
- vcpkg install libpng:%ARCH%-windows-static
|
|
||||||
|
|
||||||
before_build:
|
mkdir c:\temp
|
||||||
- cd %APPVEYOR_BUILD_FOLDER%
|
|
||||||
- nasm -v
|
|
||||||
- cmake --version
|
|
||||||
- git describe --always --tags --dirty
|
|
||||||
- FOR /F %%a in ('git describe --always --tags --dirty') do set GIT_VERSION=%%a
|
|
||||||
|
|
||||||
build_script:
|
if not exist c:\installers\nasm-2.10.01-win32.zip curl -fSL -o c:\installers\nasm-2.10.01-win32.zip http://www.nasm.us/pub/nasm/releasebuilds/2.10.01/win32/nasm-2.10.01-win32.zip
|
||||||
## Build shared
|
|
||||||
- cmake -B shared -A %PLATFORM%
|
|
||||||
-DENABLE_SHARED=1 -DENABLE_STATIC=0
|
|
||||||
-DREQUIRE_SIMD=1
|
|
||||||
-DCMAKE_TOOLCHAIN_FILE=C:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake
|
|
||||||
|
|
||||||
- cmake --build shared --config Release
|
7z x c:\installers\nasm-2.10.01-win32.zip -oc:\ > c:\installers\nasm.install.log
|
||||||
|
|
||||||
## Build static
|
if not exist c:\installers\i686-6.4.0-release-posix-dwarf-rt_v5-rev0.7z curl -fSL -o c:\installers\i686-6.4.0-release-posix-dwarf-rt_v5-rev0.7z "https://sourceforge.net/projects/mingw-w64/files/Toolchains targetting Win32/Personal Builds/mingw-builds/6.4.0/threads-posix/dwarf/i686-6.4.0-release-posix-dwarf-rt_v5-rev0.7z"
|
||||||
- cmake -B static -A %PLATFORM%
|
|
||||||
-DENABLE_SHARED=0 -DENABLE_STATIC=1
|
|
||||||
-DREQUIRE_SIMD=1
|
|
||||||
-DCMAKE_TOOLCHAIN_FILE=C:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake
|
|
||||||
-DVCPKG_TARGET_TRIPLET=%ARCH%-windows-static
|
|
||||||
|
|
||||||
- cmake --build static --config Release
|
md "c:\Program Files (x86)\mingw-w64\i686-6.4.0-posix-dwarf-rt_v5-rev0"
|
||||||
|
|
||||||
after_build:
|
7z x c:\installers\i686-6.4.0-release-posix-dwarf-rt_v5-rev0.7z -o"c:\Program Files (x86)\mingw-w64\i686-6.4.0-posix-dwarf-rt_v5-rev0" > c:\installers\mingw32.install.log
|
||||||
- 7z a mozjpeg-%GIT_VERSION%-win-%ARCH%.zip shared/Release static/Release
|
|
||||||
|
|
||||||
artifacts:
|
if not exist c:\installers\x86_64-6.4.0-release-posix-seh-rt_v5-rev0.7z curl -fSL -o c:\installers\x86_64-6.4.0-release-posix-seh-rt_v5-rev0.7z "https://sourceforge.net/projects/mingw-w64/files/Toolchains targetting Win64/Personal Builds/mingw-builds/6.4.0/threads-posix/seh/x86_64-6.4.0-release-posix-seh-rt_v5-rev0.7z"
|
||||||
- path: '*.zip'
|
|
||||||
|
md "c:\Program Files\mingw-w64\x86_64-6.4.0-posix-seh-rt_v5-rev0"
|
||||||
|
|
||||||
|
7z x c:\installers\x86_64-6.4.0-release-posix-seh-rt_v5-rev0.7z -o"c:\Program Files\mingw-w64\x86_64-6.4.0-posix-seh-rt_v5-rev0" > c:\installers\mingw64.install.log
|
||||||
|
|
||||||
|
set PATH=c:\nasm-2.10.01;c:\Program Files (x86)\NSIS;c:\msys64\usr\bin;%PATH%
|
||||||
|
|
||||||
|
"c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat"
|
||||||
|
|
||||||
|
set INCLUDE
|
||||||
|
|
||||||
|
set LIB
|
||||||
|
|
||||||
|
set PATH
|
||||||
|
|
||||||
|
set MSYSTEM=MINGW32
|
||||||
|
|
||||||
|
mklink /d "%ProgramData%\Oracle\Java32" "c:\Program Files (x86)\Java\jdk1.6.0"
|
||||||
|
|
||||||
|
git clone --depth=1 https://github.com/libjpeg-turbo/buildscripts.git -b %APPVEYOR_REPO_BRANCH% c:/buildscripts
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
- C:\ProgramData\chocolatey\bin
|
- c:\installers\nasm-2.10.01-win32.zip -> appveyor.yml
|
||||||
- C:\ProgramData\chocolatey\lib
|
- c:\installers\i686-6.4.0-release-posix-dwarf-rt_v5-rev0.7z -> appveyor.yml
|
||||||
- C:\Program Files\NASM
|
- c:\installers\x86_64-6.4.0-release-posix-seh-rt_v5-rev0.7z -> appveyor.yml
|
||||||
- C:\tools\vcpkg\installed
|
|
||||||
|
build_script:
|
||||||
|
- cmd: >-
|
||||||
|
for /f %%i in ('"cygpath %CD%"') do set MINGWPATH=%%i
|
||||||
|
|
||||||
|
bash c:/buildscripts/buildljt -d %MINGWPATH% -b /c/ljt.nightly -v
|
||||||
|
|
||||||
|
cmake --build . --target clean
|
||||||
|
|
||||||
|
md win64
|
||||||
|
|
||||||
|
cd win64
|
||||||
|
|
||||||
|
bash c:/buildscripts/setupscripts/win64 -DCMAKE_C_FLAGS='-DWIN32 -D_WINDOWS -W4 -wd4100 -wd4127 -wd4245 -wd4324 -wd4701 -wd4702 -wd4706 -WX'
|
||||||
|
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
ninja
|
||||||
|
|
||||||
|
move c:\ljt.nightly\files\*.tar.gz .
|
||||||
|
|
||||||
|
move c:\ljt.nightly\files\*.exe .
|
||||||
|
|
||||||
|
move c:\ljt.nightly\files\*.html .
|
||||||
|
|
||||||
|
move c:\ljt.nightly\log-windows.txt .
|
||||||
|
|
||||||
|
artifacts:
|
||||||
|
- path: '*.tar.gz'
|
||||||
|
name: Source tarball
|
||||||
|
|
||||||
|
- path: '*-gcc*.exe'
|
||||||
|
name: SDK for MinGW
|
||||||
|
|
||||||
|
- path: '*-vc*.exe'
|
||||||
|
name: SDK for Visual C++
|
||||||
|
|
||||||
|
- path: 'log-windows.txt'
|
||||||
|
name: Build log
|
||||||
|
|
||||||
|
- path: 'index.html'
|
||||||
|
name: MD5 checksums
|
||||||
|
|
||||||
|
test: off
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
description: 'Automated build using Appveyor'
|
provider: S3
|
||||||
provider: GitHub
|
access_key_id:
|
||||||
auth_token:
|
secure: Z74OYogQ6bNV/I+6b5ZEXig74+6MW2WLER0v/bPM/uk=
|
||||||
secure: 2Jj47Q5HnaPob9U4yX2t4q4TYTw4JWU6cS56mM12aoRLgfYkZ4gRZPySIzfmTPqC
|
secret_access_key:
|
||||||
artifact: /.*\.zip/
|
secure: cyGZhHVCFwZ9jgf5lXoW69mVtECmqwx3eLo61ha8ueWbMYlHho7lwDXwVvxOFiCa
|
||||||
on:
|
bucket: libjpeg-turbo-pr
|
||||||
APPVEYOR_REPO_TAG: true # deploy on tag push only
|
region:
|
||||||
|
secure: qSElYBgBRcEUf88M6Osthw==
|
||||||
|
folder: $(APPVEYOR_REPO_BRANCH)/windows
|
||||||
|
set_public: true
|
||||||
|
remove_files: true
|
||||||
|
|||||||
39
cderror.h
@@ -1,9 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* cderror.h
|
* cderror.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.
|
||||||
* Modified 2009-2017 by Guido Vollbeding.
|
* Modified 2009-2017 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* libjpeg-turbo Modifications:
|
||||||
|
* Copyright (C) 2021, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -42,7 +44,7 @@ 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")
|
||||||
@@ -50,9 +52,9 @@ JMESSAGE(JERR_BMP_COMPRESSED, "Sorry, compressed BMPs not yet supported")
|
|||||||
JMESSAGE(JERR_BMP_EMPTY, "Empty BMP image")
|
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(JERR_BMP_OUTOFRANGE, "Numeric value out of range in BMP file")
|
JMESSAGE(JERR_BMP_OUTOFRANGE, "Numeric value out of range in BMP file")
|
||||||
JMESSAGE(JTRC_BMP, "%ux%u 24-bit BMP image")
|
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 */
|
||||||
|
|
||||||
@@ -60,6 +62,7 @@ JMESSAGE(JTRC_BMP_OS2_MAPPED, "%ux%u 8-bit colormapped OS2 BMP image")
|
|||||||
JMESSAGE(JERR_GIF_BUG, "GIF output got confused")
|
JMESSAGE(JERR_GIF_BUG, "GIF output got confused")
|
||||||
JMESSAGE(JERR_GIF_CODESIZE, "Bogus GIF codesize %d")
|
JMESSAGE(JERR_GIF_CODESIZE, "Bogus GIF codesize %d")
|
||||||
JMESSAGE(JERR_GIF_COLORSPACE, "GIF output must be grayscale or RGB")
|
JMESSAGE(JERR_GIF_COLORSPACE, "GIF output must be grayscale or RGB")
|
||||||
|
JMESSAGE(JERR_GIF_EMPTY, "Empty GIF image")
|
||||||
JMESSAGE(JERR_GIF_IMAGENOTFOUND, "Too few images in GIF file")
|
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")
|
||||||
@@ -84,23 +87,6 @@ JMESSAGE(JTRC_PPM, "%ux%u PPM image")
|
|||||||
JMESSAGE(JTRC_PPM_TEXT, "%ux%u text PPM image")
|
JMESSAGE(JTRC_PPM_TEXT, "%ux%u text PPM image")
|
||||||
#endif /* PPM_SUPPORTED */
|
#endif /* PPM_SUPPORTED */
|
||||||
|
|
||||||
#ifdef RLE_SUPPORTED
|
|
||||||
JMESSAGE(JERR_RLE_BADERROR, "Bogus error code from RLE library")
|
|
||||||
JMESSAGE(JERR_RLE_COLORSPACE, "RLE output must be grayscale or RGB")
|
|
||||||
JMESSAGE(JERR_RLE_DIMENSIONS, "Image dimensions (%ux%u) too large for RLE")
|
|
||||||
JMESSAGE(JERR_RLE_EMPTY, "Empty RLE file")
|
|
||||||
JMESSAGE(JERR_RLE_EOF, "Premature EOF in RLE header")
|
|
||||||
JMESSAGE(JERR_RLE_MEM, "Insufficient memory for RLE header")
|
|
||||||
JMESSAGE(JERR_RLE_NOT, "Not an RLE file")
|
|
||||||
JMESSAGE(JERR_RLE_TOOMANYCHANNELS, "Cannot handle %d output channels for RLE")
|
|
||||||
JMESSAGE(JERR_RLE_UNSUPPORTED, "Cannot handle this RLE setup")
|
|
||||||
JMESSAGE(JTRC_RLE, "%ux%u full-color RLE file")
|
|
||||||
JMESSAGE(JTRC_RLE_FULLMAP, "%ux%u full-color RLE file with map of length %d")
|
|
||||||
JMESSAGE(JTRC_RLE_GRAY, "%ux%u grayscale RLE file")
|
|
||||||
JMESSAGE(JTRC_RLE_MAPGRAY, "%ux%u grayscale RLE file with map of length %d")
|
|
||||||
JMESSAGE(JTRC_RLE_MAPPED, "%ux%u colormapped RLE file with map of length %d")
|
|
||||||
#endif /* RLE_SUPPORTED */
|
|
||||||
|
|
||||||
#ifdef TARGA_SUPPORTED
|
#ifdef TARGA_SUPPORTED
|
||||||
JMESSAGE(JERR_TGA_BADCMAP, "Unsupported Targa colormap format")
|
JMESSAGE(JERR_TGA_BADCMAP, "Unsupported Targa colormap format")
|
||||||
JMESSAGE(JERR_TGA_BADPARMS, "Invalid or unsupported Targa file")
|
JMESSAGE(JERR_TGA_BADPARMS, "Invalid or unsupported Targa file")
|
||||||
@@ -117,19 +103,14 @@ JMESSAGE(JERR_BAD_CMAP_FILE,
|
|||||||
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 PNG_SUPPORTED
|
#ifdef TARGA_SUPPORTED
|
||||||
JMESSAGE(JERR_UNKNOWN_FORMAT,
|
JMESSAGE(JERR_UNKNOWN_FORMAT,
|
||||||
"MozJPEG can't read the image (JPEG, PNG and old BMP and Targa are supported)")
|
"Unrecognized input file format --- perhaps you need -targa")
|
||||||
#else
|
#else
|
||||||
JMESSAGE(JERR_UNKNOWN_FORMAT, "MozJPEG can't read the image (PNG support is disabled in this build)")
|
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")
|
|
||||||
JMESSAGE(JERR_PNG_PROFILETOOLARGE, "Embedded profile was too large for this tool - dropped.")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef JMAKE_ENUM_LIST
|
#ifdef JMAKE_ENUM_LIST
|
||||||
|
|
||||||
JMSG_LASTADDONCODE
|
JMSG_LASTADDONCODE
|
||||||
|
|||||||
23
cdjpeg.c
@@ -3,8 +3,8 @@
|
|||||||
*
|
*
|
||||||
* This file was part of the Independent JPEG Group's software:
|
* 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
|
* libjpeg-turbo Modifications:
|
||||||
* to libjpeg-turbo.
|
* Copyright (C) 2019, 2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -25,12 +25,22 @@
|
|||||||
* Optional progress monitor: display a percent-done figure on stderr.
|
* Optional progress monitor: display a percent-done figure on stderr.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef PROGRESS_REPORT
|
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
progress_monitor(j_common_ptr cinfo)
|
progress_monitor(j_common_ptr cinfo)
|
||||||
{
|
{
|
||||||
cd_progress_ptr prog = (cd_progress_ptr)cinfo->progress;
|
cd_progress_ptr prog = (cd_progress_ptr)cinfo->progress;
|
||||||
|
|
||||||
|
if (prog->max_scans != 0 && cinfo->is_decompressor) {
|
||||||
|
int scan_no = ((j_decompress_ptr)cinfo)->input_scan_number;
|
||||||
|
|
||||||
|
if (scan_no > (int)prog->max_scans) {
|
||||||
|
fprintf(stderr, "Scan number %d exceeds maximum scans (%u)\n", scan_no,
|
||||||
|
prog->max_scans);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prog->report) {
|
||||||
int total_passes = prog->pub.total_passes + prog->total_extra_passes;
|
int total_passes = prog->pub.total_passes + prog->total_extra_passes;
|
||||||
int percent_done =
|
int percent_done =
|
||||||
(int)(prog->pub.pass_counter * 100L / prog->pub.pass_limit);
|
(int)(prog->pub.pass_counter * 100L / prog->pub.pass_limit);
|
||||||
@@ -46,6 +56,7 @@ progress_monitor(j_common_ptr cinfo)
|
|||||||
}
|
}
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -57,6 +68,8 @@ start_progress_monitor(j_common_ptr cinfo, cd_progress_ptr progress)
|
|||||||
progress->pub.progress_monitor = progress_monitor;
|
progress->pub.progress_monitor = progress_monitor;
|
||||||
progress->completed_extra_passes = 0;
|
progress->completed_extra_passes = 0;
|
||||||
progress->total_extra_passes = 0;
|
progress->total_extra_passes = 0;
|
||||||
|
progress->max_scans = 0;
|
||||||
|
progress->report = FALSE;
|
||||||
progress->percent_done = -1;
|
progress->percent_done = -1;
|
||||||
cinfo->progress = &progress->pub;
|
cinfo->progress = &progress->pub;
|
||||||
}
|
}
|
||||||
@@ -73,8 +86,6 @@ end_progress_monitor(j_common_ptr cinfo)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Case-insensitive matching of possibly-abbreviated keyword switches.
|
* Case-insensitive matching of possibly-abbreviated keyword switches.
|
||||||
|
|||||||
33
cdjpeg.h
@@ -3,11 +3,11 @@
|
|||||||
*
|
*
|
||||||
* This file was part of the Independent JPEG Group's software:
|
* 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.
|
||||||
|
* Modified 2019 by Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2017, D. R. Commander.
|
* Copyright (C) 2017, 2019, 2021, D. R. Commander.
|
||||||
* mozjpeg Modifications:
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* Copyright (C) 2014, Mozilla Corporation.
|
* file.
|
||||||
* 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.
|
||||||
@@ -20,7 +20,6 @@
|
|||||||
#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
|
||||||
@@ -37,13 +36,9 @@ struct cjpeg_source_struct {
|
|||||||
|
|
||||||
JSAMPARRAY buffer;
|
JSAMPARRAY buffer;
|
||||||
JDIMENSION buffer_height;
|
JDIMENSION buffer_height;
|
||||||
|
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
|
||||||
#if JPEG_RAW_READER
|
JDIMENSION max_pixels;
|
||||||
// For reading JPEG
|
|
||||||
JSAMPARRAY plane_pointer[4];
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
jpeg_saved_marker_ptr marker_list;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -65,9 +60,9 @@ struct djpeg_dest_struct {
|
|||||||
void (*finish_output) (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo);
|
void (*finish_output) (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo);
|
||||||
/* Re-calculate buffer dimensions based on output dimensions (for use with
|
/* Re-calculate buffer dimensions based on output dimensions (for use with
|
||||||
partial image decompression.) If this is NULL, then the output format
|
partial image decompression.) If this is NULL, then the output format
|
||||||
does not support partial image decompression (BMP and RLE, in particular,
|
does not support partial image decompression (BMP, in particular, cannot
|
||||||
cannot support partial decompression because they use an inversion buffer
|
support partial decompression because it uses an inversion buffer to write
|
||||||
to write the image in bottom-up order.) */
|
the image in bottom-up order.) */
|
||||||
void (*calc_buffer_dimensions) (j_decompress_ptr cinfo,
|
void (*calc_buffer_dimensions) (j_decompress_ptr cinfo,
|
||||||
djpeg_dest_ptr dinfo);
|
djpeg_dest_ptr dinfo);
|
||||||
|
|
||||||
@@ -96,6 +91,9 @@ 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 */
|
||||||
|
JDIMENSION max_scans; /* abort if the number of scans exceeds this
|
||||||
|
value and the value is non-zero */
|
||||||
|
boolean report; /* whether or not to report progress */
|
||||||
/* last printed percentage stored here to avoid multiple printouts */
|
/* last printed percentage stored here to avoid multiple printouts */
|
||||||
int percent_done;
|
int percent_done;
|
||||||
};
|
};
|
||||||
@@ -105,18 +103,14 @@ typedef struct cdjpeg_progress_mgr *cd_progress_ptr;
|
|||||||
|
|
||||||
/* Module selection routines for I/O modules. */
|
/* Module selection routines for I/O modules. */
|
||||||
|
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_jpeg (j_compress_ptr cinfo);
|
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_png (j_compress_ptr cinfo);
|
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_bmp(j_compress_ptr cinfo,
|
EXTERN(cjpeg_source_ptr) jinit_read_bmp(j_compress_ptr cinfo,
|
||||||
boolean use_inversion_array);
|
boolean use_inversion_array);
|
||||||
EXTERN(djpeg_dest_ptr) jinit_write_bmp(j_decompress_ptr cinfo, boolean is_os2,
|
EXTERN(djpeg_dest_ptr) jinit_write_bmp(j_decompress_ptr cinfo, boolean is_os2,
|
||||||
boolean use_inversion_array);
|
boolean use_inversion_array);
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_gif(j_compress_ptr cinfo);
|
EXTERN(cjpeg_source_ptr) jinit_read_gif(j_compress_ptr cinfo);
|
||||||
EXTERN(djpeg_dest_ptr) jinit_write_gif(j_decompress_ptr cinfo);
|
EXTERN(djpeg_dest_ptr) jinit_write_gif(j_decompress_ptr cinfo, boolean is_lzw);
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_ppm(j_compress_ptr cinfo);
|
EXTERN(cjpeg_source_ptr) jinit_read_ppm(j_compress_ptr cinfo);
|
||||||
EXTERN(djpeg_dest_ptr) jinit_write_ppm(j_decompress_ptr cinfo);
|
EXTERN(djpeg_dest_ptr) jinit_write_ppm(j_decompress_ptr cinfo);
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_rle(j_compress_ptr cinfo);
|
|
||||||
EXTERN(djpeg_dest_ptr) jinit_write_rle(j_decompress_ptr cinfo);
|
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_targa(j_compress_ptr cinfo);
|
EXTERN(cjpeg_source_ptr) jinit_read_targa(j_compress_ptr cinfo);
|
||||||
EXTERN(djpeg_dest_ptr) jinit_write_targa(j_decompress_ptr cinfo);
|
EXTERN(djpeg_dest_ptr) jinit_write_targa(j_decompress_ptr cinfo);
|
||||||
|
|
||||||
@@ -136,7 +130,6 @@ EXTERN(void) read_color_map(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) start_progress_monitor(j_common_ptr cinfo,
|
EXTERN(void) start_progress_monitor(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(j_common_ptr cinfo);
|
||||||
|
|||||||
31
change.log
@@ -6,6 +6,25 @@ 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 9d 12-Jan-2020
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Restore GIF read and write support from libjpeg version 6a.
|
||||||
|
Thank to Wolfgang Werner (W.W.) Heinz for suggestion.
|
||||||
|
|
||||||
|
Add jpegtran -drop option; add options to the crop extension and wipe
|
||||||
|
to fill the extra area with content from the source image region,
|
||||||
|
instead of gray out.
|
||||||
|
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
Version 9b 17-Jan-2016
|
Version 9b 17-Jan-2016
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
@@ -13,6 +32,13 @@ Document 'f' specifier for jpegtran -crop specification.
|
|||||||
Thank to Michele Martone for suggestion.
|
Thank to Michele Martone for suggestion.
|
||||||
|
|
||||||
|
|
||||||
|
Version 9a 19-Jan-2014
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
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
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
@@ -138,11 +164,6 @@ Huffman tables being used.
|
|||||||
|
|
||||||
Huffman tables are checked for validity much more carefully than before.
|
Huffman tables are checked for validity much more carefully than before.
|
||||||
|
|
||||||
To avoid the Unisys LZW patent, djpeg's GIF output capability has been
|
|
||||||
changed to produce "uncompressed GIFs", and cjpeg's GIF input capability
|
|
||||||
has been removed altogether. We're not happy about it either, but there
|
|
||||||
seems to be no good alternative.
|
|
||||||
|
|
||||||
The configure script now supports building libjpeg as a shared library
|
The configure script now supports building libjpeg as a shared library
|
||||||
on many flavors of Unix (all the ones that GNU libtool knows how to
|
on many flavors of Unix (all the ones that GNU libtool knows how to
|
||||||
build shared libraries for). Use "./configure --enable-shared" to
|
build shared libraries for). Use "./configure --enable-shared" to
|
||||||
|
|||||||
73
cjpeg.1
@@ -1,4 +1,4 @@
|
|||||||
.TH CJPEG 1 "18 March 2017"
|
.TH CJPEG 1 "30 November 2021"
|
||||||
.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
|
||||||
@@ -16,8 +16,7 @@ cjpeg \- compress an image file to a JPEG file
|
|||||||
compresses the named image file, or the standard input if no file is
|
compresses the named image file, or the standard input if no file is
|
||||||
named, and produces a JPEG/JFIF file on the standard output.
|
named, and produces a JPEG/JFIF file on the standard output.
|
||||||
The currently supported input file formats are: PPM (PBMPLUS color
|
The currently supported input file formats are: PPM (PBMPLUS color
|
||||||
format), PGM (PBMPLUS grayscale format), BMP, Targa, and RLE (Utah Raster
|
format), PGM (PBMPLUS grayscale format), BMP, GIF, and Targa.
|
||||||
Toolkit format). (RLE is supported only if the URT library is available.)
|
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
All switch names may be abbreviated; for example,
|
All switch names may be abbreviated; for example,
|
||||||
.B \-grayscale
|
.B \-grayscale
|
||||||
@@ -41,11 +40,7 @@ Scale quantization tables to adjust image quality. Quality is 0 (worst) to
|
|||||||
100 (best); default is 75. (See below for more info.)
|
100 (best); default is 75. (See below for more info.)
|
||||||
.TP
|
.TP
|
||||||
.B \-grayscale
|
.B \-grayscale
|
||||||
Create monochrome JPEG file from color input. Be sure to use this switch when
|
Create monochrome JPEG file from color input. By saying
|
||||||
compressing a grayscale BMP file, because
|
|
||||||
.B cjpeg
|
|
||||||
isn't bright enough to notice whether a BMP file uses only shades of gray.
|
|
||||||
By saying
|
|
||||||
.BR \-grayscale,
|
.BR \-grayscale,
|
||||||
you'll get a smaller JPEG file that takes less time to process.
|
you'll get a smaller JPEG file that takes less time to process.
|
||||||
.TP
|
.TP
|
||||||
@@ -161,31 +156,40 @@ arithmetic coded JPEG is not yet widely implemented, so many decoders will be
|
|||||||
unable to view an arithmetic coded JPEG file at all.
|
unable to view an arithmetic coded JPEG file at all.
|
||||||
.TP
|
.TP
|
||||||
.B \-dct int
|
.B \-dct int
|
||||||
Use integer DCT method (default).
|
Use accurate integer DCT method (default).
|
||||||
.TP
|
.TP
|
||||||
.B \-dct fast
|
.B \-dct fast
|
||||||
Use fast integer DCT (less accurate).
|
Use less accurate integer DCT method [legacy feature].
|
||||||
In libjpeg-turbo, the fast method is generally about 5-15% faster than the int
|
When the Independent JPEG Group's software was first released in 1991, the
|
||||||
method when using the x86/x86-64 SIMD extensions (results may vary with other
|
compression time for a 1-megapixel JPEG image on a mainstream PC was measured
|
||||||
SIMD implementations, or when using libjpeg-turbo without SIMD extensions.)
|
in minutes. Thus, the \fBfast\fR integer DCT algorithm provided noticeable
|
||||||
|
performance benefits. On modern CPUs running libjpeg-turbo, however, the
|
||||||
|
compression time for a 1-megapixel JPEG image is measured in milliseconds, and
|
||||||
|
thus the performance benefits of the \fBfast\fR algorithm are much less
|
||||||
|
noticeable. On modern x86/x86-64 CPUs that support AVX2 instructions, the
|
||||||
|
\fBfast\fR and \fBint\fR methods have similar performance. On other types of
|
||||||
|
CPUs, the \fBfast\fR method is generally about 5-15% faster than the \fBint\fR
|
||||||
|
method.
|
||||||
|
|
||||||
For quality levels of 90 and below, there should be little or no perceptible
|
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,
|
quality difference between the two algorithms. For quality levels above 90,
|
||||||
the difference between the fast and the int methods becomes more pronounced.
|
however, the difference between the \fBfast\fR and \fBint\fR methods becomes
|
||||||
With quality=97, for instance, the fast method incurs generally about a 1-3 dB
|
more pronounced. With quality=97, for instance, the \fBfast\fR method incurs
|
||||||
loss (in PSNR) relative to the int method, but this can be larger for some
|
generally about a 1-3 dB loss in PSNR relative to the \fBint\fR method, but
|
||||||
images. Do not use the fast method with quality levels above 97. The
|
this can be larger for some images. Do not use the \fBfast\fR method with
|
||||||
algorithm often degenerates at quality=98 and above and can actually produce a
|
quality levels above 97. The algorithm often degenerates at quality=98 and
|
||||||
more lossy image than if lower quality levels had been used. Also, in
|
above and can actually produce a more lossy image than if lower quality levels
|
||||||
libjpeg-turbo, the fast method is not fully accelerated for quality levels
|
had been used. Also, in libjpeg-turbo, the \fBfast\fR method is not fully
|
||||||
above 97, so it will be slower than the int method.
|
accelerated for quality levels above 97, so it will be slower than the
|
||||||
|
\fBint\fR method.
|
||||||
.TP
|
.TP
|
||||||
.B \-dct float
|
.B \-dct float
|
||||||
Use floating-point DCT method.
|
Use floating-point DCT method [legacy feature].
|
||||||
The float method is mainly a legacy feature. It does not produce significantly
|
The \fBfloat\fR method does not produce significantly more accurate results
|
||||||
more accurate results than the int method, and it is much slower. The float
|
than the \fBint\fR method, and it is much slower. The \fBfloat\fR method may
|
||||||
method may also give different results on different machines due to varying
|
also give different results on different machines due to varying roundoff
|
||||||
roundoff behavior, whereas the integer methods should give the same results on
|
behavior, whereas the integer methods should give the same results on all
|
||||||
all machines.
|
machines.
|
||||||
.TP
|
.TP
|
||||||
.BI \-icc " file"
|
.BI \-icc " file"
|
||||||
Embed ICC color management profile contained in the specified file.
|
Embed ICC color management profile contained in the specified file.
|
||||||
@@ -215,6 +219,14 @@ 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
|
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.
|
also useful for benchmarking, since it reduces the I/O overhead.
|
||||||
.TP
|
.TP
|
||||||
|
.BI \-report
|
||||||
|
Report compression progress.
|
||||||
|
.TP
|
||||||
|
.BI \-strict
|
||||||
|
Treat all warnings as fatal. Enabling this option will cause the compressor to
|
||||||
|
abort if an LZW-compressed GIF input image contains incomplete or corrupt image
|
||||||
|
data.
|
||||||
|
.TP
|
||||||
.B \-verbose
|
.B \-verbose
|
||||||
Enable debug printout. More
|
Enable debug printout. More
|
||||||
.BR \-v 's
|
.BR \-v 's
|
||||||
@@ -341,11 +353,6 @@ This file was modified by The libjpeg-turbo Project to include only information
|
|||||||
relevant to libjpeg-turbo, to wordsmith certain sections, and to describe
|
relevant to libjpeg-turbo, to wordsmith certain sections, and to describe
|
||||||
features not present in libjpeg.
|
features not present in libjpeg.
|
||||||
.SH ISSUES
|
.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
|
|
||||||
Not all variants of BMP and Targa file formats are supported.
|
Not all variants of BMP and Targa file formats are supported.
|
||||||
.PP
|
.PP
|
||||||
The
|
The
|
||||||
|
|||||||
374
cjpeg.c
@@ -5,10 +5,9 @@
|
|||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2003-2011 by Guido Vollbeding.
|
* Modified 2003-2011 by Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2010, 2013-2014, 2017, D. R. Commander.
|
* Copyright (C) 2010, 2013-2014, 2017, 2019-2022, D. R. Commander.
|
||||||
* mozjpeg Modifications:
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* Copyright (C) 2014, Mozilla Corporation.
|
* 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.
|
||||||
* 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.
|
||||||
@@ -28,25 +27,17 @@
|
|||||||
* works regardless of which command line style is used.
|
* works regardless of which command line style is used.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define _CRT_SECURE_NO_DEPRECATE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CJPEG_FUZZER
|
||||||
|
#define JPEG_INTERNALS
|
||||||
|
#endif
|
||||||
#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 "jconfigint.h"
|
||||||
|
|
||||||
#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare malloc(),free() */
|
|
||||||
extern void *malloc(size_t size);
|
|
||||||
extern void free(void *ptr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_CCOMMAND /* command-line reader for Macintosh */
|
|
||||||
#ifdef __MWERKS__
|
|
||||||
#include <SIOUX.h> /* Metrowerks needs this */
|
|
||||||
#include <console.h> /* ... and this */
|
|
||||||
#endif
|
|
||||||
#ifdef THINK_C
|
|
||||||
#include <console.h> /* Think declares it here */
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Create the add-on message string table. */
|
/* Create the add-on message string table. */
|
||||||
|
|
||||||
@@ -70,9 +61,9 @@ static const char * const cdjpeg_message_table[] = {
|
|||||||
* 2) assume we can push back more than one character (works in
|
* 2) assume we can push back more than one character (works in
|
||||||
* some C implementations, but unportable);
|
* some C implementations, but unportable);
|
||||||
* 3) provide our own buffering (breaks input readers that want to use
|
* 3) provide our own buffering (breaks input readers that want to use
|
||||||
* stdio directly, such as the RLE library);
|
* stdio directly);
|
||||||
* or 4) don't put back the data, and modify the input_init methods to assume
|
* or 4) don't put back the data, and modify the input_init methods to assume
|
||||||
* they start reading after the start of file (also breaks RLE library).
|
* they start reading after the start of file.
|
||||||
* #1 is attractive for MS-DOS but is untenable on Unix.
|
* #1 is attractive for MS-DOS but is untenable on Unix.
|
||||||
*
|
*
|
||||||
* The most portable solution for file types that can't be identified by their
|
* The most portable solution for file types that can't be identified by their
|
||||||
@@ -85,8 +76,7 @@ static const char * const cdjpeg_message_table[] = {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static boolean is_targa; /* records user -targa switch */
|
static boolean is_targa; /* records user -targa switch */
|
||||||
static boolean is_jpeg;
|
|
||||||
static boolean copy_markers;
|
|
||||||
|
|
||||||
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)
|
||||||
@@ -119,23 +109,10 @@ 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:
|
|
||||||
copy_markers = TRUE;
|
|
||||||
return jinit_read_png(cinfo);
|
|
||||||
#endif
|
|
||||||
#ifdef RLE_SUPPORTED
|
|
||||||
case 'R':
|
|
||||||
return jinit_read_rle(cinfo);
|
|
||||||
#endif
|
|
||||||
#ifdef TARGA_SUPPORTED
|
#ifdef TARGA_SUPPORTED
|
||||||
case 0x00:
|
case 0x00:
|
||||||
return jinit_read_targa(cinfo);
|
return jinit_read_targa(cinfo);
|
||||||
#endif
|
#endif
|
||||||
case 0xff:
|
|
||||||
is_jpeg = TRUE;
|
|
||||||
copy_markers = TRUE;
|
|
||||||
return jinit_read_jpeg(cinfo);
|
|
||||||
default:
|
default:
|
||||||
ERREXIT(cinfo, JERR_UNKNOWN_FORMAT);
|
ERREXIT(cinfo, JERR_UNKNOWN_FORMAT);
|
||||||
break;
|
break;
|
||||||
@@ -158,6 +135,47 @@ static const char *progname; /* program name for error messages */
|
|||||||
static char *icc_filename; /* for -icc switch */
|
static char *icc_filename; /* for -icc switch */
|
||||||
static char *outfilename; /* for -outfile switch */
|
static char *outfilename; /* for -outfile switch */
|
||||||
boolean memdst; /* for -memdst switch */
|
boolean memdst; /* for -memdst switch */
|
||||||
|
boolean report; /* for -report switch */
|
||||||
|
boolean strict; /* for -strict switch */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CJPEG_FUZZER
|
||||||
|
|
||||||
|
#include <setjmp.h>
|
||||||
|
|
||||||
|
struct my_error_mgr {
|
||||||
|
struct jpeg_error_mgr pub;
|
||||||
|
jmp_buf setjmp_buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
void my_error_exit(j_common_ptr cinfo)
|
||||||
|
{
|
||||||
|
struct my_error_mgr *myerr = (struct my_error_mgr *)cinfo->err;
|
||||||
|
|
||||||
|
longjmp(myerr->setjmp_buffer, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void my_emit_message_fuzzer(j_common_ptr cinfo, int msg_level)
|
||||||
|
{
|
||||||
|
if (msg_level < 0)
|
||||||
|
cinfo->err->num_warnings++;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define HANDLE_ERROR() { \
|
||||||
|
if (cinfo.global_state > CSTATE_START) { \
|
||||||
|
if (memdst && outbuffer) \
|
||||||
|
(*cinfo.dest->term_destination) (&cinfo); \
|
||||||
|
jpeg_abort_compress(&cinfo); \
|
||||||
|
} \
|
||||||
|
jpeg_destroy_compress(&cinfo); \
|
||||||
|
if (input_file != stdin && input_file != NULL) \
|
||||||
|
fclose(input_file); \
|
||||||
|
if (memdst) \
|
||||||
|
free(outbuffer); \
|
||||||
|
return EXIT_FAILURE; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
LOCAL(void)
|
||||||
@@ -177,55 +195,30 @@ usage(void)
|
|||||||
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
|
#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");
|
|
||||||
fprintf(stderr, " -nojfif Do not write JFIF (reduces size by 18 bytes but breaks standards; no known problems in Web browsers)\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_ISLOW_SUPPORTED
|
#ifdef DCT_ISLOW_SUPPORTED
|
||||||
fprintf(stderr, " -dct int Use integer DCT method%s\n",
|
fprintf(stderr, " -dct int Use accurate 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 less accurate integer DCT method [legacy feature]%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 [legacy feature]%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, " -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, " -icc FILE Embed ICC profile contained in FILE\n");
|
fprintf(stderr, " -icc FILE Embed ICC profile contained in FILE\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
|
||||||
@@ -236,9 +229,12 @@ usage(void)
|
|||||||
#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED)
|
#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED)
|
||||||
fprintf(stderr, " -memdst Compress to memory instead of file (useful for benchmarking)\n");
|
fprintf(stderr, " -memdst Compress to memory instead of file (useful for benchmarking)\n");
|
||||||
#endif
|
#endif
|
||||||
|
fprintf(stderr, " -report Report compression progress\n");
|
||||||
|
fprintf(stderr, " -strict Treat all warnings as fatal\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");
|
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");
|
||||||
@@ -274,15 +270,13 @@ parse_switches(j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
/* 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;
|
||||||
icc_filename = NULL;
|
icc_filename = NULL;
|
||||||
outfilename = NULL;
|
outfilename = NULL;
|
||||||
memdst = FALSE;
|
memdst = FALSE;
|
||||||
|
report = FALSE;
|
||||||
|
strict = FALSE;
|
||||||
cinfo->err->trace_level = 0;
|
cinfo->err->trace_level = 0;
|
||||||
|
|
||||||
/* Scan command line options, adjust parameters */
|
/* Scan command line options, adjust parameters */
|
||||||
@@ -303,9 +297,6 @@ parse_switches(j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
/* 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);
|
||||||
@@ -315,27 +306,19 @@ parse_switches(j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
} else if (keymatch(arg, "baseline", 1)) {
|
} else if (keymatch(arg, "baseline", 1)) {
|
||||||
/* 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;
|
|
||||||
cinfo->num_scans = 0;
|
|
||||||
cinfo->scan_info = NULL;
|
|
||||||
|
|
||||||
} 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. */
|
||||||
@@ -357,10 +340,8 @@ parse_switches(j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
PACKAGE_NAME, VERSION, BUILD);
|
PACKAGE_NAME, VERSION, BUILD);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
|
|
||||||
} else if (keymatch(arg, "fastcrush", 4)) {
|
} else if (keymatch(arg, "grayscale", 2) ||
|
||||||
jpeg_c_set_bool_param(cinfo, JBOOLEAN_OPTIMIZE_SCANS, FALSE);
|
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);
|
||||||
|
|
||||||
@@ -368,18 +349,6 @@ parse_switches(j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
/* Force an RGB JPEG file to be generated. */
|
/* Force an RGB JPEG file to be generated. */
|
||||||
jpeg_set_colorspace(cinfo, JCS_RGB);
|
jpeg_set_colorspace(cinfo, JCS_RGB);
|
||||||
|
|
||||||
} else if (keymatch(arg, "lambda1", 7)) {
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE1,
|
|
||||||
atof(argv[argn]));
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "lambda2", 7)) {
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
jpeg_c_set_float_param(cinfo, JFLOAT_LAMBDA_LOG_SCALE2,
|
|
||||||
atof(argv[argn]));
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "icc", 1)) {
|
} else if (keymatch(arg, "icc", 1)) {
|
||||||
/* Set ICC filename. */
|
/* Set ICC filename. */
|
||||||
if (++argn >= argc) /* advance to next argument */
|
if (++argn >= argc) /* advance to next argument */
|
||||||
@@ -399,13 +368,6 @@ parse_switches(j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
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)) {
|
|
||||||
if (++argn >= argc) { /* advance to next argument */
|
|
||||||
fprintf(stderr, "%s: missing argument for dc-scan-opt\n", progname);
|
|
||||||
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
|
||||||
@@ -418,10 +380,8 @@ parse_switches(j_compress_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 */
|
||||||
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)) {
|
||||||
@@ -447,10 +407,8 @@ parse_switches(j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
|
|
||||||
} 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)) {
|
||||||
@@ -470,21 +428,8 @@ parse_switches(j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
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)) {
|
} else if (keymatch(arg, "report", 3)) {
|
||||||
int val;
|
report = TRUE;
|
||||||
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'). */
|
||||||
@@ -505,11 +450,6 @@ parse_switches(j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
/* 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 */
|
||||||
@@ -545,64 +485,14 @@ parse_switches(j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
usage();
|
usage();
|
||||||
cinfo->smoothing_factor = val;
|
cinfo->smoothing_factor = val;
|
||||||
|
|
||||||
|
} else if (keymatch(arg, "strict", 2)) {
|
||||||
|
strict = TRUE;
|
||||||
|
|
||||||
} 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 if (keymatch(arg, "nojfif", 6)) {
|
|
||||||
cinfo->write_JFIF_header = 0;
|
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "%s: unknown option '%s'\n", progname, arg);
|
|
||||||
usage(); /* bogus switch */
|
usage(); /* bogus switch */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -614,28 +504,20 @@ 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
|
|
||||||
subsampling must be set after it */
|
|
||||||
if (samplearg != NULL) /* process -sample if it was present */
|
if (samplearg != NULL) /* process -sample if it was present */
|
||||||
if (! set_sample_factors(cinfo, samplearg)) {
|
if (!set_sample_factors(cinfo, samplearg))
|
||||||
fprintf(stderr, "%s: can't set sample factors\n", progname);
|
|
||||||
usage();
|
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 */
|
||||||
@@ -653,6 +535,19 @@ parse_switches(j_compress_ptr cinfo, int argc, char **argv,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
METHODDEF(void)
|
||||||
|
my_emit_message(j_common_ptr cinfo, int msg_level)
|
||||||
|
{
|
||||||
|
if (msg_level < 0) {
|
||||||
|
/* Treat warning as fatal */
|
||||||
|
cinfo->err->error_exit(cinfo);
|
||||||
|
} else {
|
||||||
|
if (cinfo->err->trace_level >= msg_level)
|
||||||
|
cinfo->err->output_message(cinfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The main program.
|
* The main program.
|
||||||
*/
|
*/
|
||||||
@@ -661,13 +556,16 @@ int
|
|||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct jpeg_compress_struct cinfo;
|
struct jpeg_compress_struct cinfo;
|
||||||
|
#ifdef CJPEG_FUZZER
|
||||||
|
struct my_error_mgr myerr;
|
||||||
|
struct jpeg_error_mgr &jerr = myerr.pub;
|
||||||
|
#else
|
||||||
struct jpeg_error_mgr jerr;
|
struct jpeg_error_mgr jerr;
|
||||||
#ifdef PROGRESS_REPORT
|
|
||||||
struct cdjpeg_progress_mgr progress;
|
|
||||||
#endif
|
#endif
|
||||||
|
struct cdjpeg_progress_mgr progress;
|
||||||
int file_index;
|
int file_index;
|
||||||
cjpeg_source_ptr src_mgr;
|
cjpeg_source_ptr src_mgr;
|
||||||
FILE *input_file;
|
FILE *input_file = NULL;
|
||||||
FILE *icc_file;
|
FILE *icc_file;
|
||||||
JOCTET *icc_profile = NULL;
|
JOCTET *icc_profile = NULL;
|
||||||
long icc_len = 0;
|
long icc_len = 0;
|
||||||
@@ -676,11 +574,6 @@ main(int argc, char **argv)
|
|||||||
unsigned long outsize = 0;
|
unsigned long outsize = 0;
|
||||||
JDIMENSION num_scanlines;
|
JDIMENSION num_scanlines;
|
||||||
|
|
||||||
/* On Mac, fetch a command line. */
|
|
||||||
#ifdef USE_CCOMMAND
|
|
||||||
argc = ccommand(&argv);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
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 */
|
||||||
@@ -710,6 +603,9 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
file_index = parse_switches(&cinfo, argc, argv, 0, FALSE);
|
file_index = parse_switches(&cinfo, argc, argv, 0, FALSE);
|
||||||
|
|
||||||
|
if (strict)
|
||||||
|
jerr.emit_message = my_emit_message;
|
||||||
|
|
||||||
#ifdef TWO_FILE_COMMANDLINE
|
#ifdef TWO_FILE_COMMANDLINE
|
||||||
if (!memdst) {
|
if (!memdst) {
|
||||||
/* Must have either -outfile switch or explicit output file name */
|
/* Must have either -outfile switch or explicit output file name */
|
||||||
@@ -785,21 +681,29 @@ main(int argc, char **argv)
|
|||||||
fclose(icc_file);
|
fclose(icc_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PROGRESS_REPORT
|
#ifdef CJPEG_FUZZER
|
||||||
start_progress_monitor((j_common_ptr)&cinfo, &progress);
|
jerr.error_exit = my_error_exit;
|
||||||
|
jerr.emit_message = my_emit_message_fuzzer;
|
||||||
|
if (setjmp(myerr.setjmp_buffer))
|
||||||
|
HANDLE_ERROR()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (report) {
|
||||||
|
start_progress_monitor((j_common_ptr)&cinfo, &progress);
|
||||||
|
progress.report = report;
|
||||||
|
}
|
||||||
|
|
||||||
/* Figure out the input file format, and set up to read it. */
|
/* Figure out the input file format, and set up to read it. */
|
||||||
src_mgr = select_file_type(&cinfo, input_file);
|
src_mgr = select_file_type(&cinfo, input_file);
|
||||||
src_mgr->input_file = input_file;
|
src_mgr->input_file = input_file;
|
||||||
|
#ifdef CJPEG_FUZZER
|
||||||
|
src_mgr->max_pixels = 1048576;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Read the input file header to obtain file size & colorspace. */
|
/* Read the input file header to obtain file size & colorspace. */
|
||||||
(*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 */
|
||||||
@@ -813,53 +717,21 @@ main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
jpeg_stdio_dest(&cinfo, output_file);
|
jpeg_stdio_dest(&cinfo, output_file);
|
||||||
|
|
||||||
|
#ifdef CJPEG_FUZZER
|
||||||
|
if (setjmp(myerr.setjmp_buffer))
|
||||||
|
HANDLE_ERROR()
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Start compressor */
|
/* Start compressor */
|
||||||
jpeg_start_compress(&cinfo, TRUE);
|
jpeg_start_compress(&cinfo, TRUE);
|
||||||
|
|
||||||
/* Copy metadata */
|
|
||||||
if (copy_markers) {
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (icc_profile != NULL)
|
if (icc_profile != NULL)
|
||||||
jpeg_write_icc_profile(&cinfo, icc_profile, (unsigned int)icc_len);
|
jpeg_write_icc_profile(&cinfo, icc_profile, (unsigned int)icc_len);
|
||||||
|
|
||||||
/* 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
|
(void)jpeg_write_scanlines(&cinfo, src_mgr->buffer, num_scanlines);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Finish compression and release memory */
|
/* Finish compression and release memory */
|
||||||
@@ -873,18 +745,18 @@ main(int argc, char **argv)
|
|||||||
if (output_file != stdout && output_file != NULL)
|
if (output_file != stdout && output_file != NULL)
|
||||||
fclose(output_file);
|
fclose(output_file);
|
||||||
|
|
||||||
#ifdef PROGRESS_REPORT
|
if (report)
|
||||||
end_progress_monitor((j_common_ptr)&cinfo);
|
end_progress_monitor((j_common_ptr)&cinfo);
|
||||||
#endif
|
|
||||||
|
|
||||||
if (memdst) {
|
if (memdst) {
|
||||||
|
#ifndef CJPEG_FUZZER
|
||||||
fprintf(stderr, "Compressed size: %lu bytes\n", outsize);
|
fprintf(stderr, "Compressed size: %lu bytes\n", outsize);
|
||||||
|
#endif
|
||||||
free(outbuffer);
|
free(outbuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(icc_profile);
|
free(icc_profile);
|
||||||
|
|
||||||
/* All done. */
|
/* All done. */
|
||||||
exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS);
|
return (jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS);
|
||||||
return 0; /* suppress no-return-value warnings */
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,6 @@
|
|||||||
# This file is included from the top-level CMakeLists.txt. We just store it
|
# This file is included from the top-level CMakeLists.txt. We just store it
|
||||||
# here to avoid cluttering up that file.
|
# here to avoid cluttering up that file.
|
||||||
|
|
||||||
set(PKGNAME ${CMAKE_PROJECT_NAME} CACHE STRING
|
|
||||||
"Distribution package name (default: ${CMAKE_PROJECT_NAME})")
|
|
||||||
set(PKGVENDOR "The ${CMAKE_PROJECT_NAME} Project" CACHE STRING
|
|
||||||
"Vendor name to be included in distribution package descriptions (default: The ${CMAKE_PROJECT_NAME} Project)")
|
|
||||||
set(PKGURL "http://www.${CMAKE_PROJECT_NAME}.org" CACHE STRING
|
|
||||||
"URL of project web site to be included in distribution package descriptions (default: http://www.${CMAKE_PROJECT_NAME}.org)")
|
|
||||||
set(PKGEMAIL "information@${CMAKE_PROJECT_NAME}.org" CACHE STRING
|
|
||||||
"E-mail of project maintainer to be included in distribution package descriptions (default: information@${CMAKE_PROJECT_NAME}.org")
|
|
||||||
set(PKGID "com.${CMAKE_PROJECT_NAME}.${PKGNAME}" CACHE STRING
|
|
||||||
"Globally unique package identifier (reverse DNS notation) (default: com.${CMAKE_PROJECT_NAME}.${PKGNAME})")
|
|
||||||
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Linux RPM and DEB
|
# Linux RPM and DEB
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@@ -22,12 +10,21 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|||||||
set(RPMARCH ${CMAKE_SYSTEM_PROCESSOR})
|
set(RPMARCH ${CMAKE_SYSTEM_PROCESSOR})
|
||||||
if(CPU_TYPE STREQUAL "x86_64")
|
if(CPU_TYPE STREQUAL "x86_64")
|
||||||
set(DEBARCH amd64)
|
set(DEBARCH amd64)
|
||||||
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "armv7*")
|
|
||||||
set(DEBARCH armhf)
|
|
||||||
elseif(CPU_TYPE STREQUAL "arm64")
|
elseif(CPU_TYPE STREQUAL "arm64")
|
||||||
set(DEBARCH ${CPU_TYPE})
|
set(DEBARCH ${CPU_TYPE})
|
||||||
elseif(CPU_TYPE STREQUAL "arm")
|
elseif(CPU_TYPE STREQUAL "arm")
|
||||||
|
check_c_source_compiles("
|
||||||
|
#if __ARM_PCS_VFP != 1
|
||||||
|
#error \"float ABI != hard\"
|
||||||
|
#endif
|
||||||
|
int main(void) { return 0; }" HAVE_HARD_FLOAT)
|
||||||
|
if(HAVE_HARD_FLOAT)
|
||||||
|
set(RPMARCH armv7hl)
|
||||||
|
set(DEBARCH armhf)
|
||||||
|
else()
|
||||||
|
set(RPMARCH armel)
|
||||||
set(DEBARCH armel)
|
set(DEBARCH armel)
|
||||||
|
endif()
|
||||||
elseif(CMAKE_SYSTEM_PROCESSOR_LC STREQUAL "ppc64le")
|
elseif(CMAKE_SYSTEM_PROCESSOR_LC STREQUAL "ppc64le")
|
||||||
set(DEBARCH ppc64el)
|
set(DEBARCH ppc64el)
|
||||||
elseif(CPU_TYPE STREQUAL "powerpc" AND BITS EQUAL 32)
|
elseif(CPU_TYPE STREQUAL "powerpc" AND BITS EQUAL 32)
|
||||||
@@ -45,19 +42,19 @@ boolean_number(CMAKE_POSITION_INDEPENDENT_CODE)
|
|||||||
configure_file(release/makerpm.in pkgscripts/makerpm)
|
configure_file(release/makerpm.in pkgscripts/makerpm)
|
||||||
configure_file(release/rpm.spec.in pkgscripts/rpm.spec @ONLY)
|
configure_file(release/rpm.spec.in pkgscripts/rpm.spec @ONLY)
|
||||||
|
|
||||||
add_custom_target(rpm sh pkgscripts/makerpm
|
add_custom_target(rpm pkgscripts/makerpm
|
||||||
SOURCES pkgscripts/makerpm)
|
SOURCES pkgscripts/makerpm)
|
||||||
|
|
||||||
configure_file(release/makesrpm.in pkgscripts/makesrpm)
|
configure_file(release/makesrpm.in pkgscripts/makesrpm)
|
||||||
|
|
||||||
add_custom_target(srpm sh pkgscripts/makesrpm
|
add_custom_target(srpm pkgscripts/makesrpm
|
||||||
SOURCES pkgscripts/makesrpm
|
SOURCES pkgscripts/makesrpm
|
||||||
DEPENDS dist)
|
DEPENDS dist)
|
||||||
|
|
||||||
configure_file(release/makedpkg.in pkgscripts/makedpkg)
|
configure_file(release/makedpkg.in pkgscripts/makedpkg)
|
||||||
configure_file(release/deb-control.in pkgscripts/deb-control)
|
configure_file(release/deb-control.in pkgscripts/deb-control)
|
||||||
|
|
||||||
add_custom_target(deb sh pkgscripts/makedpkg
|
add_custom_target(deb pkgscripts/makedpkg
|
||||||
SOURCES pkgscripts/makedpkg)
|
SOURCES pkgscripts/makedpkg)
|
||||||
|
|
||||||
endif() # Linux
|
endif() # Linux
|
||||||
@@ -71,12 +68,14 @@ if(WIN32)
|
|||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
set(INST_PLATFORM "Visual C++")
|
set(INST_PLATFORM "Visual C++")
|
||||||
set(INST_NAME ${CMAKE_PROJECT_NAME}-${VERSION}-vc)
|
set(INST_ID vc)
|
||||||
|
set(INST_NAME ${CMAKE_PROJECT_NAME}-${VERSION}-${INST_ID})
|
||||||
set(INST_REG_NAME ${CMAKE_PROJECT_NAME})
|
set(INST_REG_NAME ${CMAKE_PROJECT_NAME})
|
||||||
elseif(MINGW)
|
elseif(MINGW)
|
||||||
set(INST_PLATFORM GCC)
|
set(INST_PLATFORM GCC)
|
||||||
set(INST_NAME ${CMAKE_PROJECT_NAME}-${VERSION}-gcc)
|
set(INST_ID gcc)
|
||||||
set(INST_REG_NAME ${CMAKE_PROJECT_NAME}-gcc)
|
set(INST_NAME ${CMAKE_PROJECT_NAME}-${VERSION}-${INST_ID})
|
||||||
|
set(INST_REG_NAME ${CMAKE_PROJECT_NAME}-${INST_ID})
|
||||||
set(INST_DEFS -DGCC)
|
set(INST_DEFS -DGCC)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -100,64 +99,48 @@ endif()
|
|||||||
string(REGEX REPLACE "/" "\\\\" INST_DIR ${CMAKE_INSTALL_PREFIX})
|
string(REGEX REPLACE "/" "\\\\" INST_DIR ${CMAKE_INSTALL_PREFIX})
|
||||||
|
|
||||||
configure_file(release/installer.nsi.in installer.nsi @ONLY)
|
configure_file(release/installer.nsi.in installer.nsi @ONLY)
|
||||||
|
# TODO: It would be nice to eventually switch to CPack and eliminate this mess,
|
||||||
|
# but not today.
|
||||||
|
configure_file(win/projectTargets.cmake.in
|
||||||
|
win/${CMAKE_PROJECT_NAME}Targets.cmake @ONLY)
|
||||||
|
configure_file(win/${INST_ID}/projectTargets-release.cmake.in
|
||||||
|
win/${CMAKE_PROJECT_NAME}Targets-release.cmake @ONLY)
|
||||||
|
|
||||||
if(WITH_JAVA)
|
if(WITH_JAVA)
|
||||||
set(JAVA_DEPEND turbojpeg-java)
|
set(JAVA_DEPEND turbojpeg-java)
|
||||||
endif()
|
endif()
|
||||||
|
if(WITH_TURBOJPEG)
|
||||||
|
set(TURBOJPEG_DEPEND turbojpeg turbojpeg-static tjbench)
|
||||||
|
endif()
|
||||||
add_custom_target(installer
|
add_custom_target(installer
|
||||||
makensis -nocd ${INST_DEFS} installer.nsi
|
makensis -nocd ${INST_DEFS} installer.nsi
|
||||||
DEPENDS jpeg jpeg-static turbojpeg turbojpeg-static rdjpgcom wrjpgcom
|
DEPENDS jpeg jpeg-static rdjpgcom wrjpgcom cjpeg djpeg jpegtran
|
||||||
cjpeg djpeg jpegtran tjbench ${JAVA_DEPEND}
|
${JAVA_DEPEND} ${TURBOJPEG_DEPEND}
|
||||||
SOURCES installer.nsi)
|
SOURCES installer.nsi)
|
||||||
|
|
||||||
endif() # WIN32
|
endif() # WIN32
|
||||||
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# Cygwin Package
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
if(CYGWIN)
|
|
||||||
|
|
||||||
configure_file(release/makecygwinpkg.in pkgscripts/makecygwinpkg)
|
|
||||||
|
|
||||||
add_custom_target(cygwinpkg sh pkgscripts/makecygwinpkg)
|
|
||||||
|
|
||||||
endif() # CYGWIN
|
|
||||||
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Mac DMG
|
# Mac DMG
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
|
|
||||||
set(DEFAULT_OSX_32BIT_BUILD ${CMAKE_SOURCE_DIR}/osxx86)
|
set(ARMV8_BUILD "" CACHE PATH
|
||||||
set(OSX_32BIT_BUILD ${DEFAULT_OSX_32BIT_BUILD} CACHE PATH
|
"Directory containing Armv8 iOS or macOS build to include in universal binaries")
|
||||||
"Directory containing 32-bit (i386) Mac build to include in universal binaries (default: ${DEFAULT_OSX_32BIT_BUILD})")
|
|
||||||
set(DEFAULT_IOS_ARMV7_BUILD ${CMAKE_SOURCE_DIR}/iosarmv7)
|
|
||||||
set(IOS_ARMV7_BUILD ${DEFAULT_IOS_ARMV7_BUILD} CACHE PATH
|
|
||||||
"Directory containing ARMv7 iOS build to include in universal binaries (default: ${DEFAULT_IOS_ARMV7_BUILD})")
|
|
||||||
set(DEFAULT_IOS_ARMV7S_BUILD ${CMAKE_SOURCE_DIR}/iosarmv7s)
|
|
||||||
set(IOS_ARMV7S_BUILD ${DEFAULT_IOS_ARMV7S_BUILD} CACHE PATH
|
|
||||||
"Directory containing ARMv7s iOS build to include in universal binaries (default: ${DEFAULT_IOS_ARMV7S_BUILD})")
|
|
||||||
set(DEFAULT_IOS_ARMV8_BUILD ${CMAKE_SOURCE_DIR}/iosarmv8)
|
|
||||||
set(IOS_ARMV8_BUILD ${DEFAULT_IOS_ARMV8_BUILD} CACHE PATH
|
|
||||||
"Directory containing ARMv8 iOS build to include in universal binaries (default: ${DEFAULT_IOS_ARMV8_BUILD})")
|
|
||||||
|
|
||||||
set(OSX_APP_CERT_NAME "" CACHE STRING
|
set(MACOS_APP_CERT_NAME "" CACHE STRING
|
||||||
"Name of the Developer ID Application certificate (in the macOS keychain) that should be used to sign the libjpeg-turbo DMG. Leave this blank to generate an unsigned DMG.")
|
"Name of the Developer ID Application certificate (in the macOS keychain) that should be used to sign the libjpeg-turbo DMG. Leave this blank to generate an unsigned DMG.")
|
||||||
set(OSX_INST_CERT_NAME "" CACHE STRING
|
set(MACOS_INST_CERT_NAME "" CACHE STRING
|
||||||
"Name of the Developer ID Installer certificate (in the macOS keychain) that should be used to sign the libjpeg-turbo installer package. Leave this blank to generate an unsigned package.")
|
"Name of the Developer ID Installer certificate (in the macOS keychain) that should be used to sign the libjpeg-turbo installer package. Leave this blank to generate an unsigned package.")
|
||||||
|
|
||||||
configure_file(release/makemacpkg.in pkgscripts/makemacpkg)
|
configure_file(release/makemacpkg.in pkgscripts/makemacpkg)
|
||||||
configure_file(release/Distribution.xml.in pkgscripts/Distribution.xml)
|
configure_file(release/Distribution.xml.in pkgscripts/Distribution.xml)
|
||||||
|
configure_file(release/Welcome.rtf.in pkgscripts/Welcome.rtf)
|
||||||
configure_file(release/uninstall.in pkgscripts/uninstall)
|
configure_file(release/uninstall.in pkgscripts/uninstall)
|
||||||
|
|
||||||
add_custom_target(dmg sh pkgscripts/makemacpkg
|
add_custom_target(dmg pkgscripts/makemacpkg
|
||||||
SOURCES pkgscripts/makemacpkg)
|
|
||||||
|
|
||||||
add_custom_target(udmg sh pkgscripts/makemacpkg universal
|
|
||||||
SOURCES pkgscripts/makemacpkg)
|
SOURCES pkgscripts/makemacpkg)
|
||||||
|
|
||||||
endif() # APPLE
|
endif() # APPLE
|
||||||
@@ -174,9 +157,20 @@ add_custom_target(dist
|
|||||||
|
|
||||||
configure_file(release/maketarball.in pkgscripts/maketarball)
|
configure_file(release/maketarball.in pkgscripts/maketarball)
|
||||||
|
|
||||||
add_custom_target(tarball sh pkgscripts/maketarball
|
add_custom_target(tarball pkgscripts/maketarball
|
||||||
SOURCES pkgscripts/maketarball)
|
SOURCES pkgscripts/maketarball)
|
||||||
|
|
||||||
configure_file(release/libjpeg.pc.in pkgscripts/libjpeg.pc @ONLY)
|
configure_file(release/libjpeg.pc.in pkgscripts/libjpeg.pc @ONLY)
|
||||||
|
|
||||||
configure_file(release/libturbojpeg.pc.in pkgscripts/libturbojpeg.pc @ONLY)
|
if(WITH_TURBOJPEG)
|
||||||
|
configure_file(release/libturbojpeg.pc.in pkgscripts/libturbojpeg.pc @ONLY)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(CMakePackageConfigHelpers)
|
||||||
|
write_basic_package_version_file(
|
||||||
|
pkgscripts/${CMAKE_PROJECT_NAME}ConfigVersion.cmake
|
||||||
|
VERSION ${VERSION} COMPATIBILITY AnyNewerVersion)
|
||||||
|
|
||||||
|
configure_package_config_file(release/Config.cmake.in
|
||||||
|
pkgscripts/${CMAKE_PROJECT_NAME}Config.cmake
|
||||||
|
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME})
|
||||||
|
|||||||
@@ -118,6 +118,7 @@
|
|||||||
# absolute paths where necessary, using the same logic.
|
# absolute paths where necessary, using the same logic.
|
||||||
|
|
||||||
#=============================================================================
|
#=============================================================================
|
||||||
|
# Copyright 2018 Matthias Räncker
|
||||||
# Copyright 2016, 2019 D. R. Commander
|
# Copyright 2016, 2019 D. R. Commander
|
||||||
# Copyright 2016 Dmitry Marakasov
|
# Copyright 2016 Dmitry Marakasov
|
||||||
# Copyright 2016 Roger Leigh
|
# Copyright 2016 Roger Leigh
|
||||||
@@ -259,6 +260,8 @@ if(NOT DEFINED CMAKE_INSTALL_DEFAULT_LIBDIR)
|
|||||||
else()
|
else()
|
||||||
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
|
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
|
||||||
set(CMAKE_INSTALL_DEFAULT_LIBDIR "lib64")
|
set(CMAKE_INSTALL_DEFAULT_LIBDIR "lib64")
|
||||||
|
elseif(CMAKE_C_COMPILER_ABI MATCHES "ELF X32")
|
||||||
|
set(CMAKE_INSTALL_DEFAULT_LIBDIR "libx32")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
13
cmakescripts/PackageInfo.cmake
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# This file is included from the top-level CMakeLists.txt. We just store it
|
||||||
|
# here to avoid cluttering up that file.
|
||||||
|
|
||||||
|
set(PKGNAME ${CMAKE_PROJECT_NAME} CACHE STRING
|
||||||
|
"Distribution package name (default: ${CMAKE_PROJECT_NAME})")
|
||||||
|
set(PKGVENDOR "The ${CMAKE_PROJECT_NAME} Project" CACHE STRING
|
||||||
|
"Vendor name to be included in distribution package descriptions (default: The ${CMAKE_PROJECT_NAME} Project)")
|
||||||
|
set(PKGURL "http://www.${CMAKE_PROJECT_NAME}.org" CACHE STRING
|
||||||
|
"URL of project web site to be included in distribution package descriptions (default: http://www.${CMAKE_PROJECT_NAME}.org)")
|
||||||
|
set(PKGEMAIL "information@${CMAKE_PROJECT_NAME}.org" CACHE STRING
|
||||||
|
"E-mail of project maintainer to be included in distribution package descriptions (default: information@${CMAKE_PROJECT_NAME}.org")
|
||||||
|
set(PKGID "com.${CMAKE_PROJECT_NAME}.${PKGNAME}" CACHE STRING
|
||||||
|
"Globally unique package identifier (reverse DNS notation) (default: com.${CMAKE_PROJECT_NAME}.${PKGNAME})")
|
||||||
95
croptest.in
Executable file
@@ -0,0 +1,95 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -u
|
||||||
|
set -e
|
||||||
|
trap onexit INT
|
||||||
|
trap onexit TERM
|
||||||
|
trap onexit EXIT
|
||||||
|
|
||||||
|
onexit()
|
||||||
|
{
|
||||||
|
if [ -d $OUTDIR ]; then
|
||||||
|
rm -rf $OUTDIR
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
runme()
|
||||||
|
{
|
||||||
|
echo \*\*\* $*
|
||||||
|
$*
|
||||||
|
}
|
||||||
|
|
||||||
|
IMAGE=vgl_6548_0026a.bmp
|
||||||
|
WIDTH=128
|
||||||
|
HEIGHT=95
|
||||||
|
IMGDIR=@CMAKE_CURRENT_SOURCE_DIR@/testimages
|
||||||
|
OUTDIR=`mktemp -d /tmp/__croptest_output.XXXXXX`
|
||||||
|
EXEDIR=@CMAKE_CURRENT_BINARY_DIR@
|
||||||
|
|
||||||
|
if [ -d $OUTDIR ]; then
|
||||||
|
rm -rf $OUTDIR
|
||||||
|
fi
|
||||||
|
mkdir -p $OUTDIR
|
||||||
|
|
||||||
|
exec >$EXEDIR/croptest.log
|
||||||
|
|
||||||
|
echo "============================================================"
|
||||||
|
echo "$IMAGE ($WIDTH x $HEIGHT)"
|
||||||
|
echo "============================================================"
|
||||||
|
echo
|
||||||
|
|
||||||
|
for PROGARG in "" -progressive; do
|
||||||
|
|
||||||
|
cp $IMGDIR/$IMAGE $OUTDIR
|
||||||
|
basename=`basename $IMAGE .bmp`
|
||||||
|
echo "------------------------------------------------------------"
|
||||||
|
echo "Generating test images"
|
||||||
|
echo "------------------------------------------------------------"
|
||||||
|
echo
|
||||||
|
runme $EXEDIR/cjpeg $PROGARG -grayscale -outfile $OUTDIR/${basename}_GRAY.jpg $IMGDIR/${basename}.bmp
|
||||||
|
runme $EXEDIR/cjpeg $PROGARG -sample 2x2 -outfile $OUTDIR/${basename}_420.jpg $IMGDIR/${basename}.bmp
|
||||||
|
runme $EXEDIR/cjpeg $PROGARG -sample 2x1 -outfile $OUTDIR/${basename}_422.jpg $IMGDIR/${basename}.bmp
|
||||||
|
runme $EXEDIR/cjpeg $PROGARG -sample 1x2 -outfile $OUTDIR/${basename}_440.jpg $IMGDIR/${basename}.bmp
|
||||||
|
runme $EXEDIR/cjpeg $PROGARG -sample 1x1 -outfile $OUTDIR/${basename}_444.jpg $IMGDIR/${basename}.bmp
|
||||||
|
echo
|
||||||
|
|
||||||
|
for NSARG in "" -nosmooth; do
|
||||||
|
|
||||||
|
for COLORSARG in "" "-colors 256 -dither none -onepass"; do
|
||||||
|
|
||||||
|
for Y in {0..16}; do
|
||||||
|
|
||||||
|
for H in {1..16}; do
|
||||||
|
|
||||||
|
X=$(( (Y*16)%128 ))
|
||||||
|
W=$(( WIDTH-X-7 ))
|
||||||
|
if [ $Y -le 15 ]; then
|
||||||
|
CROPSPEC="${W}x${H}+${X}+${Y}"
|
||||||
|
else
|
||||||
|
Y2=$(( HEIGHT-H ));
|
||||||
|
CROPSPEC="${W}x${H}+${X}+${Y2}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "------------------------------------------------------------"
|
||||||
|
echo $PROGARG $NSARG $COLORSARG -crop $CROPSPEC
|
||||||
|
echo "------------------------------------------------------------"
|
||||||
|
echo
|
||||||
|
for samp in GRAY 420 422 440 444; do
|
||||||
|
$EXEDIR/djpeg $NSARG $COLORSARG -rgb -outfile $OUTDIR/${basename}_${samp}_full.ppm $OUTDIR/${basename}_${samp}.jpg
|
||||||
|
convert -crop $CROPSPEC $OUTDIR/${basename}_${samp}_full.ppm $OUTDIR/${basename}_${samp}_ref.ppm
|
||||||
|
runme $EXEDIR/djpeg $NSARG $COLORSARG -crop $CROPSPEC -rgb -outfile $OUTDIR/${basename}_${samp}.ppm $OUTDIR/${basename}_${samp}.jpg
|
||||||
|
runme cmp $OUTDIR/${basename}_${samp}.ppm $OUTDIR/${basename}_${samp}_ref.ppm
|
||||||
|
done
|
||||||
|
echo
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
echo SUCCESS!
|
||||||
110
djpeg.1
@@ -1,4 +1,4 @@
|
|||||||
.TH DJPEG 1 "13 November 2017"
|
.TH DJPEG 1 "4 November 2020"
|
||||||
.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
|
||||||
@@ -15,8 +15,7 @@ djpeg \- decompress a JPEG file to an image file
|
|||||||
.B djpeg
|
.B djpeg
|
||||||
decompresses the named JPEG file, or the standard input if no file is named,
|
decompresses the named JPEG file, or the standard input if no file is named,
|
||||||
and produces an image file on the standard output. PBMPLUS (PPM/PGM), BMP,
|
and produces an image file on the standard output. PBMPLUS (PPM/PGM), BMP,
|
||||||
GIF, Targa, or RLE (Utah Raster Toolkit) output format can be selected.
|
GIF, or Targa output format can be selected.
|
||||||
(RLE is supported only if the URT library is available.)
|
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
All switch names may be abbreviated; for example,
|
All switch names may be abbreviated; for example,
|
||||||
.B \-grayscale
|
.B \-grayscale
|
||||||
@@ -81,9 +80,20 @@ is specified, or if the JPEG file is grayscale; otherwise, 24-bit full-color
|
|||||||
format is emitted.
|
format is emitted.
|
||||||
.TP
|
.TP
|
||||||
.B \-gif
|
.B \-gif
|
||||||
Select GIF output format. Since GIF does not support more than 256 colors,
|
Select GIF output format (LZW-compressed). Since GIF does not support more
|
||||||
|
than 256 colors,
|
||||||
.B \-colors 256
|
.B \-colors 256
|
||||||
is assumed (unless you specify a smaller number of colors).
|
is assumed (unless you specify a smaller number of colors). If you specify
|
||||||
|
.BR \-fast,
|
||||||
|
the default number of colors is 216.
|
||||||
|
.TP
|
||||||
|
.B \-gif0
|
||||||
|
Select GIF output format (uncompressed). Since GIF does not support more than
|
||||||
|
256 colors,
|
||||||
|
.B \-colors 256
|
||||||
|
is assumed (unless you specify a smaller number of colors). If you specify
|
||||||
|
.BR \-fast,
|
||||||
|
the default number of colors is 216.
|
||||||
.TP
|
.TP
|
||||||
.B \-os2
|
.B \-os2
|
||||||
Select BMP output format (OS/2 1.x flavor). 8-bit colormapped format is
|
Select BMP output format (OS/2 1.x flavor). 8-bit colormapped format is
|
||||||
@@ -100,9 +110,6 @@ PGM is emitted if the JPEG file is grayscale or if
|
|||||||
.B \-grayscale
|
.B \-grayscale
|
||||||
is specified; otherwise PPM is emitted.
|
is specified; otherwise PPM is emitted.
|
||||||
.TP
|
.TP
|
||||||
.B \-rle
|
|
||||||
Select RLE output format. (Requires URT library.)
|
|
||||||
.TP
|
|
||||||
.B \-targa
|
.B \-targa
|
||||||
Select Targa output format. Grayscale format is emitted if the JPEG file is
|
Select Targa output format. Grayscale format is emitted if the JPEG file is
|
||||||
grayscale or if
|
grayscale or if
|
||||||
@@ -114,32 +121,40 @@ is specified; otherwise, 24-bit full-color format is emitted.
|
|||||||
Switches for advanced users:
|
Switches for advanced users:
|
||||||
.TP
|
.TP
|
||||||
.B \-dct int
|
.B \-dct int
|
||||||
Use integer DCT method (default).
|
Use accurate integer DCT method (default).
|
||||||
.TP
|
.TP
|
||||||
.B \-dct fast
|
.B \-dct fast
|
||||||
Use fast integer DCT (less accurate).
|
Use less accurate integer DCT method [legacy feature].
|
||||||
In libjpeg-turbo, the fast method is generally about 5-15% faster than the int
|
When the Independent JPEG Group's software was first released in 1991, the
|
||||||
method when using the x86/x86-64 SIMD extensions (results may vary with other
|
decompression time for a 1-megapixel JPEG image on a mainstream PC was measured
|
||||||
SIMD implementations, or when using libjpeg-turbo without SIMD extensions.) If
|
in minutes. Thus, the \fBfast\fR integer DCT algorithm provided noticeable
|
||||||
the JPEG image was compressed using a quality level of 85 or below, then there
|
performance benefits. On modern CPUs running libjpeg-turbo, however, the
|
||||||
should be little or no perceptible difference between the two algorithms. When
|
decompression time for a 1-megapixel JPEG image is measured in milliseconds,
|
||||||
decompressing images that were compressed using quality levels above 85,
|
and thus the performance benefits of the \fBfast\fR algorithm are much less
|
||||||
however, the difference between the fast and int methods becomes more
|
noticeable. On modern x86/x86-64 CPUs that support AVX2 instructions, the
|
||||||
pronounced. With images compressed using quality=97, for instance, the fast
|
\fBfast\fR and \fBint\fR methods have similar performance. On other types of
|
||||||
method incurs generally about a 4-6 dB loss (in PSNR) relative to the int
|
CPUs, the \fBfast\fR method is generally about 5-15% faster than the \fBint\fR
|
||||||
method, but this can be larger for some images. If you can avoid it, do not
|
method.
|
||||||
use the fast method when decompressing images that were compressed using
|
|
||||||
quality levels above 97. The algorithm often degenerates for such images and
|
If the JPEG image was compressed using a quality level of 85 or below, then
|
||||||
can actually produce a more lossy output image than if the JPEG image had been
|
there should be little or no perceptible quality difference between the two
|
||||||
compressed using lower quality levels.
|
algorithms. When decompressing images that were compressed using quality
|
||||||
|
levels above 85, however, the difference between the \fBfast\fR and \fBint\fR
|
||||||
|
methods becomes more pronounced. With images compressed using quality=97, for
|
||||||
|
instance, the \fBfast\fR method incurs generally about a 4-6 dB loss in PSNR
|
||||||
|
relative to the \fBint\fR method, but this can be larger for some images. If
|
||||||
|
you can avoid it, do not use the \fBfast\fR 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 [legacy feature].
|
||||||
The float method is mainly a legacy feature. It does not produce significantly
|
The \fBfloat\fR method does not produce significantly more accurate results
|
||||||
more accurate results than the int method, and it is much slower. The float
|
than the \fBint\fR method, and it is much slower. The \fBfloat\fR method may
|
||||||
method may also give different results on different machines due to varying
|
also give different results on different machines due to varying roundoff
|
||||||
roundoff behavior, whereas the integer methods should give the same results on
|
behavior, whereas the integer methods should give the same results on all
|
||||||
all machines.
|
machines.
|
||||||
.TP
|
.TP
|
||||||
.B \-dither fs
|
.B \-dither fs
|
||||||
Use Floyd-Steinberg dithering in color quantization.
|
Use Floyd-Steinberg dithering in color quantization.
|
||||||
@@ -190,6 +205,19 @@ number. For example,
|
|||||||
.B \-max 4m
|
.B \-max 4m
|
||||||
selects 4000000 bytes. If more space is needed, an error will occur.
|
selects 4000000 bytes. If more space is needed, an error will occur.
|
||||||
.TP
|
.TP
|
||||||
|
.BI \-maxscans " N"
|
||||||
|
Abort if the JPEG image contains more than
|
||||||
|
.I N
|
||||||
|
scans. This feature demonstrates a method by which applications can guard
|
||||||
|
against denial-of-service attacks instigated by specially-crafted malformed
|
||||||
|
JPEG images containing numerous scans with missing image data or image data
|
||||||
|
consisting only of "EOB runs" (a feature of progressive JPEG images that allows
|
||||||
|
potentially hundreds of thousands of adjoining zero-value pixels to be
|
||||||
|
represented using only a few bytes.) Attempting to decompress such malformed
|
||||||
|
JPEG images can cause excessive CPU activity, since the decompressor must fully
|
||||||
|
process each scan (even if the scan is corrupt) before it can proceed to the
|
||||||
|
next scan.
|
||||||
|
.TP
|
||||||
.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
|
||||||
@@ -197,6 +225,9 @@ Send output image to the named file, not to standard output.
|
|||||||
Load input file into memory before decompressing. This feature was implemented
|
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().)
|
mainly as a way of testing the in-memory source manager (jpeg_mem_src().)
|
||||||
.TP
|
.TP
|
||||||
|
.BI \-report
|
||||||
|
Report decompression progress.
|
||||||
|
.TP
|
||||||
.BI \-skip " Y0,Y1"
|
.BI \-skip " Y0,Y1"
|
||||||
Decompress all rows of the JPEG image except those between Y0 and 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
|
(inclusive.) Note that if decompression scaling is being used, then Y0 and Y1
|
||||||
@@ -210,6 +241,12 @@ decompression scaling is being used, then X, Y, W, and H are relative to the
|
|||||||
scaled image dimensions. Currently this option only works with the
|
scaled image dimensions. Currently this option only works with the
|
||||||
PBMPLUS (PPM/PGM), GIF, and Targa output formats.
|
PBMPLUS (PPM/PGM), GIF, and Targa output formats.
|
||||||
.TP
|
.TP
|
||||||
|
.BI \-strict
|
||||||
|
Treat all warnings as fatal. This feature also demonstrates a method by which
|
||||||
|
applications can guard against attacks instigated by specially-crafted
|
||||||
|
malformed JPEG images. Enabling this option will cause the decompressor to
|
||||||
|
abort if the JPEG image contains incomplete or corrupt image data.
|
||||||
|
.TP
|
||||||
.B \-verbose
|
.B \-verbose
|
||||||
Enable debug printout. More
|
Enable debug printout. More
|
||||||
.BR \-v 's
|
.BR \-v 's
|
||||||
@@ -253,12 +290,6 @@ is fast but much lower quality than the default behavior.
|
|||||||
.B \-dither none
|
.B \-dither none
|
||||||
may give acceptable results in two-pass mode, but is seldom tolerable in
|
may give acceptable results in two-pass mode, but is seldom tolerable in
|
||||||
one-pass mode.
|
one-pass mode.
|
||||||
.PP
|
|
||||||
If you are fortunate enough to have very fast floating point hardware,
|
|
||||||
\fB\-dct float\fR may be even faster than \fB\-dct fast\fR. But on most
|
|
||||||
machines \fB\-dct float\fR is slower than \fB\-dct int\fR; in this case it is
|
|
||||||
not worth using, because its theoretical accuracy advantage is too small to be
|
|
||||||
significant in practice.
|
|
||||||
.SH ENVIRONMENT
|
.SH ENVIRONMENT
|
||||||
.TP
|
.TP
|
||||||
.B JPEGMEM
|
.B JPEGMEM
|
||||||
@@ -287,10 +318,3 @@ Independent JPEG Group
|
|||||||
This file was modified by The libjpeg-turbo Project to include only information
|
This file was modified by The libjpeg-turbo Project to include only information
|
||||||
relevant to libjpeg-turbo, to wordsmith certain sections, and to describe
|
relevant to libjpeg-turbo, to wordsmith certain sections, and to describe
|
||||||
features not present in libjpeg.
|
features not present in libjpeg.
|
||||||
.SH ISSUES
|
|
||||||
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.
|
|
||||||
|
|||||||
147
djpeg.c
@@ -3,9 +3,9 @@
|
|||||||
*
|
*
|
||||||
* This file was part of the Independent JPEG Group's software:
|
* 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 2013-2019 by Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2010-2011, 2013-2017, D. R. Commander.
|
* Copyright (C) 2010-2011, 2013-2017, 2019-2020, 2022, D. R. Commander.
|
||||||
* Copyright (C) 2015, Google, Inc.
|
* Copyright (C) 2015, Google, Inc.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
@@ -28,26 +28,16 @@
|
|||||||
* works regardless of which command line style is used.
|
* works regardless of which command line style is used.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define _CRT_SECURE_NO_DEPRECATE
|
||||||
|
#endif
|
||||||
|
|
||||||
#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 "jconfigint.h"
|
||||||
|
|
||||||
#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare free() */
|
|
||||||
extern void free(void *ptr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <ctype.h> /* to declare isprint() */
|
#include <ctype.h> /* to declare isprint() */
|
||||||
|
|
||||||
#ifdef USE_CCOMMAND /* command-line reader for Macintosh */
|
|
||||||
#ifdef __MWERKS__
|
|
||||||
#include <SIOUX.h> /* Metrowerks needs this */
|
|
||||||
#include <console.h> /* ... and this */
|
|
||||||
#endif
|
|
||||||
#ifdef THINK_C
|
|
||||||
#include <console.h> /* Think declares it here */
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Create the add-on message string table. */
|
/* Create the add-on message string table. */
|
||||||
|
|
||||||
@@ -68,10 +58,10 @@ 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 (LZW-compressed) */
|
||||||
|
FMT_GIF0, /* GIF format (uncompressed) */
|
||||||
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_TARGA, /* Targa format */
|
FMT_TARGA, /* Targa format */
|
||||||
FMT_TIFF /* TIFF format */
|
FMT_TIFF /* TIFF format */
|
||||||
} IMAGE_FORMATS;
|
} IMAGE_FORMATS;
|
||||||
@@ -94,11 +84,14 @@ 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 *icc_filename; /* for -icc switch */
|
static char *icc_filename; /* for -icc switch */
|
||||||
|
JDIMENSION max_scans; /* for -maxscans switch */
|
||||||
static char *outfilename; /* for -outfile switch */
|
static char *outfilename; /* for -outfile switch */
|
||||||
boolean memsrc; /* for -memsrc switch */
|
boolean memsrc; /* for -memsrc switch */
|
||||||
|
boolean report; /* for -report switch */
|
||||||
boolean skip, crop;
|
boolean skip, crop;
|
||||||
JDIMENSION skip_start, skip_end;
|
JDIMENSION skip_start, skip_end;
|
||||||
JDIMENSION crop_x, crop_y, crop_width, crop_height;
|
JDIMENSION crop_x, crop_y, crop_width, crop_height;
|
||||||
|
boolean strict; /* for -strict switch */
|
||||||
#define INPUT_BUF_SIZE 4096
|
#define INPUT_BUF_SIZE 4096
|
||||||
|
|
||||||
|
|
||||||
@@ -127,8 +120,10 @@ usage(void)
|
|||||||
(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 (LZW-compressed)%s\n",
|
||||||
(DEFAULT_FMT == FMT_GIF ? " (default)" : ""));
|
(DEFAULT_FMT == FMT_GIF ? " (default)" : ""));
|
||||||
|
fprintf(stderr, " -gif0 Select GIF output format (uncompressed)%s\n",
|
||||||
|
(DEFAULT_FMT == FMT_GIF0 ? " (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",
|
||||||
@@ -138,25 +133,21 @@ usage(void)
|
|||||||
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
|
|
||||||
fprintf(stderr, " -rle Select Utah RLE output format%s\n",
|
|
||||||
(DEFAULT_FMT == FMT_RLE ? " (default)" : ""));
|
|
||||||
#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 accurate 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 less accurate integer DCT method [legacy feature]%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 [legacy feature]%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");
|
||||||
@@ -171,14 +162,16 @@ usage(void)
|
|||||||
fprintf(stderr, " -onepass Use 1-pass quantization (fast, low quality)\n");
|
fprintf(stderr, " -onepass Use 1-pass quantization (fast, low quality)\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, " -maxscans N Maximum number of scans to allow in input file\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)
|
#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED)
|
||||||
fprintf(stderr, " -memsrc Load input file into memory before decompressing\n");
|
fprintf(stderr, " -memsrc Load input file into memory before decompressing\n");
|
||||||
#endif
|
#endif
|
||||||
|
fprintf(stderr, " -report Report decompression progress\n");
|
||||||
fprintf(stderr, " -skip Y0,Y1 Decompress all rows except those between Y0 and Y1 (inclusive)\n");
|
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, " -crop WxH+X+Y Decompress only a rectangular subregion of the image\n");
|
||||||
fprintf(stderr, " [requires PBMPLUS (PPM/PGM), GIF, or Targa output format]\n");
|
fprintf(stderr, " [requires PBMPLUS (PPM/PGM), GIF, or Targa output format]\n");
|
||||||
|
fprintf(stderr, " -strict Treat all warnings as fatal\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");
|
fprintf(stderr, " -version Print version information and exit\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
@@ -203,10 +196,13 @@ parse_switches(j_decompress_ptr cinfo, int argc, char **argv,
|
|||||||
/* 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 */
|
||||||
icc_filename = NULL;
|
icc_filename = NULL;
|
||||||
|
max_scans = 0;
|
||||||
outfilename = NULL;
|
outfilename = NULL;
|
||||||
memsrc = FALSE;
|
memsrc = FALSE;
|
||||||
|
report = FALSE;
|
||||||
skip = FALSE;
|
skip = FALSE;
|
||||||
crop = FALSE;
|
crop = FALSE;
|
||||||
|
strict = FALSE;
|
||||||
cinfo->err->trace_level = 0;
|
cinfo->err->trace_level = 0;
|
||||||
|
|
||||||
/* Scan command line options, adjust parameters */
|
/* Scan command line options, adjust parameters */
|
||||||
@@ -224,7 +220,7 @@ parse_switches(j_decompress_ptr cinfo, int argc, char **argv,
|
|||||||
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 (Windows flavor). */
|
||||||
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) ||
|
||||||
@@ -295,9 +291,13 @@ parse_switches(j_decompress_ptr cinfo, int argc, char **argv,
|
|||||||
cinfo->do_fancy_upsampling = FALSE;
|
cinfo->do_fancy_upsampling = FALSE;
|
||||||
|
|
||||||
} else if (keymatch(arg, "gif", 1)) {
|
} else if (keymatch(arg, "gif", 1)) {
|
||||||
/* GIF output format. */
|
/* GIF output format (LZW-compressed). */
|
||||||
requested_fmt = FMT_GIF;
|
requested_fmt = FMT_GIF;
|
||||||
|
|
||||||
|
} else if (keymatch(arg, "gif0", 4)) {
|
||||||
|
/* GIF output format (uncompressed). */
|
||||||
|
requested_fmt = FMT_GIF0;
|
||||||
|
|
||||||
} else if (keymatch(arg, "grayscale", 2) ||
|
} else if (keymatch(arg, "grayscale", 2) ||
|
||||||
keymatch(arg, "greyscale", 2)) {
|
keymatch(arg, "greyscale", 2)) {
|
||||||
/* Force monochrome output. */
|
/* Force monochrome output. */
|
||||||
@@ -351,6 +351,12 @@ parse_switches(j_decompress_ptr cinfo, int argc, char **argv,
|
|||||||
lval *= 1000L;
|
lval *= 1000L;
|
||||||
cinfo->mem->max_memory_to_use = lval * 1000L;
|
cinfo->mem->max_memory_to_use = lval * 1000L;
|
||||||
|
|
||||||
|
} else if (keymatch(arg, "maxscans", 4)) {
|
||||||
|
if (++argn >= argc) /* advance to next argument */
|
||||||
|
usage();
|
||||||
|
if (sscanf(argv[argn], "%u", &max_scans) != 1)
|
||||||
|
usage();
|
||||||
|
|
||||||
} 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;
|
||||||
@@ -383,9 +389,8 @@ parse_switches(j_decompress_ptr cinfo, int argc, char **argv,
|
|||||||
/* PPM/PGM output format. */
|
/* PPM/PGM output format. */
|
||||||
requested_fmt = FMT_PPM;
|
requested_fmt = FMT_PPM;
|
||||||
|
|
||||||
} else if (keymatch(arg, "rle", 1)) {
|
} else if (keymatch(arg, "report", 2)) {
|
||||||
/* RLE output format. */
|
report = TRUE;
|
||||||
requested_fmt = FMT_RLE;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "scale", 2)) {
|
} else if (keymatch(arg, "scale", 2)) {
|
||||||
/* Scale the output image by a fraction M/N. */
|
/* Scale the output image by a fraction M/N. */
|
||||||
@@ -413,6 +418,9 @@ parse_switches(j_decompress_ptr cinfo, int argc, char **argv,
|
|||||||
usage();
|
usage();
|
||||||
crop = TRUE;
|
crop = TRUE;
|
||||||
|
|
||||||
|
} else if (keymatch(arg, "strict", 2)) {
|
||||||
|
strict = 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;
|
||||||
@@ -444,7 +452,7 @@ jpeg_getc(j_decompress_ptr cinfo)
|
|||||||
ERREXIT(cinfo, JERR_CANT_SUSPEND);
|
ERREXIT(cinfo, JERR_CANT_SUSPEND);
|
||||||
}
|
}
|
||||||
datasrc->bytes_in_buffer--;
|
datasrc->bytes_in_buffer--;
|
||||||
return GETJOCTET(*datasrc->next_input_byte++);
|
return *datasrc->next_input_byte++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -499,6 +507,19 @@ print_text_marker(j_decompress_ptr cinfo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
METHODDEF(void)
|
||||||
|
my_emit_message(j_common_ptr cinfo, int msg_level)
|
||||||
|
{
|
||||||
|
if (msg_level < 0) {
|
||||||
|
/* Treat warning as fatal */
|
||||||
|
cinfo->err->error_exit(cinfo);
|
||||||
|
} else {
|
||||||
|
if (cinfo->err->trace_level >= msg_level)
|
||||||
|
cinfo->err->output_message(cinfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The main program.
|
* The main program.
|
||||||
*/
|
*/
|
||||||
@@ -508,9 +529,7 @@ main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
struct jpeg_decompress_struct cinfo;
|
struct jpeg_decompress_struct cinfo;
|
||||||
struct jpeg_error_mgr jerr;
|
struct jpeg_error_mgr jerr;
|
||||||
#ifdef PROGRESS_REPORT
|
|
||||||
struct cdjpeg_progress_mgr progress;
|
struct cdjpeg_progress_mgr progress;
|
||||||
#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;
|
||||||
@@ -521,11 +540,6 @@ main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
JDIMENSION num_scanlines;
|
JDIMENSION num_scanlines;
|
||||||
|
|
||||||
/* On Mac, fetch a command line. */
|
|
||||||
#ifdef USE_CCOMMAND
|
|
||||||
argc = ccommand(&argv);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
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 */
|
||||||
@@ -557,6 +571,9 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
file_index = parse_switches(&cinfo, argc, argv, 0, FALSE);
|
file_index = parse_switches(&cinfo, argc, argv, 0, FALSE);
|
||||||
|
|
||||||
|
if (strict)
|
||||||
|
jerr.emit_message = my_emit_message;
|
||||||
|
|
||||||
#ifdef TWO_FILE_COMMANDLINE
|
#ifdef TWO_FILE_COMMANDLINE
|
||||||
/* 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) {
|
||||||
@@ -603,9 +620,11 @@ main(int argc, char **argv)
|
|||||||
output_file = write_stdout();
|
output_file = write_stdout();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PROGRESS_REPORT
|
if (report || max_scans != 0) {
|
||||||
start_progress_monitor((j_common_ptr)&cinfo, &progress);
|
start_progress_monitor((j_common_ptr)&cinfo, &progress);
|
||||||
#endif
|
progress.report = report;
|
||||||
|
progress.max_scans = max_scans;
|
||||||
|
}
|
||||||
|
|
||||||
/* Specify data source for decompression */
|
/* Specify data source for decompression */
|
||||||
#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED)
|
#if JPEG_LIB_VERSION >= 80 || defined(MEM_SRCDST_SUPPORTED)
|
||||||
@@ -617,7 +636,7 @@ main(int argc, char **argv)
|
|||||||
fprintf(stderr, "%s: memory allocation failure\n", progname);
|
fprintf(stderr, "%s: memory allocation failure\n", progname);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
nbytes = JFREAD(input_file, &inbuffer[insize], INPUT_BUF_SIZE);
|
nbytes = fread(&inbuffer[insize], 1, INPUT_BUF_SIZE, input_file);
|
||||||
if (nbytes < INPUT_BUF_SIZE && ferror(input_file)) {
|
if (nbytes < INPUT_BUF_SIZE && ferror(input_file)) {
|
||||||
if (file_index < argc)
|
if (file_index < argc)
|
||||||
fprintf(stderr, "%s: can't read from %s\n", progname,
|
fprintf(stderr, "%s: can't read from %s\n", progname,
|
||||||
@@ -653,7 +672,10 @@ main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
#ifdef GIF_SUPPORTED
|
#ifdef GIF_SUPPORTED
|
||||||
case FMT_GIF:
|
case FMT_GIF:
|
||||||
dest_mgr = jinit_write_gif(&cinfo);
|
dest_mgr = jinit_write_gif(&cinfo, TRUE);
|
||||||
|
break;
|
||||||
|
case FMT_GIF0:
|
||||||
|
dest_mgr = jinit_write_gif(&cinfo, FALSE);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef PPM_SUPPORTED
|
#ifdef PPM_SUPPORTED
|
||||||
@@ -661,11 +683,6 @@ main(int argc, char **argv)
|
|||||||
dest_mgr = jinit_write_ppm(&cinfo);
|
dest_mgr = jinit_write_ppm(&cinfo);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef RLE_SUPPORTED
|
|
||||||
case FMT_RLE:
|
|
||||||
dest_mgr = jinit_write_rle(&cinfo);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#ifdef TARGA_SUPPORTED
|
#ifdef TARGA_SUPPORTED
|
||||||
case FMT_TARGA:
|
case FMT_TARGA:
|
||||||
dest_mgr = jinit_write_targa(&cinfo);
|
dest_mgr = jinit_write_targa(&cinfo);
|
||||||
@@ -689,7 +706,7 @@ main(int argc, char **argv)
|
|||||||
* that skip_start <= skip_end.
|
* that skip_start <= skip_end.
|
||||||
*/
|
*/
|
||||||
if (skip_end > cinfo.output_height - 1) {
|
if (skip_end > cinfo.output_height - 1) {
|
||||||
fprintf(stderr, "%s: skip region exceeds image height %d\n", progname,
|
fprintf(stderr, "%s: skip region exceeds image height %u\n", progname,
|
||||||
cinfo.output_height);
|
cinfo.output_height);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
@@ -708,7 +725,12 @@ main(int argc, char **argv)
|
|||||||
dest_mgr->buffer_height);
|
dest_mgr->buffer_height);
|
||||||
(*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines);
|
(*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines);
|
||||||
}
|
}
|
||||||
jpeg_skip_scanlines(&cinfo, skip_end - skip_start + 1);
|
if ((tmp = jpeg_skip_scanlines(&cinfo, skip_end - skip_start + 1)) !=
|
||||||
|
skip_end - skip_start + 1) {
|
||||||
|
fprintf(stderr, "%s: jpeg_skip_scanlines() returned %u rather than %u\n",
|
||||||
|
progname, tmp, skip_end - skip_start + 1);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
while (cinfo.output_scanline < cinfo.output_height) {
|
while (cinfo.output_scanline < cinfo.output_height) {
|
||||||
num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer,
|
num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer,
|
||||||
dest_mgr->buffer_height);
|
dest_mgr->buffer_height);
|
||||||
@@ -724,7 +746,7 @@ main(int argc, char **argv)
|
|||||||
*/
|
*/
|
||||||
if (crop_x + crop_width > cinfo.output_width ||
|
if (crop_x + crop_width > cinfo.output_width ||
|
||||||
crop_y + crop_height > cinfo.output_height) {
|
crop_y + crop_height > cinfo.output_height) {
|
||||||
fprintf(stderr, "%s: crop dimensions exceed image dimensions %d x %d\n",
|
fprintf(stderr, "%s: crop dimensions exceed image dimensions %u x %u\n",
|
||||||
progname, cinfo.output_width, cinfo.output_height);
|
progname, cinfo.output_width, cinfo.output_height);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
@@ -744,13 +766,24 @@ main(int argc, char **argv)
|
|||||||
cinfo.output_height = tmp;
|
cinfo.output_height = tmp;
|
||||||
|
|
||||||
/* Process data */
|
/* Process data */
|
||||||
jpeg_skip_scanlines(&cinfo, crop_y);
|
if ((tmp = jpeg_skip_scanlines(&cinfo, crop_y)) != crop_y) {
|
||||||
|
fprintf(stderr, "%s: jpeg_skip_scanlines() returned %u rather than %u\n",
|
||||||
|
progname, tmp, crop_y);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
while (cinfo.output_scanline < crop_y + crop_height) {
|
while (cinfo.output_scanline < crop_y + crop_height) {
|
||||||
num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer,
|
num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer,
|
||||||
dest_mgr->buffer_height);
|
dest_mgr->buffer_height);
|
||||||
(*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines);
|
(*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines);
|
||||||
}
|
}
|
||||||
jpeg_skip_scanlines(&cinfo, cinfo.output_height - crop_y - crop_height);
|
if ((tmp =
|
||||||
|
jpeg_skip_scanlines(&cinfo,
|
||||||
|
cinfo.output_height - crop_y - crop_height)) !=
|
||||||
|
cinfo.output_height - crop_y - crop_height) {
|
||||||
|
fprintf(stderr, "%s: jpeg_skip_scanlines() returned %u rather than %u\n",
|
||||||
|
progname, tmp, cinfo.output_height - crop_y - crop_height);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
/* Normal full-image decompress */
|
/* Normal full-image decompress */
|
||||||
} else {
|
} else {
|
||||||
@@ -765,12 +798,11 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PROGRESS_REPORT
|
|
||||||
/* Hack: count final pass as done in case finish_output does an extra pass.
|
/* Hack: count final pass as done in case finish_output does an extra pass.
|
||||||
* The library won't have updated completed_passes.
|
* The library won't have updated completed_passes.
|
||||||
*/
|
*/
|
||||||
|
if (report || max_scans != 0)
|
||||||
progress.pub.completed_passes = progress.pub.total_passes;
|
progress.pub.completed_passes = progress.pub.total_passes;
|
||||||
#endif
|
|
||||||
|
|
||||||
if (icc_filename != NULL) {
|
if (icc_filename != NULL) {
|
||||||
FILE *icc_file;
|
FILE *icc_file;
|
||||||
@@ -809,9 +841,8 @@ main(int argc, char **argv)
|
|||||||
if (output_file != stdout)
|
if (output_file != stdout)
|
||||||
fclose(output_file);
|
fclose(output_file);
|
||||||
|
|
||||||
#ifdef PROGRESS_REPORT
|
if (report || max_scans != 0)
|
||||||
end_progress_monitor((j_common_ptr)&cinfo);
|
end_progress_monitor((j_common_ptr)&cinfo);
|
||||||
#endif
|
|
||||||
|
|
||||||
if (memsrc)
|
if (memsrc)
|
||||||
free(inbuffer);
|
free(inbuffer);
|
||||||
|
|||||||
@@ -1,18 +1,17 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1"/>
|
<meta name="generator" content="Doxygen 1.8.20"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
<title>TurboJPEG: Data Structures</title>
|
<title>TurboJPEG: Data Structures</title>
|
||||||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
<script type="text/javascript" src="jquery.js"></script>
|
<script type="text/javascript" src="jquery.js"></script>
|
||||||
<script type="text/javascript" src="dynsections.js"></script>
|
<script type="text/javascript" src="dynsections.js"></script>
|
||||||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<script type="text/javascript" src="search/searchdata.js"></script>
|
||||||
<script type="text/javascript" src="search/search.js"></script>
|
<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.css" rel="stylesheet" type="text/css" />
|
||||||
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
||||||
</head>
|
</head>
|
||||||
@@ -22,9 +21,9 @@
|
|||||||
<table cellspacing="0" cellpadding="0">
|
<table cellspacing="0" cellpadding="0">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr style="height: 56px;">
|
<tr style="height: 56px;">
|
||||||
<td style="padding-left: 0.5em;">
|
<td id="projectalign" style="padding-left: 0.5em;">
|
||||||
<div id="projectname">TurboJPEG
|
<div id="projectname">TurboJPEG
|
||||||
 <span id="projectnumber">2.0</span>
|
 <span id="projectnumber">2.1.4</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -32,47 +31,29 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!-- end header part -->
|
<!-- end header part -->
|
||||||
<!-- Generated by Doxygen 1.8.3.1 -->
|
<!-- Generated by Doxygen 1.8.20 -->
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||||
|
/* @license-end */
|
||||||
</script>
|
</script>
|
||||||
<div id="navrow1" class="tabs">
|
<script type="text/javascript" src="menudata.js"></script>
|
||||||
<ul class="tablist">
|
<script type="text/javascript" src="menu.js"></script>
|
||||||
<li><a href="index.html"><span>Main Page</span></a></li>
|
<script type="text/javascript">
|
||||||
<li><a href="modules.html"><span>Modules</span></a></li>
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
<li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
|
$(function() {
|
||||||
<li>
|
initMenu('',true,false,'search.php','Search');
|
||||||
<div id="MSearchBox" class="MSearchBoxInactive">
|
$(document).ready(function() { init_search(); });
|
||||||
<span class="left">
|
});
|
||||||
<img id="MSearchSelect" src="search/mag_sel.png"
|
/* @license-end */</script>
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
<div id="main-nav"></div>
|
||||||
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 -->
|
</div><!-- top -->
|
||||||
<!-- window showing the filter options -->
|
<!-- window showing the filter options -->
|
||||||
<div id="MSearchSelectWindow"
|
<div id="MSearchSelectWindow"
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
||||||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
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>
|
</div>
|
||||||
|
|
||||||
<!-- iframe showing the search results (closed by default) -->
|
<!-- iframe showing the search results (closed by default) -->
|
||||||
<div id="MSearchResultsWindow">
|
<div id="MSearchResultsWindow">
|
||||||
@@ -88,17 +69,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|||||||
<div class="contents">
|
<div class="contents">
|
||||||
<div class="textblock">Here are the data structures with brief descriptions:</div><div class="directory">
|
<div class="textblock">Here are the data structures with brief descriptions:</div><div class="directory">
|
||||||
<table 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_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><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_1_"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><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>
|
<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="structtjtransform.html" target="_self">tjtransform</a></td><td class="desc">Lossless transform </td></tr>
|
||||||
</table>
|
</table>
|
||||||
</div><!-- directory -->
|
</div><!-- directory -->
|
||||||
</div><!-- contents -->
|
</div><!-- contents -->
|
||||||
<!-- start footer part -->
|
<!-- start footer part -->
|
||||||
<hr class="footer"/><address class="footer"><small>
|
<hr class="footer"/><address class="footer"><small>
|
||||||
Generated by  <a href="http://www.doxygen.org/index.html">
|
Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20
|
||||||
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
||||||
</a> 1.8.3.1
|
|
||||||
</small></address>
|
</small></address>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,18 +1,17 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1"/>
|
<meta name="generator" content="Doxygen 1.8.20"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
<title>TurboJPEG: Data Structure Index</title>
|
<title>TurboJPEG: Data Structure Index</title>
|
||||||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
<script type="text/javascript" src="jquery.js"></script>
|
<script type="text/javascript" src="jquery.js"></script>
|
||||||
<script type="text/javascript" src="dynsections.js"></script>
|
<script type="text/javascript" src="dynsections.js"></script>
|
||||||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<script type="text/javascript" src="search/searchdata.js"></script>
|
||||||
<script type="text/javascript" src="search/search.js"></script>
|
<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.css" rel="stylesheet" type="text/css" />
|
||||||
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
||||||
</head>
|
</head>
|
||||||
@@ -22,9 +21,9 @@
|
|||||||
<table cellspacing="0" cellpadding="0">
|
<table cellspacing="0" cellpadding="0">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr style="height: 56px;">
|
<tr style="height: 56px;">
|
||||||
<td style="padding-left: 0.5em;">
|
<td id="projectalign" style="padding-left: 0.5em;">
|
||||||
<div id="projectname">TurboJPEG
|
<div id="projectname">TurboJPEG
|
||||||
 <span id="projectnumber">2.0</span>
|
 <span id="projectnumber">2.1.4</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -32,47 +31,29 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!-- end header part -->
|
<!-- end header part -->
|
||||||
<!-- Generated by Doxygen 1.8.3.1 -->
|
<!-- Generated by Doxygen 1.8.20 -->
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||||
|
/* @license-end */
|
||||||
</script>
|
</script>
|
||||||
<div id="navrow1" class="tabs">
|
<script type="text/javascript" src="menudata.js"></script>
|
||||||
<ul class="tablist">
|
<script type="text/javascript" src="menu.js"></script>
|
||||||
<li><a href="index.html"><span>Main Page</span></a></li>
|
<script type="text/javascript">
|
||||||
<li><a href="modules.html"><span>Modules</span></a></li>
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
<li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
|
$(function() {
|
||||||
<li>
|
initMenu('',true,false,'search.php','Search');
|
||||||
<div id="MSearchBox" class="MSearchBoxInactive">
|
$(document).ready(function() { init_search(); });
|
||||||
<span class="left">
|
});
|
||||||
<img id="MSearchSelect" src="search/mag_sel.png"
|
/* @license-end */</script>
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
<div id="main-nav"></div>
|
||||||
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 -->
|
</div><!-- top -->
|
||||||
<!-- window showing the filter options -->
|
<!-- window showing the filter options -->
|
||||||
<div id="MSearchSelectWindow"
|
<div id="MSearchSelectWindow"
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
||||||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
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>
|
</div>
|
||||||
|
|
||||||
<!-- iframe showing the search results (closed by default) -->
|
<!-- iframe showing the search results (closed by default) -->
|
||||||
<div id="MSearchResultsWindow">
|
<div id="MSearchResultsWindow">
|
||||||
@@ -86,21 +67,23 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|||||||
<div class="title">Data Structure Index</div> </div>
|
<div class="title">Data Structure Index</div> </div>
|
||||||
</div><!--header-->
|
</div><!--header-->
|
||||||
<div class="contents">
|
<div class="contents">
|
||||||
<div class="qindex"><a class="qindex" href="#letter_T">T</a></div>
|
<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">
|
<table class="classindex">
|
||||||
<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>
|
<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>
|
</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></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 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>
|
<tr><td></td><td></td><td></td><td></td></tr>
|
||||||
</table>
|
</table>
|
||||||
<div class="qindex"><a class="qindex" href="#letter_T">T</a></div>
|
<div class="qindex"><a class="qindex" href="#letter_t">t</a></div>
|
||||||
</div><!-- contents -->
|
</div><!-- contents -->
|
||||||
<!-- start footer part -->
|
<!-- start footer part -->
|
||||||
<hr class="footer"/><address class="footer"><small>
|
<hr class="footer"/><address class="footer"><small>
|
||||||
Generated by  <a href="http://www.doxygen.org/index.html">
|
Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20
|
||||||
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
||||||
</a> 1.8.3.1
|
|
||||||
</small></address>
|
</small></address>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 746 B After Width: | Height: | Size: 746 B |
@@ -1,7 +1,11 @@
|
|||||||
/* The standard CSS for doxygen 1.8.3.1 */
|
/* The standard CSS for doxygen 1.8.20 */
|
||||||
|
|
||||||
body, table, div, p, dl {
|
body, table, div, p, dl {
|
||||||
font: 400 14px/19px Roboto,sans-serif;
|
font: 400 14px/22px Roboto,sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.reference, p.definition {
|
||||||
|
font: 400 14px/22px Roboto,sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* @group Heading Levels */
|
/* @group Heading Levels */
|
||||||
@@ -11,6 +15,7 @@ h1.groupheader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
|
font: 400 14px/28px Roboto,sans-serif;
|
||||||
font-size: 150%;
|
font-size: 150%;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
margin: 10px 2px;
|
margin: 10px 2px;
|
||||||
@@ -48,17 +53,28 @@ dt {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.multicol {
|
ul.multicol {
|
||||||
-moz-column-gap: 1em;
|
-moz-column-gap: 1em;
|
||||||
-webkit-column-gap: 1em;
|
-webkit-column-gap: 1em;
|
||||||
|
column-gap: 1em;
|
||||||
-moz-column-count: 3;
|
-moz-column-count: 3;
|
||||||
-webkit-column-count: 3;
|
-webkit-column-count: 3;
|
||||||
|
column-count: 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
p.startli, p.startdd, p.starttd {
|
p.startli, p.startdd {
|
||||||
margin-top: 2px;
|
margin-top: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
th p.starttd, th p.intertd, th p.endtd {
|
||||||
|
font-size: 100%;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.starttd {
|
||||||
|
margin-top: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
p.endli {
|
p.endli {
|
||||||
margin-bottom: 0px;
|
margin-bottom: 0px;
|
||||||
}
|
}
|
||||||
@@ -71,6 +87,15 @@ p.endtd {
|
|||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p.interli {
|
||||||
|
}
|
||||||
|
|
||||||
|
p.interdd {
|
||||||
|
}
|
||||||
|
|
||||||
|
p.intertd {
|
||||||
|
}
|
||||||
|
|
||||||
/* @end */
|
/* @end */
|
||||||
|
|
||||||
caption {
|
caption {
|
||||||
@@ -125,12 +150,12 @@ a.qindex {
|
|||||||
a.qindexHL {
|
a.qindexHL {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
background-color: #9CAFD4;
|
background-color: #9CAFD4;
|
||||||
color: #ffffff;
|
color: #FFFFFF;
|
||||||
border: 1px double #869DCA;
|
border: 1px double #869DCA;
|
||||||
}
|
}
|
||||||
|
|
||||||
.contents a.qindexHL:visited {
|
.contents a.qindexHL:visited {
|
||||||
color: #ffffff;
|
color: #FFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
a.el {
|
a.el {
|
||||||
@@ -140,11 +165,11 @@ a.el {
|
|||||||
a.elRef {
|
a.elRef {
|
||||||
}
|
}
|
||||||
|
|
||||||
a.code, a.code:visited {
|
a.code, a.code:visited, a.line, a.line:visited {
|
||||||
color: #4665A2;
|
color: #4665A2;
|
||||||
}
|
}
|
||||||
|
|
||||||
a.codeRef, a.codeRef:visited {
|
a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
|
||||||
color: #4665A2;
|
color: #4665A2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,6 +179,25 @@ dl.el {
|
|||||||
margin-left: -1cm;
|
margin-left: -1cm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
overflow: hidden; /*Fixed: list item bullets overlap floating elements*/
|
||||||
|
}
|
||||||
|
|
||||||
|
#side-nav ul {
|
||||||
|
overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-nav ul {
|
||||||
|
overflow: visible; /* reset ul rule for the navigation bar drop down lists */
|
||||||
|
}
|
||||||
|
|
||||||
|
.fragment {
|
||||||
|
text-align: left;
|
||||||
|
direction: ltr;
|
||||||
|
overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/
|
||||||
|
overflow-y: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
pre.fragment {
|
pre.fragment {
|
||||||
border: 1px solid #C4CFE5;
|
border: 1px solid #C4CFE5;
|
||||||
background-color: #FBFCFD;
|
background-color: #FBFCFD;
|
||||||
@@ -168,8 +212,8 @@ pre.fragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
div.fragment {
|
div.fragment {
|
||||||
padding: 4px;
|
padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/
|
||||||
margin: 4px;
|
margin: 4px 8px 4px 2px;
|
||||||
background-color: #FBFCFD;
|
background-color: #FBFCFD;
|
||||||
border: 1px solid #C4CFE5;
|
border: 1px solid #C4CFE5;
|
||||||
}
|
}
|
||||||
@@ -201,6 +245,11 @@ div.line {
|
|||||||
transition-duration: 0.5s;
|
transition-duration: 0.5s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.line:after {
|
||||||
|
content:"\000A";
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
|
||||||
div.line.glow {
|
div.line.glow {
|
||||||
background-color: cyan;
|
background-color: cyan;
|
||||||
box-shadow: 0 0 10px cyan;
|
box-shadow: 0 0 10px cyan;
|
||||||
@@ -222,10 +271,19 @@ span.lineno a:hover {
|
|||||||
background-color: #C8C8C8;
|
background-color: #C8C8C8;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.ah {
|
.lineno {
|
||||||
|
-webkit-touch-callout: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-khtml-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.ah, span.ah {
|
||||||
background-color: black;
|
background-color: black;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #ffffff;
|
color: #FFFFFF;
|
||||||
margin-bottom: 3px;
|
margin-bottom: 3px;
|
||||||
margin-top: 3px;
|
margin-top: 3px;
|
||||||
padding: 0.2em;
|
padding: 0.2em;
|
||||||
@@ -237,7 +295,16 @@ div.ah {
|
|||||||
-webkit-box-shadow: 2px 2px 3px #999;
|
-webkit-box-shadow: 2px 2px 3px #999;
|
||||||
-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
|
-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
|
||||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
|
||||||
background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
|
background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.classindex ul {
|
||||||
|
list-style: none;
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.classindex span.ai {
|
||||||
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.groupHeader {
|
div.groupHeader {
|
||||||
@@ -292,7 +359,7 @@ img.formulaDsp {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
img.formulaInl {
|
img.formulaInl, img.inline {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -370,6 +437,13 @@ blockquote {
|
|||||||
padding: 0 12px 0 16px;
|
padding: 0 12px 0 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
blockquote.DocNodeRTL {
|
||||||
|
border-left: 0;
|
||||||
|
border-right: 2px solid #9CAFD4;
|
||||||
|
margin: 0 4px 0 24px;
|
||||||
|
padding: 0 16px 0 12px;
|
||||||
|
}
|
||||||
|
|
||||||
/* @end */
|
/* @end */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -466,7 +540,7 @@ table.memberdecls {
|
|||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.memItemRight {
|
.memItemRight, .memTemplItemRight {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -482,6 +556,29 @@ table.memberdecls {
|
|||||||
|
|
||||||
/* Styles for detailed member documentation */
|
/* Styles for detailed member documentation */
|
||||||
|
|
||||||
|
.memtitle {
|
||||||
|
padding: 8px;
|
||||||
|
border-top: 1px solid #A8B8D9;
|
||||||
|
border-left: 1px solid #A8B8D9;
|
||||||
|
border-right: 1px solid #A8B8D9;
|
||||||
|
border-top-right-radius: 4px;
|
||||||
|
border-top-left-radius: 4px;
|
||||||
|
margin-bottom: -1px;
|
||||||
|
background-image: url('nav_f.png');
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
background-color: #E2E8F2;
|
||||||
|
line-height: 1.25;
|
||||||
|
font-weight: 300;
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.permalink
|
||||||
|
{
|
||||||
|
font-size: 65%;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
.memtemplate {
|
.memtemplate {
|
||||||
font-size: 80%;
|
font-size: 80%;
|
||||||
color: #4665A2;
|
color: #4665A2;
|
||||||
@@ -520,7 +617,7 @@ table.memberdecls {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.memname {
|
.memname {
|
||||||
font-weight: bold;
|
font-weight: 400;
|
||||||
margin-left: 6px;
|
margin-left: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -536,24 +633,24 @@ table.memberdecls {
|
|||||||
color: #253555;
|
color: #253555;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
|
text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
|
||||||
background-image:url('nav_f.png');
|
background-color: #DFE5F1;
|
||||||
background-repeat:repeat-x;
|
|
||||||
background-color: #E2E8F2;
|
|
||||||
/* opera specific markup */
|
/* opera specific markup */
|
||||||
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
|
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
|
||||||
border-top-right-radius: 4px;
|
border-top-right-radius: 4px;
|
||||||
border-top-left-radius: 4px;
|
|
||||||
/* firefox specific markup */
|
/* firefox specific markup */
|
||||||
-moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
|
-moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
|
||||||
-moz-border-radius-topright: 4px;
|
-moz-border-radius-topright: 4px;
|
||||||
-moz-border-radius-topleft: 4px;
|
|
||||||
/* webkit specific markup */
|
/* webkit specific markup */
|
||||||
-webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
|
-webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
|
||||||
-webkit-border-top-right-radius: 4px;
|
-webkit-border-top-right-radius: 4px;
|
||||||
-webkit-border-top-left-radius: 4px;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.overload {
|
||||||
|
font-family: "courier new",courier,monospace;
|
||||||
|
font-size: 65%;
|
||||||
|
}
|
||||||
|
|
||||||
.memdoc, dl.reflist dd {
|
.memdoc, dl.reflist dd {
|
||||||
border-bottom: 1px solid #A8B8D9;
|
border-bottom: 1px solid #A8B8D9;
|
||||||
border-left: 1px solid #A8B8D9;
|
border-left: 1px solid #A8B8D9;
|
||||||
@@ -611,17 +708,17 @@ dl.reflist dd {
|
|||||||
padding-left: 0px;
|
padding-left: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.params .paramname, .retval .paramname {
|
.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
|
|
||||||
.params .paramtype {
|
.params .paramtype, .tparams .paramtype {
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
|
|
||||||
.params .paramdir {
|
.params .paramdir, .tparams .paramdir {
|
||||||
font-family: "courier new",courier,monospace;
|
font-family: "courier new",courier,monospace;
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
@@ -665,12 +762,12 @@ span.mlabel {
|
|||||||
|
|
||||||
/* @end */
|
/* @end */
|
||||||
|
|
||||||
/* these are for tree view when not used as main index */
|
/* these are for tree view inside a (index) page */
|
||||||
|
|
||||||
div.directory {
|
div.directory {
|
||||||
margin: 10px 0px;
|
margin: 10px 0px;
|
||||||
border-top: 1px solid #A8B8D9;
|
border-top: 1px solid #9CAFD4;
|
||||||
border-bottom: 1px solid #A8B8D9;
|
border-bottom: 1px solid #9CAFD4;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -687,6 +784,7 @@ div.directory {
|
|||||||
.directory td.entry {
|
.directory td.entry {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
padding-right: 6px;
|
padding-right: 6px;
|
||||||
|
padding-top: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.directory td.entry a {
|
.directory td.entry a {
|
||||||
@@ -728,6 +826,80 @@ div.directory {
|
|||||||
color: #3D578C;
|
color: #3D578C;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.arrow {
|
||||||
|
color: #9CAFD4;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-khtml-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 80%;
|
||||||
|
display: inline-block;
|
||||||
|
width: 16px;
|
||||||
|
height: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
font-family: Arial, Helvetica;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 12px;
|
||||||
|
height: 14px;
|
||||||
|
width: 16px;
|
||||||
|
display: inline-block;
|
||||||
|
background-color: #728DC1;
|
||||||
|
color: white;
|
||||||
|
text-align: center;
|
||||||
|
border-radius: 4px;
|
||||||
|
margin-left: 2px;
|
||||||
|
margin-right: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icona {
|
||||||
|
width: 24px;
|
||||||
|
height: 22px;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.iconfopen {
|
||||||
|
width: 24px;
|
||||||
|
height: 18px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
background-image:url('folderopen.png');
|
||||||
|
background-position: 0px -4px;
|
||||||
|
background-repeat: repeat-y;
|
||||||
|
vertical-align:top;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.iconfclosed {
|
||||||
|
width: 24px;
|
||||||
|
height: 18px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
background-image:url('folderclosed.png');
|
||||||
|
background-position: 0px -4px;
|
||||||
|
background-repeat: repeat-y;
|
||||||
|
vertical-align:top;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icondoc {
|
||||||
|
width: 24px;
|
||||||
|
height: 18px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
background-image:url('doc.png');
|
||||||
|
background-position: 0px -4px;
|
||||||
|
background-repeat: repeat-y;
|
||||||
|
vertical-align:top;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.directory {
|
||||||
|
font: 400 14px Roboto,sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* @end */
|
||||||
|
|
||||||
div.dynheader {
|
div.dynheader {
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
-webkit-touch-callout: none;
|
-webkit-touch-callout: none;
|
||||||
@@ -743,6 +915,10 @@ address {
|
|||||||
color: #2A3D61;
|
color: #2A3D61;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table.doxtable caption {
|
||||||
|
caption-side: top;
|
||||||
|
}
|
||||||
|
|
||||||
table.doxtable {
|
table.doxtable {
|
||||||
border-collapse:collapse;
|
border-collapse:collapse;
|
||||||
margin-top: 4px;
|
margin-top: 4px;
|
||||||
@@ -787,7 +963,7 @@ table.fieldtable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.fieldtable td.fieldname {
|
.fieldtable td.fieldname {
|
||||||
padding-top: 5px;
|
padding-top: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.fieldtable td.fielddoc {
|
.fieldtable td.fielddoc {
|
||||||
@@ -796,7 +972,7 @@ table.fieldtable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.fieldtable td.fielddoc p:first-child {
|
.fieldtable td.fielddoc p:first-child {
|
||||||
margin-top: 2px;
|
margin-top: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.fieldtable td.fielddoc p:last-child {
|
.fieldtable td.fielddoc p:last-child {
|
||||||
@@ -816,6 +992,7 @@ table.fieldtable {
|
|||||||
padding-bottom: 4px;
|
padding-bottom: 4px;
|
||||||
padding-top: 5px;
|
padding-top: 5px;
|
||||||
text-align:left;
|
text-align:left;
|
||||||
|
font-weight: 400;
|
||||||
-moz-border-radius-topleft: 4px;
|
-moz-border-radius-topleft: 4px;
|
||||||
-moz-border-radius-topright: 4px;
|
-moz-border-radius-topright: 4px;
|
||||||
-webkit-border-top-left-radius: 4px;
|
-webkit-border-top-left-radius: 4px;
|
||||||
@@ -908,6 +1085,18 @@ div.summary a
|
|||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table.classindex
|
||||||
|
{
|
||||||
|
margin: 10px;
|
||||||
|
white-space: nowrap;
|
||||||
|
margin-left: 3%;
|
||||||
|
margin-right: 3%;
|
||||||
|
width: 94%;
|
||||||
|
border: 0;
|
||||||
|
border-spacing: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
div.ingroups
|
div.ingroups
|
||||||
{
|
{
|
||||||
font-size: 8pt;
|
font-size: 8pt;
|
||||||
@@ -934,71 +1123,142 @@ div.headertitle
|
|||||||
padding: 5px 5px 5px 10px;
|
padding: 5px 5px 5px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
dl
|
.PageDocRTL-title div.headertitle {
|
||||||
{
|
text-align: right;
|
||||||
padding: 0 0 0 10px;
|
direction: rtl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */
|
dl {
|
||||||
dl.section
|
padding: 0 0 0 0;
|
||||||
{
|
}
|
||||||
|
|
||||||
|
/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */
|
||||||
|
dl.section {
|
||||||
margin-left: 0px;
|
margin-left: 0px;
|
||||||
padding-left: 0px;
|
padding-left: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
dl.note
|
dl.section.DocNodeRTL {
|
||||||
{
|
margin-right: 0px;
|
||||||
margin-left:-7px;
|
padding-right: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.note {
|
||||||
|
margin-left: -7px;
|
||||||
padding-left: 3px;
|
padding-left: 3px;
|
||||||
border-left:4px solid;
|
border-left: 4px solid;
|
||||||
border-color: #D0C000;
|
border-color: #D0C000;
|
||||||
}
|
}
|
||||||
|
|
||||||
dl.warning, dl.attention
|
dl.note.DocNodeRTL {
|
||||||
{
|
margin-left: 0;
|
||||||
margin-left:-7px;
|
padding-left: 0;
|
||||||
|
border-left: 0;
|
||||||
|
margin-right: -7px;
|
||||||
|
padding-right: 3px;
|
||||||
|
border-right: 4px solid;
|
||||||
|
border-color: #D0C000;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.warning, dl.attention {
|
||||||
|
margin-left: -7px;
|
||||||
padding-left: 3px;
|
padding-left: 3px;
|
||||||
border-left:4px solid;
|
border-left: 4px solid;
|
||||||
border-color: #FF0000;
|
border-color: #FF0000;
|
||||||
}
|
}
|
||||||
|
|
||||||
dl.pre, dl.post, dl.invariant
|
dl.warning.DocNodeRTL, dl.attention.DocNodeRTL {
|
||||||
{
|
margin-left: 0;
|
||||||
margin-left:-7px;
|
padding-left: 0;
|
||||||
|
border-left: 0;
|
||||||
|
margin-right: -7px;
|
||||||
|
padding-right: 3px;
|
||||||
|
border-right: 4px solid;
|
||||||
|
border-color: #FF0000;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.pre, dl.post, dl.invariant {
|
||||||
|
margin-left: -7px;
|
||||||
padding-left: 3px;
|
padding-left: 3px;
|
||||||
border-left:4px solid;
|
border-left: 4px solid;
|
||||||
border-color: #00D000;
|
border-color: #00D000;
|
||||||
}
|
}
|
||||||
|
|
||||||
dl.deprecated
|
dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL {
|
||||||
{
|
margin-left: 0;
|
||||||
margin-left:-7px;
|
padding-left: 0;
|
||||||
|
border-left: 0;
|
||||||
|
margin-right: -7px;
|
||||||
|
padding-right: 3px;
|
||||||
|
border-right: 4px solid;
|
||||||
|
border-color: #00D000;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.deprecated {
|
||||||
|
margin-left: -7px;
|
||||||
padding-left: 3px;
|
padding-left: 3px;
|
||||||
border-left:4px solid;
|
border-left: 4px solid;
|
||||||
border-color: #505050;
|
border-color: #505050;
|
||||||
}
|
}
|
||||||
|
|
||||||
dl.todo
|
dl.deprecated.DocNodeRTL {
|
||||||
{
|
margin-left: 0;
|
||||||
margin-left:-7px;
|
padding-left: 0;
|
||||||
|
border-left: 0;
|
||||||
|
margin-right: -7px;
|
||||||
|
padding-right: 3px;
|
||||||
|
border-right: 4px solid;
|
||||||
|
border-color: #505050;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.todo {
|
||||||
|
margin-left: -7px;
|
||||||
padding-left: 3px;
|
padding-left: 3px;
|
||||||
border-left:4px solid;
|
border-left: 4px solid;
|
||||||
border-color: #00C0E0;
|
border-color: #00C0E0;
|
||||||
}
|
}
|
||||||
|
|
||||||
dl.test
|
dl.todo.DocNodeRTL {
|
||||||
{
|
margin-left: 0;
|
||||||
margin-left:-7px;
|
padding-left: 0;
|
||||||
|
border-left: 0;
|
||||||
|
margin-right: -7px;
|
||||||
|
padding-right: 3px;
|
||||||
|
border-right: 4px solid;
|
||||||
|
border-color: #00C0E0;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.test {
|
||||||
|
margin-left: -7px;
|
||||||
padding-left: 3px;
|
padding-left: 3px;
|
||||||
border-left:4px solid;
|
border-left: 4px solid;
|
||||||
border-color: #3030E0;
|
border-color: #3030E0;
|
||||||
}
|
}
|
||||||
|
|
||||||
dl.bug
|
dl.test.DocNodeRTL {
|
||||||
{
|
margin-left: 0;
|
||||||
margin-left:-7px;
|
padding-left: 0;
|
||||||
|
border-left: 0;
|
||||||
|
margin-right: -7px;
|
||||||
|
padding-right: 3px;
|
||||||
|
border-right: 4px solid;
|
||||||
|
border-color: #3030E0;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.bug {
|
||||||
|
margin-left: -7px;
|
||||||
padding-left: 3px;
|
padding-left: 3px;
|
||||||
border-left:4px solid;
|
border-left: 4px solid;
|
||||||
|
border-color: #C08050;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.bug.DocNodeRTL {
|
||||||
|
margin-left: 0;
|
||||||
|
padding-left: 0;
|
||||||
|
border-left: 0;
|
||||||
|
margin-right: -7px;
|
||||||
|
padding-right: 3px;
|
||||||
|
border-right: 4px solid;
|
||||||
border-color: #C08050;
|
border-color: #C08050;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1019,6 +1279,11 @@ dl.section dd {
|
|||||||
border: 0px none;
|
border: 0px none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#projectalign
|
||||||
|
{
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
#projectname
|
#projectname
|
||||||
{
|
{
|
||||||
font: 300% Tahoma, Arial,sans-serif;
|
font: 300% Tahoma, Arial,sans-serif;
|
||||||
@@ -1063,6 +1328,16 @@ dl.section dd {
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.plantumlgraph
|
||||||
|
{
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diagraph
|
||||||
|
{
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
.caption
|
.caption
|
||||||
{
|
{
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@@ -1083,10 +1358,12 @@ dl.citelist dt {
|
|||||||
font-weight:bold;
|
font-weight:bold;
|
||||||
margin-right:10px;
|
margin-right:10px;
|
||||||
padding:5px;
|
padding:5px;
|
||||||
|
text-align:right;
|
||||||
|
width:52px;
|
||||||
}
|
}
|
||||||
|
|
||||||
dl.citelist dd {
|
dl.citelist dd {
|
||||||
margin:2px 0;
|
margin:2px 0 2px 72px;
|
||||||
padding:5px 0;
|
padding:5px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1097,10 +1374,15 @@ div.toc {
|
|||||||
border-radius: 7px 7px 7px 7px;
|
border-radius: 7px 7px 7px 7px;
|
||||||
float: right;
|
float: right;
|
||||||
height: auto;
|
height: auto;
|
||||||
margin: 0 20px 10px 10px;
|
margin: 0 8px 10px 10px;
|
||||||
width: 200px;
|
width: 200px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.PageDocRTL-title div.toc {
|
||||||
|
float: left !important;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
div.toc li {
|
div.toc li {
|
||||||
background: url("bdwn.png") no-repeat scroll 0 5px transparent;
|
background: url("bdwn.png") no-repeat scroll 0 5px transparent;
|
||||||
font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
|
font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
|
||||||
@@ -1109,6 +1391,12 @@ div.toc li {
|
|||||||
padding-top: 2px;
|
padding-top: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.PageDocRTL-title div.toc li {
|
||||||
|
background-position-x: right !important;
|
||||||
|
padding-left: 0 !important;
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
div.toc h3 {
|
div.toc h3 {
|
||||||
font: bold 12px/1.2 Arial,FreeSans,sans-serif;
|
font: bold 12px/1.2 Arial,FreeSans,sans-serif;
|
||||||
color: #4665A2;
|
color: #4665A2;
|
||||||
@@ -1138,6 +1426,26 @@ div.toc li.level4 {
|
|||||||
margin-left: 45px;
|
margin-left: 45px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.PageDocRTL-title div.toc li.level1 {
|
||||||
|
margin-left: 0 !important;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.PageDocRTL-title div.toc li.level2 {
|
||||||
|
margin-left: 0 !important;
|
||||||
|
margin-right: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.PageDocRTL-title div.toc li.level3 {
|
||||||
|
margin-left: 0 !important;
|
||||||
|
margin-right: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.PageDocRTL-title div.toc li.level4 {
|
||||||
|
margin-left: 0 !important;
|
||||||
|
margin-right: 45px;
|
||||||
|
}
|
||||||
|
|
||||||
.inherit_header {
|
.inherit_header {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: gray;
|
color: gray;
|
||||||
@@ -1163,6 +1471,177 @@ tr.heading h2 {
|
|||||||
margin-bottom: 4px;
|
margin-bottom: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* tooltip related style info */
|
||||||
|
|
||||||
|
.ttc {
|
||||||
|
position: absolute;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip {
|
||||||
|
cursor: default;
|
||||||
|
white-space: nowrap;
|
||||||
|
background-color: white;
|
||||||
|
border: 1px solid gray;
|
||||||
|
border-radius: 4px 4px 4px 4px;
|
||||||
|
box-shadow: 1px 1px 7px gray;
|
||||||
|
display: none;
|
||||||
|
font-size: smaller;
|
||||||
|
max-width: 80%;
|
||||||
|
opacity: 0.9;
|
||||||
|
padding: 1ex 1em 1em;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 2147483647;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip div.ttdoc {
|
||||||
|
color: grey;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip div.ttname a {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip div.ttname {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip div.ttdeci {
|
||||||
|
color: #006318;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip div {
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
font: 12px/16px Roboto,sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip:before, #powerTip:after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip.n:after, #powerTip.n:before,
|
||||||
|
#powerTip.s:after, #powerTip.s:before,
|
||||||
|
#powerTip.w:after, #powerTip.w:before,
|
||||||
|
#powerTip.e:after, #powerTip.e:before,
|
||||||
|
#powerTip.ne:after, #powerTip.ne:before,
|
||||||
|
#powerTip.se:after, #powerTip.se:before,
|
||||||
|
#powerTip.nw:after, #powerTip.nw:before,
|
||||||
|
#powerTip.sw:after, #powerTip.sw:before {
|
||||||
|
border: solid transparent;
|
||||||
|
content: " ";
|
||||||
|
height: 0;
|
||||||
|
width: 0;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip.n:after, #powerTip.s:after,
|
||||||
|
#powerTip.w:after, #powerTip.e:after,
|
||||||
|
#powerTip.nw:after, #powerTip.ne:after,
|
||||||
|
#powerTip.sw:after, #powerTip.se:after {
|
||||||
|
border-color: rgba(255, 255, 255, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip.n:before, #powerTip.s:before,
|
||||||
|
#powerTip.w:before, #powerTip.e:before,
|
||||||
|
#powerTip.nw:before, #powerTip.ne:before,
|
||||||
|
#powerTip.sw:before, #powerTip.se:before {
|
||||||
|
border-color: rgba(128, 128, 128, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip.n:after, #powerTip.n:before,
|
||||||
|
#powerTip.ne:after, #powerTip.ne:before,
|
||||||
|
#powerTip.nw:after, #powerTip.nw:before {
|
||||||
|
top: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
|
||||||
|
border-top-color: #FFFFFF;
|
||||||
|
border-width: 10px;
|
||||||
|
margin: 0px -10px;
|
||||||
|
}
|
||||||
|
#powerTip.n:before {
|
||||||
|
border-top-color: #808080;
|
||||||
|
border-width: 11px;
|
||||||
|
margin: 0px -11px;
|
||||||
|
}
|
||||||
|
#powerTip.n:after, #powerTip.n:before {
|
||||||
|
left: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip.nw:after, #powerTip.nw:before {
|
||||||
|
right: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip.ne:after, #powerTip.ne:before {
|
||||||
|
left: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip.s:after, #powerTip.s:before,
|
||||||
|
#powerTip.se:after, #powerTip.se:before,
|
||||||
|
#powerTip.sw:after, #powerTip.sw:before {
|
||||||
|
bottom: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
|
||||||
|
border-bottom-color: #FFFFFF;
|
||||||
|
border-width: 10px;
|
||||||
|
margin: 0px -10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
|
||||||
|
border-bottom-color: #808080;
|
||||||
|
border-width: 11px;
|
||||||
|
margin: 0px -11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip.s:after, #powerTip.s:before {
|
||||||
|
left: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip.sw:after, #powerTip.sw:before {
|
||||||
|
right: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip.se:after, #powerTip.se:before {
|
||||||
|
left: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip.e:after, #powerTip.e:before {
|
||||||
|
left: 100%;
|
||||||
|
}
|
||||||
|
#powerTip.e:after {
|
||||||
|
border-left-color: #FFFFFF;
|
||||||
|
border-width: 10px;
|
||||||
|
top: 50%;
|
||||||
|
margin-top: -10px;
|
||||||
|
}
|
||||||
|
#powerTip.e:before {
|
||||||
|
border-left-color: #808080;
|
||||||
|
border-width: 11px;
|
||||||
|
top: 50%;
|
||||||
|
margin-top: -11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#powerTip.w:after, #powerTip.w:before {
|
||||||
|
right: 100%;
|
||||||
|
}
|
||||||
|
#powerTip.w:after {
|
||||||
|
border-right-color: #FFFFFF;
|
||||||
|
border-width: 10px;
|
||||||
|
top: 50%;
|
||||||
|
margin-top: -10px;
|
||||||
|
}
|
||||||
|
#powerTip.w:before {
|
||||||
|
border-right-color: #808080;
|
||||||
|
border-width: 11px;
|
||||||
|
top: 50%;
|
||||||
|
margin-top: -11px;
|
||||||
|
}
|
||||||
|
|
||||||
@media print
|
@media print
|
||||||
{
|
{
|
||||||
#top { display: none; }
|
#top { display: none; }
|
||||||
@@ -1182,3 +1661,72 @@ tr.heading h2 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* @group Markdown */
|
||||||
|
|
||||||
|
table.markdownTable {
|
||||||
|
border-collapse:collapse;
|
||||||
|
margin-top: 4px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.markdownTable td, table.markdownTable th {
|
||||||
|
border: 1px solid #2D4068;
|
||||||
|
padding: 3px 7px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.markdownTable tr {
|
||||||
|
}
|
||||||
|
|
||||||
|
th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone {
|
||||||
|
background-color: #374F7F;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-size: 110%;
|
||||||
|
padding-bottom: 4px;
|
||||||
|
padding-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
th.markdownTableHeadLeft, td.markdownTableBodyLeft {
|
||||||
|
text-align: left
|
||||||
|
}
|
||||||
|
|
||||||
|
th.markdownTableHeadRight, td.markdownTableBodyRight {
|
||||||
|
text-align: right
|
||||||
|
}
|
||||||
|
|
||||||
|
th.markdownTableHeadCenter, td.markdownTableBodyCenter {
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
|
||||||
|
.DocNodeRTL {
|
||||||
|
text-align: right;
|
||||||
|
direction: rtl;
|
||||||
|
}
|
||||||
|
|
||||||
|
.DocNodeLTR {
|
||||||
|
text-align: left;
|
||||||
|
direction: ltr;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.DocNodeRTL {
|
||||||
|
width: auto;
|
||||||
|
margin-right: 0;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.DocNodeLTR {
|
||||||
|
width: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
tt, code, kbd, samp
|
||||||
|
{
|
||||||
|
display: inline-block;
|
||||||
|
direction:ltr;
|
||||||
|
}
|
||||||
|
/* @end */
|
||||||
|
|
||||||
|
u {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 3.7 KiB |
26
doc/html/doxygen.svg
Normal file
|
After Width: | Height: | Size: 15 KiB |
@@ -1,3 +1,27 @@
|
|||||||
|
/*
|
||||||
|
@licstart The following is the entire license notice for the JavaScript code in this file.
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (C) 1997-2020 by Dimitri van Heesch
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
||||||
|
and associated documentation files (the "Software"), to deal in the Software without restriction,
|
||||||
|
including without limitation the rights to use, copy, modify, merge, publish, distribute,
|
||||||
|
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or
|
||||||
|
substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||||
|
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||||
|
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
@licend The above is the entire license notice for the JavaScript code in this file
|
||||||
|
*/
|
||||||
function toggleVisibility(linkObj)
|
function toggleVisibility(linkObj)
|
||||||
{
|
{
|
||||||
var base = $(linkObj).attr('id');
|
var base = $(linkObj).attr('id');
|
||||||
@@ -24,19 +48,20 @@ function updateStripes()
|
|||||||
$('table.directory tr').
|
$('table.directory tr').
|
||||||
removeClass('even').filter(':visible:even').addClass('even');
|
removeClass('even').filter(':visible:even').addClass('even');
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleLevel(level)
|
function toggleLevel(level)
|
||||||
{
|
{
|
||||||
$('table.directory tr').each(function(){
|
$('table.directory tr').each(function() {
|
||||||
var l = this.id.split('_').length-1;
|
var l = this.id.split('_').length-1;
|
||||||
var i = $('#img'+this.id.substring(3));
|
var i = $('#img'+this.id.substring(3));
|
||||||
var a = $('#arr'+this.id.substring(3));
|
var a = $('#arr'+this.id.substring(3));
|
||||||
if (l<level+1) {
|
if (l<level+1) {
|
||||||
i.attr('src','ftv2folderopen.png');
|
i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
|
||||||
a.attr('src','ftv2mnode.png');
|
a.html('▼');
|
||||||
$(this).show();
|
$(this).show();
|
||||||
} else if (l==level+1) {
|
} else if (l==level+1) {
|
||||||
i.attr('src','ftv2folderclosed.png');
|
i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
|
||||||
a.attr('src','ftv2pnode.png');
|
a.html('►');
|
||||||
$(this).show();
|
$(this).show();
|
||||||
} else {
|
} else {
|
||||||
$(this).hide();
|
$(this).hide();
|
||||||
@@ -47,34 +72,33 @@ function toggleLevel(level)
|
|||||||
|
|
||||||
function toggleFolder(id)
|
function toggleFolder(id)
|
||||||
{
|
{
|
||||||
//The clicked row
|
// the clicked row
|
||||||
var currentRow = $('#row_'+id);
|
var currentRow = $('#row_'+id);
|
||||||
var currentRowImages = currentRow.find("img");
|
|
||||||
|
|
||||||
//All rows after the clicked row
|
// all rows after the clicked row
|
||||||
var rows = currentRow.nextAll("tr");
|
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
|
var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
|
||||||
return this.id.match(re);
|
|
||||||
});
|
|
||||||
|
|
||||||
//First row is visible we are HIDING
|
// only match elements AFTER this one (can't hide elements before)
|
||||||
|
var childRows = rows.filter(function() { return this.id.match(re); });
|
||||||
|
|
||||||
|
// first row is visible we are HIDING
|
||||||
if (childRows.filter(':first').is(':visible')===true) {
|
if (childRows.filter(':first').is(':visible')===true) {
|
||||||
currentRowImages.filter("[id^=arr]").attr('src', 'ftv2pnode.png');
|
// replace down arrow by right arrow for current row
|
||||||
currentRowImages.filter("[id^=img]").attr('src', 'ftv2folderclosed.png');
|
var currentRowSpans = currentRow.find("span");
|
||||||
rows.filter("[id^=row_"+id+"]").hide();
|
currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
|
||||||
} else { //We are SHOWING
|
currentRowSpans.filter(".arrow").html('►');
|
||||||
//All sub images
|
rows.filter("[id^=row_"+id+"]").hide(); // hide all children
|
||||||
var childImages = childRows.find("img");
|
} else { // we are SHOWING
|
||||||
var childImg = childImages.filter("[id^=img]");
|
// replace right arrow by down arrow for current row
|
||||||
var childArr = childImages.filter("[id^=arr]");
|
var currentRowSpans = currentRow.find("span");
|
||||||
|
currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
|
||||||
currentRow.find("[id^=arr]").attr('src', 'ftv2mnode.png'); //open row
|
currentRowSpans.filter(".arrow").html('▼');
|
||||||
currentRow.find("[id^=img]").attr('src', 'ftv2folderopen.png'); //open row
|
// replace down arrows by right arrows for child rows
|
||||||
childImg.attr('src','ftv2folderclosed.png'); //children closed
|
var childRowsSpans = childRows.find("span");
|
||||||
childArr.attr('src','ftv2pnode.png'); //children closed
|
childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
|
||||||
|
childRowsSpans.filter(".arrow").html('►');
|
||||||
childRows.show(); //show all children
|
childRows.show(); //show all children
|
||||||
}
|
}
|
||||||
updateStripes();
|
updateStripes();
|
||||||
@@ -94,4 +118,4 @@ function toggleInherit(id)
|
|||||||
$(img).attr('src',src.substring(0,src.length-10)+'open.png');
|
$(img).attr('src',src.substring(0,src.length-10)+'open.png');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* @license-end */
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 616 B After Width: | Height: | Size: 616 B |
|
Before Width: | Height: | Size: 597 B After Width: | Height: | Size: 597 B |
|
Before Width: | Height: | Size: 86 B |
|
Before Width: | Height: | Size: 453 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: 86 B |
@@ -1,18 +1,17 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1"/>
|
<meta name="generator" content="Doxygen 1.8.20"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
<title>TurboJPEG: Data Fields</title>
|
<title>TurboJPEG: Data Fields</title>
|
||||||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
<script type="text/javascript" src="jquery.js"></script>
|
<script type="text/javascript" src="jquery.js"></script>
|
||||||
<script type="text/javascript" src="dynsections.js"></script>
|
<script type="text/javascript" src="dynsections.js"></script>
|
||||||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<script type="text/javascript" src="search/searchdata.js"></script>
|
||||||
<script type="text/javascript" src="search/search.js"></script>
|
<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.css" rel="stylesheet" type="text/css" />
|
||||||
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
||||||
</head>
|
</head>
|
||||||
@@ -22,9 +21,9 @@
|
|||||||
<table cellspacing="0" cellpadding="0">
|
<table cellspacing="0" cellpadding="0">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr style="height: 56px;">
|
<tr style="height: 56px;">
|
||||||
<td style="padding-left: 0.5em;">
|
<td id="projectalign" style="padding-left: 0.5em;">
|
||||||
<div id="projectname">TurboJPEG
|
<div id="projectname">TurboJPEG
|
||||||
 <span id="projectnumber">2.0</span>
|
 <span id="projectnumber">2.1.4</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -32,53 +31,29 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!-- end header part -->
|
<!-- end header part -->
|
||||||
<!-- Generated by Doxygen 1.8.3.1 -->
|
<!-- Generated by Doxygen 1.8.20 -->
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||||
|
/* @license-end */
|
||||||
</script>
|
</script>
|
||||||
<div id="navrow1" class="tabs">
|
<script type="text/javascript" src="menudata.js"></script>
|
||||||
<ul class="tablist">
|
<script type="text/javascript" src="menu.js"></script>
|
||||||
<li><a href="index.html"><span>Main Page</span></a></li>
|
<script type="text/javascript">
|
||||||
<li><a href="modules.html"><span>Modules</span></a></li>
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
<li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
|
$(function() {
|
||||||
<li>
|
initMenu('',true,false,'search.php','Search');
|
||||||
<div id="MSearchBox" class="MSearchBoxInactive">
|
$(document).ready(function() { init_search(); });
|
||||||
<span class="left">
|
});
|
||||||
<img id="MSearchSelect" src="search/mag_sel.png"
|
/* @license-end */</script>
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
<div id="main-nav"></div>
|
||||||
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 -->
|
</div><!-- top -->
|
||||||
<!-- window showing the filter options -->
|
<!-- window showing the filter options -->
|
||||||
<div id="MSearchSelectWindow"
|
<div id="MSearchSelectWindow"
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
||||||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
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>
|
</div>
|
||||||
|
|
||||||
<!-- iframe showing the search results (closed by default) -->
|
<!-- iframe showing the search results (closed by default) -->
|
||||||
<div id="MSearchResultsWindow">
|
<div id="MSearchResultsWindow">
|
||||||
@@ -90,7 +65,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|||||||
<div class="contents">
|
<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>
|
<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
|
<li>customFilter
|
||||||
: <a class="el" href="structtjtransform.html#a43ee1bcdd2a8d7249a756774f78793c1">tjtransform</a>
|
: <a class="el" href="structtjtransform.html#afd7fc262df33f741e120ef4183202ef5">tjtransform</a>
|
||||||
</li>
|
</li>
|
||||||
<li>data
|
<li>data
|
||||||
: <a class="el" href="structtjtransform.html#a688fe8f1a8ecc12a538d9e561cf338e3">tjtransform</a>
|
: <a class="el" href="structtjtransform.html#a688fe8f1a8ecc12a538d9e561cf338e3">tjtransform</a>
|
||||||
@@ -126,9 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|||||||
</div><!-- contents -->
|
</div><!-- contents -->
|
||||||
<!-- start footer part -->
|
<!-- start footer part -->
|
||||||
<hr class="footer"/><address class="footer"><small>
|
<hr class="footer"/><address class="footer"><small>
|
||||||
Generated by  <a href="http://www.doxygen.org/index.html">
|
Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20
|
||||||
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
||||||
</a> 1.8.3.1
|
|
||||||
</small></address>
|
</small></address>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,18 +1,17 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1"/>
|
<meta name="generator" content="Doxygen 1.8.20"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
<title>TurboJPEG: Data Fields - Variables</title>
|
<title>TurboJPEG: Data Fields - Variables</title>
|
||||||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
<script type="text/javascript" src="jquery.js"></script>
|
<script type="text/javascript" src="jquery.js"></script>
|
||||||
<script type="text/javascript" src="dynsections.js"></script>
|
<script type="text/javascript" src="dynsections.js"></script>
|
||||||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<script type="text/javascript" src="search/searchdata.js"></script>
|
||||||
<script type="text/javascript" src="search/search.js"></script>
|
<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.css" rel="stylesheet" type="text/css" />
|
||||||
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
||||||
</head>
|
</head>
|
||||||
@@ -22,9 +21,9 @@
|
|||||||
<table cellspacing="0" cellpadding="0">
|
<table cellspacing="0" cellpadding="0">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr style="height: 56px;">
|
<tr style="height: 56px;">
|
||||||
<td style="padding-left: 0.5em;">
|
<td id="projectalign" style="padding-left: 0.5em;">
|
||||||
<div id="projectname">TurboJPEG
|
<div id="projectname">TurboJPEG
|
||||||
 <span id="projectnumber">2.0</span>
|
 <span id="projectnumber">2.1.4</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -32,53 +31,29 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!-- end header part -->
|
<!-- end header part -->
|
||||||
<!-- Generated by Doxygen 1.8.3.1 -->
|
<!-- Generated by Doxygen 1.8.20 -->
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||||
|
/* @license-end */
|
||||||
</script>
|
</script>
|
||||||
<div id="navrow1" class="tabs">
|
<script type="text/javascript" src="menudata.js"></script>
|
||||||
<ul class="tablist">
|
<script type="text/javascript" src="menu.js"></script>
|
||||||
<li><a href="index.html"><span>Main Page</span></a></li>
|
<script type="text/javascript">
|
||||||
<li><a href="modules.html"><span>Modules</span></a></li>
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
<li class="current"><a href="annotated.html"><span>Data Structures</span></a></li>
|
$(function() {
|
||||||
<li>
|
initMenu('',true,false,'search.php','Search');
|
||||||
<div id="MSearchBox" class="MSearchBoxInactive">
|
$(document).ready(function() { init_search(); });
|
||||||
<span class="left">
|
});
|
||||||
<img id="MSearchSelect" src="search/mag_sel.png"
|
/* @license-end */</script>
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
<div id="main-nav"></div>
|
||||||
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 -->
|
</div><!-- top -->
|
||||||
<!-- window showing the filter options -->
|
<!-- window showing the filter options -->
|
||||||
<div id="MSearchSelectWindow"
|
<div id="MSearchSelectWindow"
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
||||||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
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>
|
</div>
|
||||||
|
|
||||||
<!-- iframe showing the search results (closed by default) -->
|
<!-- iframe showing the search results (closed by default) -->
|
||||||
<div id="MSearchResultsWindow">
|
<div id="MSearchResultsWindow">
|
||||||
@@ -90,7 +65,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|||||||
<div class="contents">
|
<div class="contents">
|
||||||
 <ul>
|
 <ul>
|
||||||
<li>customFilter
|
<li>customFilter
|
||||||
: <a class="el" href="structtjtransform.html#a43ee1bcdd2a8d7249a756774f78793c1">tjtransform</a>
|
: <a class="el" href="structtjtransform.html#afd7fc262df33f741e120ef4183202ef5">tjtransform</a>
|
||||||
</li>
|
</li>
|
||||||
<li>data
|
<li>data
|
||||||
: <a class="el" href="structtjtransform.html#a688fe8f1a8ecc12a538d9e561cf338e3">tjtransform</a>
|
: <a class="el" href="structtjtransform.html#a688fe8f1a8ecc12a538d9e561cf338e3">tjtransform</a>
|
||||||
@@ -126,9 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|||||||
</div><!-- contents -->
|
</div><!-- contents -->
|
||||||
<!-- start footer part -->
|
<!-- start footer part -->
|
||||||
<hr class="footer"/><address class="footer"><small>
|
<hr class="footer"/><address class="footer"><small>
|
||||||
Generated by  <a href="http://www.doxygen.org/index.html">
|
Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20
|
||||||
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
||||||
</a> 1.8.3.1
|
|
||||||
</small></address>
|
</small></address>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,18 +1,17 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1"/>
|
<meta name="generator" content="Doxygen 1.8.20"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
<title>TurboJPEG: Main Page</title>
|
<title>TurboJPEG: Main Page</title>
|
||||||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
<script type="text/javascript" src="jquery.js"></script>
|
<script type="text/javascript" src="jquery.js"></script>
|
||||||
<script type="text/javascript" src="dynsections.js"></script>
|
<script type="text/javascript" src="dynsections.js"></script>
|
||||||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<script type="text/javascript" src="search/searchdata.js"></script>
|
||||||
<script type="text/javascript" src="search/search.js"></script>
|
<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.css" rel="stylesheet" type="text/css" />
|
||||||
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
||||||
</head>
|
</head>
|
||||||
@@ -22,9 +21,9 @@
|
|||||||
<table cellspacing="0" cellpadding="0">
|
<table cellspacing="0" cellpadding="0">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr style="height: 56px;">
|
<tr style="height: 56px;">
|
||||||
<td style="padding-left: 0.5em;">
|
<td id="projectalign" style="padding-left: 0.5em;">
|
||||||
<div id="projectname">TurboJPEG
|
<div id="projectname">TurboJPEG
|
||||||
 <span id="projectnumber">2.0</span>
|
 <span id="projectnumber">2.1.4</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -32,40 +31,29 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!-- end header part -->
|
<!-- end header part -->
|
||||||
<!-- Generated by Doxygen 1.8.3.1 -->
|
<!-- Generated by Doxygen 1.8.20 -->
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||||
|
/* @license-end */
|
||||||
</script>
|
</script>
|
||||||
<div id="navrow1" class="tabs">
|
<script type="text/javascript" src="menudata.js"></script>
|
||||||
<ul class="tablist">
|
<script type="text/javascript" src="menu.js"></script>
|
||||||
<li class="current"><a href="index.html"><span>Main Page</span></a></li>
|
<script type="text/javascript">
|
||||||
<li><a href="modules.html"><span>Modules</span></a></li>
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
<li><a href="annotated.html"><span>Data Structures</span></a></li>
|
$(function() {
|
||||||
<li>
|
initMenu('',true,false,'search.php','Search');
|
||||||
<div id="MSearchBox" class="MSearchBoxInactive">
|
$(document).ready(function() { init_search(); });
|
||||||
<span class="left">
|
});
|
||||||
<img id="MSearchSelect" src="search/mag_sel.png"
|
/* @license-end */</script>
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
<div id="main-nav"></div>
|
||||||
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 -->
|
</div><!-- top -->
|
||||||
<!-- window showing the filter options -->
|
<!-- window showing the filter options -->
|
||||||
<div id="MSearchSelectWindow"
|
<div id="MSearchSelectWindow"
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
||||||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
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>
|
</div>
|
||||||
|
|
||||||
<!-- iframe showing the search results (closed by default) -->
|
<!-- iframe showing the search results (closed by default) -->
|
||||||
<div id="MSearchResultsWindow">
|
<div id="MSearchResultsWindow">
|
||||||
@@ -82,9 +70,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|||||||
</div><!-- contents -->
|
</div><!-- contents -->
|
||||||
<!-- start footer part -->
|
<!-- start footer part -->
|
||||||
<hr class="footer"/><address class="footer"><small>
|
<hr class="footer"/><address class="footer"><small>
|
||||||
Generated by  <a href="http://www.doxygen.org/index.html">
|
Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20
|
||||||
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
||||||
</a> 1.8.3.1
|
|
||||||
</small></address>
|
</small></address>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
43
doc/html/jquery.js
vendored
51
doc/html/menu.js
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
@licstart The following is the entire license notice for the JavaScript code in this file.
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (C) 1997-2020 by Dimitri van Heesch
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
||||||
|
and associated documentation files (the "Software"), to deal in the Software without restriction,
|
||||||
|
including without limitation the rights to use, copy, modify, merge, publish, distribute,
|
||||||
|
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or
|
||||||
|
substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||||
|
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||||
|
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
@licend The above is the entire license notice for the JavaScript code in this file
|
||||||
|
*/
|
||||||
|
function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
|
||||||
|
function makeTree(data,relPath) {
|
||||||
|
var result='';
|
||||||
|
if ('children' in data) {
|
||||||
|
result+='<ul>';
|
||||||
|
for (var i in data.children) {
|
||||||
|
result+='<li><a href="'+relPath+data.children[i].url+'">'+
|
||||||
|
data.children[i].text+'</a>'+
|
||||||
|
makeTree(data.children[i],relPath)+'</li>';
|
||||||
|
}
|
||||||
|
result+='</ul>';
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#main-nav').append(makeTree(menudata,relPath));
|
||||||
|
$('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
|
||||||
|
if (searchEnabled) {
|
||||||
|
if (serverSide) {
|
||||||
|
$('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><div class="left"><form id="FSearchBox" action="'+relPath+searchPage+'" method="get"><img id="MSearchSelect" src="'+relPath+'search/mag.svg" alt=""/><input type="text" id="MSearchField" name="query" value="'+search+'" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)"></form></div><div class="right"></div></div></li>');
|
||||||
|
} else {
|
||||||
|
$('#main-menu').append('<li style="float:right"><div id="MSearchBox" class="MSearchBoxInactive"><span class="left"><img id="MSearchSelect" src="'+relPath+'search/mag_sel.svg" 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="'+relPath+'search/close.svg" alt=""/></a></span></div></li>');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$('#main-menu').smartmenus();
|
||||||
|
}
|
||||||
|
/* @license-end */
|
||||||
33
doc/html/menudata.js
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
@licstart The following is the entire license notice for the JavaScript code in this file.
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (C) 1997-2020 by Dimitri van Heesch
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
||||||
|
and associated documentation files (the "Software"), to deal in the Software without restriction,
|
||||||
|
including without limitation the rights to use, copy, modify, merge, publish, distribute,
|
||||||
|
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or
|
||||||
|
substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||||
|
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||||
|
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
@licend The above is the entire license notice for the JavaScript code in this file
|
||||||
|
*/
|
||||||
|
var menudata={children:[
|
||||||
|
{text:"Main Page",url:"index.html"},
|
||||||
|
{text:"Modules",url:"modules.html"},
|
||||||
|
{text:"Data Structures",url:"annotated.html",children:[
|
||||||
|
{text:"Data Structures",url:"annotated.html"},
|
||||||
|
{text:"Data Structure Index",url:"classes.html"},
|
||||||
|
{text:"Data Fields",url:"functions.html",children:[
|
||||||
|
{text:"All",url:"functions.html"},
|
||||||
|
{text:"Variables",url:"functions_vars.html"}]}]}]}
|
||||||
@@ -1,18 +1,17 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1"/>
|
<meta name="generator" content="Doxygen 1.8.20"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
<title>TurboJPEG: Modules</title>
|
<title>TurboJPEG: Modules</title>
|
||||||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
<script type="text/javascript" src="jquery.js"></script>
|
<script type="text/javascript" src="jquery.js"></script>
|
||||||
<script type="text/javascript" src="dynsections.js"></script>
|
<script type="text/javascript" src="dynsections.js"></script>
|
||||||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<script type="text/javascript" src="search/searchdata.js"></script>
|
||||||
<script type="text/javascript" src="search/search.js"></script>
|
<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.css" rel="stylesheet" type="text/css" />
|
||||||
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
<link href="doxygen-extra.css" rel="stylesheet" type="text/css"/>
|
||||||
</head>
|
</head>
|
||||||
@@ -22,9 +21,9 @@
|
|||||||
<table cellspacing="0" cellpadding="0">
|
<table cellspacing="0" cellpadding="0">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr style="height: 56px;">
|
<tr style="height: 56px;">
|
||||||
<td style="padding-left: 0.5em;">
|
<td id="projectalign" style="padding-left: 0.5em;">
|
||||||
<div id="projectname">TurboJPEG
|
<div id="projectname">TurboJPEG
|
||||||
 <span id="projectnumber">2.0</span>
|
 <span id="projectnumber">2.1.4</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -32,40 +31,29 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<!-- end header part -->
|
<!-- end header part -->
|
||||||
<!-- Generated by Doxygen 1.8.3.1 -->
|
<!-- Generated by Doxygen 1.8.20 -->
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||||
|
/* @license-end */
|
||||||
</script>
|
</script>
|
||||||
<div id="navrow1" class="tabs">
|
<script type="text/javascript" src="menudata.js"></script>
|
||||||
<ul class="tablist">
|
<script type="text/javascript" src="menu.js"></script>
|
||||||
<li><a href="index.html"><span>Main Page</span></a></li>
|
<script type="text/javascript">
|
||||||
<li class="current"><a href="modules.html"><span>Modules</span></a></li>
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
<li><a href="annotated.html"><span>Data Structures</span></a></li>
|
$(function() {
|
||||||
<li>
|
initMenu('',true,false,'search.php','Search');
|
||||||
<div id="MSearchBox" class="MSearchBoxInactive">
|
$(document).ready(function() { init_search(); });
|
||||||
<span class="left">
|
});
|
||||||
<img id="MSearchSelect" src="search/mag_sel.png"
|
/* @license-end */</script>
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
<div id="main-nav"></div>
|
||||||
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 -->
|
</div><!-- top -->
|
||||||
<!-- window showing the filter options -->
|
<!-- window showing the filter options -->
|
||||||
<div id="MSearchSelectWindow"
|
<div id="MSearchSelectWindow"
|
||||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
||||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
||||||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
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>
|
</div>
|
||||||
|
|
||||||
<!-- iframe showing the search results (closed by default) -->
|
<!-- iframe showing the search results (closed by default) -->
|
||||||
<div id="MSearchResultsWindow">
|
<div id="MSearchResultsWindow">
|
||||||
@@ -81,15 +69,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|||||||
<div class="contents">
|
<div class="contents">
|
||||||
<div class="textblock">Here is a list of all modules:</div><div class="directory">
|
<div class="textblock">Here is a list of all modules:</div><div class="directory">
|
||||||
<table 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>
|
<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;"> </span><a class="el" href="group___turbo_j_p_e_g.html" target="_self">TurboJPEG</a></td><td class="desc">TurboJPEG API </td></tr>
|
||||||
</table>
|
</table>
|
||||||
</div><!-- directory -->
|
</div><!-- directory -->
|
||||||
</div><!-- contents -->
|
</div><!-- contents -->
|
||||||
<!-- start footer part -->
|
<!-- start footer part -->
|
||||||
<hr class="footer"/><address class="footer"><small>
|
<hr class="footer"/><address class="footer"><small>
|
||||||
Generated by  <a href="http://www.doxygen.org/index.html">
|
Generated by <a href="http://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.8.20
|
||||||
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
||||||
</a> 1.8.3.1
|
|
||||||
</small></address>
|
</small></address>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
<html><head><title></title>
|
<html><head><title></title>
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
<meta name="generator" content="Doxygen 1.8.20"/>
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
<link rel="stylesheet" type="text/css" href="search.css"/>
|
||||||
<script type="text/javascript" src="all_63.js"></script>
|
<script type="text/javascript" src="all_0.js"></script>
|
||||||
<script type="text/javascript" src="search.js"></script>
|
<script type="text/javascript" src="search.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body class="SRPage">
|
<body class="SRPage">
|
||||||
@@ -11,15 +11,25 @@
|
|||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
<div class="SRStatus" id="Loading">Loading...</div>
|
||||||
<div id="SRResults"></div>
|
<div id="SRResults"></div>
|
||||||
<script type="text/javascript"><!--
|
<script type="text/javascript"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
createResults();
|
createResults();
|
||||||
|
/* @license-end */
|
||||||
--></script>
|
--></script>
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
<div class="SRStatus" id="Searching">Searching...</div>
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
<div class="SRStatus" id="NoMatches">No Matches</div>
|
||||||
<script type="text/javascript"><!--
|
<script type="text/javascript"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
document.getElementById("Loading").style.display="none";
|
document.getElementById("Loading").style.display="none";
|
||||||
document.getElementById("NoMatches").style.display="none";
|
document.getElementById("NoMatches").style.display="none";
|
||||||
var searchResults = new SearchResults("searchResults");
|
var searchResults = new SearchResults("searchResults");
|
||||||
searchResults.Search();
|
searchResults.Search();
|
||||||
|
window.addEventListener("message", function(event) {
|
||||||
|
if (event.data == "take_focus") {
|
||||||
|
var elem = searchResults.NavNext(0);
|
||||||
|
if (elem) elem.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/* @license-end */
|
||||||
--></script>
|
--></script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
4
doc/html/search/all_0.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
var searchData=
|
||||||
|
[
|
||||||
|
['customfilter_0',['customFilter',['../structtjtransform.html#afd7fc262df33f741e120ef4183202ef5',1,'tjtransform']]]
|
||||||
|
];
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
<html><head><title></title>
|
<html><head><title></title>
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
<meta name="generator" content="Doxygen 1.8.20"/>
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
<link rel="stylesheet" type="text/css" href="search.css"/>
|
||||||
<script type="text/javascript" src="all_64.js"></script>
|
<script type="text/javascript" src="all_1.js"></script>
|
||||||
<script type="text/javascript" src="search.js"></script>
|
<script type="text/javascript" src="search.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body class="SRPage">
|
<body class="SRPage">
|
||||||
@@ -11,15 +11,25 @@
|
|||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
<div class="SRStatus" id="Loading">Loading...</div>
|
||||||
<div id="SRResults"></div>
|
<div id="SRResults"></div>
|
||||||
<script type="text/javascript"><!--
|
<script type="text/javascript"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
createResults();
|
createResults();
|
||||||
|
/* @license-end */
|
||||||
--></script>
|
--></script>
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
<div class="SRStatus" id="Searching">Searching...</div>
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
<div class="SRStatus" id="NoMatches">No Matches</div>
|
||||||
<script type="text/javascript"><!--
|
<script type="text/javascript"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
document.getElementById("Loading").style.display="none";
|
document.getElementById("Loading").style.display="none";
|
||||||
document.getElementById("NoMatches").style.display="none";
|
document.getElementById("NoMatches").style.display="none";
|
||||||
var searchResults = new SearchResults("searchResults");
|
var searchResults = new SearchResults("searchResults");
|
||||||
searchResults.Search();
|
searchResults.Search();
|
||||||
|
window.addEventListener("message", function(event) {
|
||||||
|
if (event.data == "take_focus") {
|
||||||
|
var elem = searchResults.NavNext(0);
|
||||||
|
if (elem) elem.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/* @license-end */
|
||||||
--></script>
|
--></script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
5
doc/html/search/all_1.js
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
var searchData=
|
||||||
|
[
|
||||||
|
['data_1',['data',['../structtjtransform.html#a688fe8f1a8ecc12a538d9e561cf338e3',1,'tjtransform']]],
|
||||||
|
['denom_2',['denom',['../structtjscalingfactor.html#aefbcdf3e9e62274b2d312c695f133ce3',1,'tjscalingfactor']]]
|
||||||
|
];
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
<html><head><title></title>
|
<html><head><title></title>
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
<meta name="generator" content="Doxygen 1.8.20"/>
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
<link rel="stylesheet" type="text/css" href="search.css"/>
|
||||||
<script type="text/javascript" src="all_68.js"></script>
|
<script type="text/javascript" src="all_2.js"></script>
|
||||||
<script type="text/javascript" src="search.js"></script>
|
<script type="text/javascript" src="search.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body class="SRPage">
|
<body class="SRPage">
|
||||||
@@ -11,15 +11,25 @@
|
|||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
<div class="SRStatus" id="Loading">Loading...</div>
|
||||||
<div id="SRResults"></div>
|
<div id="SRResults"></div>
|
||||||
<script type="text/javascript"><!--
|
<script type="text/javascript"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
createResults();
|
createResults();
|
||||||
|
/* @license-end */
|
||||||
--></script>
|
--></script>
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
<div class="SRStatus" id="Searching">Searching...</div>
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
<div class="SRStatus" id="NoMatches">No Matches</div>
|
||||||
<script type="text/javascript"><!--
|
<script type="text/javascript"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
document.getElementById("Loading").style.display="none";
|
document.getElementById("Loading").style.display="none";
|
||||||
document.getElementById("NoMatches").style.display="none";
|
document.getElementById("NoMatches").style.display="none";
|
||||||
var searchResults = new SearchResults("searchResults");
|
var searchResults = new SearchResults("searchResults");
|
||||||
searchResults.Search();
|
searchResults.Search();
|
||||||
|
window.addEventListener("message", function(event) {
|
||||||
|
if (event.data == "take_focus") {
|
||||||
|
var elem = searchResults.NavNext(0);
|
||||||
|
if (elem) elem.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/* @license-end */
|
||||||
--></script>
|
--></script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
4
doc/html/search/all_2.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
var searchData=
|
||||||
|
[
|
||||||
|
['h_3',['h',['../structtjregion.html#aecefc45a26f4d8b60dd4d825c1710115',1,'tjregion']]]
|
||||||
|
];
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
<html><head><title></title>
|
<html><head><title></title>
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
<meta name="generator" content="Doxygen 1.8.3.1">
|
<meta name="generator" content="Doxygen 1.8.20"/>
|
||||||
<link rel="stylesheet" type="text/css" href="search.css"/>
|
<link rel="stylesheet" type="text/css" href="search.css"/>
|
||||||
<script type="text/javascript" src="all_6e.js"></script>
|
<script type="text/javascript" src="all_3.js"></script>
|
||||||
<script type="text/javascript" src="search.js"></script>
|
<script type="text/javascript" src="search.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body class="SRPage">
|
<body class="SRPage">
|
||||||
@@ -11,15 +11,25 @@
|
|||||||
<div class="SRStatus" id="Loading">Loading...</div>
|
<div class="SRStatus" id="Loading">Loading...</div>
|
||||||
<div id="SRResults"></div>
|
<div id="SRResults"></div>
|
||||||
<script type="text/javascript"><!--
|
<script type="text/javascript"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
createResults();
|
createResults();
|
||||||
|
/* @license-end */
|
||||||
--></script>
|
--></script>
|
||||||
<div class="SRStatus" id="Searching">Searching...</div>
|
<div class="SRStatus" id="Searching">Searching...</div>
|
||||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
<div class="SRStatus" id="NoMatches">No Matches</div>
|
||||||
<script type="text/javascript"><!--
|
<script type="text/javascript"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
document.getElementById("Loading").style.display="none";
|
document.getElementById("Loading").style.display="none";
|
||||||
document.getElementById("NoMatches").style.display="none";
|
document.getElementById("NoMatches").style.display="none";
|
||||||
var searchResults = new SearchResults("searchResults");
|
var searchResults = new SearchResults("searchResults");
|
||||||
searchResults.Search();
|
searchResults.Search();
|
||||||
|
window.addEventListener("message", function(event) {
|
||||||
|
if (event.data == "take_focus") {
|
||||||
|
var elem = searchResults.NavNext(0);
|
||||||
|
if (elem) elem.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/* @license-end */
|
||||||
--></script>
|
--></script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
4
doc/html/search/all_3.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
var searchData=
|
||||||
|
[
|
||||||
|
['num_4',['num',['../structtjscalingfactor.html#a9b011e57f981ee23083e2c1aa5e640ec',1,'tjscalingfactor']]]
|
||||||
|
];
|
||||||
36
doc/html/search/all_4.html
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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.20"/>
|
||||||
|
<link rel="stylesheet" type="text/css" href="search.css"/>
|
||||||
|
<script type="text/javascript" src="all_4.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"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
|
createResults();
|
||||||
|
/* @license-end */
|
||||||
|
--></script>
|
||||||
|
<div class="SRStatus" id="Searching">Searching...</div>
|
||||||
|
<div class="SRStatus" id="NoMatches">No Matches</div>
|
||||||
|
<script type="text/javascript"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
|
document.getElementById("Loading").style.display="none";
|
||||||
|
document.getElementById("NoMatches").style.display="none";
|
||||||
|
var searchResults = new SearchResults("searchResults");
|
||||||
|
searchResults.Search();
|
||||||
|
window.addEventListener("message", function(event) {
|
||||||
|
if (event.data == "take_focus") {
|
||||||
|
var elem = searchResults.NavNext(0);
|
||||||
|
if (elem) elem.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/* @license-end */
|
||||||
|
--></script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
5
doc/html/search/all_4.js
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
var searchData=
|
||||||
|
[
|
||||||
|
['op_5',['op',['../structtjtransform.html#a2525aab4ba6978a1c273f74fef50e498',1,'tjtransform']]],
|
||||||
|
['options_6',['options',['../structtjtransform.html#ac0e74655baa4402209a21e1ae481c8f6',1,'tjtransform']]]
|
||||||
|
];
|
||||||
36
doc/html/search/all_5.html
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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.20"/>
|
||||||
|
<link rel="stylesheet" type="text/css" href="search.css"/>
|
||||||
|
<script type="text/javascript" src="all_5.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"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
|
createResults();
|
||||||
|
/* @license-end */
|
||||||
|
--></script>
|
||||||
|
<div class="SRStatus" id="Searching">Searching...</div>
|
||||||
|
<div class="SRStatus" id="NoMatches">No Matches</div>
|
||||||
|
<script type="text/javascript"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
|
document.getElementById("Loading").style.display="none";
|
||||||
|
document.getElementById("NoMatches").style.display="none";
|
||||||
|
var searchResults = new SearchResults("searchResults");
|
||||||
|
searchResults.Search();
|
||||||
|
window.addEventListener("message", function(event) {
|
||||||
|
if (event.data == "take_focus") {
|
||||||
|
var elem = searchResults.NavNext(0);
|
||||||
|
if (elem) elem.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/* @license-end */
|
||||||
|
--></script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
4
doc/html/search/all_5.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
var searchData=
|
||||||
|
[
|
||||||
|
['r_7',['r',['../structtjtransform.html#ac324e5e442abec8a961e5bf219db12cf',1,'tjtransform']]]
|
||||||
|
];
|
||||||
36
doc/html/search/all_6.html
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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.20"/>
|
||||||
|
<link rel="stylesheet" type="text/css" href="search.css"/>
|
||||||
|
<script type="text/javascript" src="all_6.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"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
|
createResults();
|
||||||
|
/* @license-end */
|
||||||
|
--></script>
|
||||||
|
<div class="SRStatus" id="Searching">Searching...</div>
|
||||||
|
<div class="SRStatus" id="NoMatches">No Matches</div>
|
||||||
|
<script type="text/javascript"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
|
document.getElementById("Loading").style.display="none";
|
||||||
|
document.getElementById("NoMatches").style.display="none";
|
||||||
|
var searchResults = new SearchResults("searchResults");
|
||||||
|
searchResults.Search();
|
||||||
|
window.addEventListener("message", function(event) {
|
||||||
|
if (event.data == "take_focus") {
|
||||||
|
var elem = searchResults.NavNext(0);
|
||||||
|
if (elem) elem.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/* @license-end */
|
||||||
|
--></script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
103
doc/html/search/all_6.js
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
var searchData=
|
||||||
|
[
|
||||||
|
['tj_5fnumcs_8',['TJ_NUMCS',['../group___turbo_j_p_e_g.html#ga39f57a6fb02d9cf32e7b6890099b5a71',1,'turbojpeg.h']]],
|
||||||
|
['tj_5fnumerr_9',['TJ_NUMERR',['../group___turbo_j_p_e_g.html#ga79bde1b4a3e2351e00887e47781b966e',1,'turbojpeg.h']]],
|
||||||
|
['tj_5fnumpf_10',['TJ_NUMPF',['../group___turbo_j_p_e_g.html#ga7010a4402f54a45ba822ad8675a4655e',1,'turbojpeg.h']]],
|
||||||
|
['tj_5fnumsamp_11',['TJ_NUMSAMP',['../group___turbo_j_p_e_g.html#ga5ef3d169162ce77ce348e292a0b7477c',1,'turbojpeg.h']]],
|
||||||
|
['tj_5fnumxop_12',['TJ_NUMXOP',['../group___turbo_j_p_e_g.html#ga0f6dbd18adf38b7d46ac547f0f4d562c',1,'turbojpeg.h']]],
|
||||||
|
['tjalloc_13',['tjAlloc',['../group___turbo_j_p_e_g.html#gaec627dd4c5f30b7a775a7aea3bec5d83',1,'turbojpeg.h']]],
|
||||||
|
['tjalphaoffset_14',['tjAlphaOffset',['../group___turbo_j_p_e_g.html#ga5af0ab065feefd526debf1e20c43e837',1,'turbojpeg.h']]],
|
||||||
|
['tjblueoffset_15',['tjBlueOffset',['../group___turbo_j_p_e_g.html#ga84e2e35d3f08025f976ec1ec53693dea',1,'turbojpeg.h']]],
|
||||||
|
['tjbufsize_16',['tjBufSize',['../group___turbo_j_p_e_g.html#ga67ac12fee79073242cb216e07c9f1f90',1,'turbojpeg.h']]],
|
||||||
|
['tjbufsizeyuv2_17',['tjBufSizeYUV2',['../group___turbo_j_p_e_g.html#ga2be2b9969d4df9ecce9b05deed273194',1,'turbojpeg.h']]],
|
||||||
|
['tjcompress2_18',['tjCompress2',['../group___turbo_j_p_e_g.html#gafbdce0112fd78fd38efae841443a9bcf',1,'turbojpeg.h']]],
|
||||||
|
['tjcompressfromyuv_19',['tjCompressFromYUV',['../group___turbo_j_p_e_g.html#ga7622a459b79aa1007e005b58783f875b',1,'turbojpeg.h']]],
|
||||||
|
['tjcompressfromyuvplanes_20',['tjCompressFromYUVPlanes',['../group___turbo_j_p_e_g.html#ga29ec5dfbd2d84b8724e951d6fa0d5d9e',1,'turbojpeg.h']]],
|
||||||
|
['tjcs_21',['TJCS',['../group___turbo_j_p_e_g.html#ga4f83ad3368e0e29d1957be0efa7c3720',1,'turbojpeg.h']]],
|
||||||
|
['tjcs_5fcmyk_22',['TJCS_CMYK',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a6c8b636152ac8195b869587db315ee53',1,'turbojpeg.h']]],
|
||||||
|
['tjcs_5fgray_23',['TJCS_GRAY',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720ab3e7d6a87f695e45b81c1b5262b5a50a',1,'turbojpeg.h']]],
|
||||||
|
['tjcs_5frgb_24',['TJCS_RGB',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a677cb7ccb85c4038ac41964a2e09e555',1,'turbojpeg.h']]],
|
||||||
|
['tjcs_5fycbcr_25',['TJCS_YCbCr',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a7389b8f65bb387ffedce3efd0d78ec75',1,'turbojpeg.h']]],
|
||||||
|
['tjcs_5fycck_26',['TJCS_YCCK',['../group___turbo_j_p_e_g.html#gga4f83ad3368e0e29d1957be0efa7c3720a53839e0fe867b76b58d16b0a1a7c598e',1,'turbojpeg.h']]],
|
||||||
|
['tjdecodeyuv_27',['tjDecodeYUV',['../group___turbo_j_p_e_g.html#ga70abbf38f77a26fd6da8813bef96f695',1,'turbojpeg.h']]],
|
||||||
|
['tjdecodeyuvplanes_28',['tjDecodeYUVPlanes',['../group___turbo_j_p_e_g.html#ga10e837c07fa9d25770565b237d3898d9',1,'turbojpeg.h']]],
|
||||||
|
['tjdecompress2_29',['tjDecompress2',['../group___turbo_j_p_e_g.html#gae9eccef8b682a48f43a9117c231ed013',1,'turbojpeg.h']]],
|
||||||
|
['tjdecompressheader3_30',['tjDecompressHeader3',['../group___turbo_j_p_e_g.html#ga0595681096bba7199cc6f3533cb25f77',1,'turbojpeg.h']]],
|
||||||
|
['tjdecompresstoyuv2_31',['tjDecompressToYUV2',['../group___turbo_j_p_e_g.html#ga04d1e839ff9a0860dd1475cff78d3364',1,'turbojpeg.h']]],
|
||||||
|
['tjdecompresstoyuvplanes_32',['tjDecompressToYUVPlanes',['../group___turbo_j_p_e_g.html#gaa59f901a5258ada5bd0185ad59368540',1,'turbojpeg.h']]],
|
||||||
|
['tjdestroy_33',['tjDestroy',['../group___turbo_j_p_e_g.html#ga75f355fa27225ba1a4ee392c852394d2',1,'turbojpeg.h']]],
|
||||||
|
['tjencodeyuv3_34',['tjEncodeYUV3',['../group___turbo_j_p_e_g.html#gac519b922cdf446e97d0cdcba513636bf',1,'turbojpeg.h']]],
|
||||||
|
['tjencodeyuvplanes_35',['tjEncodeYUVPlanes',['../group___turbo_j_p_e_g.html#gae2d04c72457fe7f4d60cf78ab1b1feb1',1,'turbojpeg.h']]],
|
||||||
|
['tjerr_36',['TJERR',['../group___turbo_j_p_e_g.html#gafbc17cfa57d0d5d11fea35ac025950fe',1,'turbojpeg.h']]],
|
||||||
|
['tjerr_5ffatal_37',['TJERR_FATAL',['../group___turbo_j_p_e_g.html#ggafbc17cfa57d0d5d11fea35ac025950feafc9cceeada13122b09e4851e3788039a',1,'turbojpeg.h']]],
|
||||||
|
['tjerr_5fwarning_38',['TJERR_WARNING',['../group___turbo_j_p_e_g.html#ggafbc17cfa57d0d5d11fea35ac025950fea342dd6e2aedb47bb257b4e7568329b59',1,'turbojpeg.h']]],
|
||||||
|
['tjflag_5faccuratedct_39',['TJFLAG_ACCURATEDCT',['../group___turbo_j_p_e_g.html#gacb233cfd722d66d1ccbf48a7de81f0e0',1,'turbojpeg.h']]],
|
||||||
|
['tjflag_5fbottomup_40',['TJFLAG_BOTTOMUP',['../group___turbo_j_p_e_g.html#ga72ecf4ebe6eb702d3c6f5ca27455e1ec',1,'turbojpeg.h']]],
|
||||||
|
['tjflag_5ffastdct_41',['TJFLAG_FASTDCT',['../group___turbo_j_p_e_g.html#gaabce235db80d3f698b27f36cbd453da2',1,'turbojpeg.h']]],
|
||||||
|
['tjflag_5ffastupsample_42',['TJFLAG_FASTUPSAMPLE',['../group___turbo_j_p_e_g.html#ga4ee4506c81177a06f77e2504a22efd2d',1,'turbojpeg.h']]],
|
||||||
|
['tjflag_5flimitscans_43',['TJFLAG_LIMITSCANS',['../group___turbo_j_p_e_g.html#ga163e6482dc5096831feef9c79ff3f805',1,'turbojpeg.h']]],
|
||||||
|
['tjflag_5fnorealloc_44',['TJFLAG_NOREALLOC',['../group___turbo_j_p_e_g.html#ga8808d403c68b62aaa58a4c1e58e98963',1,'turbojpeg.h']]],
|
||||||
|
['tjflag_5fprogressive_45',['TJFLAG_PROGRESSIVE',['../group___turbo_j_p_e_g.html#ga43b426750b46190a25d34a67ef76df1b',1,'turbojpeg.h']]],
|
||||||
|
['tjflag_5fstoponwarning_46',['TJFLAG_STOPONWARNING',['../group___turbo_j_p_e_g.html#ga519cfa4ef6c18d9e5b455fdf59306a3a',1,'turbojpeg.h']]],
|
||||||
|
['tjfree_47',['tjFree',['../group___turbo_j_p_e_g.html#gaea863d2da0cdb609563aabdf9196514b',1,'turbojpeg.h']]],
|
||||||
|
['tjgeterrorcode_48',['tjGetErrorCode',['../group___turbo_j_p_e_g.html#ga414feeffbf860ebd31c745df203de410',1,'turbojpeg.h']]],
|
||||||
|
['tjgeterrorstr2_49',['tjGetErrorStr2',['../group___turbo_j_p_e_g.html#ga1ead8574f9f39fbafc6b497124e7aafa',1,'turbojpeg.h']]],
|
||||||
|
['tjgetscalingfactors_50',['tjGetScalingFactors',['../group___turbo_j_p_e_g.html#gac3854476006b10787bd128f7ede48057',1,'turbojpeg.h']]],
|
||||||
|
['tjgreenoffset_51',['tjGreenOffset',['../group___turbo_j_p_e_g.html#ga82d6e35da441112a411da41923c0ba2f',1,'turbojpeg.h']]],
|
||||||
|
['tjhandle_52',['tjhandle',['../group___turbo_j_p_e_g.html#ga758d2634ecb4949de7815cba621f5763',1,'turbojpeg.h']]],
|
||||||
|
['tjinitcompress_53',['tjInitCompress',['../group___turbo_j_p_e_g.html#ga9d63a05fc6d813f4aae06107041a37e8',1,'turbojpeg.h']]],
|
||||||
|
['tjinitdecompress_54',['tjInitDecompress',['../group___turbo_j_p_e_g.html#ga52300eac3f3d9ef4bab303bc244f62d3',1,'turbojpeg.h']]],
|
||||||
|
['tjinittransform_55',['tjInitTransform',['../group___turbo_j_p_e_g.html#ga928beff6ac248ceadf01089fc6b41957',1,'turbojpeg.h']]],
|
||||||
|
['tjloadimage_56',['tjLoadImage',['../group___turbo_j_p_e_g.html#gaffbd83c375e79f5db4b5c5d8ad4466e7',1,'turbojpeg.h']]],
|
||||||
|
['tjmcuheight_57',['tjMCUHeight',['../group___turbo_j_p_e_g.html#gabd247bb9fecb393eca57366feb8327bf',1,'turbojpeg.h']]],
|
||||||
|
['tjmcuwidth_58',['tjMCUWidth',['../group___turbo_j_p_e_g.html#ga9e61e7cd47a15a173283ba94e781308c',1,'turbojpeg.h']]],
|
||||||
|
['tjpad_59',['TJPAD',['../group___turbo_j_p_e_g.html#ga0aba955473315e405295d978f0c16511',1,'turbojpeg.h']]],
|
||||||
|
['tjpf_60',['TJPF',['../group___turbo_j_p_e_g.html#gac916144e26c3817ac514e64ae5d12e2a',1,'turbojpeg.h']]],
|
||||||
|
['tjpf_5fabgr_61',['TJPF_ABGR',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa1ba1a7f1631dbeaa49a0a85fc4a40081',1,'turbojpeg.h']]],
|
||||||
|
['tjpf_5fargb_62',['TJPF_ARGB',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aae8f846ed9d9de99b6e1dfe448848765c',1,'turbojpeg.h']]],
|
||||||
|
['tjpf_5fbgr_63',['TJPF_BGR',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aab10624437fb8ef495a0b153e65749839',1,'turbojpeg.h']]],
|
||||||
|
['tjpf_5fbgra_64',['TJPF_BGRA',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aac037ff1845cf9b74bb81a3659c2b9fb4',1,'turbojpeg.h']]],
|
||||||
|
['tjpf_5fbgrx_65',['TJPF_BGRX',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa2a1fbf569ca79897eae886e3376ca4c8',1,'turbojpeg.h']]],
|
||||||
|
['tjpf_5fcmyk_66',['TJPF_CMYK',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa7f5100ec44c91994e243f1cf55553f8b',1,'turbojpeg.h']]],
|
||||||
|
['tjpf_5fgray_67',['TJPF_GRAY',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa5431b54b015337705f13118073711a1a',1,'turbojpeg.h']]],
|
||||||
|
['tjpf_5frgb_68',['TJPF_RGB',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa7ce93230bff449518ce387c17e6ed37c',1,'turbojpeg.h']]],
|
||||||
|
['tjpf_5frgba_69',['TJPF_RGBA',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa88d2e88fab67f6503cf972e14851cc12',1,'turbojpeg.h']]],
|
||||||
|
['tjpf_5frgbx_70',['TJPF_RGBX',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa83973bebb7e2dc6fa8bae89ff3f42e01',1,'turbojpeg.h']]],
|
||||||
|
['tjpf_5funknown_71',['TJPF_UNKNOWN',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa84c1a6cead7952998e2fb895844a21ed',1,'turbojpeg.h']]],
|
||||||
|
['tjpf_5fxbgr_72',['TJPF_XBGR',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aaf6603b27147de47e212e75dac027b2af',1,'turbojpeg.h']]],
|
||||||
|
['tjpf_5fxrgb_73',['TJPF_XRGB',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aadae996905efcfa3b42a0bb3bea7f9d84',1,'turbojpeg.h']]],
|
||||||
|
['tjpixelsize_74',['tjPixelSize',['../group___turbo_j_p_e_g.html#gad77cf8fe5b2bfd3cb3f53098146abb4c',1,'turbojpeg.h']]],
|
||||||
|
['tjplaneheight_75',['tjPlaneHeight',['../group___turbo_j_p_e_g.html#ga1a209696c6a80748f20e134b3c64789f',1,'turbojpeg.h']]],
|
||||||
|
['tjplanesizeyuv_76',['tjPlaneSizeYUV',['../group___turbo_j_p_e_g.html#gab4ab7b24f6e797d79abaaa670373961d',1,'turbojpeg.h']]],
|
||||||
|
['tjplanewidth_77',['tjPlaneWidth',['../group___turbo_j_p_e_g.html#ga63fb66bb1e36c74008c4634360becbb1',1,'turbojpeg.h']]],
|
||||||
|
['tjredoffset_78',['tjRedOffset',['../group___turbo_j_p_e_g.html#gadd9b446742ac8a3923f7992c7988fea8',1,'turbojpeg.h']]],
|
||||||
|
['tjregion_79',['tjregion',['../structtjregion.html',1,'']]],
|
||||||
|
['tjsamp_80',['TJSAMP',['../group___turbo_j_p_e_g.html#ga1d047060ea80bb9820d540bb928e9074',1,'turbojpeg.h']]],
|
||||||
|
['tjsamp_5f411_81',['TJSAMP_411',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a28ec62575e5ea295c3fde3001dc628e2',1,'turbojpeg.h']]],
|
||||||
|
['tjsamp_5f420_82',['TJSAMP_420',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a63085dbf683cfe39e513cdb6343e3737',1,'turbojpeg.h']]],
|
||||||
|
['tjsamp_5f422_83',['TJSAMP_422',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a136130902cc578f11f32429b59368404',1,'turbojpeg.h']]],
|
||||||
|
['tjsamp_5f440_84',['TJSAMP_440',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074accf740e6f3aa6ba20ba922cad13cb974',1,'turbojpeg.h']]],
|
||||||
|
['tjsamp_5f444_85',['TJSAMP_444',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074afb8da4f44197837bdec0a4f593dacae3',1,'turbojpeg.h']]],
|
||||||
|
['tjsamp_5fgray_86',['TJSAMP_GRAY',['../group___turbo_j_p_e_g.html#gga1d047060ea80bb9820d540bb928e9074a3f1c9504842ddc7a48d0f690754b6248',1,'turbojpeg.h']]],
|
||||||
|
['tjsaveimage_87',['tjSaveImage',['../group___turbo_j_p_e_g.html#ga6f445b22d8933ae4815b3370a538d879',1,'turbojpeg.h']]],
|
||||||
|
['tjscaled_88',['TJSCALED',['../group___turbo_j_p_e_g.html#ga84878bb65404204743aa18cac02781df',1,'turbojpeg.h']]],
|
||||||
|
['tjscalingfactor_89',['tjscalingfactor',['../structtjscalingfactor.html',1,'']]],
|
||||||
|
['tjtransform_90',['tjtransform',['../structtjtransform.html',1,'tjtransform'],['../group___turbo_j_p_e_g.html#ga504805ec0161f1b505397ca0118bf8fd',1,'tjtransform(): turbojpeg.h'],['../group___turbo_j_p_e_g.html#ga9cb8abf4cc91881e04a0329b2270be25',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']]],
|
||||||
|
['tjxop_91',['TJXOP',['../group___turbo_j_p_e_g.html#ga2de531af4e7e6c4f124908376b354866',1,'turbojpeg.h']]],
|
||||||
|
['tjxop_5fhflip_92',['TJXOP_HFLIP',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866aa0df69776caa30f0fa28e26332d311ce',1,'turbojpeg.h']]],
|
||||||
|
['tjxop_5fnone_93',['TJXOP_NONE',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866aad88c0366cd3f7d0eac9d7a3fa1c2c27',1,'turbojpeg.h']]],
|
||||||
|
['tjxop_5frot180_94',['TJXOP_ROT180',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a140952eb8dd0300accfcc22726d69692',1,'turbojpeg.h']]],
|
||||||
|
['tjxop_5frot270_95',['TJXOP_ROT270',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a3064ee5dfb7f032df332818587567a08',1,'turbojpeg.h']]],
|
||||||
|
['tjxop_5frot90_96',['TJXOP_ROT90',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a43b2bbb23bc4bd548422d43fbe9af128',1,'turbojpeg.h']]],
|
||||||
|
['tjxop_5ftranspose_97',['TJXOP_TRANSPOSE',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a31060aed199f886afdd417f80499c32d',1,'turbojpeg.h']]],
|
||||||
|
['tjxop_5ftransverse_98',['TJXOP_TRANSVERSE',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866af3b14d488aea6ece9e5b3df73a74d6a4',1,'turbojpeg.h']]],
|
||||||
|
['tjxop_5fvflip_99',['TJXOP_VFLIP',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866a324eddfbec53b7e691f61e56929d0d5d',1,'turbojpeg.h']]],
|
||||||
|
['tjxopt_5fcopynone_100',['TJXOPT_COPYNONE',['../group___turbo_j_p_e_g.html#ga153b468cfb905d0de61706c838986fe8',1,'turbojpeg.h']]],
|
||||||
|
['tjxopt_5fcrop_101',['TJXOPT_CROP',['../group___turbo_j_p_e_g.html#ga9c771a757fc1294add611906b89ab2d2',1,'turbojpeg.h']]],
|
||||||
|
['tjxopt_5fgray_102',['TJXOPT_GRAY',['../group___turbo_j_p_e_g.html#ga3acee7b48ade1b99e5588736007c2589',1,'turbojpeg.h']]],
|
||||||
|
['tjxopt_5fnooutput_103',['TJXOPT_NOOUTPUT',['../group___turbo_j_p_e_g.html#gafbf992bbf6e006705886333703ffab31',1,'turbojpeg.h']]],
|
||||||
|
['tjxopt_5fperfect_104',['TJXOPT_PERFECT',['../group___turbo_j_p_e_g.html#ga50e03cb5ed115330e212417429600b00',1,'turbojpeg.h']]],
|
||||||
|
['tjxopt_5fprogressive_105',['TJXOPT_PROGRESSIVE',['../group___turbo_j_p_e_g.html#gad2371c80674584ecc1a7d75e564cf026',1,'turbojpeg.h']]],
|
||||||
|
['tjxopt_5ftrim_106',['TJXOPT_TRIM',['../group___turbo_j_p_e_g.html#ga319826b7eb1583c0595bbe7b95428709',1,'turbojpeg.h']]],
|
||||||
|
['turbojpeg_107',['TurboJPEG',['../group___turbo_j_p_e_g.html',1,'']]]
|
||||||
|
];
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['customfilter',['customFilter',['../structtjtransform.html#a43ee1bcdd2a8d7249a756774f78793c1',1,'tjtransform']]]
|
|
||||||
];
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['data',['data',['../structtjtransform.html#a688fe8f1a8ecc12a538d9e561cf338e3',1,'tjtransform']]],
|
|
||||||
['denom',['denom',['../structtjscalingfactor.html#aefbcdf3e9e62274b2d312c695f133ce3',1,'tjscalingfactor']]]
|
|
||||||
];
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['h',['h',['../structtjregion.html#aecefc45a26f4d8b60dd4d825c1710115',1,'tjregion']]]
|
|
||||||
];
|
|
||||||
@@ -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']]]
|
|
||||||
];
|
|
||||||
36
doc/html/search/all_7.html
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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.20"/>
|
||||||
|
<link rel="stylesheet" type="text/css" href="search.css"/>
|
||||||
|
<script type="text/javascript" src="all_7.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"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
|
createResults();
|
||||||
|
/* @license-end */
|
||||||
|
--></script>
|
||||||
|
<div class="SRStatus" id="Searching">Searching...</div>
|
||||||
|
<div class="SRStatus" id="NoMatches">No Matches</div>
|
||||||
|
<script type="text/javascript"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
|
document.getElementById("Loading").style.display="none";
|
||||||
|
document.getElementById("NoMatches").style.display="none";
|
||||||
|
var searchResults = new SearchResults("searchResults");
|
||||||
|
searchResults.Search();
|
||||||
|
window.addEventListener("message", function(event) {
|
||||||
|
if (event.data == "take_focus") {
|
||||||
|
var elem = searchResults.NavNext(0);
|
||||||
|
if (elem) elem.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/* @license-end */
|
||||||
|
--></script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
4
doc/html/search/all_7.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
var searchData=
|
||||||
|
[
|
||||||
|
['w_108',['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_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,102 +0,0 @@
|
|||||||
var searchData=
|
|
||||||
[
|
|
||||||
['tj_5fnumcs',['TJ_NUMCS',['../group___turbo_j_p_e_g.html#ga39f57a6fb02d9cf32e7b6890099b5a71',1,'turbojpeg.h']]],
|
|
||||||
['tj_5fnumerr',['TJ_NUMERR',['../group___turbo_j_p_e_g.html#ga79bde1b4a3e2351e00887e47781b966e',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#gaec627dd4c5f30b7a775a7aea3bec5d83',1,'turbojpeg.h']]],
|
|
||||||
['tjalphaoffset',['tjAlphaOffset',['../group___turbo_j_p_e_g.html#ga5af0ab065feefd526debf1e20c43e837',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#ga67ac12fee79073242cb216e07c9f1f90',1,'turbojpeg.h']]],
|
|
||||||
['tjbufsizeyuv2',['tjBufSizeYUV2',['../group___turbo_j_p_e_g.html#ga2be2b9969d4df9ecce9b05deed273194',1,'turbojpeg.h']]],
|
|
||||||
['tjcompress2',['tjCompress2',['../group___turbo_j_p_e_g.html#gafbdce0112fd78fd38efae841443a9bcf',1,'turbojpeg.h']]],
|
|
||||||
['tjcompressfromyuv',['tjCompressFromYUV',['../group___turbo_j_p_e_g.html#ga7622a459b79aa1007e005b58783f875b',1,'turbojpeg.h']]],
|
|
||||||
['tjcompressfromyuvplanes',['tjCompressFromYUVPlanes',['../group___turbo_j_p_e_g.html#ga29ec5dfbd2d84b8724e951d6fa0d5d9e',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#ga70abbf38f77a26fd6da8813bef96f695',1,'turbojpeg.h']]],
|
|
||||||
['tjdecodeyuvplanes',['tjDecodeYUVPlanes',['../group___turbo_j_p_e_g.html#ga10e837c07fa9d25770565b237d3898d9',1,'turbojpeg.h']]],
|
|
||||||
['tjdecompress2',['tjDecompress2',['../group___turbo_j_p_e_g.html#gae9eccef8b682a48f43a9117c231ed013',1,'turbojpeg.h']]],
|
|
||||||
['tjdecompressheader3',['tjDecompressHeader3',['../group___turbo_j_p_e_g.html#ga0595681096bba7199cc6f3533cb25f77',1,'turbojpeg.h']]],
|
|
||||||
['tjdecompresstoyuv2',['tjDecompressToYUV2',['../group___turbo_j_p_e_g.html#ga04d1e839ff9a0860dd1475cff78d3364',1,'turbojpeg.h']]],
|
|
||||||
['tjdecompresstoyuvplanes',['tjDecompressToYUVPlanes',['../group___turbo_j_p_e_g.html#gaa59f901a5258ada5bd0185ad59368540',1,'turbojpeg.h']]],
|
|
||||||
['tjdestroy',['tjDestroy',['../group___turbo_j_p_e_g.html#ga75f355fa27225ba1a4ee392c852394d2',1,'turbojpeg.h']]],
|
|
||||||
['tjencodeyuv3',['tjEncodeYUV3',['../group___turbo_j_p_e_g.html#gac519b922cdf446e97d0cdcba513636bf',1,'turbojpeg.h']]],
|
|
||||||
['tjencodeyuvplanes',['tjEncodeYUVPlanes',['../group___turbo_j_p_e_g.html#gae2d04c72457fe7f4d60cf78ab1b1feb1',1,'turbojpeg.h']]],
|
|
||||||
['tjerr',['TJERR',['../group___turbo_j_p_e_g.html#gafbc17cfa57d0d5d11fea35ac025950fe',1,'turbojpeg.h']]],
|
|
||||||
['tjerr_5ffatal',['TJERR_FATAL',['../group___turbo_j_p_e_g.html#ggafbc17cfa57d0d5d11fea35ac025950feafc9cceeada13122b09e4851e3788039a',1,'turbojpeg.h']]],
|
|
||||||
['tjerr_5fwarning',['TJERR_WARNING',['../group___turbo_j_p_e_g.html#ggafbc17cfa57d0d5d11fea35ac025950fea342dd6e2aedb47bb257b4e7568329b59',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']]],
|
|
||||||
['tjflag_5fprogressive',['TJFLAG_PROGRESSIVE',['../group___turbo_j_p_e_g.html#ga43b426750b46190a25d34a67ef76df1b',1,'turbojpeg.h']]],
|
|
||||||
['tjflag_5fstoponwarning',['TJFLAG_STOPONWARNING',['../group___turbo_j_p_e_g.html#ga519cfa4ef6c18d9e5b455fdf59306a3a',1,'turbojpeg.h']]],
|
|
||||||
['tjfree',['tjFree',['../group___turbo_j_p_e_g.html#gaea863d2da0cdb609563aabdf9196514b',1,'turbojpeg.h']]],
|
|
||||||
['tjgeterrorcode',['tjGetErrorCode',['../group___turbo_j_p_e_g.html#ga414feeffbf860ebd31c745df203de410',1,'turbojpeg.h']]],
|
|
||||||
['tjgeterrorstr2',['tjGetErrorStr2',['../group___turbo_j_p_e_g.html#ga1ead8574f9f39fbafc6b497124e7aafa',1,'turbojpeg.h']]],
|
|
||||||
['tjgetscalingfactors',['tjGetScalingFactors',['../group___turbo_j_p_e_g.html#gac3854476006b10787bd128f7ede48057',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#ga9d63a05fc6d813f4aae06107041a37e8',1,'turbojpeg.h']]],
|
|
||||||
['tjinitdecompress',['tjInitDecompress',['../group___turbo_j_p_e_g.html#ga52300eac3f3d9ef4bab303bc244f62d3',1,'turbojpeg.h']]],
|
|
||||||
['tjinittransform',['tjInitTransform',['../group___turbo_j_p_e_g.html#ga928beff6ac248ceadf01089fc6b41957',1,'turbojpeg.h']]],
|
|
||||||
['tjloadimage',['tjLoadImage',['../group___turbo_j_p_e_g.html#gaffbd83c375e79f5db4b5c5d8ad4466e7',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_5funknown',['TJPF_UNKNOWN',['../group___turbo_j_p_e_g.html#ggac916144e26c3817ac514e64ae5d12e2aa84c1a6cead7952998e2fb895844a21ed',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#gab4ab7b24f6e797d79abaaa670373961d',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']]],
|
|
||||||
['tjsaveimage',['tjSaveImage',['../group___turbo_j_p_e_g.html#ga6f445b22d8933ae4815b3370a538d879',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#gaa29f3189c41be12ec5dee7caec318a31',1,'tjtransform(): turbojpeg.h'],['../group___turbo_j_p_e_g.html#ga9cb8abf4cc91881e04a0329b2270be25',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']]],
|
|
||||||
['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_5fcopynone',['TJXOPT_COPYNONE',['../group___turbo_j_p_e_g.html#ga153b468cfb905d0de61706c838986fe8',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_5fprogressive',['TJXOPT_PROGRESSIVE',['../group___turbo_j_p_e_g.html#gad2371c80674584ecc1a7d75e564cf026',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']]]
|
|
||||||
];
|
|
||||||
36
doc/html/search/all_8.html
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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.20"/>
|
||||||
|
<link rel="stylesheet" type="text/css" href="search.css"/>
|
||||||
|
<script type="text/javascript" src="all_8.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"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
|
createResults();
|
||||||
|
/* @license-end */
|
||||||
|
--></script>
|
||||||
|
<div class="SRStatus" id="Searching">Searching...</div>
|
||||||
|
<div class="SRStatus" id="NoMatches">No Matches</div>
|
||||||
|
<script type="text/javascript"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
|
document.getElementById("Loading").style.display="none";
|
||||||
|
document.getElementById("NoMatches").style.display="none";
|
||||||
|
var searchResults = new SearchResults("searchResults");
|
||||||
|
searchResults.Search();
|
||||||
|
window.addEventListener("message", function(event) {
|
||||||
|
if (event.data == "take_focus") {
|
||||||
|
var elem = searchResults.NavNext(0);
|
||||||
|
if (elem) elem.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/* @license-end */
|
||||||
|
--></script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
4
doc/html/search/all_8.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
var searchData=
|
||||||
|
[
|
||||||
|
['x_109',['x',['../structtjregion.html#a4b6a37a93997091b26a75831fa291ad9',1,'tjregion']]]
|
||||||
|
];
|
||||||
36
doc/html/search/all_9.html
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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.20"/>
|
||||||
|
<link rel="stylesheet" type="text/css" href="search.css"/>
|
||||||
|
<script type="text/javascript" src="all_9.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"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
|
createResults();
|
||||||
|
/* @license-end */
|
||||||
|
--></script>
|
||||||
|
<div class="SRStatus" id="Searching">Searching...</div>
|
||||||
|
<div class="SRStatus" id="NoMatches">No Matches</div>
|
||||||
|
<script type="text/javascript"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
|
document.getElementById("Loading").style.display="none";
|
||||||
|
document.getElementById("NoMatches").style.display="none";
|
||||||
|
var searchResults = new SearchResults("searchResults");
|
||||||
|
searchResults.Search();
|
||||||
|
window.addEventListener("message", function(event) {
|
||||||
|
if (event.data == "take_focus") {
|
||||||
|
var elem = searchResults.NavNext(0);
|
||||||
|
if (elem) elem.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/* @license-end */
|
||||||
|
--></script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
4
doc/html/search/all_9.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
var searchData=
|
||||||
|
[
|
||||||
|
['y_110',['y',['../structtjregion.html#a7b3e0c24cfe87acc80e334cafdcf22c2',1,'tjregion']]]
|
||||||
|
];
|
||||||
36
doc/html/search/classes_0.html
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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.20"/>
|
||||||
|
<link rel="stylesheet" type="text/css" href="search.css"/>
|
||||||
|
<script type="text/javascript" src="classes_0.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"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
|
createResults();
|
||||||
|
/* @license-end */
|
||||||
|
--></script>
|
||||||
|
<div class="SRStatus" id="Searching">Searching...</div>
|
||||||
|
<div class="SRStatus" id="NoMatches">No Matches</div>
|
||||||
|
<script type="text/javascript"><!--
|
||||||
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||||||
|
document.getElementById("Loading").style.display="none";
|
||||||
|
document.getElementById("NoMatches").style.display="none";
|
||||||
|
var searchResults = new SearchResults("searchResults");
|
||||||
|
searchResults.Search();
|
||||||
|
window.addEventListener("message", function(event) {
|
||||||
|
if (event.data == "take_focus") {
|
||||||
|
var elem = searchResults.NavNext(0);
|
||||||
|
if (elem) elem.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/* @license-end */
|
||||||
|
--></script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
6
doc/html/search/classes_0.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
var searchData=
|
||||||
|
[
|
||||||
|
['tjregion_111',['tjregion',['../structtjregion.html',1,'']]],
|
||||||
|
['tjscalingfactor_112',['tjscalingfactor',['../structtjscalingfactor.html',1,'']]],
|
||||||
|
['tjtransform_113',['tjtransform',['../structtjtransform.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="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 |