Update bundled libs to current versions
- update README.bundled-libs.txt + some comments - update bundled jpeg lib from version 9c to 9d All bundled libs are now up-to-date. For current update status please see README.bundled-libs.txt.
This commit is contained in:
parent
5bd467fa17
commit
52e16fb1be
@ -1,44 +1,41 @@
|
|||||||
README.bundled-libs.txt - Developer information for bundled libraries
|
README.bundled-libs.txt - Developer information for bundled libraries
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
******************************************************
|
|
||||||
*** NOTICE *** This file is still work in progress ***
|
|
||||||
******************************************************
|
|
||||||
|
|
||||||
This file is mainly intended for FLTK developers and contains information
|
This file is mainly intended for FLTK developers and contains information
|
||||||
about the current versions of all bundled libraries and about how to
|
about the current versions of all bundled libraries and about how to
|
||||||
upgrade these bundled libraries.
|
upgrade these bundled libraries.
|
||||||
|
|
||||||
|
|
||||||
Current versions of bundled libraries:
|
Current versions of bundled libraries (as of Feb 25, 2021):
|
||||||
|
|
||||||
** work in progress -- not yet completely upgraded **
|
|
||||||
|
|
||||||
Library Version Release date FLTK Version
|
Library Version Release date FLTK Version
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
jpeg jpeg-9c 2018-01-14 1.4.0
|
jpeg jpeg-9d 2020-01-12 1.4.0
|
||||||
nanosvg a1eea27b3d [1] 2021-02-21 1.4.0
|
nanosvg a1eea27b3d [1] 2021-02-21 1.4.0
|
||||||
png libpng-1.6.37 2019-04-14 1.4.0
|
png libpng-1.6.37 2019-04-14 1.4.0
|
||||||
zlib zlib-1.2.11 2017-01-15 1.4.0
|
zlib zlib-1.2.11 2017-01-15 1.4.0
|
||||||
|
--------------------------------------------------------------------------
|
||||||
|
|
||||||
Previous versions of bundled libraries:
|
Previous versions of bundled libraries:
|
||||||
|
|
||||||
Library Version Release date FLTK Version
|
Library Version Release date FLTK Version
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
nanosvg f31098fa85 [1] 2019-05-23 1.4.x
|
jpeg jpeg-9d 2020-01-12 1.3.6
|
||||||
jpeg jpeg-9a 2014-01-19 1.3.5
|
png libpng-1.6.37 2019-04-14 1.3.6
|
||||||
png libpng-1.6.16 2014-12-22 1.3.5
|
zlib zlib-1.2.11 2017-01-15 1.3.6
|
||||||
zlib zlib-1.2.8 2013-04-28 1.3.5
|
--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
[1] Git commit in: https://github.com/fltk/nanosvg
|
[1] Git commit in: https://github.com/fltk/nanosvg
|
||||||
See also git tag 'fltk_yyyy-mm-dd' where yyyy-mm-dd == "Release date"
|
See also git tag 'fltk_yyyy-mm-dd' where yyyy-mm-dd == "Release date"
|
||||||
and file nanosvg/README.txt.
|
and file nanosvg/README.txt.
|
||||||
|
|
||||||
|
|
||||||
General information:
|
General information:
|
||||||
|
|
||||||
FLTK does not include the entire library distributions. We only provide
|
FLTK does not include the entire library distributions. We only provide the
|
||||||
the source files necessary to build the library itself. There are no
|
source files necessary to build the FLTK library and some README and/or
|
||||||
test programs or other contributed files.
|
CHANGELOG files. There are no test programs or other contributed files.
|
||||||
|
|
||||||
We use our own build files, hence a few files MUST NOT be upgraded when
|
We use our own build files, hence a few files MUST NOT be upgraded when
|
||||||
the library source files are upgraded. We strive to keep changes to the
|
the library source files are upgraded. We strive to keep changes to the
|
||||||
@ -46,11 +43,11 @@ General information:
|
|||||||
work with FLTK should be a rare exception.
|
work with FLTK should be a rare exception.
|
||||||
|
|
||||||
If patches are necessary all changes in the library files should be
|
If patches are necessary all changes in the library files should be
|
||||||
marked with "FLTK" in a comment so a developer that upgrades the library
|
marked with "FLTK" in a comment so a developer who upgrades the library
|
||||||
later is aware of changes in the source code for FLTK. Additional comments
|
later is aware of changes in the source code for FLTK. Additional comments
|
||||||
should be added to show the rationale, i.e. why a particular change was
|
should be added to show the rationale, i.e. why a particular change was
|
||||||
necessary. If applicable, add a reference to a Software Trouble Report
|
necessary. If applicable, add a reference to a Software Trouble Report,
|
||||||
like "STR 3456", "Issue #123", or "PR #234".
|
GitHub Issue or PR like "STR 3456", "Issue #123", or "PR #234".
|
||||||
|
|
||||||
|
|
||||||
How to update the bundled libraries:
|
How to update the bundled libraries:
|
||||||
@ -62,8 +59,8 @@ How to update the bundled libraries:
|
|||||||
|
|
||||||
Some config header files may be pre-generated in the FLTK sources. These
|
Some config header files may be pre-generated in the FLTK sources. These
|
||||||
header files should be left untouched, but it may be necessary to update
|
header files should be left untouched, but it may be necessary to update
|
||||||
them if new items were added to the new library version. In this case
|
these files if new items were added to the new library version. In this
|
||||||
the new header should be pre-generated on a Linux system with default
|
case the new header should be pre-generated on a Linux system with default
|
||||||
options unless otherwise mentioned below for a specific library.
|
options unless otherwise mentioned below for a specific library.
|
||||||
Currently there are no known exceptions.
|
Currently there are no known exceptions.
|
||||||
|
|
||||||
@ -113,7 +110,7 @@ Upgrade notes for specific libraries:
|
|||||||
|
|
||||||
zlib:
|
zlib:
|
||||||
|
|
||||||
Website: http://zlib.net/
|
Website: https://zlib.net/
|
||||||
Download: See website and follow links.
|
Download: See website and follow links.
|
||||||
Repository: git clone https://github.com/madler/zlib.git
|
Repository: git clone https://github.com/madler/zlib.git
|
||||||
|
|
||||||
@ -159,7 +156,7 @@ png:
|
|||||||
|
|
||||||
jpeg:
|
jpeg:
|
||||||
|
|
||||||
Website: http://ijg.org/
|
Website: https://ijg.org/
|
||||||
Download: See website and follow links.
|
Download: See website and follow links.
|
||||||
Repository: <unknown>
|
Repository: <unknown>
|
||||||
|
|
||||||
@ -182,11 +179,11 @@ nanosvg:
|
|||||||
Website: https://github.com/memononen/nanosvg
|
Website: https://github.com/memononen/nanosvg
|
||||||
Download: See website and follow links.
|
Download: See website and follow links.
|
||||||
Repository: git clone https://github.com/memononen/nanosvg.git
|
Repository: git clone https://github.com/memononen/nanosvg.git
|
||||||
FLTK Clone: git clone https://github.com/fltk/nanosvg.git
|
FLTK Fork: git clone https://github.com/fltk/nanosvg.git
|
||||||
|
|
||||||
FLTK has its own GitHub clone of the original repository (see above).
|
FLTK has its own GitHub fork of the original repository (see above).
|
||||||
|
|
||||||
The intention is to update this clone from time to time so the FLTK
|
The intention is to update this fork from time to time so the FLTK
|
||||||
specific patches are up-to-date with the original library. Hopefully
|
specific patches are up-to-date with the original library. Hopefully
|
||||||
the FLTK patches will be accepted upstream at some time in the future
|
the FLTK patches will be accepted upstream at some time in the future
|
||||||
so we no longer need our own patches.
|
so we no longer need our own patches.
|
||||||
@ -195,7 +192,7 @@ nanosvg:
|
|||||||
Update (Feb 22, 2021): The upstream library is officially no longer
|
Update (Feb 22, 2021): The upstream library is officially no longer
|
||||||
maintained (see README.md) although updates appear from time to time.
|
maintained (see README.md) although updates appear from time to time.
|
||||||
|
|
||||||
Use this clone (branch 'fltk') to get the nanosvg library with FLTK
|
Use this fork (branch 'fltk') to get the nanosvg library with FLTK
|
||||||
specific patches:
|
specific patches:
|
||||||
|
|
||||||
$ git clone https://github.com/fltk/nanosvg.git nanosvg-fltk
|
$ git clone https://github.com/fltk/nanosvg.git nanosvg-fltk
|
||||||
@ -209,5 +206,5 @@ nanosvg:
|
|||||||
|
|
||||||
The following files need special handling:
|
The following files need special handling:
|
||||||
|
|
||||||
nanosvg.h: Merge or download from FLTK's clone (see above).
|
nanosvg.h: Merge or download from FLTK's fork (see above).
|
||||||
nanosvgrast.h: Merge or download from FLTK's clone (see above).
|
nanosvgrast.h: Merge or download from FLTK's fork (see above).
|
||||||
|
19
jpeg/README
19
jpeg/README
@ -1,7 +1,7 @@
|
|||||||
The Independent JPEG Group's JPEG software
|
The Independent JPEG Group's JPEG software
|
||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
README for release 9c of 14-Jan-2018
|
README for release 9d of 12-Jan-2020
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
This distribution contains the ninth public release of the Independent JPEG
|
This distribution contains the ninth public release of the Independent JPEG
|
||||||
@ -10,8 +10,8 @@ to use it for any purpose, subject to the conditions under LEGAL ISSUES, below.
|
|||||||
|
|
||||||
This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone,
|
This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone,
|
||||||
Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson,
|
Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson,
|
||||||
Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers,
|
John Korejwa, Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi,
|
||||||
and other members of the Independent JPEG Group.
|
Ge' Weijers, and other members of the Independent JPEG Group.
|
||||||
|
|
||||||
IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee
|
IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee
|
||||||
(previously known as JPEG, together with ITU-T SG16).
|
(previously known as JPEG, together with ITU-T SG16).
|
||||||
@ -115,7 +115,7 @@ with respect to this software, its quality, accuracy, merchantability, or
|
|||||||
fitness for a particular purpose. This software is provided "AS IS", and you,
|
fitness for a particular purpose. This software is provided "AS IS", and you,
|
||||||
its user, assume the entire risk as to its quality and accuracy.
|
its user, assume the entire risk as to its quality and accuracy.
|
||||||
|
|
||||||
This software is copyright (C) 1991-2018, 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
|
||||||
@ -152,13 +152,6 @@ The same holds for its supporting scripts (config.guess, config.sub,
|
|||||||
ltmain.sh). Another support script, install-sh, is copyright by X Consortium
|
ltmain.sh). Another support script, install-sh, is copyright by X Consortium
|
||||||
but is also freely distributable.
|
but is also freely distributable.
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
REFERENCES
|
REFERENCES
|
||||||
==========
|
==========
|
||||||
@ -246,8 +239,8 @@ ARCHIVE LOCATIONS
|
|||||||
The "official" archive site for this software is www.ijg.org.
|
The "official" archive site for this software is www.ijg.org.
|
||||||
The most recent released version can always be found there in
|
The most recent released version can always be found there in
|
||||||
directory "files". This particular version will be archived as
|
directory "files". This particular version will be archived as
|
||||||
http://www.ijg.org/files/jpegsrc.v9c.tar.gz, and in Windows-compatible
|
http://www.ijg.org/files/jpegsrc.v9d.tar.gz, and in Windows-compatible
|
||||||
"zip" archive format as http://www.ijg.org/files/jpegsr9c.zip.
|
"zip" archive format as http://www.ijg.org/files/jpegsr9d.zip.
|
||||||
|
|
||||||
The JPEG FAQ (Frequently Asked Questions) article is a source of some
|
The JPEG FAQ (Frequently Asked Questions) article is a source of some
|
||||||
general information about JPEG.
|
general information about JPEG.
|
||||||
|
@ -1,6 +1,55 @@
|
|||||||
CHANGE LOG for Independent JPEG Group's JPEG software
|
CHANGE LOG for Independent JPEG Group's JPEG software
|
||||||
|
|
||||||
|
|
||||||
|
Version 9d 12-Jan-2020
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Optimize the optimal Huffman code table generation to produce
|
||||||
|
slightly smaller files. Thank to John Korejwa for suggestion.
|
||||||
|
Note: Requires rebuild of testimgp.jpg.
|
||||||
|
|
||||||
|
Decoding Huffman: Use default tables if tables are not defined.
|
||||||
|
Thank to Simone Azzalin for report (Motion JPEG),
|
||||||
|
and to Martin Strunz for hint.
|
||||||
|
|
||||||
|
Add sanity check in optimal Huffman code table generation.
|
||||||
|
Thank to Adam Farley for suggestion.
|
||||||
|
|
||||||
|
rdtarga.c: use read_byte(), with EOF check, instead of getc()
|
||||||
|
in read_*_pixel().
|
||||||
|
Thank to Chijin Zhou for cjpeg potential vulnerability report.
|
||||||
|
|
||||||
|
jmemnobs.c: respect the max_memory_to_use setting in
|
||||||
|
jpeg_mem_available() computation. Thank to Sheng Shu and
|
||||||
|
Dongdong She for djpeg potential vulnerability report.
|
||||||
|
|
||||||
|
jdarith.c, jdhuff.c: avoid left shift of negative value
|
||||||
|
compiler warning in decode_mcu_AC_refine().
|
||||||
|
Thank to Indu Bhagat for suggestion.
|
||||||
|
|
||||||
|
Add x64 (64-bit) platform support, avoid compiler warnings.
|
||||||
|
Thank to Jonathan Potter, Feiyun Wang, and Sheng Shu for suggestion.
|
||||||
|
|
||||||
|
Adjust libjpeg version specification for pkg-config file.
|
||||||
|
Thank to Chen Chen for suggestion.
|
||||||
|
|
||||||
|
Restore GIF read and write support from libjpeg version 6a.
|
||||||
|
Thank to Wolfgang Werner (W.W.) Heinz for suggestion.
|
||||||
|
|
||||||
|
Improve consistency in raw (downsampled) image data processing mode.
|
||||||
|
Thank to Zhongyuan Zhou for hint.
|
||||||
|
|
||||||
|
Avoid out of bounds array read (AC derived table pointers)
|
||||||
|
in start pass in jdhuff.c. Thank to Peng Li for report.
|
||||||
|
|
||||||
|
Improve code sanity (jdhuff.c).
|
||||||
|
Thank to Reza Mirzazade farkhani for reports.
|
||||||
|
|
||||||
|
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
|
Version 9c 14-Jan-2018
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
IJG JPEG LIBRARY: FILE LIST
|
IJG JPEG LIBRARY: FILE LIST
|
||||||
|
|
||||||
Copyright (C) 1994-2017, Thomas G. Lane, Guido Vollbeding.
|
Copyright (C) 1994-2019, Thomas G. Lane, Guido Vollbeding.
|
||||||
This file is part of the Independent JPEG Group's software.
|
This file is part of the Independent JPEG Group's software.
|
||||||
For conditions of distribution and use, see the accompanying README file.
|
For conditions of distribution and use, see the accompanying README file.
|
||||||
|
|
||||||
@ -151,7 +151,7 @@ transupp.c Support code for jpegtran: lossless image manipulations.
|
|||||||
Image file reader modules for cjpeg:
|
Image file reader modules for cjpeg:
|
||||||
|
|
||||||
rdbmp.c BMP file input.
|
rdbmp.c BMP file input.
|
||||||
rdgif.c GIF file input (now just a stub).
|
rdgif.c GIF file input.
|
||||||
rdppm.c PPM/PGM file input.
|
rdppm.c PPM/PGM file input.
|
||||||
rdrle.c Utah RLE file input.
|
rdrle.c Utah RLE file input.
|
||||||
rdtarga.c Targa file input.
|
rdtarga.c Targa file input.
|
||||||
@ -159,7 +159,7 @@ rdtarga.c Targa file input.
|
|||||||
Image file writer modules for djpeg:
|
Image file writer modules for djpeg:
|
||||||
|
|
||||||
wrbmp.c BMP file output.
|
wrbmp.c BMP file output.
|
||||||
wrgif.c GIF file output (a mere shadow of its former self).
|
wrgif.c GIF file output.
|
||||||
wrppm.c PPM/PGM file output.
|
wrppm.c PPM/PGM file output.
|
||||||
wrrle.c Utah RLE file output.
|
wrrle.c Utah RLE file output.
|
||||||
wrtarga.c Targa file output.
|
wrtarga.c Targa file output.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
INSTALLATION INSTRUCTIONS for the Independent JPEG Group's JPEG software
|
INSTALLATION INSTRUCTIONS for the Independent JPEG Group's JPEG software
|
||||||
|
|
||||||
Copyright (C) 1991-2017, Thomas G. Lane, Guido Vollbeding.
|
Copyright (C) 1991-2019, Thomas G. Lane, Guido Vollbeding.
|
||||||
This file is part of the Independent JPEG Group's software.
|
This file is part of the Independent JPEG Group's software.
|
||||||
For conditions of distribution and use, see the accompanying README file.
|
For conditions of distribution and use, see the accompanying README file.
|
||||||
|
|
||||||
@ -150,8 +150,8 @@ makefile.wat jconfig.wat MS-DOS, OS/2, or Windows NT, Watcom C
|
|||||||
makefile.vc jconfig.vc Windows, MS Visual C++
|
makefile.vc jconfig.vc Windows, MS Visual C++
|
||||||
makefile.vs jconfig.vc Windows, MS Visual C++ 6 Developer Studio
|
makefile.vs jconfig.vc Windows, MS Visual C++ 6 Developer Studio
|
||||||
make*.vc6
|
make*.vc6
|
||||||
makefile.vs jconfig.vc Windows, Visual Studio 2017 (v15)
|
makefile.vs jconfig.vc Windows, Visual Studio 2019 (v16)
|
||||||
make*.v15
|
make*.v16
|
||||||
makefile.b32 jconfig.vc Windows, Borland C++ 32-bit (bcc32)
|
makefile.b32 jconfig.vc Windows, Borland C++ 32-bit (bcc32)
|
||||||
makefile.mms jconfig.vms Digital VMS, with MMS software
|
makefile.mms jconfig.vms Digital VMS, with MMS software
|
||||||
makefile.vms jconfig.vms Digital VMS, without MMS software
|
makefile.vms jconfig.vms Digital VMS, without MMS software
|
||||||
@ -1029,48 +1029,66 @@ library, we recommend building the applications so that you can run the
|
|||||||
self-test.)
|
self-test.)
|
||||||
|
|
||||||
To use:
|
To use:
|
||||||
1. Open the command prompt, change to the main directory and execute the
|
1. Open the command prompt, change to the source directory and execute
|
||||||
command line
|
the command line
|
||||||
NMAKE /f makefile.vs setup-vc6
|
NMAKE /f makefile.vs setup-vc6
|
||||||
|
If you get an error message saying that the "NMAKE" command could
|
||||||
|
not be found, execute the command
|
||||||
|
"%ProgramFiles%\Microsoft Visual Studio\VC98\Bin\VCVARS32"
|
||||||
|
to set the environment for using Microsoft Visual C++ tools,
|
||||||
|
and repeat the NMAKE call.
|
||||||
This will move jconfig.vc to jconfig.h and makefiles to project files.
|
This will move jconfig.vc to jconfig.h and makefiles to project files.
|
||||||
(Note that the renaming is critical!)
|
(Note that the renaming is critical!)
|
||||||
|
Alternatively you can use
|
||||||
|
NMAKE /f makefile.vs setupcopy-vc6
|
||||||
|
This will create renamed copies of the files, which allows to repeat
|
||||||
|
the setup later.
|
||||||
2. Open the workspace file jpeg.dsw, build the library project.
|
2. Open the workspace file jpeg.dsw, build the library project.
|
||||||
(If you are using Developer Studio more recent than 6.0, you'll
|
(If you are using Developer Studio more recent than 6.0, you'll
|
||||||
probably get a message saying that the project files are being updated.)
|
probably get a message saying that the project files are being updated.)
|
||||||
3. Open the workspace file apps.dsw, build the application projects.
|
3. Open the workspace file apps.dsw, build the application projects.
|
||||||
4. To perform the self-test, execute the command line
|
4. To perform the self-test, execute the command line
|
||||||
NMAKE /f makefile.vs test-build
|
NMAKE /f makefile.vs test-build
|
||||||
5. Move the application .exe files from `app`\Release to an
|
5. Move the application .exe files from the Release folder to an
|
||||||
appropriate location on your path.
|
appropriate location on your path.
|
||||||
|
|
||||||
|
|
||||||
Microsoft Windows, Visual Studio 2017 (v15):
|
Microsoft Windows, Visual Studio 2019 (v16):
|
||||||
|
|
||||||
We include makefiles that should work as project files in Visual Studio
|
We include makefiles that should work as project files in Visual Studio
|
||||||
2017 (v15) or later. There is a library makefile that builds the IJG
|
2019 (v16) or later. There is a library makefile that builds the IJG
|
||||||
library as a static Win32 library, and application makefiles that build
|
library as a static Win32/x64 library, and application makefiles that
|
||||||
the sample applications as Win32 console applications. (Even if you only
|
build the sample applications as Win32/x64 console applications. (Even
|
||||||
want the library, we recommend building the applications so that you can
|
if you only want the library, we recommend building the applications so
|
||||||
run the self-test.)
|
that you can run the self-test.)
|
||||||
|
|
||||||
To use:
|
To use:
|
||||||
1. Open the Developer Command Prompt, change to the main directory and
|
1. Open the Developer Command Prompt for VS 2019, change to the source
|
||||||
execute the command line
|
directory and execute the command line
|
||||||
NMAKE /f makefile.vs setup-v15
|
NMAKE /f makefile.vs setup-v16
|
||||||
This will move jconfig.vc to jconfig.h and makefiles to project files.
|
This will move jconfig.vc to jconfig.h and makefiles to project files.
|
||||||
(Note that the renaming is critical!)
|
(Note that the renaming is critical!)
|
||||||
|
Alternatively you can use
|
||||||
|
NMAKE /f makefile.vs setupcopy-v16
|
||||||
|
This will create renamed copies of the files, which allows to repeat
|
||||||
|
the setup later.
|
||||||
2. Open the solution file jpeg.sln, build the library project.
|
2. Open the solution file jpeg.sln, build the library project.
|
||||||
a) If you are using Visual Studio more recent than
|
a) If you are using Visual Studio more recent than
|
||||||
2017 (v15), you'll probably get a message saying
|
2019 (v16), you'll probably get a message saying
|
||||||
that the project files are being updated.
|
that the project files are being updated.
|
||||||
b) If necessary, open the project properties and
|
b) If necessary, open the project properties and
|
||||||
adapt the Windows Target Platform Version in
|
adapt the Windows Target Platform Version in
|
||||||
the Configuration Properties, General section;
|
the Configuration Properties, General section;
|
||||||
we support the latest version at the time of release.
|
we support the latest version at the time of release.
|
||||||
|
c) If you want to build x64 code, change the platform setting from
|
||||||
|
Win32 to x64. You can build Win32 and x64 versions side by side.
|
||||||
3. Open the solution file apps.sln, build the application projects.
|
3. Open the solution file apps.sln, build the application projects.
|
||||||
4. To perform the self-test, execute the command line
|
4. To perform the self-test, execute the command line
|
||||||
NMAKE /f makefile.vs test-build
|
NMAKE /f makefile.vs test-32
|
||||||
5. Move the application .exe files from `app`\Release to an
|
for the Win32 build, or on a 64-bit system
|
||||||
|
NMAKE /f makefile.vs test-64
|
||||||
|
for the x64 build.
|
||||||
|
5. Move the application .exe files from the Release folder to an
|
||||||
appropriate location on your path.
|
appropriate location on your path.
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* jcarith.c
|
* jcarith.c
|
||||||
*
|
*
|
||||||
* Developed 1997-2013 by Guido Vollbeding.
|
* Developed 1997-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -181,11 +181,11 @@ finish_pass (j_compress_ptr cinfo)
|
|||||||
if (e->zc) /* output final pending zero bytes */
|
if (e->zc) /* output final pending zero bytes */
|
||||||
do emit_byte(0x00, cinfo);
|
do emit_byte(0x00, cinfo);
|
||||||
while (--e->zc);
|
while (--e->zc);
|
||||||
emit_byte((e->c >> 19) & 0xFF, cinfo);
|
emit_byte((int) ((e->c >> 19) & 0xFF), cinfo);
|
||||||
if (((e->c >> 19) & 0xFF) == 0xFF)
|
if (((e->c >> 19) & 0xFF) == 0xFF)
|
||||||
emit_byte(0x00, cinfo);
|
emit_byte(0x00, cinfo);
|
||||||
if (e->c & 0x7F800L) {
|
if (e->c & 0x7F800L) {
|
||||||
emit_byte((e->c >> 11) & 0xFF, cinfo);
|
emit_byte((int) ((e->c >> 11) & 0xFF), cinfo);
|
||||||
if (((e->c >> 11) & 0xFF) == 0xFF)
|
if (((e->c >> 11) & 0xFF) == 0xFF)
|
||||||
emit_byte(0x00, cinfo);
|
emit_byte(0x00, cinfo);
|
||||||
}
|
}
|
||||||
@ -280,7 +280,8 @@ arith_encode (j_compress_ptr cinfo, unsigned char *st, int val)
|
|||||||
/* Note: The 3 spacer bits in the C register guarantee
|
/* Note: The 3 spacer bits in the C register guarantee
|
||||||
* that the new buffer byte can't be 0xFF here
|
* that the new buffer byte can't be 0xFF here
|
||||||
* (see page 160 in the P&M JPEG book). */
|
* (see page 160 in the P&M JPEG book). */
|
||||||
e->buffer = temp & 0xFF; /* new output byte, might overflow later */
|
/* New output byte, might overflow later */
|
||||||
|
e->buffer = (int) (temp & 0xFF);
|
||||||
} else if (temp == 0xFF) {
|
} else if (temp == 0xFF) {
|
||||||
++e->sc; /* stack 0xFF byte (which might overflow later) */
|
++e->sc; /* stack 0xFF byte (which might overflow later) */
|
||||||
} else {
|
} else {
|
||||||
@ -302,7 +303,8 @@ arith_encode (j_compress_ptr cinfo, unsigned char *st, int val)
|
|||||||
emit_byte(0x00, cinfo);
|
emit_byte(0x00, cinfo);
|
||||||
} while (--e->sc);
|
} while (--e->sc);
|
||||||
}
|
}
|
||||||
e->buffer = temp & 0xFF; /* new output byte (can still overflow) */
|
/* New output byte (can still overflow) */
|
||||||
|
e->buffer = (int) (temp & 0xFF);
|
||||||
}
|
}
|
||||||
e->c &= 0x7FFFFL;
|
e->c &= 0x7FFFFL;
|
||||||
e->ct += 8;
|
e->ct += 8;
|
||||||
@ -926,9 +928,8 @@ jinit_arith_encoder (j_compress_ptr cinfo)
|
|||||||
arith_entropy_ptr entropy;
|
arith_entropy_ptr entropy;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
entropy = (arith_entropy_ptr)
|
entropy = (arith_entropy_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(arith_entropy_encoder));
|
||||||
SIZEOF(arith_entropy_encoder));
|
|
||||||
cinfo->entropy = &entropy->pub;
|
cinfo->entropy = &entropy->pub;
|
||||||
entropy->pub.start_pass = start_pass;
|
entropy->pub.start_pass = start_pass;
|
||||||
entropy->pub.finish_pass = finish_pass;
|
entropy->pub.finish_pass = finish_pass;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* jccolor.c
|
* jccolor.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1996, Thomas G. Lane.
|
* Copyright (C) 1991-1996, Thomas G. Lane.
|
||||||
* Modified 2011-2013 by Guido Vollbeding.
|
* Modified 2011-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -105,14 +105,14 @@ rgb_ycc_start (j_compress_ptr cinfo)
|
|||||||
/* Allocate and fill in the conversion tables. */
|
/* Allocate and fill in the conversion tables. */
|
||||||
cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)
|
cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
(TABLE_SIZE * SIZEOF(INT32)));
|
TABLE_SIZE * SIZEOF(INT32));
|
||||||
|
|
||||||
for (i = 0; i <= MAXJSAMPLE; i++) {
|
for (i = 0; i <= MAXJSAMPLE; i++) {
|
||||||
rgb_ycc_tab[i+R_Y_OFF] = FIX(0.299) * i;
|
rgb_ycc_tab[i+R_Y_OFF] = FIX(0.299) * i;
|
||||||
rgb_ycc_tab[i+G_Y_OFF] = FIX(0.587) * i;
|
rgb_ycc_tab[i+G_Y_OFF] = FIX(0.587) * i;
|
||||||
rgb_ycc_tab[i+B_Y_OFF] = FIX(0.114) * i + ONE_HALF;
|
rgb_ycc_tab[i+B_Y_OFF] = FIX(0.114) * i + ONE_HALF;
|
||||||
rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.168735892)) * i;
|
rgb_ycc_tab[i+R_CB_OFF] = (- FIX(0.168735892)) * i;
|
||||||
rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.331264108)) * i;
|
rgb_ycc_tab[i+G_CB_OFF] = (- FIX(0.331264108)) * i;
|
||||||
/* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
|
/* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
|
||||||
* This ensures that the maximum output will round to MAXJSAMPLE
|
* This ensures that the maximum output will round to MAXJSAMPLE
|
||||||
* not MAXJSAMPLE+1, and thus that we don't have to range-limit.
|
* not MAXJSAMPLE+1, and thus that we don't have to range-limit.
|
||||||
@ -121,8 +121,8 @@ rgb_ycc_start (j_compress_ptr cinfo)
|
|||||||
/* B=>Cb and R=>Cr tables are the same
|
/* B=>Cb and R=>Cr tables are the same
|
||||||
rgb_ycc_tab[i+R_CR_OFF] = FIX(0.5) * i + CBCR_OFFSET + ONE_HALF-1;
|
rgb_ycc_tab[i+R_CR_OFF] = FIX(0.5) * i + CBCR_OFFSET + ONE_HALF-1;
|
||||||
*/
|
*/
|
||||||
rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.418687589)) * i;
|
rgb_ycc_tab[i+G_CR_OFF] = (- FIX(0.418687589)) * i;
|
||||||
rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.081312411)) * i;
|
rgb_ycc_tab[i+B_CR_OFF] = (- FIX(0.081312411)) * i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,12 +131,12 @@ rgb_ycc_start (j_compress_ptr cinfo)
|
|||||||
* Convert some rows of samples to the JPEG colorspace.
|
* Convert some rows of samples to the JPEG colorspace.
|
||||||
*
|
*
|
||||||
* Note that we change from the application's interleaved-pixel format
|
* Note that we change from the application's interleaved-pixel format
|
||||||
* to our internal noninterleaved, one-plane-per-component format.
|
* to our internal noninterleaved, one-plane-per-component format. The
|
||||||
* The input buffer is therefore three times as wide as the output buffer.
|
* input buffer is therefore three times as wide as the output buffer.
|
||||||
*
|
*
|
||||||
* A starting row offset is provided only for the output buffer. The caller
|
* A starting row offset is provided only for the output buffer. The
|
||||||
* can easily adjust the passed input_buf value to accommodate any row
|
* caller can easily adjust the passed input_buf value to accommodate
|
||||||
* offset required on that side.
|
* any row offset required on that side.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
@ -145,8 +145,8 @@ rgb_ycc_convert (j_compress_ptr cinfo,
|
|||||||
JDIMENSION output_row, int num_rows)
|
JDIMENSION output_row, int num_rows)
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
|
||||||
register int r, g, b;
|
register int r, g, b;
|
||||||
|
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JSAMPROW outptr0, outptr1, outptr2;
|
register JSAMPROW outptr0, outptr1, outptr2;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
@ -162,6 +162,7 @@ rgb_ycc_convert (j_compress_ptr cinfo,
|
|||||||
r = GETJSAMPLE(inptr[RGB_RED]);
|
r = GETJSAMPLE(inptr[RGB_RED]);
|
||||||
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
||||||
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
||||||
|
inptr += RGB_PIXELSIZE;
|
||||||
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
|
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
|
||||||
* must be too; we do not need an explicit range-limiting operation.
|
* must be too; we do not need an explicit range-limiting operation.
|
||||||
* Hence the value being shifted is never negative, and we don't
|
* Hence the value being shifted is never negative, and we don't
|
||||||
@ -179,7 +180,6 @@ rgb_ycc_convert (j_compress_ptr cinfo,
|
|||||||
outptr2[col] = (JSAMPLE)
|
outptr2[col] = (JSAMPLE)
|
||||||
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
|
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
|
||||||
>> SCALEBITS);
|
>> SCALEBITS);
|
||||||
inptr += RGB_PIXELSIZE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -201,8 +201,8 @@ rgb_gray_convert (j_compress_ptr cinfo,
|
|||||||
JDIMENSION output_row, int num_rows)
|
JDIMENSION output_row, int num_rows)
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
|
||||||
register int r, g, b;
|
register int r, g, b;
|
||||||
|
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
@ -215,11 +215,11 @@ rgb_gray_convert (j_compress_ptr cinfo,
|
|||||||
r = GETJSAMPLE(inptr[RGB_RED]);
|
r = GETJSAMPLE(inptr[RGB_RED]);
|
||||||
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
||||||
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
||||||
|
inptr += RGB_PIXELSIZE;
|
||||||
/* Y */
|
/* Y */
|
||||||
outptr[col] = (JSAMPLE)
|
outptr[col] = (JSAMPLE)
|
||||||
((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
|
((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
|
||||||
>> SCALEBITS);
|
>> SCALEBITS);
|
||||||
inptr += RGB_PIXELSIZE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -228,8 +228,8 @@ rgb_gray_convert (j_compress_ptr cinfo,
|
|||||||
/*
|
/*
|
||||||
* Convert some rows of samples to the JPEG colorspace.
|
* Convert some rows of samples to the JPEG colorspace.
|
||||||
* This version handles Adobe-style CMYK->YCCK conversion,
|
* This version handles Adobe-style CMYK->YCCK conversion,
|
||||||
* where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same
|
* where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the
|
||||||
* conversion as above, while passing K (black) unchanged.
|
* same conversion as above, while passing K (black) unchanged.
|
||||||
* We assume rgb_ycc_start has been called.
|
* We assume rgb_ycc_start has been called.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -239,8 +239,8 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
|
|||||||
JDIMENSION output_row, int num_rows)
|
JDIMENSION output_row, int num_rows)
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
|
||||||
register int r, g, b;
|
register int r, g, b;
|
||||||
|
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JSAMPROW outptr0, outptr1, outptr2, outptr3;
|
register JSAMPROW outptr0, outptr1, outptr2, outptr3;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
@ -259,6 +259,7 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
|
|||||||
b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
|
b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
|
||||||
/* K passes through as-is */
|
/* K passes through as-is */
|
||||||
outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */
|
outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */
|
||||||
|
inptr += 4;
|
||||||
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
|
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
|
||||||
* must be too; we do not need an explicit range-limiting operation.
|
* must be too; we do not need an explicit range-limiting operation.
|
||||||
* Hence the value being shifted is never negative, and we don't
|
* Hence the value being shifted is never negative, and we don't
|
||||||
@ -276,7 +277,6 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
|
|||||||
outptr2[col] = (JSAMPLE)
|
outptr2[col] = (JSAMPLE)
|
||||||
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
|
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
|
||||||
>> SCALEBITS);
|
>> SCALEBITS);
|
||||||
inptr += 4;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -312,13 +312,13 @@ rgb_rgb1_convert (j_compress_ptr cinfo,
|
|||||||
r = GETJSAMPLE(inptr[RGB_RED]);
|
r = GETJSAMPLE(inptr[RGB_RED]);
|
||||||
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
||||||
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
||||||
|
inptr += RGB_PIXELSIZE;
|
||||||
/* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD
|
/* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD
|
||||||
* (modulo) operator is equivalent to the bitmask operator AND.
|
* (modulo) operator is equivalent to the bitmask operator AND.
|
||||||
*/
|
*/
|
||||||
outptr0[col] = (JSAMPLE) ((r - g + CENTERJSAMPLE) & MAXJSAMPLE);
|
outptr0[col] = (JSAMPLE) ((r - g + CENTERJSAMPLE) & MAXJSAMPLE);
|
||||||
outptr1[col] = (JSAMPLE) g;
|
outptr1[col] = (JSAMPLE) g;
|
||||||
outptr2[col] = (JSAMPLE) ((b - g + CENTERJSAMPLE) & MAXJSAMPLE);
|
outptr2[col] = (JSAMPLE) ((b - g + CENTERJSAMPLE) & MAXJSAMPLE);
|
||||||
inptr += RGB_PIXELSIZE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -335,17 +335,17 @@ grayscale_convert (j_compress_ptr cinfo,
|
|||||||
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
||||||
JDIMENSION output_row, int num_rows)
|
JDIMENSION output_row, int num_rows)
|
||||||
{
|
{
|
||||||
int instride = cinfo->input_components;
|
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JDIMENSION col;
|
register JDIMENSION count;
|
||||||
|
register int instride = cinfo->input_components;
|
||||||
JDIMENSION num_cols = cinfo->image_width;
|
JDIMENSION num_cols = cinfo->image_width;
|
||||||
|
|
||||||
while (--num_rows >= 0) {
|
while (--num_rows >= 0) {
|
||||||
inptr = *input_buf++;
|
inptr = *input_buf++;
|
||||||
outptr = output_buf[0][output_row++];
|
outptr = output_buf[0][output_row++];
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (count = num_cols; count > 0; count--) {
|
||||||
outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */
|
*outptr++ = *inptr; /* don't need GETJSAMPLE() here */
|
||||||
inptr += instride;
|
inptr += instride;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -396,21 +396,21 @@ null_convert (j_compress_ptr cinfo,
|
|||||||
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
||||||
JDIMENSION output_row, int num_rows)
|
JDIMENSION output_row, int num_rows)
|
||||||
{
|
{
|
||||||
int ci;
|
|
||||||
register int nc = cinfo->num_components;
|
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JDIMENSION col;
|
register JDIMENSION count;
|
||||||
|
register int num_comps = cinfo->num_components;
|
||||||
JDIMENSION num_cols = cinfo->image_width;
|
JDIMENSION num_cols = cinfo->image_width;
|
||||||
|
int ci;
|
||||||
|
|
||||||
while (--num_rows >= 0) {
|
while (--num_rows >= 0) {
|
||||||
/* It seems fastest to make a separate pass for each component. */
|
/* It seems fastest to make a separate pass for each component. */
|
||||||
for (ci = 0; ci < nc; ci++) {
|
for (ci = 0; ci < num_comps; ci++) {
|
||||||
inptr = input_buf[0] + ci;
|
inptr = input_buf[0] + ci;
|
||||||
outptr = output_buf[ci][output_row];
|
outptr = output_buf[ci][output_row];
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (count = num_cols; count > 0; count--) {
|
||||||
*outptr++ = *inptr; /* don't need GETJSAMPLE() here */
|
*outptr++ = *inptr; /* don't need GETJSAMPLE() here */
|
||||||
inptr += nc;
|
inptr += num_comps;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
input_buf++;
|
input_buf++;
|
||||||
@ -439,9 +439,8 @@ jinit_color_converter (j_compress_ptr cinfo)
|
|||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert;
|
my_cconvert_ptr cconvert;
|
||||||
|
|
||||||
cconvert = (my_cconvert_ptr)
|
cconvert = (my_cconvert_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_color_converter));
|
||||||
SIZEOF(my_color_converter));
|
|
||||||
cinfo->cconvert = &cconvert->pub;
|
cinfo->cconvert = &cconvert->pub;
|
||||||
/* set start_pass to null method until we find out differently */
|
/* set start_pass to null method until we find out differently */
|
||||||
cconvert->pub.start_pass = null_method;
|
cconvert->pub.start_pass = null_method;
|
||||||
@ -455,9 +454,11 @@ jinit_color_converter (j_compress_ptr cinfo)
|
|||||||
|
|
||||||
case JCS_RGB:
|
case JCS_RGB:
|
||||||
case JCS_BG_RGB:
|
case JCS_BG_RGB:
|
||||||
|
#if RGB_PIXELSIZE != 3
|
||||||
if (cinfo->input_components != RGB_PIXELSIZE)
|
if (cinfo->input_components != RGB_PIXELSIZE)
|
||||||
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
||||||
break;
|
break;
|
||||||
|
#endif /* else share code with YCbCr */
|
||||||
|
|
||||||
case JCS_YCbCr:
|
case JCS_YCbCr:
|
||||||
case JCS_BG_YCC:
|
case JCS_BG_YCC:
|
||||||
@ -474,7 +475,6 @@ jinit_color_converter (j_compress_ptr cinfo)
|
|||||||
default: /* JCS_UNKNOWN can be anything */
|
default: /* JCS_UNKNOWN can be anything */
|
||||||
if (cinfo->input_components < 1)
|
if (cinfo->input_components < 1)
|
||||||
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Support color transform only for RGB colorspaces */
|
/* Support color transform only for RGB colorspaces */
|
||||||
@ -507,19 +507,18 @@ jinit_color_converter (j_compress_ptr cinfo)
|
|||||||
case JCS_BG_RGB:
|
case JCS_BG_RGB:
|
||||||
if (cinfo->num_components != 3)
|
if (cinfo->num_components != 3)
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
||||||
if (cinfo->in_color_space == cinfo->jpeg_color_space) {
|
if (cinfo->in_color_space != cinfo->jpeg_color_space)
|
||||||
switch (cinfo->color_transform) {
|
|
||||||
case JCT_NONE:
|
|
||||||
cconvert->pub.color_convert = rgb_convert;
|
|
||||||
break;
|
|
||||||
case JCT_SUBTRACT_GREEN:
|
|
||||||
cconvert->pub.color_convert = rgb_rgb1_convert;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
switch (cinfo->color_transform) {
|
||||||
|
case JCT_NONE:
|
||||||
|
cconvert->pub.color_convert = rgb_convert;
|
||||||
|
break;
|
||||||
|
case JCT_SUBTRACT_GREEN:
|
||||||
|
cconvert->pub.color_convert = rgb_rgb1_convert;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JCS_YCbCr:
|
case JCS_YCbCr:
|
||||||
@ -572,10 +571,9 @@ jinit_color_converter (j_compress_ptr cinfo)
|
|||||||
case JCS_CMYK:
|
case JCS_CMYK:
|
||||||
if (cinfo->num_components != 4)
|
if (cinfo->num_components != 4)
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
||||||
if (cinfo->in_color_space == JCS_CMYK)
|
if (cinfo->in_color_space != JCS_CMYK)
|
||||||
cconvert->pub.color_convert = null_convert;
|
|
||||||
else
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
cconvert->pub.color_convert = null_convert;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JCS_YCCK:
|
case JCS_YCCK:
|
||||||
@ -599,6 +597,5 @@ jinit_color_converter (j_compress_ptr cinfo)
|
|||||||
cinfo->num_components != cinfo->input_components)
|
cinfo->num_components != cinfo->input_components)
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
cconvert->pub.color_convert = null_convert;
|
cconvert->pub.color_convert = null_convert;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
151
jpeg/jchuff.c
151
jpeg/jchuff.c
@ -2,7 +2,7 @@
|
|||||||
* jchuff.c
|
* jchuff.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2006-2013 by Guido Vollbeding.
|
* Modified 2006-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -178,13 +178,12 @@ jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno,
|
|||||||
htbl =
|
htbl =
|
||||||
isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
|
isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
|
||||||
if (htbl == NULL)
|
if (htbl == NULL)
|
||||||
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
|
htbl = jpeg_std_huff_table((j_common_ptr) cinfo, isDC, tblno);
|
||||||
|
|
||||||
/* Allocate a workspace if we haven't already done so. */
|
/* Allocate a workspace if we haven't already done so. */
|
||||||
if (*pdtbl == NULL)
|
if (*pdtbl == NULL)
|
||||||
*pdtbl = (c_derived_tbl *)
|
*pdtbl = (c_derived_tbl *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(c_derived_tbl));
|
||||||
SIZEOF(c_derived_tbl));
|
|
||||||
dtbl = *pdtbl;
|
dtbl = *pdtbl;
|
||||||
|
|
||||||
/* Figure C.1: make table of Huffman code length for each symbol */
|
/* Figure C.1: make table of Huffman code length for each symbol */
|
||||||
@ -1256,22 +1255,88 @@ jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
|
|||||||
UINT8 bits[MAX_CLEN+1]; /* bits[k] = # of symbols with code length k */
|
UINT8 bits[MAX_CLEN+1]; /* bits[k] = # of symbols with code length k */
|
||||||
int codesize[257]; /* codesize[k] = code length of symbol k */
|
int codesize[257]; /* codesize[k] = code length of symbol k */
|
||||||
int others[257]; /* next symbol in current branch of tree */
|
int others[257]; /* next symbol in current branch of tree */
|
||||||
int c1, c2;
|
int c1, c2, i, j;
|
||||||
int p, i, j;
|
UINT8 *p;
|
||||||
long v;
|
long v;
|
||||||
|
|
||||||
|
freq[256] = 1; /* make sure 256 has a nonzero count */
|
||||||
|
/* Including the pseudo-symbol 256 in the Huffman procedure guarantees
|
||||||
|
* that no real symbol is given code-value of all ones, because 256
|
||||||
|
* will be placed last in the largest codeword category.
|
||||||
|
* In the symbol list build procedure this element serves as sentinel
|
||||||
|
* for the zero run loop.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DONT_USE_FANCY_HUFF_OPT
|
||||||
|
|
||||||
|
/* Build list of symbols sorted in order of descending frequency */
|
||||||
|
/* This approach has several benefits (thank to John Korejwa for the idea):
|
||||||
|
* 1.
|
||||||
|
* If a codelength category is split during the length limiting procedure
|
||||||
|
* below, the feature that more frequent symbols are assigned shorter
|
||||||
|
* codewords remains valid for the adjusted code.
|
||||||
|
* 2.
|
||||||
|
* To reduce consecutive ones in a Huffman data stream (thus reducing the
|
||||||
|
* number of stuff bytes in JPEG) it is preferable to follow 0 branches
|
||||||
|
* (and avoid 1 branches) as much as possible. This is easily done by
|
||||||
|
* assigning symbols to leaves of the Huffman tree in order of decreasing
|
||||||
|
* frequency, with no secondary sort based on codelengths.
|
||||||
|
* 3.
|
||||||
|
* The symbol list can be built independently from the assignment of code
|
||||||
|
* lengths by the Huffman procedure below.
|
||||||
|
* Note: The symbol list build procedure must be performed first, because
|
||||||
|
* the Huffman procedure assigning the codelengths clobbers the frequency
|
||||||
|
* counts!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Here we use the others array as a linked list of nonzero frequencies
|
||||||
|
* to be sorted. Already sorted elements are removed from the list.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Building list */
|
||||||
|
|
||||||
|
/* This item does not correspond to a valid symbol frequency and is used
|
||||||
|
* as starting index.
|
||||||
|
*/
|
||||||
|
j = 256;
|
||||||
|
|
||||||
|
for (i = 0;; i++) {
|
||||||
|
if (freq[i] == 0) /* skip zero frequencies */
|
||||||
|
continue;
|
||||||
|
if (i > 255)
|
||||||
|
break;
|
||||||
|
others[j] = i; /* this symbol value */
|
||||||
|
j = i; /* previous symbol value */
|
||||||
|
}
|
||||||
|
others[j] = -1; /* mark end of list */
|
||||||
|
|
||||||
|
/* Sorting list */
|
||||||
|
|
||||||
|
p = htbl->huffval;
|
||||||
|
while ((c1 = others[256]) >= 0) {
|
||||||
|
v = freq[c1];
|
||||||
|
i = c1; /* first symbol value */
|
||||||
|
j = 256; /* pseudo symbol value for starting index */
|
||||||
|
while ((c2 = others[c1]) >= 0) {
|
||||||
|
if (freq[c2] > v) {
|
||||||
|
v = freq[c2];
|
||||||
|
i = c2; /* this symbol value */
|
||||||
|
j = c1; /* previous symbol value */
|
||||||
|
}
|
||||||
|
c1 = c2;
|
||||||
|
}
|
||||||
|
others[j] = others[i]; /* remove this symbol i from list */
|
||||||
|
*p++ = (UINT8) i;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* DONT_USE_FANCY_HUFF_OPT */
|
||||||
|
|
||||||
/* This algorithm is explained in section K.2 of the JPEG standard */
|
/* This algorithm is explained in section K.2 of the JPEG standard */
|
||||||
|
|
||||||
MEMZERO(bits, SIZEOF(bits));
|
MEMZERO(bits, SIZEOF(bits));
|
||||||
MEMZERO(codesize, SIZEOF(codesize));
|
MEMZERO(codesize, SIZEOF(codesize));
|
||||||
for (i = 0; i < 257; i++)
|
for (i = 0; i < 257; i++)
|
||||||
others[i] = -1; /* init links to empty */
|
others[i] = -1; /* init links to empty */
|
||||||
|
|
||||||
freq[256] = 1; /* make sure 256 has a nonzero count */
|
|
||||||
/* Including the pseudo-symbol 256 in the Huffman procedure guarantees
|
|
||||||
* that no real symbol is given code-value of all ones, because 256
|
|
||||||
* will be placed last in the largest codeword category.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Huffman's basic algorithm to assign optimal code lengths to symbols */
|
/* Huffman's basic algorithm to assign optimal code lengths to symbols */
|
||||||
|
|
||||||
@ -1301,7 +1366,7 @@ jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
|
|||||||
/* Done if we've merged everything into one frequency */
|
/* Done if we've merged everything into one frequency */
|
||||||
if (c2 < 0)
|
if (c2 < 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Else merge the two counts/trees */
|
/* Else merge the two counts/trees */
|
||||||
freq[c1] += freq[c2];
|
freq[c1] += freq[c2];
|
||||||
freq[c2] = 0;
|
freq[c2] = 0;
|
||||||
@ -1312,9 +1377,9 @@ jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
|
|||||||
c1 = others[c1];
|
c1 = others[c1];
|
||||||
codesize[c1]++;
|
codesize[c1]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
others[c1] = c2; /* chain c2 onto c1's tree branch */
|
others[c1] = c2; /* chain c2 onto c1's tree branch */
|
||||||
|
|
||||||
/* Increment the codesize of everything in c2's tree branch */
|
/* Increment the codesize of everything in c2's tree branch */
|
||||||
codesize[c2]++;
|
codesize[c2]++;
|
||||||
while (others[c2] >= 0) {
|
while (others[c2] >= 0) {
|
||||||
@ -1329,7 +1394,7 @@ jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
|
|||||||
/* The JPEG standard seems to think that this can't happen, */
|
/* The JPEG standard seems to think that this can't happen, */
|
||||||
/* but I'm paranoid... */
|
/* but I'm paranoid... */
|
||||||
if (codesize[i] > MAX_CLEN)
|
if (codesize[i] > MAX_CLEN)
|
||||||
ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);
|
ERREXIT(cinfo, JERR_HUFF_CLEN_OUTOFBOUNDS);
|
||||||
|
|
||||||
bits[codesize[i]]++;
|
bits[codesize[i]]++;
|
||||||
}
|
}
|
||||||
@ -1345,13 +1410,16 @@ jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
|
|||||||
* shortest nonzero BITS entry is converted into a prefix for two code words
|
* shortest nonzero BITS entry is converted into a prefix for two code words
|
||||||
* one bit longer.
|
* one bit longer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = MAX_CLEN; i > 16; i--) {
|
for (i = MAX_CLEN; i > 16; i--) {
|
||||||
while (bits[i] > 0) {
|
while (bits[i] > 0) {
|
||||||
j = i - 2; /* find length of new prefix to be used */
|
j = i - 2; /* find length of new prefix to be used */
|
||||||
while (bits[j] == 0)
|
while (bits[j] == 0) {
|
||||||
|
if (j == 0)
|
||||||
|
ERREXIT(cinfo, JERR_HUFF_CLEN_OUTOFBOUNDS);
|
||||||
j--;
|
j--;
|
||||||
|
}
|
||||||
|
|
||||||
bits[i] -= 2; /* remove two symbols */
|
bits[i] -= 2; /* remove two symbols */
|
||||||
bits[i-1]++; /* one goes in this length */
|
bits[i-1]++; /* one goes in this length */
|
||||||
bits[j+1] += 2; /* two new symbols in this length */
|
bits[j+1] += 2; /* two new symbols in this length */
|
||||||
@ -1363,24 +1431,27 @@ jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
|
|||||||
while (bits[i] == 0) /* find largest codelength still in use */
|
while (bits[i] == 0) /* find largest codelength still in use */
|
||||||
i--;
|
i--;
|
||||||
bits[i]--;
|
bits[i]--;
|
||||||
|
|
||||||
/* Return final symbol counts (only for lengths 0..16) */
|
/* Return final symbol counts (only for lengths 0..16) */
|
||||||
MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));
|
MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));
|
||||||
|
|
||||||
|
#ifdef DONT_USE_FANCY_HUFF_OPT
|
||||||
|
|
||||||
/* Return a list of the symbols sorted by code length */
|
/* Return a list of the symbols sorted by code length */
|
||||||
/* It's not real clear to me why we don't need to consider the codelength
|
/* Note: Due to the codelength changes made above, it can happen
|
||||||
* changes made above, but the JPEG spec seems to think this works.
|
* that more frequent symbols are assigned longer codewords.
|
||||||
*/
|
*/
|
||||||
p = 0;
|
p = htbl->huffval;
|
||||||
for (i = 1; i <= MAX_CLEN; i++) {
|
for (i = 1; i <= MAX_CLEN; i++) {
|
||||||
for (j = 0; j <= 255; j++) {
|
for (j = 0; j <= 255; j++) {
|
||||||
if (codesize[j] == i) {
|
if (codesize[j] == i) {
|
||||||
htbl->huffval[p] = (UINT8) j;
|
*p++ = (UINT8) j;
|
||||||
p++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* DONT_USE_FANCY_HUFF_OPT */
|
||||||
|
|
||||||
/* Set sent_table FALSE so updated table will be written to JPEG file. */
|
/* Set sent_table FALSE so updated table will be written to JPEG file. */
|
||||||
htbl->sent_table = FALSE;
|
htbl->sent_table = FALSE;
|
||||||
}
|
}
|
||||||
@ -1400,13 +1471,13 @@ finish_pass_gather (j_compress_ptr cinfo)
|
|||||||
boolean did_dc[NUM_HUFF_TBLS];
|
boolean did_dc[NUM_HUFF_TBLS];
|
||||||
boolean did_ac[NUM_HUFF_TBLS];
|
boolean did_ac[NUM_HUFF_TBLS];
|
||||||
|
|
||||||
/* It's important not to apply jpeg_gen_optimal_table more than once
|
|
||||||
* per table, because it clobbers the input frequency counts!
|
|
||||||
*/
|
|
||||||
if (cinfo->progressive_mode)
|
if (cinfo->progressive_mode)
|
||||||
/* Flush out buffered data (all we care about is counting the EOB symbol) */
|
/* Flush out buffered data (all we care about is counting the EOB symbol) */
|
||||||
emit_eobrun(entropy);
|
emit_eobrun(entropy);
|
||||||
|
|
||||||
|
/* It's important not to apply jpeg_gen_optimal_table more than once
|
||||||
|
* per table, because it clobbers the input frequency counts!
|
||||||
|
*/
|
||||||
MEMZERO(did_dc, SIZEOF(did_dc));
|
MEMZERO(did_dc, SIZEOF(did_dc));
|
||||||
MEMZERO(did_ac, SIZEOF(did_ac));
|
MEMZERO(did_ac, SIZEOF(did_ac));
|
||||||
|
|
||||||
@ -1475,9 +1546,8 @@ start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
|
|||||||
entropy->pub.encode_mcu = encode_mcu_AC_refine;
|
entropy->pub.encode_mcu = encode_mcu_AC_refine;
|
||||||
/* AC refinement needs a correction bit buffer */
|
/* AC refinement needs a correction bit buffer */
|
||||||
if (entropy->bit_buffer == NULL)
|
if (entropy->bit_buffer == NULL)
|
||||||
entropy->bit_buffer = (char *)
|
entropy->bit_buffer = (char *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, MAX_CORR_BITS * SIZEOF(char));
|
||||||
MAX_CORR_BITS * SIZEOF(char));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1505,9 +1575,8 @@ start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
|
|||||||
/* Allocate and zero the statistics tables */
|
/* Allocate and zero the statistics tables */
|
||||||
/* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
|
/* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
|
||||||
if (entropy->dc_count_ptrs[tbl] == NULL)
|
if (entropy->dc_count_ptrs[tbl] == NULL)
|
||||||
entropy->dc_count_ptrs[tbl] = (long *)
|
entropy->dc_count_ptrs[tbl] = (long *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, 257 * SIZEOF(long));
|
||||||
257 * SIZEOF(long));
|
|
||||||
MEMZERO(entropy->dc_count_ptrs[tbl], 257 * SIZEOF(long));
|
MEMZERO(entropy->dc_count_ptrs[tbl], 257 * SIZEOF(long));
|
||||||
} else {
|
} else {
|
||||||
/* Compute derived values for Huffman tables */
|
/* Compute derived values for Huffman tables */
|
||||||
@ -1525,9 +1594,8 @@ start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
|
|||||||
if (tbl < 0 || tbl >= NUM_HUFF_TBLS)
|
if (tbl < 0 || tbl >= NUM_HUFF_TBLS)
|
||||||
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);
|
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);
|
||||||
if (entropy->ac_count_ptrs[tbl] == NULL)
|
if (entropy->ac_count_ptrs[tbl] == NULL)
|
||||||
entropy->ac_count_ptrs[tbl] = (long *)
|
entropy->ac_count_ptrs[tbl] = (long *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, 257 * SIZEOF(long));
|
||||||
257 * SIZEOF(long));
|
|
||||||
MEMZERO(entropy->ac_count_ptrs[tbl], 257 * SIZEOF(long));
|
MEMZERO(entropy->ac_count_ptrs[tbl], 257 * SIZEOF(long));
|
||||||
} else {
|
} else {
|
||||||
jpeg_make_c_derived_tbl(cinfo, FALSE, tbl,
|
jpeg_make_c_derived_tbl(cinfo, FALSE, tbl,
|
||||||
@ -1556,9 +1624,8 @@ jinit_huff_encoder (j_compress_ptr cinfo)
|
|||||||
huff_entropy_ptr entropy;
|
huff_entropy_ptr entropy;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
entropy = (huff_entropy_ptr)
|
entropy = (huff_entropy_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(huff_entropy_encoder));
|
||||||
SIZEOF(huff_entropy_encoder));
|
|
||||||
cinfo->entropy = &entropy->pub;
|
cinfo->entropy = &entropy->pub;
|
||||||
entropy->pub.start_pass = start_pass_huff;
|
entropy->pub.start_pass = start_pass_huff;
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* jcmarker.c
|
* jcmarker.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2003-2013 by Guido Vollbeding.
|
* Modified 2003-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -471,7 +471,6 @@ emit_adobe_app14 (j_compress_ptr cinfo)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
emit_byte(cinfo, 0); /* Color transform = 0 */
|
emit_byte(cinfo, 0); /* Color transform = 0 */
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -702,9 +701,8 @@ jinit_marker_writer (j_compress_ptr cinfo)
|
|||||||
my_marker_ptr marker;
|
my_marker_ptr marker;
|
||||||
|
|
||||||
/* Create the subobject */
|
/* Create the subobject */
|
||||||
marker = (my_marker_ptr)
|
marker = (my_marker_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_marker_writer));
|
||||||
SIZEOF(my_marker_writer));
|
|
||||||
cinfo->marker = &marker->pub;
|
cinfo->marker = &marker->pub;
|
||||||
/* Initialize method pointers */
|
/* Initialize method pointers */
|
||||||
marker->pub.write_file_header = write_file_header;
|
marker->pub.write_file_header = write_file_header;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* jcmaster.c
|
* jcmaster.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2003-2017 by Guido Vollbeding.
|
* Modified 2003-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -62,7 +62,7 @@ initial_setup (j_compress_ptr cinfo)
|
|||||||
case 5: cinfo->natural_order = jpeg_natural_order5; break;
|
case 5: cinfo->natural_order = jpeg_natural_order5; break;
|
||||||
case 6: cinfo->natural_order = jpeg_natural_order6; break;
|
case 6: cinfo->natural_order = jpeg_natural_order6; break;
|
||||||
case 7: cinfo->natural_order = jpeg_natural_order7; break;
|
case 7: cinfo->natural_order = jpeg_natural_order7; break;
|
||||||
default: cinfo->natural_order = jpeg_natural_order; break;
|
default: cinfo->natural_order = jpeg_natural_order;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Derive lim_Se from block_size */
|
/* Derive lim_Se from block_size */
|
||||||
@ -114,20 +114,24 @@ initial_setup (j_compress_ptr cinfo)
|
|||||||
*/
|
*/
|
||||||
ssize = 1;
|
ssize = 1;
|
||||||
#ifdef DCT_SCALING_SUPPORTED
|
#ifdef DCT_SCALING_SUPPORTED
|
||||||
while (cinfo->min_DCT_h_scaled_size * ssize <=
|
if (! cinfo->raw_data_in)
|
||||||
(cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) &&
|
while (cinfo->min_DCT_h_scaled_size * ssize <=
|
||||||
(cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) {
|
(cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) &&
|
||||||
ssize = ssize * 2;
|
(cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) ==
|
||||||
}
|
0) {
|
||||||
|
ssize = ssize * 2;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize;
|
compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize;
|
||||||
ssize = 1;
|
ssize = 1;
|
||||||
#ifdef DCT_SCALING_SUPPORTED
|
#ifdef DCT_SCALING_SUPPORTED
|
||||||
while (cinfo->min_DCT_v_scaled_size * ssize <=
|
if (! cinfo->raw_data_in)
|
||||||
(cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) &&
|
while (cinfo->min_DCT_v_scaled_size * ssize <=
|
||||||
(cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) {
|
(cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) &&
|
||||||
ssize = ssize * 2;
|
(cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) ==
|
||||||
}
|
0) {
|
||||||
|
ssize = ssize * 2;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize;
|
compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize;
|
||||||
|
|
||||||
@ -620,9 +624,8 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
|
|||||||
{
|
{
|
||||||
my_master_ptr master;
|
my_master_ptr master;
|
||||||
|
|
||||||
master = (my_master_ptr)
|
master = (my_master_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_comp_master));
|
||||||
SIZEOF(my_comp_master));
|
|
||||||
cinfo->master = &master->pub;
|
cinfo->master = &master->pub;
|
||||||
master->pub.prepare_for_pass = prepare_for_pass;
|
master->pub.prepare_for_pass = prepare_for_pass;
|
||||||
master->pub.pass_startup = pass_startup;
|
master->pub.pass_startup = pass_startup;
|
||||||
|
138
jpeg/jcomapi.c
138
jpeg/jcomapi.c
@ -2,6 +2,7 @@
|
|||||||
* jcomapi.c
|
* jcomapi.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
* Copyright (C) 1994-1997, Thomas G. Lane.
|
||||||
|
* Modified 2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -104,3 +105,140 @@ jpeg_alloc_huff_table (j_common_ptr cinfo)
|
|||||||
tbl->sent_table = FALSE; /* make sure this is false in any new table */
|
tbl->sent_table = FALSE; /* make sure this is false in any new table */
|
||||||
return tbl;
|
return tbl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up the standard Huffman tables (cf. JPEG standard section K.3).
|
||||||
|
* IMPORTANT: these are only valid for 8-bit data precision!
|
||||||
|
* (Would jutils.c be a more reasonable place to put this?)
|
||||||
|
*/
|
||||||
|
|
||||||
|
GLOBAL(JHUFF_TBL *)
|
||||||
|
jpeg_std_huff_table (j_common_ptr cinfo, boolean isDC, int tblno)
|
||||||
|
{
|
||||||
|
JHUFF_TBL **htblptr, *htbl;
|
||||||
|
const UINT8 *bits, *val;
|
||||||
|
int nsymbols, len;
|
||||||
|
|
||||||
|
static const UINT8 bits_dc_luminance[17] =
|
||||||
|
{ /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
|
||||||
|
static const UINT8 val_dc_luminance[] =
|
||||||
|
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
|
||||||
|
|
||||||
|
static const UINT8 bits_dc_chrominance[17] =
|
||||||
|
{ /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
|
||||||
|
static const UINT8 val_dc_chrominance[] =
|
||||||
|
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
|
||||||
|
|
||||||
|
static const UINT8 bits_ac_luminance[17] =
|
||||||
|
{ /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
|
||||||
|
static const UINT8 val_ac_luminance[] =
|
||||||
|
{ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
|
||||||
|
0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
|
||||||
|
0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
|
||||||
|
0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
|
||||||
|
0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
|
||||||
|
0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
|
||||||
|
0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
|
||||||
|
0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
|
||||||
|
0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
|
||||||
|
0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
|
||||||
|
0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
|
||||||
|
0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
|
||||||
|
0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
|
||||||
|
0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
|
||||||
|
0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
|
||||||
|
0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
|
||||||
|
0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
|
||||||
|
0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
|
||||||
|
0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
|
||||||
|
0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
|
||||||
|
0xf9, 0xfa };
|
||||||
|
|
||||||
|
static const UINT8 bits_ac_chrominance[17] =
|
||||||
|
{ /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
|
||||||
|
static const UINT8 val_ac_chrominance[] =
|
||||||
|
{ 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
|
||||||
|
0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
|
||||||
|
0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
|
||||||
|
0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
|
||||||
|
0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
|
||||||
|
0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
|
||||||
|
0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
|
||||||
|
0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
|
||||||
|
0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
|
||||||
|
0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
|
||||||
|
0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
|
||||||
|
0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
|
||||||
|
0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
|
||||||
|
0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
|
||||||
|
0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
|
||||||
|
0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
|
||||||
|
0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
|
||||||
|
0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
|
||||||
|
0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
|
||||||
|
0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
|
||||||
|
0xf9, 0xfa };
|
||||||
|
|
||||||
|
if (cinfo->is_decompressor) {
|
||||||
|
if (isDC)
|
||||||
|
htblptr = ((j_decompress_ptr) cinfo)->dc_huff_tbl_ptrs;
|
||||||
|
else
|
||||||
|
htblptr = ((j_decompress_ptr) cinfo)->ac_huff_tbl_ptrs;
|
||||||
|
} else {
|
||||||
|
if (isDC)
|
||||||
|
htblptr = ((j_compress_ptr) cinfo)->dc_huff_tbl_ptrs;
|
||||||
|
else
|
||||||
|
htblptr = ((j_compress_ptr) cinfo)->ac_huff_tbl_ptrs;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (tblno) {
|
||||||
|
case 0:
|
||||||
|
if (isDC) {
|
||||||
|
bits = bits_dc_luminance;
|
||||||
|
val = val_dc_luminance;
|
||||||
|
} else {
|
||||||
|
bits = bits_ac_luminance;
|
||||||
|
val = val_ac_luminance;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (isDC) {
|
||||||
|
bits = bits_dc_chrominance;
|
||||||
|
val = val_dc_chrominance;
|
||||||
|
} else {
|
||||||
|
bits = bits_ac_chrominance;
|
||||||
|
val = val_ac_chrominance;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
|
||||||
|
return NULL; /* avoid compiler warnings for uninitialized variables */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (htblptr[tblno] == NULL)
|
||||||
|
htblptr[tblno] = jpeg_alloc_huff_table(cinfo);
|
||||||
|
|
||||||
|
htbl = htblptr[tblno];
|
||||||
|
|
||||||
|
/* Copy the number-of-symbols-of-each-code-length counts */
|
||||||
|
MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));
|
||||||
|
|
||||||
|
/* Validate the counts. We do this here mainly so we can copy the right
|
||||||
|
* number of symbols from the val[] array, without risking marching off
|
||||||
|
* the end of memory. jxhuff.c will do a more thorough test later.
|
||||||
|
*/
|
||||||
|
nsymbols = 0;
|
||||||
|
for (len = 1; len <= 16; len++)
|
||||||
|
nsymbols += bits[len];
|
||||||
|
if (nsymbols > 256)
|
||||||
|
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
|
||||||
|
|
||||||
|
if (nsymbols > 0)
|
||||||
|
MEMCOPY(htbl->huffval, val, nsymbols * SIZEOF(UINT8));
|
||||||
|
|
||||||
|
/* Initialize sent_table FALSE so table will be written to JPEG file. */
|
||||||
|
htbl->sent_table = FALSE;
|
||||||
|
|
||||||
|
return htbl;
|
||||||
|
}
|
||||||
|
117
jpeg/jcparam.c
117
jpeg/jcparam.c
@ -2,7 +2,7 @@
|
|||||||
* jcparam.c
|
* jcparam.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2003-2013 by Guido Vollbeding.
|
* Modified 2003-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -162,112 +162,23 @@ jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Huffman table setup routines
|
* Reset standard Huffman tables
|
||||||
*/
|
*/
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
add_huff_table (j_compress_ptr cinfo,
|
|
||||||
JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)
|
|
||||||
/* Define a Huffman table */
|
|
||||||
{
|
|
||||||
int nsymbols, len;
|
|
||||||
|
|
||||||
if (*htblptr == NULL)
|
|
||||||
*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
|
|
||||||
|
|
||||||
/* Copy the number-of-symbols-of-each-code-length counts */
|
|
||||||
MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
|
|
||||||
|
|
||||||
/* Validate the counts. We do this here mainly so we can copy the right
|
|
||||||
* number of symbols from the val[] array, without risking marching off
|
|
||||||
* the end of memory. jchuff.c will do a more thorough test later.
|
|
||||||
*/
|
|
||||||
nsymbols = 0;
|
|
||||||
for (len = 1; len <= 16; len++)
|
|
||||||
nsymbols += bits[len];
|
|
||||||
if (nsymbols < 1 || nsymbols > 256)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
|
|
||||||
|
|
||||||
MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8));
|
|
||||||
|
|
||||||
/* Initialize sent_table FALSE so table will be written to JPEG file. */
|
|
||||||
(*htblptr)->sent_table = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
LOCAL(void)
|
||||||
std_huff_tables (j_compress_ptr cinfo)
|
std_huff_tables (j_compress_ptr cinfo)
|
||||||
/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
|
|
||||||
/* IMPORTANT: these are only valid for 8-bit data precision! */
|
|
||||||
{
|
{
|
||||||
static const UINT8 bits_dc_luminance[17] =
|
if (cinfo->dc_huff_tbl_ptrs[0] != NULL)
|
||||||
{ /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
|
(void) jpeg_std_huff_table((j_common_ptr) cinfo, TRUE, 0);
|
||||||
static const UINT8 val_dc_luminance[] =
|
|
||||||
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
|
if (cinfo->ac_huff_tbl_ptrs[0] != NULL)
|
||||||
|
(void) jpeg_std_huff_table((j_common_ptr) cinfo, FALSE, 0);
|
||||||
static const UINT8 bits_dc_chrominance[17] =
|
|
||||||
{ /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
|
if (cinfo->dc_huff_tbl_ptrs[1] != NULL)
|
||||||
static const UINT8 val_dc_chrominance[] =
|
(void) jpeg_std_huff_table((j_common_ptr) cinfo, TRUE, 1);
|
||||||
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
|
|
||||||
|
if (cinfo->ac_huff_tbl_ptrs[1] != NULL)
|
||||||
static const UINT8 bits_ac_luminance[17] =
|
(void) jpeg_std_huff_table((j_common_ptr) cinfo, FALSE, 1);
|
||||||
{ /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
|
|
||||||
static const UINT8 val_ac_luminance[] =
|
|
||||||
{ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
|
|
||||||
0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
|
|
||||||
0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
|
|
||||||
0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
|
|
||||||
0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
|
|
||||||
0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
|
|
||||||
0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
|
|
||||||
0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
|
|
||||||
0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
|
|
||||||
0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
|
|
||||||
0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
|
|
||||||
0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
|
|
||||||
0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
|
|
||||||
0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
|
|
||||||
0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
|
|
||||||
0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
|
|
||||||
0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
|
|
||||||
0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
|
|
||||||
0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
|
|
||||||
0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
|
|
||||||
0xf9, 0xfa };
|
|
||||||
|
|
||||||
static const UINT8 bits_ac_chrominance[17] =
|
|
||||||
{ /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
|
|
||||||
static const UINT8 val_ac_chrominance[] =
|
|
||||||
{ 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
|
|
||||||
0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
|
|
||||||
0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
|
|
||||||
0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
|
|
||||||
0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
|
|
||||||
0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
|
|
||||||
0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
|
|
||||||
0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
|
|
||||||
0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
|
|
||||||
0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
|
|
||||||
0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
|
|
||||||
0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
|
|
||||||
0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
|
|
||||||
0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
|
|
||||||
0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
|
|
||||||
0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
|
|
||||||
0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
|
|
||||||
0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
|
|
||||||
0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
|
|
||||||
0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
|
|
||||||
0xf9, 0xfa };
|
|
||||||
|
|
||||||
add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0],
|
|
||||||
bits_dc_luminance, val_dc_luminance);
|
|
||||||
add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0],
|
|
||||||
bits_ac_luminance, val_ac_luminance);
|
|
||||||
add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1],
|
|
||||||
bits_dc_chrominance, val_dc_chrominance);
|
|
||||||
add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1],
|
|
||||||
bits_ac_chrominance, val_ac_chrominance);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -306,7 +217,7 @@ jpeg_set_defaults (j_compress_ptr cinfo)
|
|||||||
cinfo->data_precision = BITS_IN_JSAMPLE;
|
cinfo->data_precision = BITS_IN_JSAMPLE;
|
||||||
/* Set up two quantization tables using default quality of 75 */
|
/* Set up two quantization tables using default quality of 75 */
|
||||||
jpeg_set_quality(cinfo, 75, TRUE);
|
jpeg_set_quality(cinfo, 75, TRUE);
|
||||||
/* Set up two Huffman tables */
|
/* Reset standard Huffman tables */
|
||||||
std_huff_tables(cinfo);
|
std_huff_tables(cinfo);
|
||||||
|
|
||||||
/* Initialize default arithmetic coding conditioning */
|
/* Initialize default arithmetic coding conditioning */
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* jdarith.c
|
* jdarith.c
|
||||||
*
|
*
|
||||||
* Developed 1997-2015 by Guido Vollbeding.
|
* Developed 1997-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -280,7 +280,7 @@ decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
if ((m = arith_decode(cinfo, st)) != 0) {
|
if ((m = arith_decode(cinfo, st)) != 0) {
|
||||||
st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
|
st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
|
||||||
while (arith_decode(cinfo, st)) {
|
while (arith_decode(cinfo, st)) {
|
||||||
if ((m <<= 1) == 0x8000) {
|
if ((m <<= 1) == (int) 0x8000U) {
|
||||||
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
entropy->ct = -1; /* magnitude overflow */
|
entropy->ct = -1; /* magnitude overflow */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -370,7 +370,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
st = entropy->ac_stats[tbl] +
|
st = entropy->ac_stats[tbl] +
|
||||||
(k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
|
(k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
|
||||||
while (arith_decode(cinfo, st)) {
|
while (arith_decode(cinfo, st)) {
|
||||||
if ((m <<= 1) == 0x8000) {
|
if ((m <<= 1) == (int) 0x8000U) {
|
||||||
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
entropy->ct = -1; /* magnitude overflow */
|
entropy->ct = -1; /* magnitude overflow */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -404,7 +404,8 @@ decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
{
|
{
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
unsigned char *st;
|
unsigned char *st;
|
||||||
int p1, blkn;
|
JCOEF p1;
|
||||||
|
int blkn;
|
||||||
|
|
||||||
/* Process restart marker if needed */
|
/* Process restart marker if needed */
|
||||||
if (cinfo->restart_interval) {
|
if (cinfo->restart_interval) {
|
||||||
@ -440,7 +441,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
JCOEFPTR thiscoef;
|
JCOEFPTR thiscoef;
|
||||||
unsigned char *st;
|
unsigned char *st;
|
||||||
int tbl, k, kex;
|
int tbl, k, kex;
|
||||||
int p1, m1;
|
JCOEF p1, m1;
|
||||||
const int * natural_order;
|
const int * natural_order;
|
||||||
|
|
||||||
/* Process restart marker if needed */
|
/* Process restart marker if needed */
|
||||||
@ -459,7 +460,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
|
tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
|
||||||
|
|
||||||
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
||||||
m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */
|
m1 = -p1; /* -1 in the bit position being coded */
|
||||||
|
|
||||||
/* Establish EOBx (previous stage end-of-block) index */
|
/* Establish EOBx (previous stage end-of-block) index */
|
||||||
kex = cinfo->Se;
|
kex = cinfo->Se;
|
||||||
@ -555,7 +556,7 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
if ((m = arith_decode(cinfo, st)) != 0) {
|
if ((m = arith_decode(cinfo, st)) != 0) {
|
||||||
st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
|
st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
|
||||||
while (arith_decode(cinfo, st)) {
|
while (arith_decode(cinfo, st)) {
|
||||||
if ((m <<= 1) == 0x8000) {
|
if ((m <<= 1) == (int) 0x8000U) {
|
||||||
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
entropy->ct = -1; /* magnitude overflow */
|
entropy->ct = -1; /* magnitude overflow */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -612,7 +613,7 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
st = entropy->ac_stats[tbl] +
|
st = entropy->ac_stats[tbl] +
|
||||||
(k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
|
(k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
|
||||||
while (arith_decode(cinfo, st)) {
|
while (arith_decode(cinfo, st)) {
|
||||||
if ((m <<= 1) == 0x8000) {
|
if ((m <<= 1) == (int) 0x8000U) {
|
||||||
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
entropy->ct = -1; /* magnitude overflow */
|
entropy->ct = -1; /* magnitude overflow */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -766,9 +767,8 @@ jinit_arith_decoder (j_decompress_ptr cinfo)
|
|||||||
arith_entropy_ptr entropy;
|
arith_entropy_ptr entropy;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
entropy = (arith_entropy_ptr)
|
entropy = (arith_entropy_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(arith_entropy_decoder));
|
||||||
SIZEOF(arith_entropy_decoder));
|
|
||||||
cinfo->entropy = &entropy->pub;
|
cinfo->entropy = &entropy->pub;
|
||||||
entropy->pub.start_pass = start_pass;
|
entropy->pub.start_pass = start_pass;
|
||||||
entropy->pub.finish_pass = finish_pass;
|
entropy->pub.finish_pass = finish_pass;
|
||||||
@ -785,9 +785,9 @@ jinit_arith_decoder (j_decompress_ptr cinfo)
|
|||||||
if (cinfo->progressive_mode) {
|
if (cinfo->progressive_mode) {
|
||||||
/* Create progression status table */
|
/* Create progression status table */
|
||||||
int *coef_bit_ptr, ci;
|
int *coef_bit_ptr, ci;
|
||||||
cinfo->coef_bits = (int (*)[DCTSIZE2])
|
cinfo->coef_bits = (int (*)[DCTSIZE2]) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
cinfo->num_components*DCTSIZE2*SIZEOF(int));
|
cinfo->num_components * DCTSIZE2 * SIZEOF(int));
|
||||||
coef_bit_ptr = & cinfo->coef_bits[0][0];
|
coef_bit_ptr = & cinfo->coef_bits[0][0];
|
||||||
for (ci = 0; ci < cinfo->num_components; ci++)
|
for (ci = 0; ci < cinfo->num_components; ci++)
|
||||||
for (i = 0; i < DCTSIZE2; i++)
|
for (i = 0; i < DCTSIZE2; i++)
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* jdatadst.c
|
* jdatadst.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* Modified 2009-2017 by Guido Vollbeding.
|
* Modified 2009-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -46,7 +46,7 @@ typedef struct {
|
|||||||
struct jpeg_destination_mgr pub; /* public fields */
|
struct jpeg_destination_mgr pub; /* public fields */
|
||||||
|
|
||||||
unsigned char ** outbuffer; /* target buffer */
|
unsigned char ** outbuffer; /* target buffer */
|
||||||
unsigned long * outsize;
|
size_t * outsize;
|
||||||
unsigned char * newbuffer; /* newly allocated buffer */
|
unsigned char * newbuffer; /* newly allocated buffer */
|
||||||
JOCTET * buffer; /* start of buffer */
|
JOCTET * buffer; /* start of buffer */
|
||||||
size_t bufsize;
|
size_t bufsize;
|
||||||
@ -66,9 +66,8 @@ init_destination (j_compress_ptr cinfo)
|
|||||||
my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
|
my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
|
||||||
|
|
||||||
/* Allocate the output buffer --- it will be released when done with image */
|
/* Allocate the output buffer --- it will be released when done with image */
|
||||||
dest->buffer = (JOCTET *)
|
dest->buffer = (JOCTET *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, OUTPUT_BUF_SIZE * SIZEOF(JOCTET));
|
||||||
OUTPUT_BUF_SIZE * SIZEOF(JOCTET));
|
|
||||||
|
|
||||||
dest->pub.next_output_byte = dest->buffer;
|
dest->pub.next_output_byte = dest->buffer;
|
||||||
dest->pub.free_in_buffer = OUTPUT_BUF_SIZE;
|
dest->pub.free_in_buffer = OUTPUT_BUF_SIZE;
|
||||||
@ -131,7 +130,7 @@ empty_mem_output_buffer (j_compress_ptr cinfo)
|
|||||||
nextbuffer = (JOCTET *) malloc(nextsize);
|
nextbuffer = (JOCTET *) malloc(nextsize);
|
||||||
|
|
||||||
if (nextbuffer == NULL)
|
if (nextbuffer == NULL)
|
||||||
ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
|
ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 11);
|
||||||
|
|
||||||
MEMCOPY(nextbuffer, dest->buffer, dest->bufsize);
|
MEMCOPY(nextbuffer, dest->buffer, dest->bufsize);
|
||||||
|
|
||||||
@ -204,9 +203,8 @@ jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)
|
|||||||
* sizes may be different. Caveat programmer.
|
* sizes may be different. Caveat programmer.
|
||||||
*/
|
*/
|
||||||
if (cinfo->dest == NULL) { /* first time for this JPEG object? */
|
if (cinfo->dest == NULL) { /* first time for this JPEG object? */
|
||||||
cinfo->dest = (struct jpeg_destination_mgr *)
|
cinfo->dest = (struct jpeg_destination_mgr *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
((j_common_ptr) cinfo, JPOOL_PERMANENT, SIZEOF(my_destination_mgr));
|
||||||
SIZEOF(my_destination_mgr));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dest = (my_dest_ptr) cinfo->dest;
|
dest = (my_dest_ptr) cinfo->dest;
|
||||||
@ -233,7 +231,7 @@ jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)
|
|||||||
|
|
||||||
GLOBAL(void)
|
GLOBAL(void)
|
||||||
jpeg_mem_dest (j_compress_ptr cinfo,
|
jpeg_mem_dest (j_compress_ptr cinfo,
|
||||||
unsigned char ** outbuffer, unsigned long * outsize)
|
unsigned char ** outbuffer, size_t * outsize)
|
||||||
{
|
{
|
||||||
my_mem_dest_ptr dest;
|
my_mem_dest_ptr dest;
|
||||||
|
|
||||||
@ -244,9 +242,8 @@ jpeg_mem_dest (j_compress_ptr cinfo,
|
|||||||
* can be written to the same buffer without re-executing jpeg_mem_dest.
|
* can be written to the same buffer without re-executing jpeg_mem_dest.
|
||||||
*/
|
*/
|
||||||
if (cinfo->dest == NULL) { /* first time for this JPEG object? */
|
if (cinfo->dest == NULL) { /* first time for this JPEG object? */
|
||||||
cinfo->dest = (struct jpeg_destination_mgr *)
|
cinfo->dest = (struct jpeg_destination_mgr *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
((j_common_ptr) cinfo, JPOOL_PERMANENT, SIZEOF(my_mem_destination_mgr));
|
||||||
SIZEOF(my_mem_destination_mgr));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dest = (my_mem_dest_ptr) cinfo->dest;
|
dest = (my_mem_dest_ptr) cinfo->dest;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* jdatasrc.c
|
* jdatasrc.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* Modified 2009-2015 by Guido Vollbeding.
|
* Modified 2009-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -156,21 +156,23 @@ METHODDEF(void)
|
|||||||
skip_input_data (j_decompress_ptr cinfo, long num_bytes)
|
skip_input_data (j_decompress_ptr cinfo, long num_bytes)
|
||||||
{
|
{
|
||||||
struct jpeg_source_mgr * src = cinfo->src;
|
struct jpeg_source_mgr * src = cinfo->src;
|
||||||
|
size_t nbytes;
|
||||||
|
|
||||||
/* Just a dumb implementation for now. Could use fseek() except
|
/* Just a dumb implementation for now. Could use fseek() except
|
||||||
* it doesn't work on pipes. Not clear that being smart is worth
|
* it doesn't work on pipes. Not clear that being smart is worth
|
||||||
* any trouble anyway --- large skips are infrequent.
|
* any trouble anyway --- large skips are infrequent.
|
||||||
*/
|
*/
|
||||||
if (num_bytes > 0) {
|
if (num_bytes > 0) {
|
||||||
while (num_bytes > (long) src->bytes_in_buffer) {
|
nbytes = (size_t) num_bytes;
|
||||||
num_bytes -= (long) src->bytes_in_buffer;
|
while (nbytes > src->bytes_in_buffer) {
|
||||||
|
nbytes -= src->bytes_in_buffer;
|
||||||
(void) (*src->fill_input_buffer) (cinfo);
|
(void) (*src->fill_input_buffer) (cinfo);
|
||||||
/* note we assume that fill_input_buffer will never return FALSE,
|
/* note we assume that fill_input_buffer will never return FALSE,
|
||||||
* so suspension need not be handled.
|
* so suspension need not be handled.
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
src->next_input_byte += (size_t) num_bytes;
|
src->next_input_byte += nbytes;
|
||||||
src->bytes_in_buffer -= (size_t) num_bytes;
|
src->bytes_in_buffer -= nbytes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -219,13 +221,11 @@ jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile)
|
|||||||
* manager serially with the same JPEG object. Caveat programmer.
|
* manager serially with the same JPEG object. Caveat programmer.
|
||||||
*/
|
*/
|
||||||
if (cinfo->src == NULL) { /* first time for this JPEG object? */
|
if (cinfo->src == NULL) { /* first time for this JPEG object? */
|
||||||
cinfo->src = (struct jpeg_source_mgr *)
|
cinfo->src = (struct jpeg_source_mgr *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
((j_common_ptr) cinfo, JPOOL_PERMANENT, SIZEOF(my_source_mgr));
|
||||||
SIZEOF(my_source_mgr));
|
|
||||||
src = (my_src_ptr) cinfo->src;
|
src = (my_src_ptr) cinfo->src;
|
||||||
src->buffer = (JOCTET *)
|
src->buffer = (JOCTET *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
((j_common_ptr) cinfo, JPOOL_PERMANENT, INPUT_BUF_SIZE * SIZEOF(JOCTET));
|
||||||
INPUT_BUF_SIZE * SIZEOF(JOCTET));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
src = (my_src_ptr) cinfo->src;
|
src = (my_src_ptr) cinfo->src;
|
||||||
@ -247,7 +247,7 @@ jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile)
|
|||||||
|
|
||||||
GLOBAL(void)
|
GLOBAL(void)
|
||||||
jpeg_mem_src (j_decompress_ptr cinfo,
|
jpeg_mem_src (j_decompress_ptr cinfo,
|
||||||
const unsigned char * inbuffer, unsigned long insize)
|
const unsigned char * inbuffer, size_t insize)
|
||||||
{
|
{
|
||||||
struct jpeg_source_mgr * src;
|
struct jpeg_source_mgr * src;
|
||||||
|
|
||||||
@ -259,9 +259,8 @@ jpeg_mem_src (j_decompress_ptr cinfo,
|
|||||||
* the first one.
|
* the first one.
|
||||||
*/
|
*/
|
||||||
if (cinfo->src == NULL) { /* first time for this JPEG object? */
|
if (cinfo->src == NULL) { /* first time for this JPEG object? */
|
||||||
cinfo->src = (struct jpeg_source_mgr *)
|
cinfo->src = (struct jpeg_source_mgr *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
((j_common_ptr) cinfo, JPOOL_PERMANENT, SIZEOF(struct jpeg_source_mgr));
|
||||||
SIZEOF(struct jpeg_source_mgr));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
src = cinfo->src;
|
src = cinfo->src;
|
||||||
@ -270,6 +269,6 @@ jpeg_mem_src (j_decompress_ptr cinfo,
|
|||||||
src->skip_input_data = skip_input_data;
|
src->skip_input_data = skip_input_data;
|
||||||
src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
|
src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
|
||||||
src->term_source = term_source;
|
src->term_source = term_source;
|
||||||
src->bytes_in_buffer = (size_t) insize;
|
src->bytes_in_buffer = insize;
|
||||||
src->next_input_byte = (const JOCTET *) inbuffer;
|
src->next_input_byte = (const JOCTET *) inbuffer;
|
||||||
}
|
}
|
||||||
|
130
jpeg/jdcolor.c
130
jpeg/jdcolor.c
@ -2,7 +2,7 @@
|
|||||||
* jdcolor.c
|
* jdcolor.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2011-2017 by Guido Vollbeding.
|
* Modified 2011-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -124,28 +124,22 @@ build_ycc_rgb_table (j_decompress_ptr cinfo)
|
|||||||
INT32 x;
|
INT32 x;
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
|
||||||
cconvert->Cr_r_tab = (int *)
|
cconvert->Cr_r_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
cconvert->Cb_b_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
cconvert->Cb_b_tab = (int *)
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
cconvert->Cr_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
cconvert->Cr_g_tab = (INT32 *)
|
cconvert->Cb_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
cconvert->Cb_g_tab = (INT32 *)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
|
|
||||||
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
||||||
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
||||||
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
||||||
/* Cr=>R value is nearest int to 1.402 * x */
|
/* Cr=>R value is nearest int to 1.402 * x */
|
||||||
cconvert->Cr_r_tab[i] = (int)
|
cconvert->Cr_r_tab[i] = (int) DESCALE(FIX(1.402) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(1.402) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cb=>B value is nearest int to 1.772 * x */
|
/* Cb=>B value is nearest int to 1.772 * x */
|
||||||
cconvert->Cb_b_tab[i] = (int)
|
cconvert->Cb_b_tab[i] = (int) DESCALE(FIX(1.772) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(1.772) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cr=>G value is scaled-up -0.714136286 * x */
|
/* Cr=>G value is scaled-up -0.714136286 * x */
|
||||||
cconvert->Cr_g_tab[i] = (- FIX(0.714136286)) * x;
|
cconvert->Cr_g_tab[i] = (- FIX(0.714136286)) * x;
|
||||||
/* Cb=>G value is scaled-up -0.344136286 * x */
|
/* Cb=>G value is scaled-up -0.344136286 * x */
|
||||||
@ -164,28 +158,22 @@ build_bg_ycc_rgb_table (j_decompress_ptr cinfo)
|
|||||||
INT32 x;
|
INT32 x;
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
|
||||||
cconvert->Cr_r_tab = (int *)
|
cconvert->Cr_r_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
cconvert->Cb_b_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
cconvert->Cb_b_tab = (int *)
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
cconvert->Cr_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
cconvert->Cr_g_tab = (INT32 *)
|
cconvert->Cb_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
cconvert->Cb_g_tab = (INT32 *)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
|
|
||||||
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
||||||
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
||||||
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
||||||
/* Cr=>R value is nearest int to 2.804 * x */
|
/* Cr=>R value is nearest int to 2.804 * x */
|
||||||
cconvert->Cr_r_tab[i] = (int)
|
cconvert->Cr_r_tab[i] = (int) DESCALE(FIX(2.804) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(2.804) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cb=>B value is nearest int to 3.544 * x */
|
/* Cb=>B value is nearest int to 3.544 * x */
|
||||||
cconvert->Cb_b_tab[i] = (int)
|
cconvert->Cb_b_tab[i] = (int) DESCALE(FIX(3.544) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(3.544) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cr=>G value is scaled-up -1.428272572 * x */
|
/* Cr=>G value is scaled-up -1.428272572 * x */
|
||||||
cconvert->Cr_g_tab[i] = (- FIX(1.428272572)) * x;
|
cconvert->Cr_g_tab[i] = (- FIX(1.428272572)) * x;
|
||||||
/* Cb=>G value is scaled-up -0.688272572 * x */
|
/* Cb=>G value is scaled-up -0.688272572 * x */
|
||||||
@ -201,6 +189,7 @@ build_bg_ycc_rgb_table (j_decompress_ptr cinfo)
|
|||||||
* Note that we change from noninterleaved, one-plane-per-component format
|
* Note that we change from noninterleaved, one-plane-per-component format
|
||||||
* to interleaved-pixel format. The output buffer is therefore three times
|
* to interleaved-pixel format. The output buffer is therefore three times
|
||||||
* as wide as the input buffer.
|
* as wide as the input buffer.
|
||||||
|
*
|
||||||
* A starting row offset is provided only for the input buffer. The caller
|
* A starting row offset is provided only for the input buffer. The caller
|
||||||
* can easily adjust the passed output_buf value to accommodate any row
|
* can easily adjust the passed output_buf value to accommodate any row
|
||||||
* offset required on that side.
|
* offset required on that side.
|
||||||
@ -264,9 +253,8 @@ build_rgb_y_table (j_decompress_ptr cinfo)
|
|||||||
INT32 i;
|
INT32 i;
|
||||||
|
|
||||||
/* Allocate and fill in the conversion tables. */
|
/* Allocate and fill in the conversion tables. */
|
||||||
cconvert->rgb_y_tab = rgb_y_tab = (INT32 *)
|
cconvert->rgb_y_tab = rgb_y_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, TABLE_SIZE * SIZEOF(INT32));
|
||||||
(TABLE_SIZE * SIZEOF(INT32)));
|
|
||||||
|
|
||||||
for (i = 0; i <= MAXJSAMPLE; i++) {
|
for (i = 0; i <= MAXJSAMPLE; i++) {
|
||||||
rgb_y_tab[i+R_Y_OFF] = FIX(0.299) * i;
|
rgb_y_tab[i+R_Y_OFF] = FIX(0.299) * i;
|
||||||
@ -286,8 +274,8 @@ rgb_gray_convert (j_decompress_ptr cinfo,
|
|||||||
JSAMPARRAY output_buf, int num_rows)
|
JSAMPARRAY output_buf, int num_rows)
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
register INT32 * ctab = cconvert->rgb_y_tab;
|
|
||||||
register int r, g, b;
|
register int r, g, b;
|
||||||
|
register INT32 * ctab = cconvert->rgb_y_tab;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JSAMPROW inptr0, inptr1, inptr2;
|
register JSAMPROW inptr0, inptr1, inptr2;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
@ -313,6 +301,7 @@ rgb_gray_convert (j_decompress_ptr cinfo,
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
* Convert some rows of samples to the output colorspace.
|
||||||
* [R-G,G,B-G] to [R,G,B] conversion with modulo calculation
|
* [R-G,G,B-G] to [R,G,B] conversion with modulo calculation
|
||||||
* (inverse color transform).
|
* (inverse color transform).
|
||||||
* This can be seen as an adaption of the general YCbCr->RGB
|
* This can be seen as an adaption of the general YCbCr->RGB
|
||||||
@ -364,8 +353,8 @@ rgb1_gray_convert (j_decompress_ptr cinfo,
|
|||||||
JSAMPARRAY output_buf, int num_rows)
|
JSAMPARRAY output_buf, int num_rows)
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
register INT32 * ctab = cconvert->rgb_y_tab;
|
|
||||||
register int r, g, b;
|
register int r, g, b;
|
||||||
|
register INT32 * ctab = cconvert->rgb_y_tab;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JSAMPROW inptr0, inptr1, inptr2;
|
register JSAMPROW inptr0, inptr1, inptr2;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
@ -396,6 +385,7 @@ rgb1_gray_convert (j_decompress_ptr cinfo,
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
* Convert some rows of samples to the output colorspace.
|
||||||
* No colorspace change, but conversion from separate-planes
|
* No colorspace change, but conversion from separate-planes
|
||||||
* to interleaved representation.
|
* to interleaved representation.
|
||||||
*/
|
*/
|
||||||
@ -430,6 +420,7 @@ rgb_convert (j_decompress_ptr cinfo,
|
|||||||
/*
|
/*
|
||||||
* Color conversion for no colorspace change: just copy the data,
|
* Color conversion for no colorspace change: just copy the data,
|
||||||
* converting from separate-planes to interleaved representation.
|
* converting from separate-planes to interleaved representation.
|
||||||
|
* We assume out_color_components == num_components.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
@ -437,20 +428,21 @@ null_convert (j_decompress_ptr cinfo,
|
|||||||
JSAMPIMAGE input_buf, JDIMENSION input_row,
|
JSAMPIMAGE input_buf, JDIMENSION input_row,
|
||||||
JSAMPARRAY output_buf, int num_rows)
|
JSAMPARRAY output_buf, int num_rows)
|
||||||
{
|
{
|
||||||
int ci;
|
|
||||||
register int nc = cinfo->num_components;
|
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JDIMENSION col;
|
register JDIMENSION count;
|
||||||
|
register int num_comps = cinfo->num_components;
|
||||||
JDIMENSION num_cols = cinfo->output_width;
|
JDIMENSION num_cols = cinfo->output_width;
|
||||||
|
int ci;
|
||||||
|
|
||||||
while (--num_rows >= 0) {
|
while (--num_rows >= 0) {
|
||||||
for (ci = 0; ci < nc; ci++) {
|
/* It seems fastest to make a separate pass for each component. */
|
||||||
|
for (ci = 0; ci < num_comps; ci++) {
|
||||||
inptr = input_buf[ci][input_row];
|
inptr = input_buf[ci][input_row];
|
||||||
outptr = output_buf[0] + ci;
|
outptr = output_buf[0] + ci;
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (count = num_cols; count > 0; count--) {
|
||||||
*outptr = *inptr++; /* needn't bother with GETJSAMPLE() here */
|
*outptr = *inptr++; /* don't need GETJSAMPLE() here */
|
||||||
outptr += nc;
|
outptr += num_comps;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
input_row++;
|
input_row++;
|
||||||
@ -504,9 +496,10 @@ gray_rgb_convert (j_decompress_ptr cinfo,
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Adobe-style YCCK->CMYK conversion.
|
* Convert some rows of samples to the output colorspace.
|
||||||
* We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same
|
* This version handles Adobe-style YCCK->CMYK conversion,
|
||||||
* conversion as above, while passing K (black) unchanged.
|
* where we convert YCbCr to R=1-C, G=1-M, and B=1-Y using the
|
||||||
|
* same conversion as above, while passing K (black) unchanged.
|
||||||
* We assume build_ycc_rgb_table has been called.
|
* We assume build_ycc_rgb_table has been called.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -577,9 +570,8 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
|
|||||||
my_cconvert_ptr cconvert;
|
my_cconvert_ptr cconvert;
|
||||||
int ci;
|
int ci;
|
||||||
|
|
||||||
cconvert = (my_cconvert_ptr)
|
cconvert = (my_cconvert_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_color_deconverter));
|
||||||
SIZEOF(my_color_deconverter));
|
|
||||||
cinfo->cconvert = &cconvert->pub;
|
cinfo->cconvert = &cconvert->pub;
|
||||||
cconvert->pub.start_pass = start_pass_dcolor;
|
cconvert->pub.start_pass = start_pass_dcolor;
|
||||||
|
|
||||||
@ -607,7 +599,6 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
|
|||||||
default: /* JCS_UNKNOWN can be anything */
|
default: /* JCS_UNKNOWN can be anything */
|
||||||
if (cinfo->num_components < 1)
|
if (cinfo->num_components < 1)
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Support color transform only for RGB colorspaces */
|
/* Support color transform only for RGB colorspaces */
|
||||||
@ -684,19 +675,18 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
|
|||||||
|
|
||||||
case JCS_BG_RGB:
|
case JCS_BG_RGB:
|
||||||
cinfo->out_color_components = RGB_PIXELSIZE;
|
cinfo->out_color_components = RGB_PIXELSIZE;
|
||||||
if (cinfo->jpeg_color_space == JCS_BG_RGB) {
|
if (cinfo->jpeg_color_space != JCS_BG_RGB)
|
||||||
switch (cinfo->color_transform) {
|
|
||||||
case JCT_NONE:
|
|
||||||
cconvert->pub.color_convert = rgb_convert;
|
|
||||||
break;
|
|
||||||
case JCT_SUBTRACT_GREEN:
|
|
||||||
cconvert->pub.color_convert = rgb1_rgb_convert;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
switch (cinfo->color_transform) {
|
||||||
|
case JCT_NONE:
|
||||||
|
cconvert->pub.color_convert = rgb_convert;
|
||||||
|
break;
|
||||||
|
case JCT_SUBTRACT_GREEN:
|
||||||
|
cconvert->pub.color_convert = rgb1_rgb_convert;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JCS_CMYK:
|
case JCS_CMYK:
|
||||||
@ -714,14 +704,12 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default: /* permit null conversion to same output space */
|
||||||
/* Permit null conversion to same output space */
|
if (cinfo->out_color_space != cinfo->jpeg_color_space)
|
||||||
if (cinfo->out_color_space == cinfo->jpeg_color_space) {
|
/* unsupported non-null conversion */
|
||||||
cinfo->out_color_components = cinfo->num_components;
|
|
||||||
cconvert->pub.color_convert = null_convert;
|
|
||||||
} else /* unsupported non-null conversion */
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
break;
|
cinfo->out_color_components = cinfo->num_components;
|
||||||
|
cconvert->pub.color_convert = null_convert;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cinfo->quantize_colors)
|
if (cinfo->quantize_colors)
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* jdct.h
|
* jdct.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* Modified 2002-2017 by Guido Vollbeding.
|
* Modified 2002-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -358,13 +358,6 @@ EXTERN(void) jpeg_idct_1x2
|
|||||||
|
|
||||||
#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5))
|
#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5))
|
||||||
|
|
||||||
/* Descale and correctly round an INT32 value that's scaled by N bits.
|
|
||||||
* We assume RIGHT_SHIFT rounds towards minus infinity, so adding
|
|
||||||
* the fudge factor is correct for either sign of X.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)
|
|
||||||
|
|
||||||
/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
|
/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
|
||||||
* This macro is used only when the two inputs will actually be no more than
|
* This macro is used only when the two inputs will actually be no more than
|
||||||
* 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a
|
* 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a
|
||||||
|
106
jpeg/jdhuff.c
106
jpeg/jdhuff.c
@ -2,7 +2,7 @@
|
|||||||
* jdhuff.c
|
* jdhuff.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2006-2016 by Guido Vollbeding.
|
* Modified 2006-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -341,13 +341,12 @@ jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno,
|
|||||||
htbl =
|
htbl =
|
||||||
isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
|
isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
|
||||||
if (htbl == NULL)
|
if (htbl == NULL)
|
||||||
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
|
htbl = jpeg_std_huff_table((j_common_ptr) cinfo, isDC, tblno);
|
||||||
|
|
||||||
/* Allocate a workspace if we haven't already done so. */
|
/* Allocate a workspace if we haven't already done so. */
|
||||||
if (*pdtbl == NULL)
|
if (*pdtbl == NULL)
|
||||||
*pdtbl = (d_derived_tbl *)
|
*pdtbl = (d_derived_tbl *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(d_derived_tbl));
|
||||||
SIZEOF(d_derived_tbl));
|
|
||||||
dtbl = *pdtbl;
|
dtbl = *pdtbl;
|
||||||
dtbl->pub = htbl; /* fill in back link */
|
dtbl->pub = htbl; /* fill in back link */
|
||||||
|
|
||||||
@ -706,7 +705,7 @@ process_restart (j_decompress_ptr cinfo)
|
|||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
int Al = cinfo->Al;
|
int Al = cinfo->Al;
|
||||||
register int s, r;
|
register int s, r;
|
||||||
@ -730,7 +729,7 @@ decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
if (! entropy->insufficient_data) {
|
if (! entropy->insufficient_data) {
|
||||||
|
|
||||||
/* Load up working state */
|
/* Load up working state */
|
||||||
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
|
BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
|
||||||
ASSIGN_STATE(state, entropy->saved);
|
ASSIGN_STATE(state, entropy->saved);
|
||||||
|
|
||||||
/* Outer loop handles each block in the MCU */
|
/* Outer loop handles each block in the MCU */
|
||||||
@ -759,12 +758,13 @@ decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Completed MCU, so update state */
|
/* Completed MCU, so update state */
|
||||||
BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
|
BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
|
||||||
ASSIGN_STATE(entropy->saved, state);
|
ASSIGN_STATE(entropy->saved, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval if using restarts */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -777,7 +777,7 @@ decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
register int s, k, r;
|
register int s, k, r;
|
||||||
unsigned int EOBRUN;
|
unsigned int EOBRUN;
|
||||||
@ -809,7 +809,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
if (EOBRUN) /* if it's a band of zeroes... */
|
if (EOBRUN) /* if it's a band of zeroes... */
|
||||||
EOBRUN--; /* ...process it now (we do nothing) */
|
EOBRUN--; /* ...process it now (we do nothing) */
|
||||||
else {
|
else {
|
||||||
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
|
BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
|
||||||
Se = cinfo->Se;
|
Se = cinfo->Se;
|
||||||
Al = cinfo->Al;
|
Al = cinfo->Al;
|
||||||
natural_order = cinfo->natural_order;
|
natural_order = cinfo->natural_order;
|
||||||
@ -842,15 +842,16 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
|
BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Completed MCU, so update state */
|
/* Completed MCU, so update state */
|
||||||
entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
|
entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval if using restarts */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -864,9 +865,10 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
int p1, blkn;
|
JCOEF p1;
|
||||||
|
int blkn;
|
||||||
BITREAD_STATE_VARS;
|
BITREAD_STATE_VARS;
|
||||||
|
|
||||||
/* Process restart marker if needed; may have to suspend */
|
/* Process restart marker if needed; may have to suspend */
|
||||||
@ -881,7 +883,7 @@ decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Load up working state */
|
/* Load up working state */
|
||||||
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
|
BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
|
||||||
|
|
||||||
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
||||||
|
|
||||||
@ -896,10 +898,11 @@ decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Completed MCU, so update state */
|
/* Completed MCU, so update state */
|
||||||
BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
|
BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval if using restarts */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -911,11 +914,12 @@ decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
register int s, k, r;
|
register int s, k, r;
|
||||||
unsigned int EOBRUN;
|
unsigned int EOBRUN;
|
||||||
int Se, p1, m1;
|
int Se;
|
||||||
|
JCOEF p1, m1;
|
||||||
const int * natural_order;
|
const int * natural_order;
|
||||||
JBLOCKROW block;
|
JBLOCKROW block;
|
||||||
JCOEFPTR thiscoef;
|
JCOEFPTR thiscoef;
|
||||||
@ -937,11 +941,11 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
|
|
||||||
Se = cinfo->Se;
|
Se = cinfo->Se;
|
||||||
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
||||||
m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */
|
m1 = -p1; /* -1 in the bit position being coded */
|
||||||
natural_order = cinfo->natural_order;
|
natural_order = cinfo->natural_order;
|
||||||
|
|
||||||
/* Load up working state */
|
/* Load up working state */
|
||||||
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
|
BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
|
||||||
EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */
|
EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */
|
||||||
|
|
||||||
/* There is always only one block per MCU */
|
/* There is always only one block per MCU */
|
||||||
@ -1043,12 +1047,13 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Completed MCU, so update state */
|
/* Completed MCU, so update state */
|
||||||
BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
|
BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
|
||||||
entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
|
entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval if using restarts */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
@ -1091,7 +1096,7 @@ decode_mcu_sub (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
Se = cinfo->lim_Se;
|
Se = cinfo->lim_Se;
|
||||||
|
|
||||||
/* Load up working state */
|
/* Load up working state */
|
||||||
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
|
BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
|
||||||
ASSIGN_STATE(state, entropy->saved);
|
ASSIGN_STATE(state, entropy->saved);
|
||||||
|
|
||||||
/* Outer loop handles each block in the MCU */
|
/* Outer loop handles each block in the MCU */
|
||||||
@ -1178,12 +1183,13 @@ decode_mcu_sub (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Completed MCU, so update state */
|
/* Completed MCU, so update state */
|
||||||
BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
|
BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
|
||||||
ASSIGN_STATE(entropy->saved, state);
|
ASSIGN_STATE(entropy->saved, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval if using restarts */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -1215,7 +1221,7 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
if (! entropy->insufficient_data) {
|
if (! entropy->insufficient_data) {
|
||||||
|
|
||||||
/* Load up working state */
|
/* Load up working state */
|
||||||
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
|
BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
|
||||||
ASSIGN_STATE(state, entropy->saved);
|
ASSIGN_STATE(state, entropy->saved);
|
||||||
|
|
||||||
/* Outer loop handles each block in the MCU */
|
/* Outer loop handles each block in the MCU */
|
||||||
@ -1302,12 +1308,13 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Completed MCU, so update state */
|
/* Completed MCU, so update state */
|
||||||
BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
|
BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
|
||||||
ASSIGN_STATE(entropy->saved, state);
|
ASSIGN_STATE(entropy->saved, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval if using restarts */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -1343,11 +1350,11 @@ start_pass_huff_decoder (j_decompress_ptr cinfo)
|
|||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
if (cinfo->Al > 13) { /* need not check for < 0 */
|
if (cinfo->Al > 13) { /* need not check for < 0 */
|
||||||
/* Arguably the maximum Al value should be less than 13 for 8-bit precision,
|
/* Arguably the maximum Al value should be less than 13 for 8-bit
|
||||||
* but the spec doesn't say so, and we try to be liberal about what we
|
* precision, but the spec doesn't say so, and we try to be liberal
|
||||||
* accept. Note: large Al values could result in out-of-range DC
|
* about what we accept. Note: large Al values could result in
|
||||||
* coefficients during early scans, leading to bizarre displays due to
|
* out-of-range DC coefficients during early scans, leading to bizarre
|
||||||
* overflows in the IDCT math. But we won't crash.
|
* displays due to overflows in the IDCT math. But we won't crash.
|
||||||
*/
|
*/
|
||||||
bad:
|
bad:
|
||||||
ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
|
ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
|
||||||
@ -1451,7 +1458,8 @@ start_pass_huff_decoder (j_decompress_ptr cinfo)
|
|||||||
compptr = cinfo->cur_comp_info[ci];
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
/* Precalculate which table to use for each block */
|
/* Precalculate which table to use for each block */
|
||||||
entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no];
|
entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no];
|
||||||
entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no];
|
entropy->ac_cur_tbls[blkn] = /* AC needs no table when not present */
|
||||||
|
cinfo->lim_Se ? entropy->ac_derived_tbls[compptr->ac_tbl_no] : NULL;
|
||||||
/* Decide whether we really care about the coefficient values */
|
/* Decide whether we really care about the coefficient values */
|
||||||
if (compptr->component_needed) {
|
if (compptr->component_needed) {
|
||||||
ci = compptr->DCT_v_scaled_size;
|
ci = compptr->DCT_v_scaled_size;
|
||||||
@ -1494,7 +1502,6 @@ start_pass_huff_decoder (j_decompress_ptr cinfo)
|
|||||||
if (ci <= 0 || ci > 8) ci = 8;
|
if (ci <= 0 || ci > 8) ci = 8;
|
||||||
if (i <= 0 || i > 8) i = 8;
|
if (i <= 0 || i > 8) i = 8;
|
||||||
entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order[ci - 1][i - 1];
|
entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order[ci - 1][i - 1];
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
entropy->coef_limit[blkn] = 0;
|
entropy->coef_limit[blkn] = 0;
|
||||||
@ -1522,9 +1529,8 @@ jinit_huff_decoder (j_decompress_ptr cinfo)
|
|||||||
huff_entropy_ptr entropy;
|
huff_entropy_ptr entropy;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
entropy = (huff_entropy_ptr)
|
entropy = (huff_entropy_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(huff_entropy_decoder));
|
||||||
SIZEOF(huff_entropy_decoder));
|
|
||||||
cinfo->entropy = &entropy->pub;
|
cinfo->entropy = &entropy->pub;
|
||||||
entropy->pub.start_pass = start_pass_huff_decoder;
|
entropy->pub.start_pass = start_pass_huff_decoder;
|
||||||
entropy->pub.finish_pass = finish_pass_huff;
|
entropy->pub.finish_pass = finish_pass_huff;
|
||||||
@ -1532,9 +1538,9 @@ jinit_huff_decoder (j_decompress_ptr cinfo)
|
|||||||
if (cinfo->progressive_mode) {
|
if (cinfo->progressive_mode) {
|
||||||
/* Create progression status table */
|
/* Create progression status table */
|
||||||
int *coef_bit_ptr, ci;
|
int *coef_bit_ptr, ci;
|
||||||
cinfo->coef_bits = (int (*)[DCTSIZE2])
|
cinfo->coef_bits = (int (*)[DCTSIZE2]) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
cinfo->num_components*DCTSIZE2*SIZEOF(int));
|
cinfo->num_components * DCTSIZE2 * SIZEOF(int));
|
||||||
coef_bit_ptr = & cinfo->coef_bits[0][0];
|
coef_bit_ptr = & cinfo->coef_bits[0][0];
|
||||||
for (ci = 0; ci < cinfo->num_components; ci++)
|
for (ci = 0; ci < cinfo->num_components; ci++)
|
||||||
for (i = 0; i < DCTSIZE2; i++)
|
for (i = 0; i < DCTSIZE2; i++)
|
||||||
@ -1545,7 +1551,7 @@ jinit_huff_decoder (j_decompress_ptr cinfo)
|
|||||||
entropy->derived_tbls[i] = NULL;
|
entropy->derived_tbls[i] = NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Mark tables unallocated */
|
/* Mark derived tables unallocated */
|
||||||
for (i = 0; i < NUM_HUFF_TBLS; i++) {
|
for (i = 0; i < NUM_HUFF_TBLS; i++) {
|
||||||
entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
|
entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* jdmarker.c
|
* jdmarker.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2009-2013 by Guido Vollbeding.
|
* Modified 2009-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -496,8 +496,6 @@ get_dht (j_decompress_ptr cinfo)
|
|||||||
if (count > 256 || ((INT32) count) > length)
|
if (count > 256 || ((INT32) count) > length)
|
||||||
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
|
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
|
||||||
|
|
||||||
MEMZERO(huffval, SIZEOF(huffval)); /* pre-zero array for later copy */
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
INPUT_BYTE(cinfo, huffval[i], return FALSE);
|
INPUT_BYTE(cinfo, huffval[i], return FALSE);
|
||||||
|
|
||||||
@ -517,7 +515,8 @@ get_dht (j_decompress_ptr cinfo)
|
|||||||
*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
|
*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
|
||||||
|
|
||||||
MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
|
MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
|
||||||
MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval));
|
if (count > 0)
|
||||||
|
MEMCOPY((*htblptr)->huffval, huffval, count * SIZEOF(UINT8));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length != 0)
|
if (length != 0)
|
||||||
@ -577,14 +576,14 @@ get_dqt (j_decompress_ptr cinfo)
|
|||||||
count = DCTSIZE2;
|
count = DCTSIZE2;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (count) {
|
switch ((int) count) {
|
||||||
case (2*2): natural_order = jpeg_natural_order2; break;
|
case (2*2): natural_order = jpeg_natural_order2; break;
|
||||||
case (3*3): natural_order = jpeg_natural_order3; break;
|
case (3*3): natural_order = jpeg_natural_order3; break;
|
||||||
case (4*4): natural_order = jpeg_natural_order4; break;
|
case (4*4): natural_order = jpeg_natural_order4; break;
|
||||||
case (5*5): natural_order = jpeg_natural_order5; break;
|
case (5*5): natural_order = jpeg_natural_order5; break;
|
||||||
case (6*6): natural_order = jpeg_natural_order6; break;
|
case (6*6): natural_order = jpeg_natural_order6; break;
|
||||||
case (7*7): natural_order = jpeg_natural_order7; break;
|
case (7*7): natural_order = jpeg_natural_order7; break;
|
||||||
default: natural_order = jpeg_natural_order; break;
|
default: natural_order = jpeg_natural_order;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
@ -784,7 +783,6 @@ examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data,
|
|||||||
default:
|
default:
|
||||||
TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,
|
TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,
|
||||||
GETJOCTET(data[5]), (int) totallen);
|
GETJOCTET(data[5]), (int) totallen);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Start of APP0 does not match "JFIF" or "JFXX", or too short */
|
/* Start of APP0 does not match "JFIF" or "JFXX", or too short */
|
||||||
@ -858,7 +856,6 @@ get_interesting_appn (j_decompress_ptr cinfo)
|
|||||||
default:
|
default:
|
||||||
/* can't get here unless jpeg_save_markers chooses wrong processor */
|
/* can't get here unless jpeg_save_markers chooses wrong processor */
|
||||||
ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
|
ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* skip any remaining data -- could be lots */
|
/* skip any remaining data -- could be lots */
|
||||||
@ -964,7 +961,6 @@ save_marker (j_decompress_ptr cinfo)
|
|||||||
default:
|
default:
|
||||||
TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,
|
TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,
|
||||||
(int) (data_length + length));
|
(int) (data_length + length));
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* skip any remaining data -- could be lots */
|
/* skip any remaining data -- could be lots */
|
||||||
@ -1240,7 +1236,6 @@ read_markers (j_decompress_ptr cinfo)
|
|||||||
* ought to change!
|
* ought to change!
|
||||||
*/
|
*/
|
||||||
ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
|
ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
/* Successfully processed marker, so reset state variable */
|
/* Successfully processed marker, so reset state variable */
|
||||||
cinfo->unread_marker = 0;
|
cinfo->unread_marker = 0;
|
||||||
@ -1416,9 +1411,8 @@ jinit_marker_reader (j_decompress_ptr cinfo)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Create subobject in permanent pool */
|
/* Create subobject in permanent pool */
|
||||||
marker = (my_marker_ptr)
|
marker = (my_marker_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
((j_common_ptr) cinfo, JPOOL_PERMANENT, SIZEOF(my_marker_reader));
|
||||||
SIZEOF(my_marker_reader));
|
|
||||||
cinfo->marker = &marker->pub;
|
cinfo->marker = &marker->pub;
|
||||||
/* Initialize public method pointers */
|
/* Initialize public method pointers */
|
||||||
marker->pub.reset_marker_reader = reset_marker_reader;
|
marker->pub.reset_marker_reader = reset_marker_reader;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* jdmaster.c
|
* jdmaster.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2002-2017 by Guido Vollbeding.
|
* Modified 2002-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -104,7 +104,7 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
|
|||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
#ifdef IDCT_SCALING_SUPPORTED
|
#ifdef IDCT_SCALING_SUPPORTED
|
||||||
int ci;
|
int ci, ssize;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -124,19 +124,23 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
|
|||||||
*/
|
*/
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
||||||
ci++, compptr++) {
|
ci++, compptr++) {
|
||||||
int ssize = 1;
|
ssize = 1;
|
||||||
while (cinfo->min_DCT_h_scaled_size * ssize <=
|
if (! cinfo->raw_data_out)
|
||||||
(cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) &&
|
while (cinfo->min_DCT_h_scaled_size * ssize <=
|
||||||
(cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) {
|
(cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) &&
|
||||||
ssize = ssize * 2;
|
(cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) ==
|
||||||
}
|
0) {
|
||||||
|
ssize = ssize * 2;
|
||||||
|
}
|
||||||
compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize;
|
compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize;
|
||||||
ssize = 1;
|
ssize = 1;
|
||||||
while (cinfo->min_DCT_v_scaled_size * ssize <=
|
if (! cinfo->raw_data_out)
|
||||||
(cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) &&
|
while (cinfo->min_DCT_v_scaled_size * ssize <=
|
||||||
(cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) {
|
(cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) &&
|
||||||
ssize = ssize * 2;
|
(cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) ==
|
||||||
}
|
0) {
|
||||||
|
ssize = ssize * 2;
|
||||||
|
}
|
||||||
compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize;
|
compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize;
|
||||||
|
|
||||||
/* We don't support IDCT ratios larger than 2. */
|
/* We don't support IDCT ratios larger than 2. */
|
||||||
@ -144,13 +148,10 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
|
|||||||
compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2;
|
compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2;
|
||||||
else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2)
|
else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2)
|
||||||
compptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2;
|
compptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2;
|
||||||
}
|
|
||||||
|
|
||||||
/* Recompute downsampled dimensions of components;
|
/* Recompute downsampled dimensions of components;
|
||||||
* application needs to know these if using raw downsampled data.
|
* application needs to know these if using raw downsampled data.
|
||||||
*/
|
*/
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
|
||||||
ci++, compptr++) {
|
|
||||||
/* Size in samples, after IDCT scaling */
|
/* Size in samples, after IDCT scaling */
|
||||||
compptr->downsampled_width = (JDIMENSION)
|
compptr->downsampled_width = (JDIMENSION)
|
||||||
jdiv_round_up((long) cinfo->image_width *
|
jdiv_round_up((long) cinfo->image_width *
|
||||||
@ -172,8 +173,10 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
|
|||||||
break;
|
break;
|
||||||
case JCS_RGB:
|
case JCS_RGB:
|
||||||
case JCS_BG_RGB:
|
case JCS_BG_RGB:
|
||||||
|
#if RGB_PIXELSIZE != 3
|
||||||
cinfo->out_color_components = RGB_PIXELSIZE;
|
cinfo->out_color_components = RGB_PIXELSIZE;
|
||||||
break;
|
break;
|
||||||
|
#endif /* else share code with YCbCr */
|
||||||
case JCS_YCbCr:
|
case JCS_YCbCr:
|
||||||
case JCS_BG_YCC:
|
case JCS_BG_YCC:
|
||||||
cinfo->out_color_components = 3;
|
cinfo->out_color_components = 3;
|
||||||
@ -184,7 +187,6 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
|
|||||||
break;
|
break;
|
||||||
default: /* else must be same colorspace as in file */
|
default: /* else must be same colorspace as in file */
|
||||||
cinfo->out_color_components = cinfo->num_components;
|
cinfo->out_color_components = cinfo->num_components;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
cinfo->output_components = (cinfo->quantize_colors ? 1 :
|
cinfo->output_components = (cinfo->quantize_colors ? 1 :
|
||||||
cinfo->out_color_components);
|
cinfo->out_color_components);
|
||||||
@ -525,9 +527,8 @@ jinit_master_decompress (j_decompress_ptr cinfo)
|
|||||||
{
|
{
|
||||||
my_master_ptr master;
|
my_master_ptr master;
|
||||||
|
|
||||||
master = (my_master_ptr)
|
master = (my_master_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_decomp_master));
|
||||||
SIZEOF(my_decomp_master));
|
|
||||||
cinfo->master = &master->pub;
|
cinfo->master = &master->pub;
|
||||||
master->pub.prepare_for_output_pass = prepare_for_output_pass;
|
master->pub.prepare_for_output_pass = prepare_for_output_pass;
|
||||||
master->pub.finish_output_pass = finish_output_pass;
|
master->pub.finish_output_pass = finish_output_pass;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* jdmerge.c
|
* jdmerge.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* Modified 2013-2017 by Guido Vollbeding.
|
* Modified 2013-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -95,28 +95,22 @@ build_ycc_rgb_table (j_decompress_ptr cinfo)
|
|||||||
INT32 x;
|
INT32 x;
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
|
||||||
upsample->Cr_r_tab = (int *)
|
upsample->Cr_r_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
upsample->Cb_b_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
upsample->Cb_b_tab = (int *)
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
upsample->Cr_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
upsample->Cr_g_tab = (INT32 *)
|
upsample->Cb_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
upsample->Cb_g_tab = (INT32 *)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
|
|
||||||
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
||||||
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
||||||
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
||||||
/* Cr=>R value is nearest int to 1.402 * x */
|
/* Cr=>R value is nearest int to 1.402 * x */
|
||||||
upsample->Cr_r_tab[i] = (int)
|
upsample->Cr_r_tab[i] = (int) DESCALE(FIX(1.402) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(1.402) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cb=>B value is nearest int to 1.772 * x */
|
/* Cb=>B value is nearest int to 1.772 * x */
|
||||||
upsample->Cb_b_tab[i] = (int)
|
upsample->Cb_b_tab[i] = (int) DESCALE(FIX(1.772) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(1.772) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cr=>G value is scaled-up -0.714136286 * x */
|
/* Cr=>G value is scaled-up -0.714136286 * x */
|
||||||
upsample->Cr_g_tab[i] = (- FIX(0.714136286)) * x;
|
upsample->Cr_g_tab[i] = (- FIX(0.714136286)) * x;
|
||||||
/* Cb=>G value is scaled-up -0.344136286 * x */
|
/* Cb=>G value is scaled-up -0.344136286 * x */
|
||||||
@ -135,28 +129,22 @@ build_bg_ycc_rgb_table (j_decompress_ptr cinfo)
|
|||||||
INT32 x;
|
INT32 x;
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
|
||||||
upsample->Cr_r_tab = (int *)
|
upsample->Cr_r_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
upsample->Cb_b_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
upsample->Cb_b_tab = (int *)
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
upsample->Cr_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
upsample->Cr_g_tab = (INT32 *)
|
upsample->Cb_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
upsample->Cb_g_tab = (INT32 *)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
|
|
||||||
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
||||||
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
||||||
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
||||||
/* Cr=>R value is nearest int to 2.804 * x */
|
/* Cr=>R value is nearest int to 2.804 * x */
|
||||||
upsample->Cr_r_tab[i] = (int)
|
upsample->Cr_r_tab[i] = (int) DESCALE(FIX(2.804) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(2.804) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cb=>B value is nearest int to 3.544 * x */
|
/* Cb=>B value is nearest int to 3.544 * x */
|
||||||
upsample->Cb_b_tab[i] = (int)
|
upsample->Cb_b_tab[i] = (int) DESCALE(FIX(3.544) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(3.544) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cr=>G value is scaled-up -1.428272572 * x */
|
/* Cr=>G value is scaled-up -1.428272572 * x */
|
||||||
upsample->Cr_g_tab[i] = (- FIX(1.428272572)) * x;
|
upsample->Cr_g_tab[i] = (- FIX(1.428272572)) * x;
|
||||||
/* Cb=>G value is scaled-up -0.688272572 * x */
|
/* Cb=>G value is scaled-up -0.688272572 * x */
|
||||||
@ -419,9 +407,8 @@ jinit_merged_upsampler (j_decompress_ptr cinfo)
|
|||||||
{
|
{
|
||||||
my_upsample_ptr upsample;
|
my_upsample_ptr upsample;
|
||||||
|
|
||||||
upsample = (my_upsample_ptr)
|
upsample = (my_upsample_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_upsampler));
|
||||||
SIZEOF(my_upsampler));
|
|
||||||
cinfo->upsample = &upsample->pub;
|
cinfo->upsample = &upsample->pub;
|
||||||
upsample->pub.start_pass = start_pass_merged_upsample;
|
upsample->pub.start_pass = start_pass_merged_upsample;
|
||||||
upsample->pub.need_context_rows = FALSE;
|
upsample->pub.need_context_rows = FALSE;
|
||||||
@ -432,9 +419,9 @@ jinit_merged_upsampler (j_decompress_ptr cinfo)
|
|||||||
upsample->pub.upsample = merged_2v_upsample;
|
upsample->pub.upsample = merged_2v_upsample;
|
||||||
upsample->upmethod = h2v2_merged_upsample;
|
upsample->upmethod = h2v2_merged_upsample;
|
||||||
/* Allocate a spare row buffer */
|
/* Allocate a spare row buffer */
|
||||||
upsample->spare_row = (JSAMPROW)
|
upsample->spare_row = (JSAMPROW) (*cinfo->mem->alloc_large)
|
||||||
(*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
(size_t) (upsample->out_row_width * SIZEOF(JSAMPLE)));
|
(size_t) upsample->out_row_width * SIZEOF(JSAMPLE));
|
||||||
} else {
|
} else {
|
||||||
upsample->pub.upsample = merged_1v_upsample;
|
upsample->pub.upsample = merged_1v_upsample;
|
||||||
upsample->upmethod = h2v1_merged_upsample;
|
upsample->upmethod = h2v1_merged_upsample;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* jerror.h
|
* jerror.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
* Copyright (C) 1994-1997, Thomas G. Lane.
|
||||||
* Modified 1997-2012 by Guido Vollbeding.
|
* Modified 1997-2018 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -84,7 +84,7 @@ JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan")
|
|||||||
JMESSAGE(JERR_FILE_READ, "Input file read error")
|
JMESSAGE(JERR_FILE_READ, "Input file read error")
|
||||||
JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?")
|
JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?")
|
||||||
JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet")
|
JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet")
|
||||||
JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow")
|
JMESSAGE(JERR_HUFF_CLEN_OUTOFBOUNDS, "Huffman code size table out of bounds")
|
||||||
JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry")
|
JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry")
|
||||||
JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels")
|
JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels")
|
||||||
JMESSAGE(JERR_INPUT_EMPTY, "Empty input file")
|
JMESSAGE(JERR_INPUT_EMPTY, "Empty input file")
|
||||||
|
116
jpeg/jfdctint.c
116
jpeg/jfdctint.c
@ -2,7 +2,7 @@
|
|||||||
* jfdctint.c
|
* jfdctint.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1996, Thomas G. Lane.
|
* Copyright (C) 1991-1996, Thomas G. Lane.
|
||||||
* Modification developed 2003-2015 by Guido Vollbeding.
|
* Modification developed 2003-2018 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -3261,78 +3261,84 @@ jpeg_fdct_6x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
|
|||||||
GLOBAL(void)
|
GLOBAL(void)
|
||||||
jpeg_fdct_4x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
|
jpeg_fdct_4x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
|
||||||
{
|
{
|
||||||
INT32 tmp0, tmp1;
|
DCTELEM tmp0, tmp2, tmp10, tmp12, tmp4, tmp5;
|
||||||
INT32 tmp10, tmp11;
|
INT32 tmp1, tmp3, tmp11, tmp13;
|
||||||
DCTELEM *dataptr;
|
INT32 z1, z2, z3;
|
||||||
JSAMPROW elemptr;
|
JSAMPROW elemptr;
|
||||||
int ctr;
|
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
|
||||||
/* Pre-zero output coefficient block. */
|
/* Pre-zero output coefficient block. */
|
||||||
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
|
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
|
||||||
|
|
||||||
/* Pass 1: process rows.
|
/* Pass 1: process rows.
|
||||||
* Note results are scaled up by sqrt(8) compared to a true DCT;
|
* Note results are scaled up by sqrt(8) compared to a true DCT.
|
||||||
* furthermore, we scale the results by 2**PASS1_BITS.
|
|
||||||
* We must also scale the output by (8/4)*(8/2) = 2**3, which we add here.
|
|
||||||
* 4-point FDCT kernel,
|
* 4-point FDCT kernel,
|
||||||
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
|
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
|
||||||
*/
|
*/
|
||||||
|
|
||||||
dataptr = data;
|
/* Row 0 */
|
||||||
for (ctr = 0; ctr < 2; ctr++) {
|
elemptr = sample_data[0] + start_col;
|
||||||
elemptr = sample_data[ctr] + start_col;
|
|
||||||
|
|
||||||
/* Even part */
|
/* Even part */
|
||||||
|
|
||||||
tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]);
|
tmp4 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]);
|
||||||
tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]);
|
tmp5 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]);
|
||||||
|
|
||||||
tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]);
|
tmp0 = tmp4 + tmp5;
|
||||||
tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]);
|
tmp2 = tmp4 - tmp5;
|
||||||
|
|
||||||
/* Apply unsigned->signed conversion. */
|
/* Odd part */
|
||||||
dataptr[0] = (DCTELEM)
|
|
||||||
((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+3));
|
|
||||||
dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+3));
|
|
||||||
|
|
||||||
/* Odd part */
|
z2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]);
|
||||||
|
z3 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]);
|
||||||
|
|
||||||
tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */
|
z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
|
||||||
/* Add fudge factor here for final descale. */
|
/* Add fudge factor here for final descale. */
|
||||||
tmp0 += ONE << (CONST_BITS-PASS1_BITS-4);
|
z1 += ONE << (CONST_BITS-3-1);
|
||||||
|
tmp1 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
|
||||||
|
tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
|
||||||
|
|
||||||
dataptr[1] = (DCTELEM)
|
/* Row 1 */
|
||||||
RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */
|
elemptr = sample_data[1] + start_col;
|
||||||
CONST_BITS-PASS1_BITS-3);
|
|
||||||
dataptr[3] = (DCTELEM)
|
|
||||||
RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */
|
|
||||||
CONST_BITS-PASS1_BITS-3);
|
|
||||||
|
|
||||||
dataptr += DCTSIZE; /* advance pointer to next row */
|
/* Even part */
|
||||||
}
|
|
||||||
|
tmp4 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]);
|
||||||
|
tmp5 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]);
|
||||||
|
|
||||||
|
tmp10 = tmp4 + tmp5;
|
||||||
|
tmp12 = tmp4 - tmp5;
|
||||||
|
|
||||||
|
/* Odd part */
|
||||||
|
|
||||||
|
z2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]);
|
||||||
|
z3 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]);
|
||||||
|
|
||||||
|
z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
|
||||||
|
tmp11 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
|
||||||
|
tmp13 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
|
||||||
|
|
||||||
/* Pass 2: process columns.
|
/* Pass 2: process columns.
|
||||||
* We remove the PASS1_BITS scaling, but leave the results scaled up
|
* We leave the results scaled up by an overall factor of 8.
|
||||||
* by an overall factor of 8.
|
* We must also scale the output by (8/4)*(8/2) = 2**3.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
dataptr = data;
|
/* Column 0 */
|
||||||
for (ctr = 0; ctr < 4; ctr++) {
|
/* Apply unsigned->signed conversion. */
|
||||||
/* Even part */
|
data[DCTSIZE*0] = (tmp0 + tmp10 - 8 * CENTERJSAMPLE) << 3;
|
||||||
|
data[DCTSIZE*1] = (tmp0 - tmp10) << 3;
|
||||||
|
|
||||||
/* Add fudge factor here for final descale. */
|
/* Column 1 */
|
||||||
tmp0 = dataptr[DCTSIZE*0] + (ONE << (PASS1_BITS-1));
|
data[DCTSIZE*0+1] = (DCTELEM) RIGHT_SHIFT(tmp1 + tmp11, CONST_BITS-3);
|
||||||
tmp1 = dataptr[DCTSIZE*1];
|
data[DCTSIZE*1+1] = (DCTELEM) RIGHT_SHIFT(tmp1 - tmp11, CONST_BITS-3);
|
||||||
|
|
||||||
dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS);
|
/* Column 2 */
|
||||||
|
data[DCTSIZE*0+2] = (tmp2 + tmp12) << 3;
|
||||||
|
data[DCTSIZE*1+2] = (tmp2 - tmp12) << 3;
|
||||||
|
|
||||||
/* Odd part */
|
/* Column 3 */
|
||||||
|
data[DCTSIZE*0+3] = (DCTELEM) RIGHT_SHIFT(tmp3 + tmp13, CONST_BITS-3);
|
||||||
dataptr[DCTSIZE*1] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS);
|
data[DCTSIZE*1+3] = (DCTELEM) RIGHT_SHIFT(tmp3 - tmp13, CONST_BITS-3);
|
||||||
|
|
||||||
dataptr++; /* advance pointer to next column */
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -4312,7 +4318,6 @@ jpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
|
|||||||
|
|
||||||
/* Pass 1: process rows.
|
/* Pass 1: process rows.
|
||||||
* Note results are scaled up by sqrt(8) compared to a true DCT.
|
* Note results are scaled up by sqrt(8) compared to a true DCT.
|
||||||
* We must also scale the output by (8/2)*(8/4) = 2**3, which we add here.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
dataptr = data;
|
dataptr = data;
|
||||||
@ -4325,17 +4330,18 @@ jpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
|
|||||||
tmp1 = GETJSAMPLE(elemptr[1]);
|
tmp1 = GETJSAMPLE(elemptr[1]);
|
||||||
|
|
||||||
/* Apply unsigned->signed conversion. */
|
/* Apply unsigned->signed conversion. */
|
||||||
dataptr[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 3);
|
dataptr[0] = (DCTELEM) (tmp0 + tmp1 - 2 * CENTERJSAMPLE);
|
||||||
|
|
||||||
/* Odd part */
|
/* Odd part */
|
||||||
|
|
||||||
dataptr[1] = (DCTELEM) ((tmp0 - tmp1) << 3);
|
dataptr[1] = (DCTELEM) (tmp0 - tmp1);
|
||||||
|
|
||||||
dataptr += DCTSIZE; /* advance pointer to next row */
|
dataptr += DCTSIZE; /* advance pointer to next row */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pass 2: process columns.
|
/* Pass 2: process columns.
|
||||||
* We leave the results scaled up by an overall factor of 8.
|
* We leave the results scaled up by an overall factor of 8.
|
||||||
|
* We must also scale the output by (8/2)*(8/4) = 2**3.
|
||||||
* 4-point FDCT kernel,
|
* 4-point FDCT kernel,
|
||||||
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
|
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
|
||||||
*/
|
*/
|
||||||
@ -4350,21 +4356,21 @@ jpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
|
|||||||
tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3];
|
tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3];
|
||||||
tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2];
|
tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2];
|
||||||
|
|
||||||
dataptr[DCTSIZE*0] = (DCTELEM) (tmp0 + tmp1);
|
dataptr[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp1) << 3);
|
||||||
dataptr[DCTSIZE*2] = (DCTELEM) (tmp0 - tmp1);
|
dataptr[DCTSIZE*2] = (DCTELEM) ((tmp0 - tmp1) << 3);
|
||||||
|
|
||||||
/* Odd part */
|
/* Odd part */
|
||||||
|
|
||||||
tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */
|
tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */
|
||||||
/* Add fudge factor here for final descale. */
|
/* Add fudge factor here for final descale. */
|
||||||
tmp0 += ONE << (CONST_BITS-1);
|
tmp0 += ONE << (CONST_BITS-3-1);
|
||||||
|
|
||||||
dataptr[DCTSIZE*1] = (DCTELEM)
|
dataptr[DCTSIZE*1] = (DCTELEM)
|
||||||
RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */
|
RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */
|
||||||
CONST_BITS);
|
CONST_BITS-3);
|
||||||
dataptr[DCTSIZE*3] = (DCTELEM)
|
dataptr[DCTSIZE*3] = (DCTELEM)
|
||||||
RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */
|
RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */
|
||||||
CONST_BITS);
|
CONST_BITS-3);
|
||||||
|
|
||||||
dataptr++; /* advance pointer to next column */
|
dataptr++; /* advance pointer to next column */
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* jidctint.c
|
* jidctint.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modification developed 2002-2016 by Guido Vollbeding.
|
* Modification developed 2002-2018 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -1474,7 +1474,7 @@ jpeg_idct_10x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Perform dequantization and inverse DCT on one block of coefficients,
|
* Perform dequantization and inverse DCT on one block of coefficients,
|
||||||
* producing a 11x11 output block.
|
* producing an 11x11 output block.
|
||||||
*
|
*
|
||||||
* Optimized algorithm with 24 multiplications in the 1-D kernel.
|
* Optimized algorithm with 24 multiplications in the 1-D kernel.
|
||||||
* cK represents sqrt(2) * cos(K*pi/22).
|
* cK represents sqrt(2) * cos(K*pi/22).
|
||||||
@ -3675,7 +3675,7 @@ jpeg_idct_10x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Perform dequantization and inverse DCT on one block of coefficients,
|
* Perform dequantization and inverse DCT on one block of coefficients,
|
||||||
* producing a 8x4 output block.
|
* producing an 8x4 output block.
|
||||||
*
|
*
|
||||||
* 4-point IDCT in pass 1 (columns), 8-point in pass 2 (rows).
|
* 4-point IDCT in pass 1 (columns), 8-point in pass 2 (rows).
|
||||||
*/
|
*/
|
||||||
@ -3835,7 +3835,7 @@ jpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Perform dequantization and inverse DCT on one block of coefficients,
|
* Perform dequantization and inverse DCT on one block of coefficients,
|
||||||
* producing a reduced-size 6x3 output block.
|
* producing a 6x3 output block.
|
||||||
*
|
*
|
||||||
* 3-point IDCT in pass 1 (columns), 6-point in pass 2 (rows).
|
* 3-point IDCT in pass 1 (columns), 6-point in pass 2 (rows).
|
||||||
*/
|
*/
|
||||||
@ -4082,7 +4082,7 @@ jpeg_idct_2x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Perform dequantization and inverse DCT on one block of coefficients,
|
* Perform dequantization and inverse DCT on one block of coefficients,
|
||||||
* producing a 8x16 output block.
|
* producing an 8x16 output block.
|
||||||
*
|
*
|
||||||
* 16-point IDCT in pass 1 (columns), 8-point in pass 2 (rows).
|
* 16-point IDCT in pass 1 (columns), 8-point in pass 2 (rows).
|
||||||
*/
|
*/
|
||||||
@ -5004,7 +5004,7 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Perform dequantization and inverse DCT on one block of coefficients,
|
* Perform dequantization and inverse DCT on one block of coefficients,
|
||||||
* producing a reduced-size 3x6 output block.
|
* producing a 3x6 output block.
|
||||||
*
|
*
|
||||||
* 6-point IDCT in pass 1 (columns), 3-point in pass 2 (rows).
|
* 6-point IDCT in pass 1 (columns), 3-point in pass 2 (rows).
|
||||||
*/
|
*/
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* jmemmgr.c
|
* jmemmgr.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2011-2012 by Guido Vollbeding.
|
* Modified 2011-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -130,7 +130,7 @@ typedef struct {
|
|||||||
jvirt_barray_ptr virt_barray_list;
|
jvirt_barray_ptr virt_barray_list;
|
||||||
|
|
||||||
/* This counts total space obtained from jpeg_get_small/large */
|
/* This counts total space obtained from jpeg_get_small/large */
|
||||||
long total_space_allocated;
|
size_t total_space_allocated;
|
||||||
|
|
||||||
/* alloc_sarray and alloc_barray set this value for use by virtual
|
/* alloc_sarray and alloc_barray set this value for use by virtual
|
||||||
* array routines.
|
* array routines.
|
||||||
@ -195,7 +195,7 @@ print_mem_stats (j_common_ptr cinfo, int pool_id)
|
|||||||
* This is helpful because message parm array can't handle longs.
|
* This is helpful because message parm array can't handle longs.
|
||||||
*/
|
*/
|
||||||
fprintf(stderr, "Freeing pool %d, total space = %ld\n",
|
fprintf(stderr, "Freeing pool %d, total space = %ld\n",
|
||||||
pool_id, mem->total_space_allocated);
|
pool_id, (long) mem->total_space_allocated);
|
||||||
|
|
||||||
for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL;
|
for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL;
|
||||||
lhdr_ptr = lhdr_ptr->hdr.next) {
|
lhdr_ptr = lhdr_ptr->hdr.next) {
|
||||||
@ -260,11 +260,11 @@ alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
|
|||||||
{
|
{
|
||||||
my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
|
my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
|
||||||
small_pool_ptr hdr_ptr, prev_hdr_ptr;
|
small_pool_ptr hdr_ptr, prev_hdr_ptr;
|
||||||
char * data_ptr;
|
|
||||||
size_t odd_bytes, min_request, slop;
|
size_t odd_bytes, min_request, slop;
|
||||||
|
char * data_ptr;
|
||||||
|
|
||||||
/* Check for unsatisfiable request (do now to ensure no overflow below) */
|
/* Check for unsatisfiable request (do now to ensure no overflow below) */
|
||||||
if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr)))
|
if (sizeofobject > (size_t) MAX_ALLOC_CHUNK - SIZEOF(small_pool_hdr))
|
||||||
out_of_memory(cinfo, 1); /* request exceeds malloc's ability */
|
out_of_memory(cinfo, 1); /* request exceeds malloc's ability */
|
||||||
|
|
||||||
/* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
|
/* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
|
||||||
@ -293,8 +293,8 @@ alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
|
|||||||
else
|
else
|
||||||
slop = extra_pool_slop[pool_id];
|
slop = extra_pool_slop[pool_id];
|
||||||
/* Don't ask for more than MAX_ALLOC_CHUNK */
|
/* Don't ask for more than MAX_ALLOC_CHUNK */
|
||||||
if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request))
|
if (slop > (size_t) MAX_ALLOC_CHUNK - min_request)
|
||||||
slop = (size_t) (MAX_ALLOC_CHUNK-min_request);
|
slop = (size_t) MAX_ALLOC_CHUNK - min_request;
|
||||||
/* Try to get space, if fail reduce slop and try again */
|
/* Try to get space, if fail reduce slop and try again */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop);
|
hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop);
|
||||||
@ -348,7 +348,7 @@ alloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
|
|||||||
size_t odd_bytes;
|
size_t odd_bytes;
|
||||||
|
|
||||||
/* Check for unsatisfiable request (do now to ensure no overflow below) */
|
/* Check for unsatisfiable request (do now to ensure no overflow below) */
|
||||||
if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)))
|
if (sizeofobject > (size_t) MAX_ALLOC_CHUNK - SIZEOF(large_pool_hdr))
|
||||||
out_of_memory(cinfo, 3); /* request exceeds malloc's ability */
|
out_of_memory(cinfo, 3); /* request exceeds malloc's ability */
|
||||||
|
|
||||||
/* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
|
/* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
|
||||||
@ -404,7 +404,7 @@ alloc_sarray (j_common_ptr cinfo, int pool_id,
|
|||||||
long ltemp;
|
long ltemp;
|
||||||
|
|
||||||
/* Calculate max # of rows allowed in one allocation chunk */
|
/* Calculate max # of rows allowed in one allocation chunk */
|
||||||
ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /
|
ltemp = (MAX_ALLOC_CHUNK - SIZEOF(large_pool_hdr)) /
|
||||||
((long) samplesperrow * SIZEOF(JSAMPLE));
|
((long) samplesperrow * SIZEOF(JSAMPLE));
|
||||||
if (ltemp <= 0)
|
if (ltemp <= 0)
|
||||||
ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
|
ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
|
||||||
@ -416,15 +416,14 @@ alloc_sarray (j_common_ptr cinfo, int pool_id,
|
|||||||
|
|
||||||
/* Get space for row pointers (small object) */
|
/* Get space for row pointers (small object) */
|
||||||
result = (JSAMPARRAY) alloc_small(cinfo, pool_id,
|
result = (JSAMPARRAY) alloc_small(cinfo, pool_id,
|
||||||
(size_t) (numrows * SIZEOF(JSAMPROW)));
|
(size_t) numrows * SIZEOF(JSAMPROW));
|
||||||
|
|
||||||
/* Get the rows themselves (large objects) */
|
/* Get the rows themselves (large objects) */
|
||||||
currow = 0;
|
currow = 0;
|
||||||
while (currow < numrows) {
|
while (currow < numrows) {
|
||||||
rowsperchunk = MIN(rowsperchunk, numrows - currow);
|
rowsperchunk = MIN(rowsperchunk, numrows - currow);
|
||||||
workspace = (JSAMPROW) alloc_large(cinfo, pool_id,
|
workspace = (JSAMPROW) alloc_large(cinfo, pool_id,
|
||||||
(size_t) ((size_t) rowsperchunk * (size_t) samplesperrow
|
(size_t) rowsperchunk * (size_t) samplesperrow * SIZEOF(JSAMPLE));
|
||||||
* SIZEOF(JSAMPLE)));
|
|
||||||
for (i = rowsperchunk; i > 0; i--) {
|
for (i = rowsperchunk; i > 0; i--) {
|
||||||
result[currow++] = workspace;
|
result[currow++] = workspace;
|
||||||
workspace += samplesperrow;
|
workspace += samplesperrow;
|
||||||
@ -452,7 +451,7 @@ alloc_barray (j_common_ptr cinfo, int pool_id,
|
|||||||
long ltemp;
|
long ltemp;
|
||||||
|
|
||||||
/* Calculate max # of rows allowed in one allocation chunk */
|
/* Calculate max # of rows allowed in one allocation chunk */
|
||||||
ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /
|
ltemp = (MAX_ALLOC_CHUNK - SIZEOF(large_pool_hdr)) /
|
||||||
((long) blocksperrow * SIZEOF(JBLOCK));
|
((long) blocksperrow * SIZEOF(JBLOCK));
|
||||||
if (ltemp <= 0)
|
if (ltemp <= 0)
|
||||||
ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
|
ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
|
||||||
@ -464,15 +463,14 @@ alloc_barray (j_common_ptr cinfo, int pool_id,
|
|||||||
|
|
||||||
/* Get space for row pointers (small object) */
|
/* Get space for row pointers (small object) */
|
||||||
result = (JBLOCKARRAY) alloc_small(cinfo, pool_id,
|
result = (JBLOCKARRAY) alloc_small(cinfo, pool_id,
|
||||||
(size_t) (numrows * SIZEOF(JBLOCKROW)));
|
(size_t) numrows * SIZEOF(JBLOCKROW));
|
||||||
|
|
||||||
/* Get the rows themselves (large objects) */
|
/* Get the rows themselves (large objects) */
|
||||||
currow = 0;
|
currow = 0;
|
||||||
while (currow < numrows) {
|
while (currow < numrows) {
|
||||||
rowsperchunk = MIN(rowsperchunk, numrows - currow);
|
rowsperchunk = MIN(rowsperchunk, numrows - currow);
|
||||||
workspace = (JBLOCKROW) alloc_large(cinfo, pool_id,
|
workspace = (JBLOCKROW) alloc_large(cinfo, pool_id,
|
||||||
(size_t) ((size_t) rowsperchunk * (size_t) blocksperrow
|
(size_t) rowsperchunk * (size_t) blocksperrow * SIZEOF(JBLOCK));
|
||||||
* SIZEOF(JBLOCK)));
|
|
||||||
for (i = rowsperchunk; i > 0; i--) {
|
for (i = rowsperchunk; i > 0; i--) {
|
||||||
result[currow++] = workspace;
|
result[currow++] = workspace;
|
||||||
workspace += blocksperrow;
|
workspace += blocksperrow;
|
||||||
@ -585,8 +583,8 @@ realize_virt_arrays (j_common_ptr cinfo)
|
|||||||
/* Allocate the in-memory buffers for any unrealized virtual arrays */
|
/* Allocate the in-memory buffers for any unrealized virtual arrays */
|
||||||
{
|
{
|
||||||
my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
|
my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
|
||||||
long space_per_minheight, maximum_space, avail_mem;
|
long bytesperrow, space_per_minheight, maximum_space;
|
||||||
long minheights, max_minheights;
|
long avail_mem, minheights, max_minheights;
|
||||||
jvirt_sarray_ptr sptr;
|
jvirt_sarray_ptr sptr;
|
||||||
jvirt_barray_ptr bptr;
|
jvirt_barray_ptr bptr;
|
||||||
|
|
||||||
@ -598,18 +596,16 @@ realize_virt_arrays (j_common_ptr cinfo)
|
|||||||
maximum_space = 0;
|
maximum_space = 0;
|
||||||
for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
|
for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
|
||||||
if (sptr->mem_buffer == NULL) { /* if not realized yet */
|
if (sptr->mem_buffer == NULL) { /* if not realized yet */
|
||||||
space_per_minheight += (long) sptr->maxaccess *
|
bytesperrow = (long) sptr->samplesperrow * SIZEOF(JSAMPLE);
|
||||||
(long) sptr->samplesperrow * SIZEOF(JSAMPLE);
|
space_per_minheight += (long) sptr->maxaccess * bytesperrow;
|
||||||
maximum_space += (long) sptr->rows_in_array *
|
maximum_space += (long) sptr->rows_in_array * bytesperrow;
|
||||||
(long) sptr->samplesperrow * SIZEOF(JSAMPLE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
|
for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
|
||||||
if (bptr->mem_buffer == NULL) { /* if not realized yet */
|
if (bptr->mem_buffer == NULL) { /* if not realized yet */
|
||||||
space_per_minheight += (long) bptr->maxaccess *
|
bytesperrow = (long) bptr->blocksperrow * SIZEOF(JBLOCK);
|
||||||
(long) bptr->blocksperrow * SIZEOF(JBLOCK);
|
space_per_minheight += (long) bptr->maxaccess * bytesperrow;
|
||||||
maximum_space += (long) bptr->rows_in_array *
|
maximum_space += (long) bptr->rows_in_array * bytesperrow;
|
||||||
(long) bptr->blocksperrow * SIZEOF(JBLOCK);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -618,7 +614,7 @@ realize_virt_arrays (j_common_ptr cinfo)
|
|||||||
|
|
||||||
/* Determine amount of memory to actually use; this is system-dependent. */
|
/* Determine amount of memory to actually use; this is system-dependent. */
|
||||||
avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space,
|
avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space,
|
||||||
mem->total_space_allocated);
|
(long) mem->total_space_allocated);
|
||||||
|
|
||||||
/* If the maximum space needed is available, make all the buffers full
|
/* If the maximum space needed is available, make all the buffers full
|
||||||
* height; otherwise parcel it out with the same number of minheights
|
* height; otherwise parcel it out with the same number of minheights
|
||||||
@ -694,7 +690,7 @@ do_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing)
|
|||||||
long bytesperrow, file_offset, byte_count, rows, thisrow, i;
|
long bytesperrow, file_offset, byte_count, rows, thisrow, i;
|
||||||
|
|
||||||
bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE);
|
bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE);
|
||||||
file_offset = ptr->cur_start_row * bytesperrow;
|
file_offset = (long) ptr->cur_start_row * bytesperrow;
|
||||||
/* Loop to read or write each allocation chunk in mem_buffer */
|
/* Loop to read or write each allocation chunk in mem_buffer */
|
||||||
for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
|
for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
|
||||||
/* One chunk, but check for short chunk at end of buffer */
|
/* One chunk, but check for short chunk at end of buffer */
|
||||||
@ -727,7 +723,7 @@ do_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing)
|
|||||||
long bytesperrow, file_offset, byte_count, rows, thisrow, i;
|
long bytesperrow, file_offset, byte_count, rows, thisrow, i;
|
||||||
|
|
||||||
bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK);
|
bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK);
|
||||||
file_offset = ptr->cur_start_row * bytesperrow;
|
file_offset = (long) ptr->cur_start_row * bytesperrow;
|
||||||
/* Loop to read or write each allocation chunk in mem_buffer */
|
/* Loop to read or write each allocation chunk in mem_buffer */
|
||||||
for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
|
for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
|
||||||
/* One chunk, but check for short chunk at end of buffer */
|
/* One chunk, but check for short chunk at end of buffer */
|
||||||
@ -771,7 +767,7 @@ access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr,
|
|||||||
|
|
||||||
/* Make the desired part of the virtual array accessible */
|
/* Make the desired part of the virtual array accessible */
|
||||||
if (start_row < ptr->cur_start_row ||
|
if (start_row < ptr->cur_start_row ||
|
||||||
end_row > ptr->cur_start_row+ptr->rows_in_mem) {
|
end_row > ptr->cur_start_row + ptr->rows_in_mem) {
|
||||||
if (! ptr->b_s_open)
|
if (! ptr->b_s_open)
|
||||||
ERREXIT(cinfo, JERR_VIRTUAL_BUG);
|
ERREXIT(cinfo, JERR_VIRTUAL_BUG);
|
||||||
/* Flush old buffer contents if necessary */
|
/* Flush old buffer contents if necessary */
|
||||||
@ -856,7 +852,7 @@ access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr,
|
|||||||
|
|
||||||
/* Make the desired part of the virtual array accessible */
|
/* Make the desired part of the virtual array accessible */
|
||||||
if (start_row < ptr->cur_start_row ||
|
if (start_row < ptr->cur_start_row ||
|
||||||
end_row > ptr->cur_start_row+ptr->rows_in_mem) {
|
end_row > ptr->cur_start_row + ptr->rows_in_mem) {
|
||||||
if (! ptr->b_s_open)
|
if (! ptr->b_s_open)
|
||||||
ERREXIT(cinfo, JERR_VIRTUAL_BUG);
|
ERREXIT(cinfo, JERR_VIRTUAL_BUG);
|
||||||
/* Flush old buffer contents if necessary */
|
/* Flush old buffer contents if necessary */
|
||||||
@ -1093,7 +1089,7 @@ jinit_memory_mgr (j_common_ptr cinfo)
|
|||||||
mem->total_space_allocated = SIZEOF(my_memory_mgr);
|
mem->total_space_allocated = SIZEOF(my_memory_mgr);
|
||||||
|
|
||||||
/* Declare ourselves open for business */
|
/* Declare ourselves open for business */
|
||||||
cinfo->mem = & mem->pub;
|
cinfo->mem = &mem->pub;
|
||||||
|
|
||||||
/* Check for an environment variable JPEGMEM; if found, override the
|
/* Check for an environment variable JPEGMEM; if found, override the
|
||||||
* default max_memory setting from jpeg_mem_init. Note that the
|
* default max_memory setting from jpeg_mem_init. Note that the
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
* jmemnobs.c
|
* jmemnobs.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1992-1996, Thomas G. Lane.
|
* Copyright (C) 1992-1996, Thomas G. Lane.
|
||||||
|
* Modified 2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -12,7 +13,7 @@
|
|||||||
* This is very portable in the sense that it'll compile on almost anything,
|
* This is very portable in the sense that it'll compile on almost anything,
|
||||||
* but you'd better have lots of main memory (or virtual memory) if you want
|
* but you'd better have lots of main memory (or virtual memory) if you want
|
||||||
* to process big images.
|
* to process big images.
|
||||||
* Note that the max_memory_to_use option is ignored by this implementation.
|
* Note that the max_memory_to_use option is respected by this implementation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define JPEG_INTERNALS
|
#define JPEG_INTERNALS
|
||||||
@ -66,13 +67,16 @@ jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* This routine computes the total memory space available for allocation.
|
* This routine computes the total memory space available for allocation.
|
||||||
* Here we always say, "we got all you want bud!"
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
GLOBAL(long)
|
GLOBAL(long)
|
||||||
jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,
|
jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,
|
||||||
long max_bytes_needed, long already_allocated)
|
long max_bytes_needed, long already_allocated)
|
||||||
{
|
{
|
||||||
|
if (cinfo->mem->max_memory_to_use)
|
||||||
|
return cinfo->mem->max_memory_to_use - already_allocated;
|
||||||
|
|
||||||
|
/* Here we say, "we got all you want bud!" */
|
||||||
return max_bytes_needed;
|
return max_bytes_needed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* jpegint.h
|
* jpegint.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 1997-2017 by Guido Vollbeding.
|
* Modified 1997-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -302,6 +302,13 @@ struct jpeg_color_quantizer {
|
|||||||
#define RIGHT_SHIFT(x,shft) ((x) >> (shft))
|
#define RIGHT_SHIFT(x,shft) ((x) >> (shft))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Descale and correctly round an INT32 value that's scaled by N bits.
|
||||||
|
* We assume RIGHT_SHIFT rounds towards minus infinity, so adding
|
||||||
|
* the fudge factor is correct for either sign of X.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define DESCALE(x,n) RIGHT_SHIFT((x) + ((INT32) 1 << ((n)-1)), n)
|
||||||
|
|
||||||
|
|
||||||
/* Short forms of external names for systems with brain-damaged linkers. */
|
/* Short forms of external names for systems with brain-damaged linkers. */
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* jpeglib.h
|
* jpeglib.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2002-2017 by Guido Vollbeding.
|
* Modified 2002-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -39,7 +39,7 @@ extern "C" {
|
|||||||
|
|
||||||
#define JPEG_LIB_VERSION 90 /* Compatibility version 9.0 */
|
#define JPEG_LIB_VERSION 90 /* Compatibility version 9.0 */
|
||||||
#define JPEG_LIB_VERSION_MAJOR 9
|
#define JPEG_LIB_VERSION_MAJOR 9
|
||||||
#define JPEG_LIB_VERSION_MINOR 3
|
#define JPEG_LIB_VERSION_MINOR 4
|
||||||
|
|
||||||
|
|
||||||
/* Various constants determining the sizes of things.
|
/* Various constants determining the sizes of things.
|
||||||
@ -909,6 +909,7 @@ typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));
|
|||||||
#define jpeg_suppress_tables jSuppressTables
|
#define jpeg_suppress_tables jSuppressTables
|
||||||
#define jpeg_alloc_quant_table jAlcQTable
|
#define jpeg_alloc_quant_table jAlcQTable
|
||||||
#define jpeg_alloc_huff_table jAlcHTable
|
#define jpeg_alloc_huff_table jAlcHTable
|
||||||
|
#define jpeg_std_huff_table jStdHTable
|
||||||
#define jpeg_start_compress jStrtCompress
|
#define jpeg_start_compress jStrtCompress
|
||||||
#define jpeg_write_scanlines jWrtScanlines
|
#define jpeg_write_scanlines jWrtScanlines
|
||||||
#define jpeg_finish_compress jFinCompress
|
#define jpeg_finish_compress jFinCompress
|
||||||
@ -977,10 +978,10 @@ EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));
|
|||||||
/* Data source and destination managers: memory buffers. */
|
/* Data source and destination managers: memory buffers. */
|
||||||
EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo,
|
EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo,
|
||||||
unsigned char ** outbuffer,
|
unsigned char ** outbuffer,
|
||||||
unsigned long * outsize));
|
size_t * outsize));
|
||||||
EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo,
|
EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo,
|
||||||
const unsigned char * inbuffer,
|
const unsigned char * inbuffer,
|
||||||
unsigned long insize));
|
size_t insize));
|
||||||
|
|
||||||
/* Default parameter setup for compression */
|
/* Default parameter setup for compression */
|
||||||
EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));
|
EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));
|
||||||
@ -1005,6 +1006,8 @@ EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo,
|
|||||||
boolean suppress));
|
boolean suppress));
|
||||||
EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));
|
EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));
|
||||||
EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));
|
EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));
|
||||||
|
EXTERN(JHUFF_TBL *) jpeg_std_huff_table JPP((j_common_ptr cinfo,
|
||||||
|
boolean isDC, int tblno));
|
||||||
|
|
||||||
/* Main entry points for compression */
|
/* Main entry points for compression */
|
||||||
EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,
|
EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* jutils.c
|
* jutils.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1996, Thomas G. Lane.
|
* Copyright (C) 1991-1996, Thomas G. Lane.
|
||||||
* Modified 2009-2011 by Guido Vollbeding.
|
* Modified 2009-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -185,7 +185,7 @@ jcopy_sample_rows (JSAMPARRAY input_array, int source_row,
|
|||||||
{
|
{
|
||||||
register JSAMPROW inptr, outptr;
|
register JSAMPROW inptr, outptr;
|
||||||
#ifdef FMEMCOPY
|
#ifdef FMEMCOPY
|
||||||
register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE));
|
register size_t count = (size_t) num_cols * SIZEOF(JSAMPLE);
|
||||||
#else
|
#else
|
||||||
register JDIMENSION count;
|
register JDIMENSION count;
|
||||||
#endif
|
#endif
|
||||||
@ -213,7 +213,7 @@ jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row,
|
|||||||
/* Copy a row of coefficient blocks from one place to another. */
|
/* Copy a row of coefficient blocks from one place to another. */
|
||||||
{
|
{
|
||||||
#ifdef FMEMCOPY
|
#ifdef FMEMCOPY
|
||||||
FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF)));
|
FMEMCOPY(output_row, input_row, (size_t) num_blocks * (DCTSIZE2 * SIZEOF(JCOEF)));
|
||||||
#else
|
#else
|
||||||
register JCOEFPTR inptr, outptr;
|
register JCOEFPTR inptr, outptr;
|
||||||
register long count;
|
register long count;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* jversion.h
|
* jversion.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-2018, Thomas G. Lane, Guido Vollbeding.
|
* Copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@ -9,6 +9,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#define JVERSION "9c 14-Jan-2018"
|
#define JVERSION "9d 12-Jan-2020"
|
||||||
|
|
||||||
#define JCOPYRIGHT "Copyright (C) 2018, Thomas G. Lane, Guido Vollbeding"
|
#define JCOPYRIGHT "Copyright (C) 2020, Thomas G. Lane, Guido Vollbeding"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
USING THE IJG JPEG LIBRARY
|
USING THE IJG JPEG LIBRARY
|
||||||
|
|
||||||
Copyright (C) 1994-2013, Thomas G. Lane, Guido Vollbeding.
|
Copyright (C) 1994-2019, Thomas G. Lane, Guido Vollbeding.
|
||||||
This file is part of the Independent JPEG Group's software.
|
This file is part of the Independent JPEG Group's software.
|
||||||
For conditions of distribution and use, see the accompanying README file.
|
For conditions of distribution and use, see the accompanying README file.
|
||||||
|
|
||||||
@ -2591,8 +2591,8 @@ different sizes. If the image dimensions are not a multiple of the MCU size,
|
|||||||
you must also pad the data correctly (usually, this is done by replicating
|
you must also pad the data correctly (usually, this is done by replicating
|
||||||
the last column and/or row). The data must be padded to a multiple of a DCT
|
the last column and/or row). The data must be padded to a multiple of a DCT
|
||||||
block in each component: that is, each downsampled row must contain a
|
block in each component: that is, each downsampled row must contain a
|
||||||
multiple of block_size valid samples, and there must be a multiple of
|
multiple of DCT_h_scaled_size valid samples, and there must be a multiple of
|
||||||
block_size sample rows for each component. (For applications such as
|
DCT_v_scaled_size sample rows for each component. (For applications such as
|
||||||
conversion of digital TV images, the standard image size is usually a
|
conversion of digital TV images, the standard image size is usually a
|
||||||
multiple of the DCT block size, so that no padding need actually be done.)
|
multiple of the DCT block size, so that no padding need actually be done.)
|
||||||
|
|
||||||
@ -2602,8 +2602,6 @@ jpeg_write_scanlines(). Before calling jpeg_start_compress(), you must do
|
|||||||
the following:
|
the following:
|
||||||
* Set cinfo->raw_data_in to TRUE. (It is set FALSE by jpeg_set_defaults().)
|
* Set cinfo->raw_data_in to TRUE. (It is set FALSE by jpeg_set_defaults().)
|
||||||
This notifies the library that you will be supplying raw data.
|
This notifies the library that you will be supplying raw data.
|
||||||
Furthermore, set cinfo->do_fancy_downsampling to FALSE if you want to use
|
|
||||||
real downsampled data. (It is set TRUE by jpeg_set_defaults().)
|
|
||||||
* Ensure jpeg_color_space is correct --- an explicit jpeg_set_colorspace()
|
* Ensure jpeg_color_space is correct --- an explicit jpeg_set_colorspace()
|
||||||
call is a good idea. Note that since color conversion is bypassed,
|
call is a good idea. Note that since color conversion is bypassed,
|
||||||
in_color_space is ignored, except that jpeg_set_defaults() uses it to
|
in_color_space is ignored, except that jpeg_set_defaults() uses it to
|
||||||
@ -2620,23 +2618,25 @@ The scanlines count passed to and returned from jpeg_write_raw_data is
|
|||||||
measured in terms of the component with the largest v_samp_factor.
|
measured in terms of the component with the largest v_samp_factor.
|
||||||
|
|
||||||
jpeg_write_raw_data() processes one MCU row per call, which is to say
|
jpeg_write_raw_data() processes one MCU row per call, which is to say
|
||||||
v_samp_factor*block_size sample rows of each component. The passed num_lines
|
v_samp_factor*min_DCT_v_scaled_size sample rows of each component. The passed
|
||||||
value must be at least max_v_samp_factor*block_size, and the return value
|
num_lines value must be at least max_v_samp_factor*min_DCT_v_scaled_size, and
|
||||||
will be exactly that amount (or possibly some multiple of that amount, in
|
the return value will be exactly that amount (or possibly some multiple of
|
||||||
future library versions). This is true even on the last call at the bottom
|
that amount, in future library versions). This is true even on the last call
|
||||||
of the image; don't forget to pad your data as necessary.
|
at the bottom of the image; don't forget to pad your data as necessary.
|
||||||
|
|
||||||
The required dimensions of the supplied data can be computed for each
|
The required dimensions of the supplied data can be computed for each
|
||||||
component as
|
component as
|
||||||
cinfo->comp_info[i].width_in_blocks*block_size samples per row
|
cinfo->comp_info[i].width_in_blocks *
|
||||||
cinfo->comp_info[i].height_in_blocks*block_size rows in image
|
cinfo->comp_info[i].DCT_h_scaled_size samples per row
|
||||||
|
cinfo->comp_info[i].height_in_blocks *
|
||||||
|
cinfo->comp_info[i].DCT_v_scaled_size rows in image
|
||||||
after jpeg_start_compress() has initialized those fields. If the valid data
|
after jpeg_start_compress() has initialized those fields. If the valid data
|
||||||
is smaller than this, it must be padded appropriately. For some sampling
|
is smaller than this, it must be padded appropriately. For some sampling
|
||||||
factors and image sizes, additional dummy DCT blocks are inserted to make
|
factors and image sizes, additional dummy DCT blocks are inserted to make
|
||||||
the image a multiple of the MCU dimensions. The library creates such dummy
|
the image a multiple of the MCU dimensions. The library creates such dummy
|
||||||
blocks itself; it does not read them from your supplied data. Therefore you
|
blocks itself; it does not read them from your supplied data. Therefore you
|
||||||
need never pad by more than block_size samples. An example may help here.
|
need never pad by more than DCT_scaled_size samples.
|
||||||
Assume 2h2v downsampling of YCbCr data, that is
|
An example may help here. Assume 2h2v downsampling of YCbCr data, that is
|
||||||
cinfo->comp_info[0].h_samp_factor = 2 for Y
|
cinfo->comp_info[0].h_samp_factor = 2 for Y
|
||||||
cinfo->comp_info[0].v_samp_factor = 2
|
cinfo->comp_info[0].v_samp_factor = 2
|
||||||
cinfo->comp_info[1].h_samp_factor = 1 for Cb
|
cinfo->comp_info[1].h_samp_factor = 1 for Cb
|
||||||
@ -2662,27 +2662,26 @@ destination module suspends, jpeg_write_raw_data() will return 0.
|
|||||||
In this case the same data rows must be passed again on the next call.
|
In this case the same data rows must be passed again on the next call.
|
||||||
|
|
||||||
|
|
||||||
Decompression with raw data output implies bypassing all postprocessing.
|
Decompression with raw data output implies bypassing all postprocessing:
|
||||||
You must deal with the color space and sampling factors present in the
|
you cannot ask for color quantization, for instance. More seriously, you
|
||||||
incoming file. If your application only handles, say, 2h1v YCbCr data,
|
must deal with the color space and sampling factors present in the incoming
|
||||||
you must check for and fail on other color spaces or other sampling factors.
|
file. If your application only handles, say, 2h1v YCbCr data, you must
|
||||||
|
check for and fail on other color spaces or other sampling factors.
|
||||||
The library will not convert to a different color space for you.
|
The library will not convert to a different color space for you.
|
||||||
|
|
||||||
To obtain raw data output, set cinfo->raw_data_out = TRUE before
|
To obtain raw data output, set cinfo->raw_data_out = TRUE before
|
||||||
jpeg_start_decompress() (it is set FALSE by jpeg_read_header()). Be sure to
|
jpeg_start_decompress() (it is set FALSE by jpeg_read_header()). Be sure to
|
||||||
verify that the color space and sampling factors are ones you can handle.
|
verify that the color space and sampling factors are ones you can handle.
|
||||||
Furthermore, set cinfo->do_fancy_upsampling = FALSE if you want to get real
|
|
||||||
downsampled data (it is set TRUE by jpeg_read_header()).
|
|
||||||
Then call jpeg_read_raw_data() in place of jpeg_read_scanlines(). The
|
Then call jpeg_read_raw_data() in place of jpeg_read_scanlines(). The
|
||||||
decompression process is otherwise the same as usual.
|
decompression process is otherwise the same as usual.
|
||||||
|
|
||||||
jpeg_read_raw_data() returns one MCU row per call, and thus you must pass a
|
jpeg_read_raw_data() returns one MCU row per call, and thus you must pass a
|
||||||
buffer of at least max_v_samp_factor*block_size scanlines (scanline counting
|
buffer of at least max_v_samp_factor*min_DCT_v_scaled_size scanlines (scanline
|
||||||
is the same as for raw-data compression). The buffer you pass must be large
|
counting is the same as for raw-data compression). The buffer you pass must
|
||||||
enough to hold the actual data plus padding to DCT-block boundaries. As with
|
be large enough to hold the actual data plus padding to DCT-block boundaries.
|
||||||
compression, any entirely dummy DCT blocks are not processed so you need not
|
As with compression, any entirely dummy DCT blocks are not processed so you
|
||||||
allocate space for them, but the total scanline count includes them. The
|
need not allocate space for them, but the total scanline count includes them.
|
||||||
above example of computing buffer dimensions for raw-data compression is
|
The above example of computing buffer dimensions for raw-data compression is
|
||||||
equally valid for decompression.
|
equally valid for decompression.
|
||||||
|
|
||||||
Input suspension is supported with raw-data decompression: if the data source
|
Input suspension is supported with raw-data decompression: if the data source
|
||||||
|
@ -47,7 +47,7 @@ or
|
|||||||
This syntax works on all systems, so it is useful for scripts.
|
This syntax works on all systems, so it is useful for scripts.
|
||||||
|
|
||||||
The currently supported image file formats are: PPM (PBMPLUS color format),
|
The currently supported image file formats are: PPM (PBMPLUS color format),
|
||||||
PGM (PBMPLUS grayscale format), BMP, Targa, and RLE (Utah Raster Toolkit
|
PGM (PBMPLUS grayscale format), BMP, GIF, Targa, and RLE (Utah Raster Toolkit
|
||||||
format). (RLE is supported only if the URT library is available, which it
|
format). (RLE is supported only if the URT library is available, which it
|
||||||
isn't on most non-Unix systems.) cjpeg recognizes the input image format
|
isn't on most non-Unix systems.) cjpeg recognizes the input image format
|
||||||
automatically, with the exception of some Targa-format files. You have to
|
automatically, with the exception of some Targa-format files. You have to
|
||||||
@ -73,10 +73,10 @@ The basic command line switches for cjpeg are:
|
|||||||
|
|
||||||
-grayscale Create monochrome JPEG file from color input.
|
-grayscale Create monochrome JPEG file from color input.
|
||||||
Be sure to use this switch when compressing a grayscale
|
Be sure to use this switch when compressing a grayscale
|
||||||
BMP file, because cjpeg isn't bright enough to notice
|
BMP or GIF file, because cjpeg isn't bright enough to
|
||||||
whether a BMP file uses only shades of gray. By
|
notice whether a BMP or GIF file uses only shades of
|
||||||
saying -grayscale, you'll get a smaller JPEG file that
|
gray. By saying -grayscale, you'll get a smaller
|
||||||
takes less time to process.
|
JPEG file that takes less time to process.
|
||||||
|
|
||||||
-rgb Create RGB JPEG file.
|
-rgb Create RGB JPEG file.
|
||||||
Using this switch suppresses the conversion from RGB
|
Using this switch suppresses the conversion from RGB
|
||||||
@ -317,10 +317,17 @@ The basic command line switches for djpeg are:
|
|||||||
is specified, or if the JPEG file is grayscale;
|
is specified, or if the JPEG file is grayscale;
|
||||||
otherwise, 24-bit full-color format is emitted.
|
otherwise, 24-bit full-color format is emitted.
|
||||||
|
|
||||||
-gif Select GIF output format. Since GIF does not support
|
-gif Select GIF output format (LZW compressed).
|
||||||
more than 256 colors, -colors 256 is assumed (unless
|
Since GIF does not support more than 256 colors,
|
||||||
you specify a smaller number of colors). If you
|
-colors 256 is assumed (unless you specify a smaller
|
||||||
specify -fast, the default number of colors is 216.
|
number of colors). If you specify -fast, the default
|
||||||
|
number of colors is 216.
|
||||||
|
|
||||||
|
-gif0 Select GIF output format (uncompressed).
|
||||||
|
Since GIF does not support more than 256 colors,
|
||||||
|
-colors 256 is assumed (unless you specify a smaller
|
||||||
|
number of colors). If you specify -fast, the default
|
||||||
|
number of colors is 216.
|
||||||
|
|
||||||
-os2 Select BMP output format (OS/2 1.x flavor). 8-bit
|
-os2 Select BMP output format (OS/2 1.x flavor). 8-bit
|
||||||
colormapped format is emitted if -colors or -grayscale
|
colormapped format is emitted if -colors or -grayscale
|
||||||
@ -411,10 +418,6 @@ quality settings to make very small JPEG files; the percentage improvement
|
|||||||
is often a lot more than it is on larger files. (At present, -optimize
|
is often a lot more than it is on larger files. (At present, -optimize
|
||||||
mode is always selected when generating progressive JPEG files.)
|
mode is always selected when generating progressive JPEG files.)
|
||||||
|
|
||||||
GIF input files are no longer supported, to avoid the Unisys LZW patent
|
|
||||||
(now expired).
|
|
||||||
(Conversion of GIF files to JPEG is usually a bad idea anyway.)
|
|
||||||
|
|
||||||
|
|
||||||
HINTS FOR DJPEG
|
HINTS FOR DJPEG
|
||||||
|
|
||||||
@ -440,10 +443,6 @@ it may run out of memory even with -maxmemory 0. In that case you can still
|
|||||||
decompress, with some loss of image quality, by specifying -onepass for
|
decompress, with some loss of image quality, by specifying -onepass for
|
||||||
one-pass quantization.
|
one-pass quantization.
|
||||||
|
|
||||||
To avoid the Unisys LZW patent (now expired), djpeg produces uncompressed GIF
|
|
||||||
files. These are larger than they should be, but are readable by standard GIF
|
|
||||||
decoders.
|
|
||||||
|
|
||||||
|
|
||||||
HINTS FOR BOTH PROGRAMS
|
HINTS FOR BOTH PROGRAMS
|
||||||
|
|
||||||
@ -571,13 +570,33 @@ The image can be losslessly cropped by giving the switch:
|
|||||||
-crop WxH+X+Y Crop to a rectangular subarea of width W, height H
|
-crop WxH+X+Y Crop to a rectangular subarea of width W, height H
|
||||||
starting at point X,Y.
|
starting at point X,Y.
|
||||||
|
|
||||||
|
Crop extension: The width or height parameters can be made larger than the
|
||||||
|
source image. In this case the extra area is filled in with zero (neutral
|
||||||
|
gray). A larger width parameter has two more options: Attaching an 'f'
|
||||||
|
character ("flatten") to the width number will fill in the extra area with
|
||||||
|
the DC of the adjacent block, instead of gray out. Attaching an 'r'
|
||||||
|
character ("reflect") to the width number will fill in the extra area with
|
||||||
|
repeated reflections of the source region, instead of gray out.
|
||||||
|
|
||||||
A complementary lossless-wipe option is provided to discard (gray out) data
|
A complementary lossless-wipe option is provided to discard (gray out) data
|
||||||
inside a given image region while losslessly preserving what is outside:
|
inside a given image region while losslessly preserving what is outside:
|
||||||
-wipe WxH+X+Y Wipe (gray out) a rectangular subarea of
|
-wipe WxH+X+Y Wipe (gray out) a rectangular subarea of
|
||||||
width W, height H starting at point X,Y.
|
width W, height H starting at point X,Y.
|
||||||
|
|
||||||
Attaching an 'f' character ("flatten") to the width number will fill
|
Attaching an 'f' character ("flatten") to the width number will fill the
|
||||||
the region with the average of adjacent blocks, instead of gray out.
|
region with the average of adjacent blocks, instead of gray out. In case
|
||||||
|
the wipe region and outside area form two horizontally adjacent rectangles,
|
||||||
|
attaching an 'r' character ("reflect") to the width number will fill the
|
||||||
|
region with repeated reflections of the outside area, instead of gray out.
|
||||||
|
|
||||||
|
Another option is lossless-drop, which replaces data at a given image
|
||||||
|
position by another image:
|
||||||
|
-drop +X+Y filename Drop another image
|
||||||
|
|
||||||
|
Both source images must have the same subsampling values. It is best if
|
||||||
|
they also have the same quantization, otherwise quantization adaption occurs.
|
||||||
|
The trim option can be used with the drop option to requantize the drop file
|
||||||
|
to the source file.
|
||||||
|
|
||||||
Other not-strictly-lossless transformation switches are:
|
Other not-strictly-lossless transformation switches are:
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# GNU ZIP library makefile for the Fast Light Toolkit (FLTK).
|
# GNU ZIP library makefile for the Fast Light Toolkit (FLTK).
|
||||||
#
|
#
|
||||||
# Copyright 1998-2011 by Bill Spitzak and others.
|
# Copyright 1998-2021 by Bill Spitzak and others.
|
||||||
#
|
#
|
||||||
# This library is free software. Distribution and use rights are outlined in
|
# This library is free software. Distribution and use rights are outlined in
|
||||||
# the file "COPYING" which should have been included with this file. If this
|
# the file "COPYING" which should have been included with this file. If this
|
||||||
|
12
zlib/zconf.h
12
zlib/zconf.h
@ -1,6 +1,6 @@
|
|||||||
/* FLTK *************************************************************** */
|
/* FLTK *************************************************************** */
|
||||||
/* FLTK Comments marked with FLTK show modifications for FLTK which */
|
/* FLTK Comments marked with FLTK show modifications for FLTK which */
|
||||||
/* FLTK should probably be preserved when zlib is upgraded. */
|
/* FLTK should probably be preserved when zlib is upgraded. */
|
||||||
/* FLTK *************************************************************** */
|
/* FLTK *************************************************************** */
|
||||||
|
|
||||||
/* zconf.h -- configuration of the zlib compression library
|
/* zconf.h -- configuration of the zlib compression library
|
||||||
@ -13,9 +13,9 @@
|
|||||||
#ifndef ZCONF_H
|
#ifndef ZCONF_H
|
||||||
#define ZCONF_H
|
#define ZCONF_H
|
||||||
|
|
||||||
#if ! (defined(_WIN32) || defined(WIN32)) /* FLTK */
|
#if ! (defined(_WIN32) || defined(WIN32)) /* FLTK */
|
||||||
# define HAVE_UNISTD_H /* FLTK */
|
# define HAVE_UNISTD_H /* FLTK */
|
||||||
#endif /* FLTK */
|
#endif /* FLTK */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If you *really* need a unique prefix for all types and library functions,
|
* If you *really* need a unique prefix for all types and library functions,
|
||||||
|
Loading…
Reference in New Issue
Block a user