mirror of https://github.com/fltk/fltk
Update bundled libjpeg to version 9e (16 jan 2022)
This commit is contained in:
parent
8941dd1ab7
commit
2f09e96b6d
|
@ -19,7 +19,7 @@ Current versions of bundled libraries (as of Jan 16, 2023):
|
||||||
|
|
||||||
Library Version/git commit Release date FLTK Version
|
Library Version/git commit Release date FLTK Version
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
jpeg jpeg-9d 2020-01-12 1.4.0
|
jpeg jpeg-9e 2022-01-16 1.4.0
|
||||||
nanosvg abcd277ea4 [1] 2022-12-22 1.4.0
|
nanosvg abcd277ea4 [1] 2022-12-22 1.4.0
|
||||||
png libpng-1.6.39 2022-11-20 1.4.0
|
png libpng-1.6.39 2022-11-20 1.4.0
|
||||||
zlib zlib-1.2.13 2022-10-13 1.4.0
|
zlib zlib-1.2.13 2022-10-13 1.4.0
|
||||||
|
|
33
jpeg/README
33
jpeg/README
|
@ -1,7 +1,7 @@
|
||||||
The Independent JPEG Group's JPEG software
|
The Independent JPEG Group's JPEG software
|
||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
README for release 9d of 12-Jan-2020
|
README for release 9e of 16-Jan-2022
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
This distribution contains the ninth public release of the Independent JPEG
|
This distribution contains the ninth public release of the Independent JPEG
|
||||||
|
@ -38,6 +38,7 @@ User documentation:
|
||||||
rdjpgcom, and wrjpgcom.
|
rdjpgcom, and wrjpgcom.
|
||||||
*.1 Unix-style man pages for programs (same info as usage.txt).
|
*.1 Unix-style man pages for programs (same info as usage.txt).
|
||||||
wizard.txt Advanced usage instructions for JPEG wizards only.
|
wizard.txt Advanced usage instructions for JPEG wizards only.
|
||||||
|
cdaltui.txt Description of alternate user interface for cjpeg/djpeg.
|
||||||
change.log Version-to-version change highlights.
|
change.log Version-to-version change highlights.
|
||||||
Programmer and internal documentation:
|
Programmer and internal documentation:
|
||||||
libjpeg.txt How to use the JPEG library in your own programs.
|
libjpeg.txt How to use the JPEG library in your own programs.
|
||||||
|
@ -115,7 +116,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-2020, Thomas G. Lane, Guido Vollbeding.
|
This software is copyright (C) 1991-2022, 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
|
||||||
|
@ -165,7 +166,7 @@ The best short technical introduction to the JPEG compression algorithm is
|
||||||
(Adjacent articles in that issue discuss MPEG motion picture compression,
|
(Adjacent articles in that issue discuss MPEG motion picture compression,
|
||||||
applications of JPEG, and related topics.) If you don't have the CACM issue
|
applications of JPEG, and related topics.) If you don't have the CACM issue
|
||||||
handy, a PDF file containing a revised version of Wallace's article is
|
handy, a PDF file containing a revised version of Wallace's article is
|
||||||
available at http://www.ijg.org/files/Wallace.JPEG.pdf. The file (actually
|
available at https://www.ijg.org/files/Wallace.JPEG.pdf. The file (actually
|
||||||
a preprint for an article that appeared in IEEE Trans. Consumer Electronics)
|
a preprint for an article that appeared in IEEE Trans. Consumer Electronics)
|
||||||
omits the sample images that appeared in CACM, but it includes corrections
|
omits the sample images that appeared in CACM, but it includes corrections
|
||||||
and some added material. Note: the Wallace article is copyright ACM and IEEE,
|
and some added material. Note: the Wallace article is copyright ACM and IEEE,
|
||||||
|
@ -209,17 +210,16 @@ document is Revision 3. And a contributed document ISO/IEC JTC1/SC29/WG1 N
|
||||||
5799 with title "Evolution of JPEG", June/July 2011, Berlin, Germany.
|
5799 with title "Evolution of JPEG", June/July 2011, Berlin, Germany.
|
||||||
IJG JPEG 9 introduces a reversible color transform for improved lossless
|
IJG JPEG 9 introduces a reversible color transform for improved lossless
|
||||||
compression which is described in a contributed document ISO/IEC JTC1/SC29/
|
compression which is described in a contributed document ISO/IEC JTC1/SC29/
|
||||||
WG1 N 6080 with title "JPEG 9 Lossless Coding", June/July 2012, Paris,
|
WG1 N 6080 with title "JPEG 9 Lossless Coding", June/July 2012, Paris, France.
|
||||||
France.
|
|
||||||
|
|
||||||
The JPEG standard does not specify all details of an interchangeable file
|
The JPEG standard does not specify all details of an interchangeable file
|
||||||
format. For the omitted details we follow the "JFIF" conventions, version 2.
|
format. For the omitted details we follow the "JFIF" conventions, version 2.
|
||||||
JFIF version 1 has been adopted as Recommendation ITU-T T.871 (05/2011) :
|
JFIF version 1 has been adopted as Recommendation ITU-T T.871 (05/2011) :
|
||||||
Information technology - Digital compression and coding of continuous-tone
|
Information technology - Digital compression and coding of continuous-tone
|
||||||
still images: JPEG File Interchange Format (JFIF). It is available as a
|
still images: JPEG File Interchange Format (JFIF). It is available as a
|
||||||
free download in PDF file format from http://www.itu.int/rec/T-REC-T.871.
|
free download in PDF file format from https://www.itu.int/rec/T-REC-T.871.
|
||||||
A PDF file of the older JFIF document is available at
|
A PDF file of the older JFIF document is available at
|
||||||
http://www.w3.org/Graphics/JPEG/jfif3.pdf.
|
https://www.w3.org/Graphics/JPEG/jfif3.pdf.
|
||||||
|
|
||||||
The TIFF 6.0 file format specification can be obtained by FTP from
|
The TIFF 6.0 file format specification can be obtained by FTP from
|
||||||
ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme
|
ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme
|
||||||
|
@ -227,7 +227,7 @@ found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems.
|
||||||
IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6).
|
IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6).
|
||||||
Instead, we recommend the JPEG design proposed by TIFF Technical Note #2
|
Instead, we recommend the JPEG design proposed by TIFF Technical Note #2
|
||||||
(Compression tag 7). Copies of this Note can be obtained from
|
(Compression tag 7). Copies of this Note can be obtained from
|
||||||
http://www.ijg.org/files/. It is expected that the next revision
|
https://www.ijg.org/files/. It is expected that the next revision
|
||||||
of the TIFF spec will replace the 6.0 JPEG design with the Note's design.
|
of the TIFF spec will replace the 6.0 JPEG design with the Note's design.
|
||||||
Although IJG's own code does not support TIFF/JPEG, the free libtiff library
|
Although IJG's own code does not support TIFF/JPEG, the free libtiff library
|
||||||
uses our library to implement TIFF/JPEG per the Note.
|
uses our library to implement TIFF/JPEG per the Note.
|
||||||
|
@ -238,9 +238,11 @@ 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
|
||||||
http://www.ijg.org/files/jpegsrc.v9d.tar.gz, and in Windows-compatible
|
in Windows-compatible "zip" archive format as
|
||||||
"zip" archive format as http://www.ijg.org/files/jpegsr9d.zip.
|
https://www.ijg.org/files/jpegsr9e.zip, and
|
||||||
|
in Unix-compatible "tar.gz" archive format as
|
||||||
|
https://www.ijg.org/files/jpegsrc.v9e.tar.gz.
|
||||||
|
|
||||||
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.
|
||||||
|
@ -286,11 +288,12 @@ communication about JPEG configuration in Sigma Photo Pro software.
|
||||||
|
|
||||||
Thank to Andrew Finkenstadt for hosting the ijg.org site.
|
Thank to Andrew Finkenstadt for hosting the ijg.org site.
|
||||||
|
|
||||||
Thank to Thomas G. Lane for the original design and development of
|
Thank to Thomas G. Lane for the original design and development
|
||||||
this singular software package.
|
of this singular software package.
|
||||||
|
|
||||||
Thank to Lars Goehler, Andreas Heinecke, Sebastian Fuss, Yvonne Roebert,
|
Thank to Lars Goehler, Andreas Heinecke, Sebastian Fuss,
|
||||||
Andrej Werner, and Ulf-Dietrich Braumann for support and public relations.
|
Yvonne Roebert, Andrej Werner, Ulf-Dietrich Braumann,
|
||||||
|
and Nina Ssymank for support and public relations.
|
||||||
|
|
||||||
|
|
||||||
FILE FORMAT WARS
|
FILE FORMAT WARS
|
||||||
|
|
|
@ -1,6 +1,20 @@
|
||||||
CHANGE LOG for Independent JPEG Group's JPEG software
|
CHANGE LOG for Independent JPEG Group's JPEG software
|
||||||
|
|
||||||
|
|
||||||
|
Version 9e 16-Jan-2022
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Include alternate user interface files for cjpeg/djpeg.
|
||||||
|
|
||||||
|
jcparam.c: change default chrominance DC quantization factor
|
||||||
|
for lossless support. Note: Requires rebuild of test images.
|
||||||
|
|
||||||
|
rdgif.c, cderror.h: add sanity check for GIF image dimensions.
|
||||||
|
Thank to Casper Sun for cjpeg potential vulnerability report.
|
||||||
|
|
||||||
|
Add ARM and ARM64 platform support in the Visual Studio build.
|
||||||
|
|
||||||
|
|
||||||
Version 9d 12-Jan-2020
|
Version 9d 12-Jan-2020
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
IJG JPEG LIBRARY: FILE LIST
|
IJG JPEG LIBRARY: FILE LIST
|
||||||
|
|
||||||
Copyright (C) 1994-2019, Thomas G. Lane, Guido Vollbeding.
|
Copyright (C) 1994-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.
|
||||||
|
|
||||||
|
@ -140,7 +140,9 @@ transupp.h Declarations for jpegtran support routines in transupp.c.
|
||||||
C source code files:
|
C source code files:
|
||||||
|
|
||||||
cjpeg.c Main program for cjpeg.
|
cjpeg.c Main program for cjpeg.
|
||||||
|
cjpegalt.c Main program for cjpeg with alternate user interface.
|
||||||
djpeg.c Main program for djpeg.
|
djpeg.c Main program for djpeg.
|
||||||
|
djpegalt.c Main program for djpeg with alternate user interface.
|
||||||
jpegtran.c Main program for jpegtran.
|
jpegtran.c Main program for jpegtran.
|
||||||
cdjpeg.c Utility routines used by all three programs.
|
cdjpeg.c Utility routines used by all three programs.
|
||||||
rdcolmap.c Code to read a colormap file for djpeg's "-map" switch.
|
rdcolmap.c Code to read a colormap file for djpeg's "-map" switch.
|
||||||
|
|
117
jpeg/install.txt
117
jpeg/install.txt
|
@ -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-2019, Thomas G. Lane, Guido Vollbeding.
|
Copyright (C) 1991-2021, 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,11 @@ 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 2019 (v16)
|
makefile.vs jconfig.vc Windows, Visual Studio 2019 Version 16
|
||||||
make*.v16
|
make*.v16
|
||||||
|
makefile.vs jconfig.vc Windows, Visual Studio 2022 Version 17
|
||||||
|
make*.v16
|
||||||
|
make*.v17
|
||||||
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
|
||||||
|
@ -320,6 +323,7 @@ As a quick test of functionality we've included a small sample image in
|
||||||
several forms:
|
several forms:
|
||||||
testorig.jpg Starting point for the djpeg tests.
|
testorig.jpg Starting point for the djpeg tests.
|
||||||
testimg.ppm The output of djpeg testorig.jpg
|
testimg.ppm The output of djpeg testorig.jpg
|
||||||
|
testimg.gif The output of djpeg -gif testorig.jpg
|
||||||
testimg.bmp The output of djpeg -bmp -colors 256 testorig.jpg
|
testimg.bmp The output of djpeg -bmp -colors 256 testorig.jpg
|
||||||
testimg.jpg The output of cjpeg testimg.ppm
|
testimg.jpg The output of cjpeg testimg.ppm
|
||||||
testprog.jpg Progressive-mode equivalent of testorig.jpg.
|
testprog.jpg Progressive-mode equivalent of testorig.jpg.
|
||||||
|
@ -1029,18 +1033,18 @@ 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 source directory and execute
|
1. Open the Windows Command Prompt, change to the source directory and
|
||||||
the command line
|
execute 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
|
If you get an error message saying that the "nmake" command could
|
||||||
not be found, execute the command
|
not be found, execute the command
|
||||||
"%ProgramFiles%\Microsoft Visual Studio\VC98\Bin\VCVARS32"
|
"%ProgramFiles%\Microsoft Visual Studio\VC98\Bin\VCVARS32"
|
||||||
to set the environment for using Microsoft Visual C++ tools,
|
to set the environment for using Microsoft Visual C++ tools,
|
||||||
and repeat the NMAKE call.
|
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
|
Alternatively you can use
|
||||||
NMAKE /f makefile.vs setupcopy-vc6
|
nmake /f makefile.vs setupcopy-vc6
|
||||||
This will create renamed copies of the files, which allows to repeat
|
This will create renamed copies of the files, which allows to repeat
|
||||||
the setup later.
|
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.
|
||||||
|
@ -1048,45 +1052,112 @@ To use:
|
||||||
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 the Release folder 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 2019 (v16):
|
Microsoft Windows, Visual Studio 2019 Version 16:
|
||||||
|
|
||||||
We include makefiles that should work as project files in Visual Studio
|
We include makefiles that should work as project files in Visual Studio
|
||||||
2019 (v16) or later. There is a library makefile that builds the IJG
|
2019 Version 16 or later. There is a library makefile that builds the
|
||||||
library as a static Win32/x64 library, and application makefiles that
|
IJG library as a static Win32/x64/ARM/ARM64 library, and application
|
||||||
build the sample applications as Win32/x64 console applications. (Even
|
makefiles that build the sample applications as Win32/x64/ARM/ARM64
|
||||||
if you only want the library, we recommend building the applications so
|
console applications. (Even if you only want the library, we recommend
|
||||||
that you can run the self-test.)
|
building the applications so that you can run the self-test.)
|
||||||
|
|
||||||
To use:
|
To use:
|
||||||
1. Open the Developer Command Prompt for VS 2019, change to the source
|
1. Ensure you’ve checked the item "Desktop development with C++" in the
|
||||||
|
Workloads tab of Visual Studio Installer.
|
||||||
|
Open the Developer Command Prompt for VS 2019, change to the source
|
||||||
directory and execute the command line
|
directory and execute the command line
|
||||||
NMAKE /f makefile.vs setup-v16
|
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
|
Alternatively you can use
|
||||||
NMAKE /f makefile.vs setupcopy-v16
|
nmake /f makefile.vs setupcopy-v16
|
||||||
This will create renamed copies of the files, which allows to repeat
|
This will create renamed copies of the files, which allows to repeat
|
||||||
the setup later.
|
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
|
||||||
2019 (v16), you'll probably get a message saying
|
2019 Version 16, you'll probably get a message
|
||||||
that the project files are being updated.
|
saying 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
|
c) If you get a warning saying that a platform cannot be found,
|
||||||
|
you can either
|
||||||
|
* forgo the platform and ignore the warning, or
|
||||||
|
* remove the platform in the Configuration Manager, or
|
||||||
|
* install the corresponding platform Buildtools in
|
||||||
|
Visual Studio Installer (Workloads tab Optional components
|
||||||
|
or Individual components tab).
|
||||||
|
d) 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.
|
Win32 to x64. You can build Win32 and x64 versions side by side.
|
||||||
|
e) If you want to build ARM/ARM64 code, change the platform setting
|
||||||
|
to ARM/ARM64. Ensure you've installed the ARM/ARM64-Buildtools
|
||||||
|
in Visual Studio Installer (Workloads tab Optional components
|
||||||
|
or Individual components tab).
|
||||||
|
You can build Win32/x64/ARM/ARM64 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-32
|
nmake /f makefile.vs test-32
|
||||||
for the Win32 build, or on a 64-bit system
|
for the Win32 build, or on a 64-bit system
|
||||||
NMAKE /f makefile.vs test-64
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
Microsoft Windows, Visual Studio 2022 Version 17:
|
||||||
|
|
||||||
|
We include makefiles that should work as project files in Visual Studio
|
||||||
|
2022 Version 17 or later. There is a library makefile that builds the
|
||||||
|
IJG library as a static Win32/x64/ARM/ARM64 library, and application
|
||||||
|
makefiles that build the sample applications as Win32/x64/ARM/ARM64
|
||||||
|
console applications. (Even if you only want the library, we recommend
|
||||||
|
building the applications so that you can run the self-test.)
|
||||||
|
|
||||||
|
To use:
|
||||||
|
1. Ensure you’ve checked the item "Desktop development with C++" in the
|
||||||
|
Workloads tab of Visual Studio Installer.
|
||||||
|
Open the Developer Command Prompt for VS 2022, change to the source
|
||||||
|
directory and execute the command line
|
||||||
|
nmake /f makefile.vs setup-v17
|
||||||
|
This will move jconfig.vc to jconfig.h and makefiles to project files.
|
||||||
|
(Note that the renaming is critical!)
|
||||||
|
Alternatively you can use
|
||||||
|
nmake /f makefile.vs setupcopy-v17
|
||||||
|
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.
|
||||||
|
a) If you are using Visual Studio more recent than
|
||||||
|
2022 Version 17, you'll probably get a message
|
||||||
|
saying that the project files are being updated.
|
||||||
|
b) If necessary, open the project properties and
|
||||||
|
adapt the Windows Target Platform Version in
|
||||||
|
the Configuration Properties, General section;
|
||||||
|
we support the latest version at the time of release.
|
||||||
|
c) If you get a warning saying that a platform cannot be found,
|
||||||
|
you can either
|
||||||
|
* forgo the platform and ignore the warning, or
|
||||||
|
* remove the platform in the Configuration Manager, or
|
||||||
|
* install the corresponding platform Buildtools in
|
||||||
|
Visual Studio Installer (Workloads tab Optional components
|
||||||
|
or Individual components tab).
|
||||||
|
d) 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.
|
||||||
|
e) If you want to build ARM/ARM64 code, change the platform setting
|
||||||
|
to ARM/ARM64. Ensure you've installed the ARM/ARM64-Buildtools
|
||||||
|
in Visual Studio Installer (Workloads tab Optional components
|
||||||
|
or Individual components tab).
|
||||||
|
You can build Win32/x64/ARM/ARM64 versions side by side.
|
||||||
|
3. Open the solution file apps.sln, build the application projects.
|
||||||
|
4. To perform the self-test, execute the command line
|
||||||
|
nmake /f makefile.vs test-32
|
||||||
|
for the Win32 build, or on a 64-bit system
|
||||||
|
nmake /f makefile.vs test-64
|
||||||
for the x64 build.
|
for the x64 build.
|
||||||
5. Move the application .exe files from the Release folder to an
|
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-2019 by Guido Vollbeding.
|
* Developed 1997-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -361,7 +361,7 @@ emit_restart (j_compress_ptr cinfo, int restart_num)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKARRAY 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;
|
||||||
|
@ -450,7 +450,7 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
const int * natural_order;
|
const int * natural_order;
|
||||||
|
@ -557,7 +557,7 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKARRAY 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;
|
||||||
|
@ -592,7 +592,7 @@ encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
const int * natural_order;
|
const int * natural_order;
|
||||||
|
@ -691,7 +691,7 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu (j_compress_ptr cinfo, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
const int * natural_order;
|
const int * natural_order;
|
||||||
|
|
146
jpeg/jccoefct.c
146
jpeg/jccoefct.c
|
@ -2,7 +2,7 @@
|
||||||
* jccoefct.c
|
* jccoefct.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
* Copyright (C) 1994-1997, Thomas G. Lane.
|
||||||
* Modified 2003-2011 by Guido Vollbeding.
|
* Modified 2003-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -36,16 +36,14 @@ typedef struct {
|
||||||
struct jpeg_c_coef_controller pub; /* public fields */
|
struct jpeg_c_coef_controller pub; /* public fields */
|
||||||
|
|
||||||
JDIMENSION iMCU_row_num; /* iMCU row # within image */
|
JDIMENSION iMCU_row_num; /* iMCU row # within image */
|
||||||
JDIMENSION mcu_ctr; /* counts MCUs processed in current row */
|
JDIMENSION MCU_ctr; /* counts MCUs processed in current row */
|
||||||
int MCU_vert_offset; /* counts MCU rows within iMCU row */
|
int MCU_vert_offset; /* counts MCU rows within iMCU row */
|
||||||
int MCU_rows_per_iMCU_row; /* number of such rows needed */
|
int MCU_rows_per_iMCU_row; /* number of such rows needed */
|
||||||
|
|
||||||
/* For single-pass compression, it's sufficient to buffer just one MCU
|
/* For single-pass compression, it's sufficient to buffer just one MCU
|
||||||
* (although this may prove a bit slow in practice). We allocate a
|
* (although this may prove a bit slow in practice). We append a
|
||||||
* workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each
|
* workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it
|
||||||
* MCU constructed and sent. (On 80x86, the workspace is FAR even though
|
* for each MCU constructed and sent.
|
||||||
* it's not really very big; this is to keep the module interfaces unchanged
|
|
||||||
* when a large coefficient buffer is necessary.)
|
|
||||||
* In multi-pass modes, this array points to the current MCU's blocks
|
* In multi-pass modes, this array points to the current MCU's blocks
|
||||||
* within the virtual arrays.
|
* within the virtual arrays.
|
||||||
*/
|
*/
|
||||||
|
@ -53,6 +51,9 @@ typedef struct {
|
||||||
|
|
||||||
/* In multi-pass modes, we need a virtual block array for each component. */
|
/* In multi-pass modes, we need a virtual block array for each component. */
|
||||||
jvirt_barray_ptr whole_image[MAX_COMPONENTS];
|
jvirt_barray_ptr whole_image[MAX_COMPONENTS];
|
||||||
|
|
||||||
|
/* Workspace for single-pass compression (omitted otherwise). */
|
||||||
|
JBLOCK blk_buffer[C_MAX_BLOCKS_IN_MCU];
|
||||||
} my_coef_controller;
|
} my_coef_controller;
|
||||||
|
|
||||||
typedef my_coef_controller * my_coef_ptr;
|
typedef my_coef_controller * my_coef_ptr;
|
||||||
|
@ -88,7 +89,7 @@ start_iMCU_row (j_compress_ptr cinfo)
|
||||||
coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
|
coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
coef->mcu_ctr = 0;
|
coef->MCU_ctr = 0;
|
||||||
coef->MCU_vert_offset = 0;
|
coef->MCU_vert_offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,7 +126,6 @@ start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,59 +147,56 @@ compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
|
||||||
JDIMENSION MCU_col_num; /* index of current MCU within row */
|
JDIMENSION MCU_col_num; /* index of current MCU within row */
|
||||||
JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
|
JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
|
||||||
JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
|
JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
|
||||||
int blkn, bi, ci, yindex, yoffset, blockcnt;
|
int ci, xindex, yindex, yoffset, blockcnt;
|
||||||
JDIMENSION ypos, xpos;
|
JBLOCKROW blkp;
|
||||||
|
JSAMPARRAY input_ptr;
|
||||||
|
JDIMENSION xpos;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
forward_DCT_ptr forward_DCT;
|
forward_DCT_ptr forward_DCT;
|
||||||
|
|
||||||
/* Loop to write as much as one whole iMCU row */
|
/* Loop to write as much as one whole iMCU row */
|
||||||
for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
|
for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
|
||||||
yoffset++) {
|
yoffset++) {
|
||||||
for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col;
|
for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
|
||||||
MCU_col_num++) {
|
MCU_col_num++) {
|
||||||
/* Determine where data comes from in input_buf and do the DCT thing.
|
/* Determine where data comes from in input_buf and do the DCT thing.
|
||||||
* Each call on forward_DCT processes a horizontal row of DCT blocks
|
* Each call on forward_DCT processes a horizontal row of DCT blocks as
|
||||||
* as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks
|
* wide as an MCU. Dummy blocks at the right or bottom edge are filled in
|
||||||
* sequentially. Dummy blocks at the right or bottom edge are filled in
|
|
||||||
* specially. The data in them does not matter for image reconstruction,
|
* specially. The data in them does not matter for image reconstruction,
|
||||||
* so we fill them with values that will encode to the smallest amount of
|
* so we fill them with values that will encode to the smallest amount of
|
||||||
* data, viz: all zeroes in the AC entries, DC entries equal to previous
|
* data, viz: all zeroes in the AC entries, DC entries equal to previous
|
||||||
* block's DC value. (Thanks to Thomas Kinsman for this idea.)
|
* block's DC value. (Thanks to Thomas Kinsman for this idea.)
|
||||||
*/
|
*/
|
||||||
blkn = 0;
|
blkp = coef->blk_buffer; /* pointer to current DCT block within MCU */
|
||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
forward_DCT = cinfo->fdct->forward_DCT[compptr->component_index];
|
forward_DCT = cinfo->fdct->forward_DCT[compptr->component_index];
|
||||||
|
input_ptr = input_buf[compptr->component_index] +
|
||||||
|
yoffset * compptr->DCT_v_scaled_size;
|
||||||
|
/* ypos == (yoffset + yindex) * compptr->DCT_v_scaled_size */
|
||||||
blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
|
blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
|
||||||
: compptr->last_col_width;
|
: compptr->last_col_width;
|
||||||
xpos = MCU_col_num * compptr->MCU_sample_width;
|
xpos = MCU_col_num * compptr->MCU_sample_width;
|
||||||
ypos = yoffset * compptr->DCT_v_scaled_size;
|
|
||||||
/* ypos == (yoffset+yindex) * DCTSIZE */
|
|
||||||
for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
|
for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
|
||||||
if (coef->iMCU_row_num < last_iMCU_row ||
|
if (coef->iMCU_row_num < last_iMCU_row ||
|
||||||
yoffset+yindex < compptr->last_row_height) {
|
yoffset + yindex < compptr->last_row_height) {
|
||||||
(*forward_DCT) (cinfo, compptr,
|
(*forward_DCT) (cinfo, compptr, input_ptr, blkp,
|
||||||
input_buf[compptr->component_index],
|
xpos, (JDIMENSION) blockcnt);
|
||||||
coef->MCU_buffer[blkn],
|
input_ptr += compptr->DCT_v_scaled_size;
|
||||||
ypos, xpos, (JDIMENSION) blockcnt);
|
blkp += blockcnt;
|
||||||
if (blockcnt < compptr->MCU_width) {
|
/* Dummy blocks at right edge */
|
||||||
/* Create some dummy blocks at the right edge of the image. */
|
if ((xindex = compptr->MCU_width - blockcnt) == 0)
|
||||||
FMEMZERO((void FAR *) coef->MCU_buffer[blkn + blockcnt],
|
continue;
|
||||||
(compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK));
|
|
||||||
for (bi = blockcnt; bi < compptr->MCU_width; bi++) {
|
|
||||||
coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
/* Create a row of dummy blocks at the bottom of the image. */
|
/* At bottom of image, need a whole row of dummy blocks */
|
||||||
FMEMZERO((void FAR *) coef->MCU_buffer[blkn],
|
xindex = compptr->MCU_width;
|
||||||
compptr->MCU_width * SIZEOF(JBLOCK));
|
|
||||||
for (bi = 0; bi < compptr->MCU_width; bi++) {
|
|
||||||
coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
blkn += compptr->MCU_width;
|
/* Fill in any dummy blocks needed in this row */
|
||||||
ypos += compptr->DCT_v_scaled_size;
|
MEMZERO(blkp, xindex * SIZEOF(JBLOCK));
|
||||||
|
do {
|
||||||
|
blkp[0][0] = blkp[-1][0];
|
||||||
|
blkp++;
|
||||||
|
} while (--xindex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Try to write the MCU. In event of a suspension failure, we will
|
/* Try to write the MCU. In event of a suspension failure, we will
|
||||||
|
@ -208,12 +205,12 @@ compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
|
||||||
if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
|
if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
|
||||||
/* Suspension forced; update state counters and exit */
|
/* Suspension forced; update state counters and exit */
|
||||||
coef->MCU_vert_offset = yoffset;
|
coef->MCU_vert_offset = yoffset;
|
||||||
coef->mcu_ctr = MCU_col_num;
|
coef->MCU_ctr = MCU_col_num;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Completed an MCU row, but perhaps not an iMCU row */
|
/* Completed an MCU row, but perhaps not an iMCU row */
|
||||||
coef->mcu_ctr = 0;
|
coef->MCU_ctr = 0;
|
||||||
}
|
}
|
||||||
/* Completed the iMCU row, advance counters for next one */
|
/* Completed the iMCU row, advance counters for next one */
|
||||||
coef->iMCU_row_num++;
|
coef->iMCU_row_num++;
|
||||||
|
@ -256,6 +253,7 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
JBLOCKARRAY buffer;
|
JBLOCKARRAY buffer;
|
||||||
JBLOCKROW thisblockrow, lastblockrow;
|
JBLOCKROW thisblockrow, lastblockrow;
|
||||||
|
JSAMPARRAY input_ptr;
|
||||||
forward_DCT_ptr forward_DCT;
|
forward_DCT_ptr forward_DCT;
|
||||||
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
||||||
|
@ -280,14 +278,15 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
|
||||||
if (ndummy > 0)
|
if (ndummy > 0)
|
||||||
ndummy = h_samp_factor - ndummy;
|
ndummy = h_samp_factor - ndummy;
|
||||||
forward_DCT = cinfo->fdct->forward_DCT[ci];
|
forward_DCT = cinfo->fdct->forward_DCT[ci];
|
||||||
|
input_ptr = input_buf[ci];
|
||||||
/* Perform DCT for all non-dummy blocks in this iMCU row. Each call
|
/* Perform DCT for all non-dummy blocks in this iMCU row. Each call
|
||||||
* on forward_DCT processes a complete horizontal row of DCT blocks.
|
* on forward_DCT processes a complete horizontal row of DCT blocks.
|
||||||
*/
|
*/
|
||||||
for (block_row = 0; block_row < block_rows; block_row++) {
|
for (block_row = 0; block_row < block_rows; block_row++) {
|
||||||
thisblockrow = buffer[block_row];
|
thisblockrow = buffer[block_row];
|
||||||
(*forward_DCT) (cinfo, compptr, input_buf[ci], thisblockrow,
|
(*forward_DCT) (cinfo, compptr, input_ptr, thisblockrow,
|
||||||
(JDIMENSION) (block_row * compptr->DCT_v_scaled_size),
|
|
||||||
(JDIMENSION) 0, blocks_across);
|
(JDIMENSION) 0, blocks_across);
|
||||||
|
input_ptr += compptr->DCT_v_scaled_size;
|
||||||
if (ndummy > 0) {
|
if (ndummy > 0) {
|
||||||
/* Create dummy blocks at the right edge of the image. */
|
/* Create dummy blocks at the right edge of the image. */
|
||||||
thisblockrow += blocks_across; /* => first dummy block */
|
thisblockrow += blocks_across; /* => first dummy block */
|
||||||
|
@ -303,15 +302,14 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
|
||||||
* of the dummy blocks to match the last real block's DC value.
|
* of the dummy blocks to match the last real block's DC value.
|
||||||
* This squeezes a few more bytes out of the resulting file...
|
* This squeezes a few more bytes out of the resulting file...
|
||||||
*/
|
*/
|
||||||
if (coef->iMCU_row_num == last_iMCU_row) {
|
if (block_row < compptr->v_samp_factor) {
|
||||||
blocks_across += ndummy; /* include lower right corner */
|
blocks_across += ndummy; /* include lower right corner */
|
||||||
MCUs_across = blocks_across / h_samp_factor;
|
MCUs_across = blocks_across / h_samp_factor;
|
||||||
for (block_row = block_rows; block_row < compptr->v_samp_factor;
|
do {
|
||||||
block_row++) {
|
|
||||||
thisblockrow = buffer[block_row];
|
thisblockrow = buffer[block_row];
|
||||||
lastblockrow = buffer[block_row-1];
|
lastblockrow = buffer[block_row-1];
|
||||||
FMEMZERO((void FAR *) thisblockrow,
|
FMEMZERO((void FAR *) thisblockrow,
|
||||||
(size_t) (blocks_across * SIZEOF(JBLOCK)));
|
(size_t) blocks_across * SIZEOF(JBLOCK));
|
||||||
for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {
|
for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {
|
||||||
lastDC = lastblockrow[h_samp_factor-1][0];
|
lastDC = lastblockrow[h_samp_factor-1][0];
|
||||||
for (bi = 0; bi < h_samp_factor; bi++) {
|
for (bi = 0; bi < h_samp_factor; bi++) {
|
||||||
|
@ -320,7 +318,7 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
|
||||||
thisblockrow += h_samp_factor; /* advance to next MCU in row */
|
thisblockrow += h_samp_factor; /* advance to next MCU in row */
|
||||||
lastblockrow += h_samp_factor;
|
lastblockrow += h_samp_factor;
|
||||||
}
|
}
|
||||||
}
|
} while (++block_row < compptr->v_samp_factor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* NB: compress_output will increment iMCU_row_num if successful.
|
/* NB: compress_output will increment iMCU_row_num if successful.
|
||||||
|
@ -347,8 +345,9 @@ compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
|
||||||
{
|
{
|
||||||
my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
|
my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
|
||||||
JDIMENSION MCU_col_num; /* index of current MCU within row */
|
JDIMENSION MCU_col_num; /* index of current MCU within row */
|
||||||
int blkn, ci, xindex, yindex, yoffset;
|
int ci, xindex, yindex, yoffset;
|
||||||
JDIMENSION start_col;
|
JDIMENSION start_col;
|
||||||
|
JBLOCKARRAY blkp;
|
||||||
JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
|
JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
|
||||||
JBLOCKROW buffer_ptr;
|
JBLOCKROW buffer_ptr;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
@ -368,30 +367,31 @@ compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
|
||||||
/* Loop to process one whole iMCU row */
|
/* Loop to process one whole iMCU row */
|
||||||
for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
|
for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
|
||||||
yoffset++) {
|
yoffset++) {
|
||||||
for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;
|
for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
|
||||||
MCU_col_num++) {
|
MCU_col_num++) {
|
||||||
/* Construct list of pointers to DCT blocks belonging to this MCU */
|
/* Construct list of pointers to DCT blocks belonging to this MCU */
|
||||||
blkn = 0; /* index of current DCT block within MCU */
|
blkp = coef->MCU_buffer; /* pointer to current DCT block within MCU */
|
||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
start_col = MCU_col_num * compptr->MCU_width;
|
start_col = MCU_col_num * compptr->MCU_width;
|
||||||
for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
|
for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
|
||||||
buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
|
buffer_ptr = buffer[ci][yoffset + yindex] + start_col;
|
||||||
for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
|
xindex = compptr->MCU_width;
|
||||||
coef->MCU_buffer[blkn++] = buffer_ptr++;
|
do {
|
||||||
}
|
*blkp++ = buffer_ptr++;
|
||||||
|
} while (--xindex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Try to write the MCU. */
|
/* Try to write the MCU. */
|
||||||
if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
|
if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
|
||||||
/* Suspension forced; update state counters and exit */
|
/* Suspension forced; update state counters and exit */
|
||||||
coef->MCU_vert_offset = yoffset;
|
coef->MCU_vert_offset = yoffset;
|
||||||
coef->mcu_ctr = MCU_col_num;
|
coef->MCU_ctr = MCU_col_num;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Completed an MCU row, but perhaps not an iMCU row */
|
/* Completed an MCU row, but perhaps not an iMCU row */
|
||||||
coef->mcu_ctr = 0;
|
coef->MCU_ctr = 0;
|
||||||
}
|
}
|
||||||
/* Completed the iMCU row, advance counters for next one */
|
/* Completed the iMCU row, advance counters for next one */
|
||||||
coef->iMCU_row_num++;
|
coef->iMCU_row_num++;
|
||||||
|
@ -411,13 +411,6 @@ jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer)
|
||||||
{
|
{
|
||||||
my_coef_ptr coef;
|
my_coef_ptr coef;
|
||||||
|
|
||||||
coef = (my_coef_ptr)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
SIZEOF(my_coef_controller));
|
|
||||||
cinfo->coef = (struct jpeg_c_coef_controller *) coef;
|
|
||||||
coef->pub.start_pass = start_pass_coef;
|
|
||||||
|
|
||||||
/* Create the coefficient buffer. */
|
|
||||||
if (need_full_buffer) {
|
if (need_full_buffer) {
|
||||||
#ifdef FULL_COEF_BUFFER_SUPPORTED
|
#ifdef FULL_COEF_BUFFER_SUPPORTED
|
||||||
/* Allocate a full-image virtual array for each component, */
|
/* Allocate a full-image virtual array for each component, */
|
||||||
|
@ -425,6 +418,9 @@ jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer)
|
||||||
int ci;
|
int ci;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
|
||||||
|
coef = (my_coef_ptr) (*cinfo->mem->alloc_small)
|
||||||
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
|
SIZEOF(my_coef_controller) - SIZEOF(coef->blk_buffer));
|
||||||
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++) {
|
||||||
coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
|
coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
|
||||||
|
@ -440,15 +436,21 @@ jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer)
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
/* We only need a single-MCU buffer. */
|
/* We only need a single-MCU buffer. */
|
||||||
JBLOCKROW buffer;
|
JBLOCKARRAY blkp;
|
||||||
int i;
|
JBLOCKROW buffer_ptr;
|
||||||
|
int bi;
|
||||||
|
|
||||||
buffer = (JBLOCKROW)
|
coef = (my_coef_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_coef_controller));
|
||||||
C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
|
blkp = coef->MCU_buffer;
|
||||||
for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
|
buffer_ptr = coef->blk_buffer;
|
||||||
coef->MCU_buffer[i] = buffer + i;
|
bi = C_MAX_BLOCKS_IN_MCU;
|
||||||
}
|
do {
|
||||||
|
*blkp++ = buffer_ptr++;
|
||||||
|
} while (--bi);
|
||||||
coef->whole_image[0] = NULL; /* flag for no virtual arrays */
|
coef->whole_image[0] = NULL; /* flag for no virtual arrays */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
coef->pub.start_pass = start_pass_coef;
|
||||||
|
cinfo->coef = &coef->pub;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jcdctmgr.c
|
* jcdctmgr.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* Modified 2003-2013 by Guido Vollbeding.
|
* Modified 2003-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -66,15 +66,14 @@ typedef union {
|
||||||
* Perform forward DCT on one or more blocks of a component.
|
* Perform forward DCT on one or more blocks of a component.
|
||||||
*
|
*
|
||||||
* The input samples are taken from the sample_data[] array starting at
|
* The input samples are taken from the sample_data[] array starting at
|
||||||
* position start_row/start_col, and moving to the right for any additional
|
* position start_col, and moving to the right for any additional blocks.
|
||||||
* blocks. The quantized coefficients are returned in coef_blocks[].
|
* The quantized coefficients are returned in coef_blocks[].
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
|
JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
|
||||||
JDIMENSION start_row, JDIMENSION start_col,
|
JDIMENSION start_col, JDIMENSION num_blocks)
|
||||||
JDIMENSION num_blocks)
|
|
||||||
/* This version is used for integer DCT implementations. */
|
/* This version is used for integer DCT implementations. */
|
||||||
{
|
{
|
||||||
/* This routine is heavily used, so it's worth coding it tightly. */
|
/* This routine is heavily used, so it's worth coding it tightly. */
|
||||||
|
@ -84,8 +83,6 @@ forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */
|
DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */
|
||||||
JDIMENSION bi;
|
JDIMENSION bi;
|
||||||
|
|
||||||
sample_data += start_row; /* fold in the vertical offset once */
|
|
||||||
|
|
||||||
for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) {
|
for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) {
|
||||||
/* Perform the DCT */
|
/* Perform the DCT */
|
||||||
(*do_dct) (workspace, sample_data, start_col);
|
(*do_dct) (workspace, sample_data, start_col);
|
||||||
|
@ -136,8 +133,7 @@ forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
|
JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
|
||||||
JDIMENSION start_row, JDIMENSION start_col,
|
JDIMENSION start_col, JDIMENSION num_blocks)
|
||||||
JDIMENSION num_blocks)
|
|
||||||
/* This version is used for floating-point DCT implementations. */
|
/* This version is used for floating-point DCT implementations. */
|
||||||
{
|
{
|
||||||
/* This routine is heavily used, so it's worth coding it tightly. */
|
/* This routine is heavily used, so it's worth coding it tightly. */
|
||||||
|
@ -147,8 +143,6 @@ forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */
|
FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */
|
||||||
JDIMENSION bi;
|
JDIMENSION bi;
|
||||||
|
|
||||||
sample_data += start_row; /* fold in the vertical offset once */
|
|
||||||
|
|
||||||
for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) {
|
for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) {
|
||||||
/* Perform the DCT */
|
/* Perform the DCT */
|
||||||
(*do_dct) (workspace, sample_data, start_col);
|
(*do_dct) (workspace, sample_data, start_col);
|
||||||
|
@ -347,13 +341,11 @@ start_pass_fdctmgr (j_compress_ptr cinfo)
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ERREXIT2(cinfo, JERR_BAD_DCTSIZE,
|
ERREXIT2(cinfo, JERR_BAD_DCTSIZE,
|
||||||
compptr->DCT_h_scaled_size, compptr->DCT_v_scaled_size);
|
compptr->DCT_h_scaled_size, compptr->DCT_v_scaled_size);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
qtblno = compptr->quant_tbl_no;
|
qtblno = compptr->quant_tbl_no;
|
||||||
/* Make sure specified quantization table is present */
|
/* Make sure specified quantization table is present */
|
||||||
|
@ -444,7 +436,6 @@ start_pass_fdctmgr (j_compress_ptr cinfo)
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -461,17 +452,15 @@ jinit_forward_dct (j_compress_ptr cinfo)
|
||||||
int ci;
|
int ci;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
|
||||||
fdct = (my_fdct_ptr)
|
fdct = (my_fdct_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_fdct_controller));
|
||||||
SIZEOF(my_fdct_controller));
|
|
||||||
cinfo->fdct = &fdct->pub;
|
cinfo->fdct = &fdct->pub;
|
||||||
fdct->pub.start_pass = start_pass_fdctmgr;
|
fdct->pub.start_pass = start_pass_fdctmgr;
|
||||||
|
|
||||||
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++) {
|
||||||
/* Allocate a divisor table for each component */
|
/* Allocate a divisor table for each component */
|
||||||
compptr->dct_table =
|
compptr->dct_table = (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(divisor_table));
|
||||||
SIZEOF(divisor_table));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jchuff.c
|
* jchuff.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2006-2019 by Guido Vollbeding.
|
* Modified 2006-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -542,7 +542,7 @@ emit_restart_e (huff_entropy_ptr entropy, int restart_num)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
register int temp, temp2;
|
register int temp, temp2;
|
||||||
|
@ -625,7 +625,7 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
const int * natural_order;
|
const int * natural_order;
|
||||||
|
@ -736,7 +736,7 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
int Al, blkn;
|
int Al, blkn;
|
||||||
|
@ -779,7 +779,7 @@ encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
const int * natural_order;
|
const int * natural_order;
|
||||||
|
@ -1009,7 +1009,7 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_huff (j_compress_ptr cinfo, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
working_state state;
|
working_state state;
|
||||||
|
@ -1190,7 +1190,7 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_gather (j_compress_ptr cinfo, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
int blkn, ci;
|
int blkn, ci;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jcmaster.c
|
* jcmaster.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2003-2019 by Guido Vollbeding.
|
* Modified 2003-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -391,16 +391,16 @@ per_scan_setup (j_compress_ptr cinfo)
|
||||||
{
|
{
|
||||||
int ci, mcublks, tmp;
|
int ci, mcublks, tmp;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
|
||||||
if (cinfo->comps_in_scan == 1) {
|
if (cinfo->comps_in_scan == 1) {
|
||||||
|
|
||||||
/* Noninterleaved (single-component) scan */
|
/* Noninterleaved (single-component) scan */
|
||||||
compptr = cinfo->cur_comp_info[0];
|
compptr = cinfo->cur_comp_info[0];
|
||||||
|
|
||||||
/* Overall image size in MCUs */
|
/* Overall image size in MCUs */
|
||||||
cinfo->MCUs_per_row = compptr->width_in_blocks;
|
cinfo->MCUs_per_row = compptr->width_in_blocks;
|
||||||
cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
|
cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
|
||||||
|
|
||||||
/* For noninterleaved scan, always one block per MCU */
|
/* For noninterleaved scan, always one block per MCU */
|
||||||
compptr->MCU_width = 1;
|
compptr->MCU_width = 1;
|
||||||
compptr->MCU_height = 1;
|
compptr->MCU_height = 1;
|
||||||
|
@ -413,28 +413,26 @@ per_scan_setup (j_compress_ptr cinfo)
|
||||||
tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
|
tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
|
||||||
if (tmp == 0) tmp = compptr->v_samp_factor;
|
if (tmp == 0) tmp = compptr->v_samp_factor;
|
||||||
compptr->last_row_height = tmp;
|
compptr->last_row_height = tmp;
|
||||||
|
|
||||||
/* Prepare array describing MCU composition */
|
/* Prepare array describing MCU composition */
|
||||||
cinfo->blocks_in_MCU = 1;
|
cinfo->blocks_in_MCU = 1;
|
||||||
cinfo->MCU_membership[0] = 0;
|
cinfo->MCU_membership[0] = 0;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
/* Interleaved (multi-component) scan */
|
/* Interleaved (multi-component) scan */
|
||||||
if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
|
if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
|
||||||
ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
|
ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
|
||||||
MAX_COMPS_IN_SCAN);
|
MAX_COMPS_IN_SCAN);
|
||||||
|
|
||||||
/* Overall image size in MCUs */
|
/* Overall image size in MCUs */
|
||||||
cinfo->MCUs_per_row = (JDIMENSION)
|
cinfo->MCUs_per_row = (JDIMENSION)
|
||||||
jdiv_round_up((long) cinfo->jpeg_width,
|
jdiv_round_up((long) cinfo->jpeg_width,
|
||||||
(long) (cinfo->max_h_samp_factor * cinfo->block_size));
|
(long) (cinfo->max_h_samp_factor * cinfo->block_size));
|
||||||
cinfo->MCU_rows_in_scan = (JDIMENSION)
|
cinfo->MCU_rows_in_scan = cinfo->total_iMCU_rows;
|
||||||
jdiv_round_up((long) cinfo->jpeg_height,
|
|
||||||
(long) (cinfo->max_v_samp_factor * cinfo->block_size));
|
|
||||||
|
|
||||||
cinfo->blocks_in_MCU = 0;
|
cinfo->blocks_in_MCU = 0;
|
||||||
|
|
||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
/* Sampling factors give # of blocks of component in each MCU */
|
/* Sampling factors give # of blocks of component in each MCU */
|
||||||
|
@ -457,7 +455,7 @@ per_scan_setup (j_compress_ptr cinfo)
|
||||||
cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
|
cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert restart specified in rows to actual MCU count. */
|
/* Convert restart specified in rows to actual MCU count. */
|
||||||
|
|
|
@ -16,9 +16,9 @@
|
||||||
/* #undef void */
|
/* #undef void */
|
||||||
/* #undef const */
|
/* #undef const */
|
||||||
/* #undef CHAR_IS_UNSIGNED */
|
/* #undef CHAR_IS_UNSIGNED */
|
||||||
/* #define HAVE_STDDEF_H 1 */ /* FLTK */
|
#define HAVE_STDDEF_H 1
|
||||||
#define HAVE_STDLIB_H 1
|
#define HAVE_STDLIB_H 1
|
||||||
/* #define HAVE_LOCALE_H 1 */ /* FLTK */
|
#define HAVE_LOCALE_H 1
|
||||||
/* #undef NEED_BSD_STRINGS */
|
/* #undef NEED_BSD_STRINGS */
|
||||||
/* #undef NEED_SYS_TYPES_H */
|
/* #undef NEED_SYS_TYPES_H */
|
||||||
/* #undef NEED_FAR_POINTERS */
|
/* #undef NEED_FAR_POINTERS */
|
||||||
|
@ -43,7 +43,7 @@ typedef unsigned char boolean;
|
||||||
#ifdef JPEG_INTERNALS
|
#ifdef JPEG_INTERNALS
|
||||||
|
|
||||||
/* #undef RIGHT_SHIFT_IS_UNSIGNED */
|
/* #undef RIGHT_SHIFT_IS_UNSIGNED */
|
||||||
/* #define INLINE __inline__ */ /* FLTK */
|
#define INLINE __inline__
|
||||||
/* These are for configuring the JPEG memory manager. */
|
/* These are for configuring the JPEG memory manager. */
|
||||||
/* #undef DEFAULT_MAX_MEM */
|
/* #undef DEFAULT_MAX_MEM */
|
||||||
/* #undef NO_MKTEMP */
|
/* #undef NO_MKTEMP */
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jcparam.c
|
* jcparam.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2003-2019 by Guido Vollbeding.
|
* Modified 2003-2022 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,8 +62,9 @@ jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl,
|
||||||
|
|
||||||
|
|
||||||
/* These are the sample quantization tables given in JPEG spec section K.1.
|
/* These are the sample quantization tables given in JPEG spec section K.1.
|
||||||
* The spec says that the values given produce "good" quality, and
|
* NOTE: chrominance DC value is changed from 17 to 16 for lossless support.
|
||||||
* when divided by 2, "very good" quality.
|
* The spec says that the values given produce "good" quality,
|
||||||
|
* and when divided by 2, "very good" quality.
|
||||||
*/
|
*/
|
||||||
static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
|
static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
|
||||||
16, 11, 10, 16, 24, 40, 51, 61,
|
16, 11, 10, 16, 24, 40, 51, 61,
|
||||||
|
@ -76,7 +77,7 @@ static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
|
||||||
72, 92, 95, 98, 112, 100, 103, 99
|
72, 92, 95, 98, 112, 100, 103, 99
|
||||||
};
|
};
|
||||||
static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {
|
static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {
|
||||||
17, 18, 24, 47, 99, 99, 99, 99,
|
16, 18, 24, 47, 99, 99, 99, 99,
|
||||||
18, 21, 26, 66, 99, 99, 99, 99,
|
18, 21, 26, 66, 99, 99, 99, 99,
|
||||||
24, 26, 56, 99, 99, 99, 99, 99,
|
24, 26, 56, 99, 99, 99, 99, 99,
|
||||||
47, 66, 99, 99, 99, 99, 99, 99,
|
47, 66, 99, 99, 99, 99, 99, 99,
|
||||||
|
@ -379,11 +380,13 @@ jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
|
||||||
case JCS_RGB:
|
case JCS_RGB:
|
||||||
cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */
|
cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */
|
||||||
cinfo->num_components = 3;
|
cinfo->num_components = 3;
|
||||||
SET_COMP(0, 0x52 /* 'R' */, 1,1, 0,
|
SET_COMP(0, 0x52 /* 'R' */, 1,1,
|
||||||
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
||||||
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
||||||
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
|
||||||
SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0);
|
SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0);
|
||||||
SET_COMP(2, 0x42 /* 'B' */, 1,1, 0,
|
SET_COMP(2, 0x42 /* 'B' */, 1,1,
|
||||||
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
||||||
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
||||||
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
|
||||||
break;
|
break;
|
||||||
|
@ -417,11 +420,13 @@ jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
|
||||||
cinfo->JFIF_major_version = 2; /* Set JFIF major version = 2 */
|
cinfo->JFIF_major_version = 2; /* Set JFIF major version = 2 */
|
||||||
cinfo->num_components = 3;
|
cinfo->num_components = 3;
|
||||||
/* Add offset 0x20 to the normal R/G/B component IDs */
|
/* Add offset 0x20 to the normal R/G/B component IDs */
|
||||||
SET_COMP(0, 0x72 /* 'r' */, 1,1, 0,
|
SET_COMP(0, 0x72 /* 'r' */, 1,1,
|
||||||
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
||||||
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
||||||
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
|
||||||
SET_COMP(1, 0x67 /* 'g' */, 1,1, 0, 0,0);
|
SET_COMP(1, 0x67 /* 'g' */, 1,1, 0, 0,0);
|
||||||
SET_COMP(2, 0x62 /* 'b' */, 1,1, 0,
|
SET_COMP(2, 0x62 /* 'b' */, 1,1,
|
||||||
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
||||||
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
|
||||||
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
|
cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* jcprepct.c
|
* jcprepct.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
|
* Modified 2003-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -109,7 +110,8 @@ expand_bottom_edge (JSAMPARRAY image_data, JDIMENSION num_cols,
|
||||||
register int row;
|
register int row;
|
||||||
|
|
||||||
for (row = input_rows; row < output_rows; row++) {
|
for (row = input_rows; row < output_rows; row++) {
|
||||||
jcopy_sample_rows(image_data, input_rows-1, image_data, row,
|
jcopy_sample_rows(image_data + input_rows - 1,
|
||||||
|
image_data + row,
|
||||||
1, num_cols);
|
1, num_cols);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -220,8 +222,8 @@ pre_process_context (j_compress_ptr cinfo,
|
||||||
for (ci = 0; ci < cinfo->num_components; ci++) {
|
for (ci = 0; ci < cinfo->num_components; ci++) {
|
||||||
int row;
|
int row;
|
||||||
for (row = 1; row <= cinfo->max_v_samp_factor; row++) {
|
for (row = 1; row <= cinfo->max_v_samp_factor; row++) {
|
||||||
jcopy_sample_rows(prep->color_buf[ci], 0,
|
jcopy_sample_rows(prep->color_buf[ci],
|
||||||
prep->color_buf[ci], -row,
|
prep->color_buf[ci] - row,
|
||||||
1, cinfo->image_width);
|
1, cinfo->image_width);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -277,10 +279,9 @@ create_context_buffer (j_compress_ptr cinfo)
|
||||||
/* Grab enough space for fake row pointers for all the components;
|
/* Grab enough space for fake row pointers for all the components;
|
||||||
* we need five row groups' worth of pointers for each component.
|
* we need five row groups' worth of pointers for each component.
|
||||||
*/
|
*/
|
||||||
fake_buffer = (JSAMPARRAY)
|
fake_buffer = (JSAMPARRAY) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
(cinfo->num_components * 5 * rgroup_height) *
|
(cinfo->num_components * 5 * rgroup_height) * SIZEOF(JSAMPROW));
|
||||||
SIZEOF(JSAMPROW));
|
|
||||||
|
|
||||||
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++) {
|
||||||
|
@ -324,10 +325,9 @@ jinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer)
|
||||||
if (need_full_buffer) /* safety check */
|
if (need_full_buffer) /* safety check */
|
||||||
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
||||||
|
|
||||||
prep = (my_prep_ptr)
|
prep = (my_prep_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_prep_controller));
|
||||||
SIZEOF(my_prep_controller));
|
cinfo->prep = &prep->pub;
|
||||||
cinfo->prep = (struct jpeg_c_prep_controller *) prep;
|
|
||||||
prep->pub.start_pass = start_pass_prep;
|
prep->pub.start_pass = start_pass_prep;
|
||||||
|
|
||||||
/* Allocate the color conversion buffer.
|
/* Allocate the color conversion buffer.
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* jcsample.c
|
* jcsample.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1996, Thomas G. Lane.
|
* Copyright (C) 1991-1996, Thomas G. Lane.
|
||||||
|
* Modified 2003-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -200,7 +201,7 @@ fullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
JSAMPARRAY input_data, JSAMPARRAY output_data)
|
JSAMPARRAY input_data, JSAMPARRAY output_data)
|
||||||
{
|
{
|
||||||
/* Copy the data */
|
/* Copy the data */
|
||||||
jcopy_sample_rows(input_data, 0, output_data, 0,
|
jcopy_sample_rows(input_data, output_data,
|
||||||
cinfo->max_v_samp_factor, cinfo->image_width);
|
cinfo->max_v_samp_factor, cinfo->image_width);
|
||||||
/* Edge-expand */
|
/* Edge-expand */
|
||||||
expand_right_edge(output_data, cinfo->max_v_samp_factor, cinfo->image_width,
|
expand_right_edge(output_data, cinfo->max_v_samp_factor, cinfo->image_width,
|
||||||
|
@ -483,10 +484,9 @@ jinit_downsampler (j_compress_ptr cinfo)
|
||||||
boolean smoothok = TRUE;
|
boolean smoothok = TRUE;
|
||||||
int h_in_group, v_in_group, h_out_group, v_out_group;
|
int h_in_group, v_in_group, h_out_group, v_out_group;
|
||||||
|
|
||||||
downsample = (my_downsample_ptr)
|
downsample = (my_downsample_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_downsampler));
|
||||||
SIZEOF(my_downsampler));
|
cinfo->downsample = &downsample->pub;
|
||||||
cinfo->downsample = (struct jpeg_downsampler *) downsample;
|
|
||||||
downsample->pub.start_pass = start_pass_downsample;
|
downsample->pub.start_pass = start_pass_downsample;
|
||||||
downsample->pub.downsample = sep_downsample;
|
downsample->pub.downsample = sep_downsample;
|
||||||
downsample->pub.need_context_rows = FALSE;
|
downsample->pub.need_context_rows = FALSE;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jctrans.c
|
* jctrans.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1995-1998, Thomas G. Lane.
|
* Copyright (C) 1995-1998, Thomas G. Lane.
|
||||||
* Modified 2000-2017 by Guido Vollbeding.
|
* Modified 2000-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -224,7 +224,7 @@ typedef struct {
|
||||||
struct jpeg_c_coef_controller pub; /* public fields */
|
struct jpeg_c_coef_controller pub; /* public fields */
|
||||||
|
|
||||||
JDIMENSION iMCU_row_num; /* iMCU row # within image */
|
JDIMENSION iMCU_row_num; /* iMCU row # within image */
|
||||||
JDIMENSION mcu_ctr; /* counts MCUs processed in current row */
|
JDIMENSION MCU_ctr; /* counts MCUs processed in current row */
|
||||||
int MCU_vert_offset; /* counts MCU rows within iMCU row */
|
int MCU_vert_offset; /* counts MCU rows within iMCU row */
|
||||||
int MCU_rows_per_iMCU_row; /* number of such rows needed */
|
int MCU_rows_per_iMCU_row; /* number of such rows needed */
|
||||||
|
|
||||||
|
@ -232,7 +232,7 @@ typedef struct {
|
||||||
jvirt_barray_ptr * whole_image;
|
jvirt_barray_ptr * whole_image;
|
||||||
|
|
||||||
/* Workspace for constructing dummy blocks at right/bottom edges. */
|
/* Workspace for constructing dummy blocks at right/bottom edges. */
|
||||||
JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU];
|
JBLOCK dummy_buffer[C_MAX_BLOCKS_IN_MCU];
|
||||||
} my_coef_controller;
|
} my_coef_controller;
|
||||||
|
|
||||||
typedef my_coef_controller * my_coef_ptr;
|
typedef my_coef_controller * my_coef_ptr;
|
||||||
|
@ -257,7 +257,7 @@ start_iMCU_row (j_compress_ptr cinfo)
|
||||||
coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
|
coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
coef->mcu_ctr = 0;
|
coef->MCU_ctr = 0;
|
||||||
coef->MCU_vert_offset = 0;
|
coef->MCU_vert_offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,25 +315,30 @@ compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
|
||||||
/* Loop to process one whole iMCU row */
|
/* Loop to process one whole iMCU row */
|
||||||
for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
|
for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
|
||||||
yoffset++) {
|
yoffset++) {
|
||||||
for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;
|
for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
|
||||||
MCU_col_num++) {
|
MCU_col_num++) {
|
||||||
/* Construct list of pointers to DCT blocks belonging to this MCU */
|
/* Construct list of pointers to DCT blocks belonging to this MCU */
|
||||||
blkn = 0; /* index of current DCT block within MCU */
|
blkn = 0; /* index of current DCT block within MCU */
|
||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
start_col = MCU_col_num * compptr->MCU_width;
|
|
||||||
blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
|
blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
|
||||||
: compptr->last_col_width;
|
: compptr->last_col_width;
|
||||||
|
start_col = MCU_col_num * compptr->MCU_width;
|
||||||
for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
|
for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
|
||||||
if (coef->iMCU_row_num < last_iMCU_row ||
|
if (coef->iMCU_row_num < last_iMCU_row ||
|
||||||
yindex+yoffset < compptr->last_row_height) {
|
yoffset + yindex < compptr->last_row_height) {
|
||||||
/* Fill in pointers to real blocks in this row */
|
/* Fill in pointers to real blocks in this row */
|
||||||
buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
|
buffer_ptr = buffer[ci][yoffset + yindex] + start_col;
|
||||||
for (xindex = 0; xindex < blockcnt; xindex++)
|
xindex = blockcnt;
|
||||||
|
do {
|
||||||
MCU_buffer[blkn++] = buffer_ptr++;
|
MCU_buffer[blkn++] = buffer_ptr++;
|
||||||
|
} while (--xindex);
|
||||||
|
/* Dummy blocks at right edge */
|
||||||
|
if ((xindex = compptr->MCU_width - blockcnt) == 0)
|
||||||
|
continue;
|
||||||
} else {
|
} else {
|
||||||
/* At bottom of image, need a whole row of dummy blocks */
|
/* At bottom of image, need a whole row of dummy blocks */
|
||||||
xindex = 0;
|
xindex = compptr->MCU_width;
|
||||||
}
|
}
|
||||||
/* Fill in any dummy blocks needed in this row.
|
/* Fill in any dummy blocks needed in this row.
|
||||||
* Dummy blocks are filled in the same way as in jccoefct.c:
|
* Dummy blocks are filled in the same way as in jccoefct.c:
|
||||||
|
@ -341,23 +346,23 @@ compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
|
||||||
* block's DC value. The init routine has already zeroed the
|
* block's DC value. The init routine has already zeroed the
|
||||||
* AC entries, so we need only set the DC entries correctly.
|
* AC entries, so we need only set the DC entries correctly.
|
||||||
*/
|
*/
|
||||||
for (; xindex < compptr->MCU_width; xindex++) {
|
buffer_ptr = coef->dummy_buffer + blkn;
|
||||||
MCU_buffer[blkn] = coef->dummy_buffer[blkn];
|
do {
|
||||||
MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0];
|
buffer_ptr[0][0] = MCU_buffer[blkn-1][0][0];
|
||||||
blkn++;
|
MCU_buffer[blkn++] = buffer_ptr++;
|
||||||
}
|
} while (--xindex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Try to write the MCU. */
|
/* Try to write the MCU. */
|
||||||
if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) {
|
if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) {
|
||||||
/* Suspension forced; update state counters and exit */
|
/* Suspension forced; update state counters and exit */
|
||||||
coef->MCU_vert_offset = yoffset;
|
coef->MCU_vert_offset = yoffset;
|
||||||
coef->mcu_ctr = MCU_col_num;
|
coef->MCU_ctr = MCU_col_num;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Completed an MCU row, but perhaps not an iMCU row */
|
/* Completed an MCU row, but perhaps not an iMCU row */
|
||||||
coef->mcu_ctr = 0;
|
coef->MCU_ctr = 0;
|
||||||
}
|
}
|
||||||
/* Completed the iMCU row, advance counters for next one */
|
/* Completed the iMCU row, advance counters for next one */
|
||||||
coef->iMCU_row_num++;
|
coef->iMCU_row_num++;
|
||||||
|
@ -379,12 +384,9 @@ transencode_coef_controller (j_compress_ptr cinfo,
|
||||||
jvirt_barray_ptr * coef_arrays)
|
jvirt_barray_ptr * coef_arrays)
|
||||||
{
|
{
|
||||||
my_coef_ptr coef;
|
my_coef_ptr coef;
|
||||||
JBLOCKROW buffer;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
coef = (my_coef_ptr)
|
coef = (my_coef_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_coef_controller));
|
||||||
SIZEOF(my_coef_controller));
|
|
||||||
cinfo->coef = &coef->pub;
|
cinfo->coef = &coef->pub;
|
||||||
coef->pub.start_pass = start_pass_coef;
|
coef->pub.start_pass = start_pass_coef;
|
||||||
coef->pub.compress_data = compress_output;
|
coef->pub.compress_data = compress_output;
|
||||||
|
@ -392,12 +394,6 @@ transencode_coef_controller (j_compress_ptr cinfo,
|
||||||
/* Save pointer to virtual arrays */
|
/* Save pointer to virtual arrays */
|
||||||
coef->whole_image = coef_arrays;
|
coef->whole_image = coef_arrays;
|
||||||
|
|
||||||
/* Allocate and pre-zero space for dummy DCT blocks. */
|
/* Pre-zero space for dummy DCT blocks */
|
||||||
buffer = (JBLOCKROW)
|
MEMZERO(coef->dummy_buffer, SIZEOF(coef->dummy_buffer));
|
||||||
(*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
|
|
||||||
FMEMZERO((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
|
|
||||||
for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
|
|
||||||
coef->dummy_buffer[i] = buffer + i;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jdapimin.c
|
* jdapimin.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1998, Thomas G. Lane.
|
* Copyright (C) 1994-1998, Thomas G. Lane.
|
||||||
* Modified 2009-2013 by Guido Vollbeding.
|
* Modified 2009-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -114,7 +114,7 @@ jpeg_abort_decompress (j_decompress_ptr cinfo)
|
||||||
LOCAL(void)
|
LOCAL(void)
|
||||||
default_decompress_parms (j_decompress_ptr cinfo)
|
default_decompress_parms (j_decompress_ptr cinfo)
|
||||||
{
|
{
|
||||||
int cid0, cid1, cid2;
|
int cid0, cid1, cid2, cid3;
|
||||||
|
|
||||||
/* Guess the input colorspace, and set output colorspace accordingly. */
|
/* Guess the input colorspace, and set output colorspace accordingly. */
|
||||||
/* Note application may override our guesses. */
|
/* Note application may override our guesses. */
|
||||||
|
@ -123,13 +123,16 @@ default_decompress_parms (j_decompress_ptr cinfo)
|
||||||
cinfo->jpeg_color_space = JCS_GRAYSCALE;
|
cinfo->jpeg_color_space = JCS_GRAYSCALE;
|
||||||
cinfo->out_color_space = JCS_GRAYSCALE;
|
cinfo->out_color_space = JCS_GRAYSCALE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
cid0 = cinfo->comp_info[0].component_id;
|
cid0 = cinfo->comp_info[0].component_id;
|
||||||
cid1 = cinfo->comp_info[1].component_id;
|
cid1 = cinfo->comp_info[1].component_id;
|
||||||
cid2 = cinfo->comp_info[2].component_id;
|
cid2 = cinfo->comp_info[2].component_id;
|
||||||
|
|
||||||
/* First try to guess from the component IDs */
|
/* For robust detection of standard colorspaces
|
||||||
|
* regardless of the presence of special markers,
|
||||||
|
* check component IDs from SOF marker first.
|
||||||
|
*/
|
||||||
if (cid0 == 0x01 && cid1 == 0x02 && cid2 == 0x03)
|
if (cid0 == 0x01 && cid1 == 0x02 && cid2 == 0x03)
|
||||||
cinfo->jpeg_color_space = JCS_YCbCr;
|
cinfo->jpeg_color_space = JCS_YCbCr;
|
||||||
else if (cid0 == 0x01 && cid1 == 0x22 && cid2 == 0x23)
|
else if (cid0 == 0x01 && cid1 == 0x22 && cid2 == 0x23)
|
||||||
|
@ -151,7 +154,6 @@ default_decompress_parms (j_decompress_ptr cinfo)
|
||||||
default:
|
default:
|
||||||
WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
|
WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
|
||||||
cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
|
cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
|
TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
|
||||||
|
@ -160,9 +162,22 @@ default_decompress_parms (j_decompress_ptr cinfo)
|
||||||
/* Always guess RGB is proper output colorspace. */
|
/* Always guess RGB is proper output colorspace. */
|
||||||
cinfo->out_color_space = JCS_RGB;
|
cinfo->out_color_space = JCS_RGB;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
if (cinfo->saw_Adobe_marker) {
|
cid0 = cinfo->comp_info[0].component_id;
|
||||||
|
cid1 = cinfo->comp_info[1].component_id;
|
||||||
|
cid2 = cinfo->comp_info[2].component_id;
|
||||||
|
cid3 = cinfo->comp_info[3].component_id;
|
||||||
|
|
||||||
|
/* For robust detection of standard colorspaces
|
||||||
|
* regardless of the presence of special markers,
|
||||||
|
* check component IDs from SOF marker first.
|
||||||
|
*/
|
||||||
|
if (cid0 == 0x01 && cid1 == 0x02 && cid2 == 0x03 && cid3 == 0x04)
|
||||||
|
cinfo->jpeg_color_space = JCS_YCCK;
|
||||||
|
else if (cid0 == 0x43 && cid1 == 0x4D && cid2 == 0x59 && cid3 == 0x4B)
|
||||||
|
cinfo->jpeg_color_space = JCS_CMYK; /* ASCII 'C', 'M', 'Y', 'K' */
|
||||||
|
else if (cinfo->saw_Adobe_marker) {
|
||||||
switch (cinfo->Adobe_transform) {
|
switch (cinfo->Adobe_transform) {
|
||||||
case 0:
|
case 0:
|
||||||
cinfo->jpeg_color_space = JCS_CMYK;
|
cinfo->jpeg_color_space = JCS_CMYK;
|
||||||
|
@ -173,19 +188,17 @@ default_decompress_parms (j_decompress_ptr cinfo)
|
||||||
default:
|
default:
|
||||||
WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
|
WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
|
||||||
cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
|
cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* No special markers, assume straight CMYK. */
|
/* Unknown IDs and no special markers, assume straight CMYK. */
|
||||||
cinfo->jpeg_color_space = JCS_CMYK;
|
cinfo->jpeg_color_space = JCS_CMYK;
|
||||||
}
|
}
|
||||||
cinfo->out_color_space = JCS_CMYK;
|
cinfo->out_color_space = JCS_CMYK;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
cinfo->jpeg_color_space = JCS_UNKNOWN;
|
cinfo->jpeg_color_space = JCS_UNKNOWN;
|
||||||
cinfo->out_color_space = JCS_UNKNOWN;
|
cinfo->out_color_space = JCS_UNKNOWN;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set defaults for other decompression parameters. */
|
/* Set defaults for other decompression parameters. */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* jdarith.c
|
* jdarith.c
|
||||||
*
|
*
|
||||||
* Developed 1997-2019 by Guido Vollbeding.
|
* Developed 1997-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -239,7 +239,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, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
JBLOCKROW block;
|
JBLOCKROW block;
|
||||||
|
@ -318,7 +318,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, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
JBLOCKROW block;
|
JBLOCKROW block;
|
||||||
|
@ -400,7 +400,7 @@ 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, JBLOCKARRAY 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;
|
||||||
|
@ -434,7 +434,7 @@ 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, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
JBLOCKROW block;
|
JBLOCKROW block;
|
||||||
|
@ -509,7 +509,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
decode_mcu (j_decompress_ptr cinfo, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
jpeg_component_info * compptr;
|
jpeg_component_info * compptr;
|
||||||
|
|
111
jpeg/jdcoefct.c
111
jpeg/jdcoefct.c
|
@ -2,7 +2,7 @@
|
||||||
* jdcoefct.c
|
* jdcoefct.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
* Copyright (C) 1994-1997, Thomas G. Lane.
|
||||||
* Modified 2002-2011 by Guido Vollbeding.
|
* Modified 2002-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -19,11 +19,13 @@
|
||||||
#include "jinclude.h"
|
#include "jinclude.h"
|
||||||
#include "jpeglib.h"
|
#include "jpeglib.h"
|
||||||
|
|
||||||
|
|
||||||
/* Block smoothing is only applicable for progressive JPEG, so: */
|
/* Block smoothing is only applicable for progressive JPEG, so: */
|
||||||
#ifndef D_PROGRESSIVE_SUPPORTED
|
#ifndef D_PROGRESSIVE_SUPPORTED
|
||||||
#undef BLOCK_SMOOTHING_SUPPORTED
|
#undef BLOCK_SMOOTHING_SUPPORTED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Private buffer controller object */
|
/* Private buffer controller object */
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -38,11 +40,8 @@ typedef struct {
|
||||||
/* The output side's location is represented by cinfo->output_iMCU_row. */
|
/* The output side's location is represented by cinfo->output_iMCU_row. */
|
||||||
|
|
||||||
/* In single-pass modes, it's sufficient to buffer just one MCU.
|
/* In single-pass modes, it's sufficient to buffer just one MCU.
|
||||||
* We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks,
|
* We append a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks,
|
||||||
* and let the entropy decoder write into that workspace each time.
|
* and let the entropy decoder write into that workspace each time.
|
||||||
* (On 80x86, the workspace is FAR even though it's not really very big;
|
|
||||||
* this is to keep the module interfaces unchanged when a large coefficient
|
|
||||||
* buffer is necessary.)
|
|
||||||
* In multi-pass modes, this array points to the current MCU's blocks
|
* In multi-pass modes, this array points to the current MCU's blocks
|
||||||
* within the virtual arrays; it is used only by the input side.
|
* within the virtual arrays; it is used only by the input side.
|
||||||
*/
|
*/
|
||||||
|
@ -58,10 +57,14 @@ typedef struct {
|
||||||
int * coef_bits_latch;
|
int * coef_bits_latch;
|
||||||
#define SAVED_COEFS 6 /* we save coef_bits[0..5] */
|
#define SAVED_COEFS 6 /* we save coef_bits[0..5] */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Workspace for single-pass modes (omitted otherwise). */
|
||||||
|
JBLOCK blk_buffer[D_MAX_BLOCKS_IN_MCU];
|
||||||
} my_coef_controller;
|
} my_coef_controller;
|
||||||
|
|
||||||
typedef my_coef_controller * my_coef_ptr;
|
typedef my_coef_controller * my_coef_ptr;
|
||||||
|
|
||||||
|
|
||||||
/* Forward declarations */
|
/* Forward declarations */
|
||||||
METHODDEF(int) decompress_onepass
|
METHODDEF(int) decompress_onepass
|
||||||
JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
|
JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
|
||||||
|
@ -151,7 +154,8 @@ decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
||||||
JDIMENSION MCU_col_num; /* index of current MCU within row */
|
JDIMENSION MCU_col_num; /* index of current MCU within row */
|
||||||
JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
|
JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
|
||||||
JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
|
JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
|
||||||
int blkn, ci, xindex, yindex, yoffset, useful_width;
|
int ci, xindex, yindex, yoffset, useful_width;
|
||||||
|
JBLOCKROW blkp;
|
||||||
JSAMPARRAY output_ptr;
|
JSAMPARRAY output_ptr;
|
||||||
JDIMENSION start_col, output_col;
|
JDIMENSION start_col, output_col;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
@ -162,10 +166,10 @@ decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
||||||
yoffset++) {
|
yoffset++) {
|
||||||
for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
|
for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
|
||||||
MCU_col_num++) {
|
MCU_col_num++) {
|
||||||
|
blkp = coef->blk_buffer; /* pointer to current DCT block within MCU */
|
||||||
/* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */
|
/* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */
|
||||||
if (cinfo->lim_Se) /* can bypass in DC only case */
|
if (cinfo->lim_Se) /* can bypass in DC only case */
|
||||||
FMEMZERO((void FAR *) coef->MCU_buffer[0],
|
MEMZERO(blkp, cinfo->blocks_in_MCU * SIZEOF(JBLOCK));
|
||||||
(size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK)));
|
|
||||||
if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
|
if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
|
||||||
/* Suspension forced; update state counters and exit */
|
/* Suspension forced; update state counters and exit */
|
||||||
coef->MCU_vert_offset = yoffset;
|
coef->MCU_vert_offset = yoffset;
|
||||||
|
@ -173,37 +177,34 @@ decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
||||||
return JPEG_SUSPENDED;
|
return JPEG_SUSPENDED;
|
||||||
}
|
}
|
||||||
/* Determine where data should go in output_buf and do the IDCT thing.
|
/* Determine where data should go in output_buf and do the IDCT thing.
|
||||||
* We skip dummy blocks at the right and bottom edges (but blkn gets
|
* We skip dummy blocks at the right and bottom edges (but blkp gets
|
||||||
* incremented past them!). Note the inner loop relies on having
|
* incremented past them!).
|
||||||
* allocated the MCU_buffer[] blocks sequentially.
|
|
||||||
*/
|
*/
|
||||||
blkn = 0; /* index of current DCT block within MCU */
|
|
||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
/* Don't bother to IDCT an uninteresting component. */
|
/* Don't bother to IDCT an uninteresting component. */
|
||||||
if (! compptr->component_needed) {
|
if (! compptr->component_needed) {
|
||||||
blkn += compptr->MCU_blocks;
|
blkp += compptr->MCU_blocks;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index];
|
inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index];
|
||||||
useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
|
|
||||||
: compptr->last_col_width;
|
|
||||||
output_ptr = output_buf[compptr->component_index] +
|
output_ptr = output_buf[compptr->component_index] +
|
||||||
yoffset * compptr->DCT_v_scaled_size;
|
yoffset * compptr->DCT_v_scaled_size;
|
||||||
|
useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
|
||||||
|
: compptr->last_col_width;
|
||||||
start_col = MCU_col_num * compptr->MCU_sample_width;
|
start_col = MCU_col_num * compptr->MCU_sample_width;
|
||||||
for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
|
for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
|
||||||
if (cinfo->input_iMCU_row < last_iMCU_row ||
|
if (cinfo->input_iMCU_row < last_iMCU_row ||
|
||||||
yoffset+yindex < compptr->last_row_height) {
|
yoffset + yindex < compptr->last_row_height) {
|
||||||
output_col = start_col;
|
output_col = start_col;
|
||||||
for (xindex = 0; xindex < useful_width; xindex++) {
|
for (xindex = 0; xindex < useful_width; xindex++) {
|
||||||
(*inverse_DCT) (cinfo, compptr,
|
(*inverse_DCT) (cinfo, compptr, (JCOEFPTR) (blkp + xindex),
|
||||||
(JCOEFPTR) coef->MCU_buffer[blkn+xindex],
|
|
||||||
output_ptr, output_col);
|
output_ptr, output_col);
|
||||||
output_col += compptr->DCT_h_scaled_size;
|
output_col += compptr->DCT_h_scaled_size;
|
||||||
}
|
}
|
||||||
|
output_ptr += compptr->DCT_v_scaled_size;
|
||||||
}
|
}
|
||||||
blkn += compptr->MCU_width;
|
blkp += compptr->MCU_width;
|
||||||
output_ptr += compptr->DCT_v_scaled_size;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -212,7 +213,7 @@ decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
||||||
}
|
}
|
||||||
/* Completed the iMCU row, advance counters for next one */
|
/* Completed the iMCU row, advance counters for next one */
|
||||||
cinfo->output_iMCU_row++;
|
cinfo->output_iMCU_row++;
|
||||||
if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
|
if (++(cinfo->input_iMCU_row) <= last_iMCU_row) {
|
||||||
start_iMCU_row(cinfo);
|
start_iMCU_row(cinfo);
|
||||||
return JPEG_ROW_COMPLETED;
|
return JPEG_ROW_COMPLETED;
|
||||||
}
|
}
|
||||||
|
@ -247,8 +248,9 @@ consume_data (j_decompress_ptr cinfo)
|
||||||
{
|
{
|
||||||
my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
|
my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
|
||||||
JDIMENSION MCU_col_num; /* index of current MCU within row */
|
JDIMENSION MCU_col_num; /* index of current MCU within row */
|
||||||
int blkn, ci, xindex, yindex, yoffset;
|
int ci, xindex, yindex, yoffset;
|
||||||
JDIMENSION start_col;
|
JDIMENSION start_col;
|
||||||
|
JBLOCKARRAY blkp;
|
||||||
JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
|
JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
|
||||||
JBLOCKROW buffer_ptr;
|
JBLOCKROW buffer_ptr;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
@ -272,15 +274,16 @@ consume_data (j_decompress_ptr cinfo)
|
||||||
for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
|
for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
|
||||||
MCU_col_num++) {
|
MCU_col_num++) {
|
||||||
/* Construct list of pointers to DCT blocks belonging to this MCU */
|
/* Construct list of pointers to DCT blocks belonging to this MCU */
|
||||||
blkn = 0; /* index of current DCT block within MCU */
|
blkp = coef->MCU_buffer; /* pointer to current DCT block within MCU */
|
||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
start_col = MCU_col_num * compptr->MCU_width;
|
start_col = MCU_col_num * compptr->MCU_width;
|
||||||
for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
|
for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
|
||||||
buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
|
buffer_ptr = buffer[ci][yoffset + yindex] + start_col;
|
||||||
for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
|
xindex = compptr->MCU_width;
|
||||||
coef->MCU_buffer[blkn++] = buffer_ptr++;
|
do {
|
||||||
}
|
*blkp++ = buffer_ptr++;
|
||||||
|
} while (--xindex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Try to fetch the MCU. */
|
/* Try to fetch the MCU. */
|
||||||
|
@ -370,7 +373,7 @@ decompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
|
if (++(cinfo->output_iMCU_row) <= last_iMCU_row)
|
||||||
return JPEG_ROW_COMPLETED;
|
return JPEG_ROW_COMPLETED;
|
||||||
return JPEG_SCAN_COMPLETED;
|
return JPEG_SCAN_COMPLETED;
|
||||||
}
|
}
|
||||||
|
@ -419,10 +422,9 @@ smoothing_ok (j_decompress_ptr cinfo)
|
||||||
|
|
||||||
/* Allocate latch area if not already done */
|
/* Allocate latch area if not already done */
|
||||||
if (coef->coef_bits_latch == NULL)
|
if (coef->coef_bits_latch == NULL)
|
||||||
coef->coef_bits_latch = (int *)
|
coef->coef_bits_latch = (int *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
cinfo->num_components *
|
cinfo->num_components * (SAVED_COEFS * SIZEOF(int)));
|
||||||
(SAVED_COEFS * SIZEOF(int)));
|
|
||||||
coef_bits_latch = coef->coef_bits_latch;
|
coef_bits_latch = coef->coef_bits_latch;
|
||||||
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
||||||
|
@ -662,7 +664,7 @@ decompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
|
if (++(cinfo->output_iMCU_row) <= last_iMCU_row)
|
||||||
return JPEG_ROW_COMPLETED;
|
return JPEG_ROW_COMPLETED;
|
||||||
return JPEG_SCAN_COMPLETED;
|
return JPEG_SCAN_COMPLETED;
|
||||||
}
|
}
|
||||||
|
@ -679,17 +681,6 @@ jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
|
||||||
{
|
{
|
||||||
my_coef_ptr coef;
|
my_coef_ptr coef;
|
||||||
|
|
||||||
coef = (my_coef_ptr)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
SIZEOF(my_coef_controller));
|
|
||||||
cinfo->coef = (struct jpeg_d_coef_controller *) coef;
|
|
||||||
coef->pub.start_input_pass = start_input_pass;
|
|
||||||
coef->pub.start_output_pass = start_output_pass;
|
|
||||||
#ifdef BLOCK_SMOOTHING_SUPPORTED
|
|
||||||
coef->coef_bits_latch = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Create the coefficient buffer. */
|
|
||||||
if (need_full_buffer) {
|
if (need_full_buffer) {
|
||||||
#ifdef D_MULTISCAN_FILES_SUPPORTED
|
#ifdef D_MULTISCAN_FILES_SUPPORTED
|
||||||
/* Allocate a full-image virtual array for each component, */
|
/* Allocate a full-image virtual array for each component, */
|
||||||
|
@ -698,6 +689,9 @@ jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
|
||||||
int ci, access_rows;
|
int ci, access_rows;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
|
||||||
|
coef = (my_coef_ptr) (*cinfo->mem->alloc_small)
|
||||||
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
|
SIZEOF(my_coef_controller) - SIZEOF(coef->blk_buffer));
|
||||||
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++) {
|
||||||
access_rows = compptr->v_samp_factor;
|
access_rows = compptr->v_samp_factor;
|
||||||
|
@ -722,20 +716,29 @@ jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
/* We only need a single-MCU buffer. */
|
/* We only need a single-MCU buffer. */
|
||||||
JBLOCKROW buffer;
|
JBLOCKARRAY blkp;
|
||||||
int i;
|
JBLOCKROW buffer_ptr;
|
||||||
|
int bi;
|
||||||
|
|
||||||
buffer = (JBLOCKROW)
|
coef = (my_coef_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_coef_controller));
|
||||||
D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
|
buffer_ptr = coef->blk_buffer;
|
||||||
for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
|
|
||||||
coef->MCU_buffer[i] = buffer + i;
|
|
||||||
}
|
|
||||||
if (cinfo->lim_Se == 0) /* DC only case: want to bypass later */
|
if (cinfo->lim_Se == 0) /* DC only case: want to bypass later */
|
||||||
FMEMZERO((void FAR *) buffer,
|
MEMZERO(buffer_ptr, SIZEOF(coef->blk_buffer));
|
||||||
(size_t) (D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)));
|
blkp = coef->MCU_buffer;
|
||||||
|
bi = D_MAX_BLOCKS_IN_MCU;
|
||||||
|
do {
|
||||||
|
*blkp++ = buffer_ptr++;
|
||||||
|
} while (--bi);
|
||||||
coef->pub.consume_data = dummy_consume_data;
|
coef->pub.consume_data = dummy_consume_data;
|
||||||
coef->pub.decompress_data = decompress_onepass;
|
coef->pub.decompress_data = decompress_onepass;
|
||||||
coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
|
coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
coef->pub.start_input_pass = start_input_pass;
|
||||||
|
coef->pub.start_output_pass = start_output_pass;
|
||||||
|
#ifdef BLOCK_SMOOTHING_SUPPORTED
|
||||||
|
coef->coef_bits_latch = NULL;
|
||||||
|
#endif
|
||||||
|
cinfo->coef = &coef->pub;
|
||||||
}
|
}
|
||||||
|
|
107
jpeg/jdcolor.c
107
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-2019 by Guido Vollbeding.
|
* Modified 2011-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -420,7 +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.
|
* Note: Omit uninteresting components in output buffer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
|
@ -431,22 +431,27 @@ null_convert (j_decompress_ptr cinfo,
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JDIMENSION count;
|
register JDIMENSION count;
|
||||||
register int num_comps = cinfo->num_components;
|
register int out_comps = cinfo->out_color_components;
|
||||||
JDIMENSION num_cols = cinfo->output_width;
|
JDIMENSION num_cols = cinfo->output_width;
|
||||||
|
JSAMPROW startptr;
|
||||||
int ci;
|
int ci;
|
||||||
|
jpeg_component_info *compptr;
|
||||||
|
|
||||||
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 < num_comps; ci++) {
|
startptr = *output_buf++;
|
||||||
|
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
||||||
|
ci++, compptr++) {
|
||||||
|
if (! compptr->component_needed)
|
||||||
|
continue; /* skip uninteresting component */
|
||||||
inptr = input_buf[ci][input_row];
|
inptr = input_buf[ci][input_row];
|
||||||
outptr = output_buf[0] + ci;
|
outptr = startptr++;
|
||||||
for (count = num_cols; count > 0; count--) {
|
for (count = num_cols; count > 0; count--) {
|
||||||
*outptr = *inptr++; /* don't need GETJSAMPLE() here */
|
*outptr = *inptr++; /* don't need GETJSAMPLE() here */
|
||||||
outptr += num_comps;
|
outptr += out_comps;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
input_row++;
|
input_row++;
|
||||||
output_buf++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -462,7 +467,7 @@ grayscale_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)
|
||||||
{
|
{
|
||||||
jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0,
|
jcopy_sample_rows(input_buf[0] + input_row, output_buf,
|
||||||
num_rows, cinfo->output_width);
|
num_rows, cinfo->output_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -549,6 +554,47 @@ ycck_cmyk_convert (j_decompress_ptr cinfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert CMYK to YK part of YCCK for colorless output.
|
||||||
|
* We assume build_rgb_y_table has been called.
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(void)
|
||||||
|
cmyk_yk_convert (j_decompress_ptr cinfo,
|
||||||
|
JSAMPIMAGE input_buf, JDIMENSION input_row,
|
||||||
|
JSAMPARRAY output_buf, int num_rows)
|
||||||
|
{
|
||||||
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
|
register int r, g, b;
|
||||||
|
register INT32 * ctab = cconvert->rgb_y_tab;
|
||||||
|
register JSAMPROW outptr;
|
||||||
|
register JSAMPROW inptr0, inptr1, inptr2, inptr3;
|
||||||
|
register JDIMENSION col;
|
||||||
|
JDIMENSION num_cols = cinfo->output_width;
|
||||||
|
|
||||||
|
while (--num_rows >= 0) {
|
||||||
|
inptr0 = input_buf[0][input_row];
|
||||||
|
inptr1 = input_buf[1][input_row];
|
||||||
|
inptr2 = input_buf[2][input_row];
|
||||||
|
inptr3 = input_buf[3][input_row];
|
||||||
|
input_row++;
|
||||||
|
outptr = *output_buf++;
|
||||||
|
for (col = 0; col < num_cols; col++) {
|
||||||
|
r = MAXJSAMPLE - GETJSAMPLE(inptr0[col]);
|
||||||
|
g = MAXJSAMPLE - GETJSAMPLE(inptr1[col]);
|
||||||
|
b = MAXJSAMPLE - GETJSAMPLE(inptr2[col]);
|
||||||
|
/* Y */
|
||||||
|
outptr[0] = (JSAMPLE)
|
||||||
|
((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
|
||||||
|
>> SCALEBITS);
|
||||||
|
/* K passes through unchanged */
|
||||||
|
outptr[1] = inptr3[col]; /* don't need GETJSAMPLE here */
|
||||||
|
outptr += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Empty method for start_pass.
|
* Empty method for start_pass.
|
||||||
*/
|
*/
|
||||||
|
@ -568,7 +614,7 @@ GLOBAL(void)
|
||||||
jinit_color_deconverter (j_decompress_ptr cinfo)
|
jinit_color_deconverter (j_decompress_ptr cinfo)
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert;
|
my_cconvert_ptr cconvert;
|
||||||
int ci;
|
int ci, i;
|
||||||
|
|
||||||
cconvert = (my_cconvert_ptr) (*cinfo->mem->alloc_small)
|
cconvert = (my_cconvert_ptr) (*cinfo->mem->alloc_small)
|
||||||
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_color_deconverter));
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_color_deconverter));
|
||||||
|
@ -608,7 +654,7 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
|
||||||
/* Set out_color_components and conversion method based on requested space.
|
/* Set out_color_components and conversion method based on requested space.
|
||||||
* Also clear the component_needed flags for any unused components,
|
* Also adjust the component_needed flags for any unused components,
|
||||||
* so that earlier pipeline stages can avoid useless computation.
|
* so that earlier pipeline stages can avoid useless computation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -674,9 +720,9 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JCS_BG_RGB:
|
case JCS_BG_RGB:
|
||||||
cinfo->out_color_components = RGB_PIXELSIZE;
|
|
||||||
if (cinfo->jpeg_color_space != JCS_BG_RGB)
|
if (cinfo->jpeg_color_space != JCS_BG_RGB)
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
cinfo->out_color_components = RGB_PIXELSIZE;
|
||||||
switch (cinfo->color_transform) {
|
switch (cinfo->color_transform) {
|
||||||
case JCT_NONE:
|
case JCT_NONE:
|
||||||
cconvert->pub.color_convert = rgb_convert;
|
cconvert->pub.color_convert = rgb_convert;
|
||||||
|
@ -690,25 +736,38 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JCS_CMYK:
|
case JCS_CMYK:
|
||||||
|
if (cinfo->jpeg_color_space != JCS_YCCK)
|
||||||
|
goto def_label;
|
||||||
cinfo->out_color_components = 4;
|
cinfo->out_color_components = 4;
|
||||||
switch (cinfo->jpeg_color_space) {
|
cconvert->pub.color_convert = ycck_cmyk_convert;
|
||||||
case JCS_YCCK:
|
build_ycc_rgb_table(cinfo);
|
||||||
cconvert->pub.color_convert = ycck_cmyk_convert;
|
|
||||||
build_ycc_rgb_table(cinfo);
|
|
||||||
break;
|
|
||||||
case JCS_CMYK:
|
|
||||||
cconvert->pub.color_convert = null_convert;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: /* permit null conversion to same output space */
|
case JCS_YCCK:
|
||||||
|
if (cinfo->jpeg_color_space != JCS_CMYK ||
|
||||||
|
/* Support only YK part of YCCK for colorless output */
|
||||||
|
! cinfo->comp_info[0].component_needed ||
|
||||||
|
cinfo->comp_info[1].component_needed ||
|
||||||
|
cinfo->comp_info[2].component_needed ||
|
||||||
|
! cinfo->comp_info[3].component_needed)
|
||||||
|
goto def_label;
|
||||||
|
cinfo->out_color_components = 2;
|
||||||
|
/* Need all components on input side */
|
||||||
|
cinfo->comp_info[1].component_needed = TRUE;
|
||||||
|
cinfo->comp_info[2].component_needed = TRUE;
|
||||||
|
cconvert->pub.color_convert = cmyk_yk_convert;
|
||||||
|
build_rgb_y_table(cinfo);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: def_label: /* 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 */
|
/* unsupported non-null conversion */
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
cinfo->out_color_components = cinfo->num_components;
|
i = 0;
|
||||||
|
for (ci = 0; ci < cinfo->num_components; ci++)
|
||||||
|
if (cinfo->comp_info[ci].component_needed)
|
||||||
|
i++; /* count output color components */
|
||||||
|
cinfo->out_color_components = i;
|
||||||
cconvert->pub.color_convert = null_convert;
|
cconvert->pub.color_convert = null_convert;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jdhuff.c
|
* jdhuff.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2006-2019 by Guido Vollbeding.
|
* Modified 2006-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -704,7 +704,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, JBLOCKARRAY 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;
|
||||||
|
@ -776,7 +776,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, JBLOCKARRAY 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;
|
||||||
|
@ -864,7 +864,7 @@ 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, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
JCOEF p1;
|
JCOEF p1;
|
||||||
|
@ -913,7 +913,7 @@ 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, JBLOCKARRAY 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;
|
||||||
|
@ -1072,7 +1072,7 @@ undoit:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
decode_mcu_sub (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
decode_mcu_sub (j_decompress_ptr cinfo, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
const int * natural_order;
|
const int * natural_order;
|
||||||
|
@ -1201,7 +1201,7 @@ decode_mcu_sub (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
decode_mcu (j_decompress_ptr cinfo, JBLOCKARRAY MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
int blkn;
|
int blkn;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jdinput.c
|
* jdinput.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2002-2013 by Guido Vollbeding.
|
* Modified 2002-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -330,7 +330,6 @@ initial_setup (j_decompress_ptr cinfo)
|
||||||
default:
|
default:
|
||||||
ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
|
ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
|
||||||
cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);
|
cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We initialize DCT_scaled_size and min_DCT_scaled_size to block_size.
|
/* We initialize DCT_scaled_size and min_DCT_scaled_size to block_size.
|
||||||
|
@ -391,16 +390,16 @@ per_scan_setup (j_decompress_ptr cinfo)
|
||||||
{
|
{
|
||||||
int ci, mcublks, tmp;
|
int ci, mcublks, tmp;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
|
||||||
if (cinfo->comps_in_scan == 1) {
|
if (cinfo->comps_in_scan == 1) {
|
||||||
|
|
||||||
/* Noninterleaved (single-component) scan */
|
/* Noninterleaved (single-component) scan */
|
||||||
compptr = cinfo->cur_comp_info[0];
|
compptr = cinfo->cur_comp_info[0];
|
||||||
|
|
||||||
/* Overall image size in MCUs */
|
/* Overall image size in MCUs */
|
||||||
cinfo->MCUs_per_row = compptr->width_in_blocks;
|
cinfo->MCUs_per_row = compptr->width_in_blocks;
|
||||||
cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
|
cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
|
||||||
|
|
||||||
/* For noninterleaved scan, always one block per MCU */
|
/* For noninterleaved scan, always one block per MCU */
|
||||||
compptr->MCU_width = 1;
|
compptr->MCU_width = 1;
|
||||||
compptr->MCU_height = 1;
|
compptr->MCU_height = 1;
|
||||||
|
@ -413,28 +412,26 @@ per_scan_setup (j_decompress_ptr cinfo)
|
||||||
tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
|
tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
|
||||||
if (tmp == 0) tmp = compptr->v_samp_factor;
|
if (tmp == 0) tmp = compptr->v_samp_factor;
|
||||||
compptr->last_row_height = tmp;
|
compptr->last_row_height = tmp;
|
||||||
|
|
||||||
/* Prepare array describing MCU composition */
|
/* Prepare array describing MCU composition */
|
||||||
cinfo->blocks_in_MCU = 1;
|
cinfo->blocks_in_MCU = 1;
|
||||||
cinfo->MCU_membership[0] = 0;
|
cinfo->MCU_membership[0] = 0;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
/* Interleaved (multi-component) scan */
|
/* Interleaved (multi-component) scan */
|
||||||
if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
|
if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
|
||||||
ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
|
ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
|
||||||
MAX_COMPS_IN_SCAN);
|
MAX_COMPS_IN_SCAN);
|
||||||
|
|
||||||
/* Overall image size in MCUs */
|
/* Overall image size in MCUs */
|
||||||
cinfo->MCUs_per_row = (JDIMENSION)
|
cinfo->MCUs_per_row = (JDIMENSION)
|
||||||
jdiv_round_up((long) cinfo->image_width,
|
jdiv_round_up((long) cinfo->image_width,
|
||||||
(long) (cinfo->max_h_samp_factor * cinfo->block_size));
|
(long) (cinfo->max_h_samp_factor * cinfo->block_size));
|
||||||
cinfo->MCU_rows_in_scan = (JDIMENSION)
|
cinfo->MCU_rows_in_scan = cinfo->total_iMCU_rows;
|
||||||
jdiv_round_up((long) cinfo->image_height,
|
|
||||||
(long) (cinfo->max_v_samp_factor * cinfo->block_size));
|
|
||||||
|
|
||||||
cinfo->blocks_in_MCU = 0;
|
cinfo->blocks_in_MCU = 0;
|
||||||
|
|
||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
/* Sampling factors give # of blocks of component in each MCU */
|
/* Sampling factors give # of blocks of component in each MCU */
|
||||||
|
@ -457,7 +454,7 @@ per_scan_setup (j_decompress_ptr cinfo)
|
||||||
cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
|
cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -501,9 +498,8 @@ latch_quant_tables (j_decompress_ptr cinfo)
|
||||||
cinfo->quant_tbl_ptrs[qtblno] == NULL)
|
cinfo->quant_tbl_ptrs[qtblno] == NULL)
|
||||||
ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
|
ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
|
||||||
/* OK, save away the quantization table */
|
/* OK, save away the quantization table */
|
||||||
qtbl = (JQUANT_TBL *)
|
qtbl = (JQUANT_TBL *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(JQUANT_TBL));
|
||||||
SIZEOF(JQUANT_TBL));
|
|
||||||
MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL));
|
MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL));
|
||||||
compptr->quant_table = qtbl;
|
compptr->quant_table = qtbl;
|
||||||
}
|
}
|
||||||
|
@ -644,9 +640,8 @@ jinit_input_controller (j_decompress_ptr cinfo)
|
||||||
my_inputctl_ptr inputctl;
|
my_inputctl_ptr inputctl;
|
||||||
|
|
||||||
/* Create subobject in permanent pool */
|
/* Create subobject in permanent pool */
|
||||||
inputctl = (my_inputctl_ptr)
|
inputctl = (my_inputctl_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
((j_common_ptr) cinfo, JPOOL_PERMANENT, SIZEOF(my_input_controller));
|
||||||
SIZEOF(my_input_controller));
|
|
||||||
cinfo->inputctl = &inputctl->pub;
|
cinfo->inputctl = &inputctl->pub;
|
||||||
/* Initialize method pointers */
|
/* Initialize method pointers */
|
||||||
inputctl->pub.consume_input = consume_markers;
|
inputctl->pub.consume_input = consume_markers;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jdmainct.c
|
* jdmainct.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* Modified 2002-2016 by Guido Vollbeding.
|
* Modified 2002-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -170,21 +170,22 @@ alloc_funny_pointers (j_decompress_ptr cinfo)
|
||||||
/* Get top-level space for component array pointers.
|
/* Get top-level space for component array pointers.
|
||||||
* We alloc both arrays with one call to save a few cycles.
|
* We alloc both arrays with one call to save a few cycles.
|
||||||
*/
|
*/
|
||||||
mainp->xbuffer[0] = (JSAMPIMAGE)
|
mainp->xbuffer[0] = (JSAMPIMAGE) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
cinfo->num_components * 2 * SIZEOF(JSAMPARRAY));
|
cinfo->num_components * 2 * SIZEOF(JSAMPARRAY));
|
||||||
mainp->xbuffer[1] = mainp->xbuffer[0] + cinfo->num_components;
|
mainp->xbuffer[1] = mainp->xbuffer[0] + cinfo->num_components;
|
||||||
|
|
||||||
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++) {
|
||||||
|
if (! compptr->component_needed)
|
||||||
|
continue; /* skip uninteresting component */
|
||||||
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
|
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
|
||||||
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
|
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
|
||||||
/* Get space for pointer lists --- M+4 row groups in each list.
|
/* Get space for pointer lists --- M+4 row groups in each list.
|
||||||
* We alloc both pointer lists with one call to save a few cycles.
|
* We alloc both pointer lists with one call to save a few cycles.
|
||||||
*/
|
*/
|
||||||
xbuf = (JSAMPARRAY)
|
xbuf = (JSAMPARRAY) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo,
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
JPOOL_IMAGE, 2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW));
|
||||||
2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW));
|
|
||||||
xbuf += rgroup; /* want one row group at negative offsets */
|
xbuf += rgroup; /* want one row group at negative offsets */
|
||||||
mainp->xbuffer[0][ci] = xbuf;
|
mainp->xbuffer[0][ci] = xbuf;
|
||||||
xbuf += rgroup * (M + 4);
|
xbuf += rgroup * (M + 4);
|
||||||
|
@ -210,6 +211,8 @@ make_funny_pointers (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++) {
|
||||||
|
if (! compptr->component_needed)
|
||||||
|
continue; /* skip uninteresting component */
|
||||||
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
|
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
|
||||||
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
|
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
|
||||||
xbuf0 = mainp->xbuffer[0][ci];
|
xbuf0 = mainp->xbuffer[0][ci];
|
||||||
|
@ -250,6 +253,8 @@ set_wraparound_pointers (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++) {
|
||||||
|
if (! compptr->component_needed)
|
||||||
|
continue; /* skip uninteresting component */
|
||||||
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
|
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
|
||||||
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
|
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
|
||||||
xbuf0 = mainp->xbuffer[0][ci];
|
xbuf0 = mainp->xbuffer[0][ci];
|
||||||
|
@ -278,6 +283,8 @@ set_bottom_pointers (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++) {
|
||||||
|
if (! compptr->component_needed)
|
||||||
|
continue; /* skip uninteresting component */
|
||||||
/* Count sample rows in one iMCU row and in one row group */
|
/* Count sample rows in one iMCU row and in one row group */
|
||||||
iMCUheight = compptr->v_samp_factor * compptr->DCT_v_scaled_size;
|
iMCUheight = compptr->v_samp_factor * compptr->DCT_v_scaled_size;
|
||||||
rgroup = iMCUheight / cinfo->min_DCT_v_scaled_size;
|
rgroup = iMCUheight / cinfo->min_DCT_v_scaled_size;
|
||||||
|
@ -333,7 +340,6 @@ start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -344,9 +350,8 @@ start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
process_data_simple_main (j_decompress_ptr cinfo,
|
process_data_simple_main (j_decompress_ptr cinfo, JSAMPARRAY output_buf,
|
||||||
JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
|
JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)
|
||||||
JDIMENSION out_rows_avail)
|
|
||||||
{
|
{
|
||||||
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
||||||
|
|
||||||
|
@ -375,9 +380,8 @@ process_data_simple_main (j_decompress_ptr cinfo,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
process_data_context_main (j_decompress_ptr cinfo,
|
process_data_context_main (j_decompress_ptr cinfo, JSAMPARRAY output_buf,
|
||||||
JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
|
JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)
|
||||||
JDIMENSION out_rows_avail)
|
|
||||||
{
|
{
|
||||||
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
||||||
|
|
||||||
|
@ -449,13 +453,12 @@ process_data_context_main (j_decompress_ptr cinfo,
|
||||||
#ifdef QUANT_2PASS_SUPPORTED
|
#ifdef QUANT_2PASS_SUPPORTED
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
process_data_crank_post (j_decompress_ptr cinfo,
|
process_data_crank_post (j_decompress_ptr cinfo, JSAMPARRAY output_buf,
|
||||||
JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
|
JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)
|
||||||
JDIMENSION out_rows_avail)
|
|
||||||
{
|
{
|
||||||
(*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL,
|
(*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL,
|
||||||
(JDIMENSION *) NULL, (JDIMENSION) 0,
|
(JDIMENSION *) NULL, (JDIMENSION) 0,
|
||||||
output_buf, out_row_ctr, out_rows_avail);
|
output_buf, out_row_ctr, out_rows_avail);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* QUANT_2PASS_SUPPORTED */
|
#endif /* QUANT_2PASS_SUPPORTED */
|
||||||
|
@ -472,9 +475,8 @@ jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
|
||||||
int ci, rgroup, ngroups;
|
int ci, rgroup, ngroups;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
|
||||||
mainp = (my_main_ptr)
|
mainp = (my_main_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_main_controller));
|
||||||
SIZEOF(my_main_controller));
|
|
||||||
cinfo->main = &mainp->pub;
|
cinfo->main = &mainp->pub;
|
||||||
mainp->pub.start_pass = start_pass_main;
|
mainp->pub.start_pass = start_pass_main;
|
||||||
|
|
||||||
|
@ -497,6 +499,8 @@ jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
|
||||||
|
|
||||||
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++) {
|
||||||
|
if (! compptr->component_needed)
|
||||||
|
continue; /* skip uninteresting component */
|
||||||
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
|
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
|
||||||
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
|
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
|
||||||
mainp->buffer[ci] = (*cinfo->mem->alloc_sarray)
|
mainp->buffer[ci] = (*cinfo->mem->alloc_sarray)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jdmaster.c
|
* jdmaster.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2002-2019 by Guido Vollbeding.
|
* Modified 2002-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -103,10 +103,8 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
|
||||||
* This function is used for full decompression.
|
* This function is used for full decompression.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
#ifdef IDCT_SCALING_SUPPORTED
|
int ci, i;
|
||||||
int ci, ssize;
|
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Prevent application from calling me at wrong times */
|
/* Prevent application from calling me at wrong times */
|
||||||
if (cinfo->global_state != DSTATE_READY)
|
if (cinfo->global_state != DSTATE_READY)
|
||||||
|
@ -124,7 +122,7 @@ 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++) {
|
||||||
ssize = 1;
|
int ssize = 1;
|
||||||
if (! cinfo->raw_data_out)
|
if (! cinfo->raw_data_out)
|
||||||
while (cinfo->min_DCT_h_scaled_size * ssize <=
|
while (cinfo->min_DCT_h_scaled_size * ssize <=
|
||||||
(cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) &&
|
(cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) &&
|
||||||
|
@ -166,27 +164,22 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
|
||||||
#endif /* IDCT_SCALING_SUPPORTED */
|
#endif /* IDCT_SCALING_SUPPORTED */
|
||||||
|
|
||||||
/* Report number of components in selected colorspace. */
|
/* Report number of components in selected colorspace. */
|
||||||
/* Probably this should be in the color conversion module... */
|
/* This should correspond to the actual code in the color conversion module. */
|
||||||
switch (cinfo->out_color_space) {
|
switch (cinfo->out_color_space) {
|
||||||
case JCS_GRAYSCALE:
|
case JCS_GRAYSCALE:
|
||||||
cinfo->out_color_components = 1;
|
cinfo->out_color_components = 1;
|
||||||
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 */
|
default: /* YCCK <=> CMYK conversion or same colorspace as in file */
|
||||||
case JCS_YCbCr:
|
i = 0;
|
||||||
case JCS_BG_YCC:
|
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
||||||
cinfo->out_color_components = 3;
|
ci++, compptr++)
|
||||||
break;
|
if (compptr->component_needed)
|
||||||
case JCS_CMYK:
|
i++; /* count output color components */
|
||||||
case JCS_YCCK:
|
cinfo->out_color_components = i;
|
||||||
cinfo->out_color_components = 4;
|
|
||||||
break;
|
|
||||||
default: /* else must be same colorspace as in file */
|
|
||||||
cinfo->out_color_components = cinfo->num_components;
|
|
||||||
}
|
}
|
||||||
cinfo->output_components = (cinfo->quantize_colors ? 1 :
|
cinfo->output_components = (cinfo->quantize_colors ? 1 :
|
||||||
cinfo->out_color_components);
|
cinfo->out_color_components);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jdmerge.c
|
* jdmerge.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* Modified 2013-2019 by Guido Vollbeding.
|
* Modified 2013-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -190,7 +190,7 @@ merged_2v_upsample (j_decompress_ptr cinfo,
|
||||||
|
|
||||||
if (upsample->spare_full) {
|
if (upsample->spare_full) {
|
||||||
/* If we have a spare row saved from a previous cycle, just return it. */
|
/* If we have a spare row saved from a previous cycle, just return it. */
|
||||||
jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0,
|
jcopy_sample_rows(& upsample->spare_row, output_buf + *out_row_ctr,
|
||||||
1, upsample->out_row_width);
|
1, upsample->out_row_width);
|
||||||
num_rows = 1;
|
num_rows = 1;
|
||||||
upsample->spare_full = FALSE;
|
upsample->spare_full = FALSE;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jdsample.c
|
* jdsample.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1996, Thomas G. Lane.
|
* Copyright (C) 1991-1996, Thomas G. Lane.
|
||||||
* Modified 2002-2015 by Guido Vollbeding.
|
* Modified 2002-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -27,7 +27,7 @@
|
||||||
/* Pointer to routine to upsample a single component */
|
/* Pointer to routine to upsample a single component */
|
||||||
typedef JMETHOD(void, upsample1_ptr,
|
typedef JMETHOD(void, upsample1_ptr,
|
||||||
(j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
(j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr));
|
JSAMPARRAY input_data, JSAMPIMAGE output_data_ptr));
|
||||||
|
|
||||||
/* Private subobject */
|
/* Private subobject */
|
||||||
|
|
||||||
|
@ -102,6 +102,9 @@ sep_upsample (j_decompress_ptr cinfo,
|
||||||
if (upsample->next_row_out >= cinfo->max_v_samp_factor) {
|
if (upsample->next_row_out >= cinfo->max_v_samp_factor) {
|
||||||
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++) {
|
||||||
|
/* Don't bother to upsample an uninteresting component. */
|
||||||
|
if (! compptr->component_needed)
|
||||||
|
continue;
|
||||||
/* Invoke per-component upsample method. Notice we pass a POINTER
|
/* Invoke per-component upsample method. Notice we pass a POINTER
|
||||||
* to color_buf[ci], so that fullsize_upsample can change it.
|
* to color_buf[ci], so that fullsize_upsample can change it.
|
||||||
*/
|
*/
|
||||||
|
@ -156,25 +159,12 @@ sep_upsample (j_decompress_ptr cinfo,
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
fullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
fullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
|
JSAMPARRAY input_data, JSAMPIMAGE output_data_ptr)
|
||||||
{
|
{
|
||||||
*output_data_ptr = input_data;
|
*output_data_ptr = input_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is a no-op version used for "uninteresting" components.
|
|
||||||
* These components will not be referenced by color conversion.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
noop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
|
||||||
JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
|
|
||||||
{
|
|
||||||
*output_data_ptr = NULL; /* safety check */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This version handles any integral sampling ratios.
|
* This version handles any integral sampling ratios.
|
||||||
* This is not used for typical JPEG files, so it need not be fast.
|
* This is not used for typical JPEG files, so it need not be fast.
|
||||||
|
@ -188,25 +178,25 @@ noop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
|
JSAMPARRAY input_data, JSAMPIMAGE output_data_ptr)
|
||||||
{
|
{
|
||||||
my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
|
my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
|
||||||
JSAMPARRAY output_data = *output_data_ptr;
|
JSAMPARRAY output_data, output_end;
|
||||||
register JSAMPROW inptr, outptr;
|
register JSAMPROW inptr, outptr;
|
||||||
register JSAMPLE invalue;
|
register JSAMPLE invalue;
|
||||||
register int h;
|
register int h;
|
||||||
JSAMPROW outend;
|
JSAMPROW outend;
|
||||||
int h_expand, v_expand;
|
int h_expand, v_expand;
|
||||||
int inrow, outrow;
|
|
||||||
|
|
||||||
h_expand = upsample->h_expand[compptr->component_index];
|
h_expand = upsample->h_expand[compptr->component_index];
|
||||||
v_expand = upsample->v_expand[compptr->component_index];
|
v_expand = upsample->v_expand[compptr->component_index];
|
||||||
|
|
||||||
inrow = outrow = 0;
|
output_data = *output_data_ptr;
|
||||||
while (outrow < cinfo->max_v_samp_factor) {
|
output_end = output_data + cinfo->max_v_samp_factor;
|
||||||
|
for (; output_data < output_end; output_data += v_expand) {
|
||||||
/* Generate one output row with proper horizontal expansion */
|
/* Generate one output row with proper horizontal expansion */
|
||||||
inptr = input_data[inrow];
|
inptr = *input_data++;
|
||||||
outptr = output_data[outrow];
|
outptr = *output_data;
|
||||||
outend = outptr + cinfo->output_width;
|
outend = outptr + cinfo->output_width;
|
||||||
while (outptr < outend) {
|
while (outptr < outend) {
|
||||||
invalue = *inptr++; /* don't need GETJSAMPLE() here */
|
invalue = *inptr++; /* don't need GETJSAMPLE() here */
|
||||||
|
@ -216,11 +206,9 @@ int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
}
|
}
|
||||||
/* Generate any additional output rows by duplicating the first one */
|
/* Generate any additional output rows by duplicating the first one */
|
||||||
if (v_expand > 1) {
|
if (v_expand > 1) {
|
||||||
jcopy_sample_rows(output_data, outrow, output_data, outrow+1,
|
jcopy_sample_rows(output_data, output_data + 1,
|
||||||
v_expand-1, cinfo->output_width);
|
v_expand - 1, cinfo->output_width);
|
||||||
}
|
}
|
||||||
inrow++;
|
|
||||||
outrow += v_expand;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,7 +220,7 @@ int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
|
JSAMPARRAY input_data, JSAMPIMAGE output_data_ptr)
|
||||||
{
|
{
|
||||||
JSAMPARRAY output_data = *output_data_ptr;
|
JSAMPARRAY output_data = *output_data_ptr;
|
||||||
register JSAMPROW inptr, outptr;
|
register JSAMPROW inptr, outptr;
|
||||||
|
@ -260,28 +248,26 @@ h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
|
||||||
JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
|
JSAMPARRAY input_data, JSAMPIMAGE output_data_ptr)
|
||||||
{
|
{
|
||||||
JSAMPARRAY output_data = *output_data_ptr;
|
JSAMPARRAY output_data, output_end;
|
||||||
register JSAMPROW inptr, outptr;
|
register JSAMPROW inptr, outptr;
|
||||||
register JSAMPLE invalue;
|
register JSAMPLE invalue;
|
||||||
JSAMPROW outend;
|
JSAMPROW outend;
|
||||||
int inrow, outrow;
|
|
||||||
|
|
||||||
inrow = outrow = 0;
|
output_data = *output_data_ptr;
|
||||||
while (outrow < cinfo->max_v_samp_factor) {
|
output_end = output_data + cinfo->max_v_samp_factor;
|
||||||
inptr = input_data[inrow];
|
for (; output_data < output_end; output_data += 2) {
|
||||||
outptr = output_data[outrow];
|
inptr = *input_data++;
|
||||||
|
outptr = *output_data;
|
||||||
outend = outptr + cinfo->output_width;
|
outend = outptr + cinfo->output_width;
|
||||||
while (outptr < outend) {
|
while (outptr < outend) {
|
||||||
invalue = *inptr++; /* don't need GETJSAMPLE() here */
|
invalue = *inptr++; /* don't need GETJSAMPLE() here */
|
||||||
*outptr++ = invalue;
|
*outptr++ = invalue;
|
||||||
*outptr++ = invalue;
|
*outptr++ = invalue;
|
||||||
}
|
}
|
||||||
jcopy_sample_rows(output_data, outrow, output_data, outrow+1,
|
jcopy_sample_rows(output_data, output_data + 1,
|
||||||
1, cinfo->output_width);
|
1, cinfo->output_width);
|
||||||
inrow++;
|
|
||||||
outrow += 2;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -298,9 +284,8 @@ jinit_upsampler (j_decompress_ptr cinfo)
|
||||||
jpeg_component_info * compptr;
|
jpeg_component_info * compptr;
|
||||||
int h_in_group, v_in_group, h_out_group, v_out_group;
|
int h_in_group, v_in_group, h_out_group, v_out_group;
|
||||||
|
|
||||||
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_upsample;
|
upsample->pub.start_pass = start_pass_upsample;
|
||||||
upsample->pub.upsample = sep_upsample;
|
upsample->pub.upsample = sep_upsample;
|
||||||
|
@ -314,6 +299,9 @@ jinit_upsampler (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++) {
|
||||||
|
/* Don't bother to upsample an uninteresting component. */
|
||||||
|
if (! compptr->component_needed)
|
||||||
|
continue;
|
||||||
/* Compute size of an "input group" after IDCT scaling. This many samples
|
/* Compute size of an "input group" after IDCT scaling. This many samples
|
||||||
* are to be converted to max_h_samp_factor * max_v_samp_factor pixels.
|
* are to be converted to max_h_samp_factor * max_v_samp_factor pixels.
|
||||||
*/
|
*/
|
||||||
|
@ -324,11 +312,6 @@ jinit_upsampler (j_decompress_ptr cinfo)
|
||||||
h_out_group = cinfo->max_h_samp_factor;
|
h_out_group = cinfo->max_h_samp_factor;
|
||||||
v_out_group = cinfo->max_v_samp_factor;
|
v_out_group = cinfo->max_v_samp_factor;
|
||||||
upsample->rowgroup_height[ci] = v_in_group; /* save for use later */
|
upsample->rowgroup_height[ci] = v_in_group; /* save for use later */
|
||||||
if (! compptr->component_needed) {
|
|
||||||
/* Don't bother to upsample an uninteresting component. */
|
|
||||||
upsample->methods[ci] = noop_upsample;
|
|
||||||
continue; /* don't need to allocate buffer */
|
|
||||||
}
|
|
||||||
if (h_in_group == h_out_group && v_in_group == v_out_group) {
|
if (h_in_group == h_out_group && v_in_group == v_out_group) {
|
||||||
/* Fullsize components can be processed without any work. */
|
/* Fullsize components can be processed without any work. */
|
||||||
upsample->methods[ci] = fullsize_upsample;
|
upsample->methods[ci] = fullsize_upsample;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jpeglib.h
|
* jpeglib.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2002-2019 by Guido Vollbeding.
|
* Modified 2002-2020 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 4
|
#define JPEG_LIB_VERSION_MINOR 5
|
||||||
|
|
||||||
|
|
||||||
/* Various constants determining the sizes of things.
|
/* Various constants determining the sizes of things.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jquant1.c
|
* jquant1.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1996, Thomas G. Lane.
|
* Copyright (C) 1991-1996, Thomas G. Lane.
|
||||||
* Modified 2011 by Guido Vollbeding.
|
* Modified 2011-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -293,8 +293,7 @@ create_colormap (j_decompress_ptr cinfo)
|
||||||
/* The colors are ordered in the map in standard row-major order, */
|
/* The colors are ordered in the map in standard row-major order, */
|
||||||
/* i.e. rightmost (highest-indexed) color changes most rapidly. */
|
/* i.e. rightmost (highest-indexed) color changes most rapidly. */
|
||||||
|
|
||||||
colormap = (*cinfo->mem->alloc_sarray)
|
colormap = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
(JDIMENSION) total_colors, (JDIMENSION) cinfo->out_color_components);
|
(JDIMENSION) total_colors, (JDIMENSION) cinfo->out_color_components);
|
||||||
|
|
||||||
/* blksize is number of adjacent repeated entries for a component */
|
/* blksize is number of adjacent repeated entries for a component */
|
||||||
|
@ -400,9 +399,8 @@ make_odither_array (j_decompress_ptr cinfo, int ncolors)
|
||||||
int j,k;
|
int j,k;
|
||||||
INT32 num,den;
|
INT32 num,den;
|
||||||
|
|
||||||
odither = (ODITHER_MATRIX_PTR)
|
odither = (ODITHER_MATRIX_PTR) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(ODITHER_MATRIX));
|
||||||
SIZEOF(ODITHER_MATRIX));
|
|
||||||
/* The inter-value distance for this color is MAXJSAMPLE/(ncolors-1).
|
/* The inter-value distance for this color is MAXJSAMPLE/(ncolors-1).
|
||||||
* Hence the dither value for the matrix cell with fill order f
|
* Hence the dither value for the matrix cell with fill order f
|
||||||
* (f=0..N-1) should be (N-1-2*f)/(2*N) * MAXJSAMPLE/(ncolors-1).
|
* (f=0..N-1) should be (N-1-2*f)/(2*N) * MAXJSAMPLE/(ncolors-1).
|
||||||
|
@ -531,8 +529,7 @@ quantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
|
||||||
|
|
||||||
for (row = 0; row < num_rows; row++) {
|
for (row = 0; row < num_rows; row++) {
|
||||||
/* Initialize output values to 0 so can process components separately */
|
/* Initialize output values to 0 so can process components separately */
|
||||||
FMEMZERO((void FAR *) output_buf[row],
|
FMEMZERO((void FAR *) output_buf[row], (size_t) width * SIZEOF(JSAMPLE));
|
||||||
(size_t) (width * SIZEOF(JSAMPLE)));
|
|
||||||
row_index = cquantize->row_index;
|
row_index = cquantize->row_index;
|
||||||
for (ci = 0; ci < nc; ci++) {
|
for (ci = 0; ci < nc; ci++) {
|
||||||
input_ptr = input_buf[row] + ci;
|
input_ptr = input_buf[row] + ci;
|
||||||
|
@ -636,8 +633,7 @@ quantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
|
||||||
|
|
||||||
for (row = 0; row < num_rows; row++) {
|
for (row = 0; row < num_rows; row++) {
|
||||||
/* Initialize output values to 0 so can process components separately */
|
/* Initialize output values to 0 so can process components separately */
|
||||||
FMEMZERO((void FAR *) output_buf[row],
|
FMEMZERO((void FAR *) output_buf[row], (size_t) width * SIZEOF(JSAMPLE));
|
||||||
(size_t) (width * SIZEOF(JSAMPLE)));
|
|
||||||
for (ci = 0; ci < nc; ci++) {
|
for (ci = 0; ci < nc; ci++) {
|
||||||
input_ptr = input_buf[row] + ci;
|
input_ptr = input_buf[row] + ci;
|
||||||
output_ptr = output_buf[row];
|
output_ptr = output_buf[row];
|
||||||
|
@ -726,10 +722,10 @@ alloc_fs_workspace (j_decompress_ptr cinfo)
|
||||||
size_t arraysize;
|
size_t arraysize;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR));
|
arraysize = ((size_t) cinfo->output_width + (size_t) 2) * SIZEOF(FSERROR);
|
||||||
for (i = 0; i < cinfo->out_color_components; i++) {
|
for (i = 0; i < cinfo->out_color_components; i++) {
|
||||||
cquantize->fserrors[i] = (FSERRPTR)
|
cquantize->fserrors[i] = (FSERRPTR) (*cinfo->mem->alloc_large)
|
||||||
(*cinfo->mem->alloc_large)((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize);
|
((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -780,13 +776,12 @@ start_pass_1_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
|
||||||
if (cquantize->fserrors[0] == NULL)
|
if (cquantize->fserrors[0] == NULL)
|
||||||
alloc_fs_workspace(cinfo);
|
alloc_fs_workspace(cinfo);
|
||||||
/* Initialize the propagated errors to zero. */
|
/* Initialize the propagated errors to zero. */
|
||||||
arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR));
|
arraysize = ((size_t) cinfo->output_width + (size_t) 2) * SIZEOF(FSERROR);
|
||||||
for (i = 0; i < cinfo->out_color_components; i++)
|
for (i = 0; i < cinfo->out_color_components; i++)
|
||||||
FMEMZERO((void FAR *) cquantize->fserrors[i], arraysize);
|
FMEMZERO((void FAR *) cquantize->fserrors[i], arraysize);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -823,10 +818,9 @@ jinit_1pass_quantizer (j_decompress_ptr cinfo)
|
||||||
{
|
{
|
||||||
my_cquantize_ptr cquantize;
|
my_cquantize_ptr cquantize;
|
||||||
|
|
||||||
cquantize = (my_cquantize_ptr)
|
cquantize = (my_cquantize_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_cquantizer));
|
||||||
SIZEOF(my_cquantizer));
|
cinfo->cquantize = &cquantize->pub;
|
||||||
cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize;
|
|
||||||
cquantize->pub.start_pass = start_pass_1_quant;
|
cquantize->pub.start_pass = start_pass_1_quant;
|
||||||
cquantize->pub.finish_pass = finish_pass_1_quant;
|
cquantize->pub.finish_pass = finish_pass_1_quant;
|
||||||
cquantize->pub.new_color_map = new_color_map_1_quant;
|
cquantize->pub.new_color_map = new_color_map_1_quant;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* jquant2.c
|
* jquant2.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1996, Thomas G. Lane.
|
* Copyright (C) 1991-1996, Thomas G. Lane.
|
||||||
* Modified 2011 by Guido Vollbeding.
|
* Modified 2011-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -1197,8 +1197,8 @@ start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
|
||||||
ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
|
ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
|
||||||
|
|
||||||
if (cinfo->dither_mode == JDITHER_FS) {
|
if (cinfo->dither_mode == JDITHER_FS) {
|
||||||
size_t arraysize = (size_t) ((cinfo->output_width + 2) *
|
size_t arraysize = ((size_t) cinfo->output_width + (size_t) 2)
|
||||||
(3 * SIZEOF(FSERROR)));
|
* (3 * SIZEOF(FSERROR));
|
||||||
/* Allocate Floyd-Steinberg workspace if we didn't already. */
|
/* Allocate Floyd-Steinberg workspace if we didn't already. */
|
||||||
if (cquantize->fserrors == NULL)
|
if (cquantize->fserrors == NULL)
|
||||||
cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
|
cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
|
||||||
|
@ -1247,10 +1247,9 @@ jinit_2pass_quantizer (j_decompress_ptr cinfo)
|
||||||
my_cquantize_ptr cquantize;
|
my_cquantize_ptr cquantize;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
cquantize = (my_cquantize_ptr)
|
cquantize = (my_cquantize_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_cquantizer));
|
||||||
SIZEOF(my_cquantizer));
|
cinfo->cquantize = &cquantize->pub;
|
||||||
cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize;
|
|
||||||
cquantize->pub.start_pass = start_pass_2_quant;
|
cquantize->pub.start_pass = start_pass_2_quant;
|
||||||
cquantize->pub.new_color_map = new_color_map_2_quant;
|
cquantize->pub.new_color_map = new_color_map_2_quant;
|
||||||
cquantize->fserrors = NULL; /* flag optional arrays not allocated */
|
cquantize->fserrors = NULL; /* flag optional arrays not allocated */
|
||||||
|
@ -1284,7 +1283,8 @@ jinit_2pass_quantizer (j_decompress_ptr cinfo)
|
||||||
if (desired > MAXNUMCOLORS)
|
if (desired > MAXNUMCOLORS)
|
||||||
ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
|
ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
|
||||||
cquantize->sv_colormap = (*cinfo->mem->alloc_sarray)
|
cquantize->sv_colormap = (*cinfo->mem->alloc_sarray)
|
||||||
((j_common_ptr) cinfo,JPOOL_IMAGE, (JDIMENSION) desired, (JDIMENSION) 3);
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
|
(JDIMENSION) desired, (JDIMENSION) 3);
|
||||||
cquantize->desired = desired;
|
cquantize->desired = desired;
|
||||||
} else
|
} else
|
||||||
cquantize->sv_colormap = NULL;
|
cquantize->sv_colormap = NULL;
|
||||||
|
@ -1302,7 +1302,7 @@ jinit_2pass_quantizer (j_decompress_ptr cinfo)
|
||||||
if (cinfo->dither_mode == JDITHER_FS) {
|
if (cinfo->dither_mode == JDITHER_FS) {
|
||||||
cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
|
cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
|
||||||
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
(size_t) ((cinfo->output_width + 2) * (3 * SIZEOF(FSERROR))));
|
((size_t) cinfo->output_width + (size_t) 2) * (3 * SIZEOF(FSERROR)));
|
||||||
/* Might as well create the error-limiting table too. */
|
/* Might as well create the error-limiting table too. */
|
||||||
init_error_limit(cinfo);
|
init_error_limit(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-2019 by Guido Vollbeding.
|
* Modified 2009-2020 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.
|
||||||
*
|
*
|
||||||
|
@ -52,67 +52,67 @@ const int jpeg_zigzag_order[DCTSIZE2] = {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const int jpeg_natural_order[DCTSIZE2+16] = {
|
const int jpeg_natural_order[DCTSIZE2+16] = {
|
||||||
0, 1, 8, 16, 9, 2, 3, 10,
|
0, 1, 8, 16, 9, 2, 3, 10,
|
||||||
17, 24, 32, 25, 18, 11, 4, 5,
|
17, 24, 32, 25, 18, 11, 4, 5,
|
||||||
12, 19, 26, 33, 40, 48, 41, 34,
|
12, 19, 26, 33, 40, 48, 41, 34,
|
||||||
27, 20, 13, 6, 7, 14, 21, 28,
|
27, 20, 13, 6, 7, 14, 21, 28,
|
||||||
35, 42, 49, 56, 57, 50, 43, 36,
|
35, 42, 49, 56, 57, 50, 43, 36,
|
||||||
29, 22, 15, 23, 30, 37, 44, 51,
|
29, 22, 15, 23, 30, 37, 44, 51,
|
||||||
58, 59, 52, 45, 38, 31, 39, 46,
|
58, 59, 52, 45, 38, 31, 39, 46,
|
||||||
53, 60, 61, 54, 47, 55, 62, 63,
|
53, 60, 61, 54, 47, 55, 62, 63,
|
||||||
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
|
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
|
||||||
63, 63, 63, 63, 63, 63, 63, 63
|
63, 63, 63, 63, 63, 63, 63, 63
|
||||||
};
|
};
|
||||||
|
|
||||||
const int jpeg_natural_order7[7*7+16] = {
|
const int jpeg_natural_order7[7*7+16] = {
|
||||||
0, 1, 8, 16, 9, 2, 3, 10,
|
0, 1, 8, 16, 9, 2, 3, 10,
|
||||||
17, 24, 32, 25, 18, 11, 4, 5,
|
17, 24, 32, 25, 18, 11, 4, 5,
|
||||||
12, 19, 26, 33, 40, 48, 41, 34,
|
12, 19, 26, 33, 40, 48, 41, 34,
|
||||||
27, 20, 13, 6, 14, 21, 28, 35,
|
27, 20, 13, 6, 14, 21, 28, 35,
|
||||||
42, 49, 50, 43, 36, 29, 22, 30,
|
42, 49, 50, 43, 36, 29, 22, 30,
|
||||||
37, 44, 51, 52, 45, 38, 46, 53,
|
37, 44, 51, 52, 45, 38, 46, 53,
|
||||||
54,
|
54,
|
||||||
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
|
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
|
||||||
63, 63, 63, 63, 63, 63, 63, 63
|
63, 63, 63, 63, 63, 63, 63, 63
|
||||||
};
|
};
|
||||||
|
|
||||||
const int jpeg_natural_order6[6*6+16] = {
|
const int jpeg_natural_order6[6*6+16] = {
|
||||||
0, 1, 8, 16, 9, 2, 3, 10,
|
0, 1, 8, 16, 9, 2, 3, 10,
|
||||||
17, 24, 32, 25, 18, 11, 4, 5,
|
17, 24, 32, 25, 18, 11, 4, 5,
|
||||||
12, 19, 26, 33, 40, 41, 34, 27,
|
12, 19, 26, 33, 40, 41, 34, 27,
|
||||||
20, 13, 21, 28, 35, 42, 43, 36,
|
20, 13, 21, 28, 35, 42, 43, 36,
|
||||||
29, 37, 44, 45,
|
29, 37, 44, 45,
|
||||||
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
|
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
|
||||||
63, 63, 63, 63, 63, 63, 63, 63
|
63, 63, 63, 63, 63, 63, 63, 63
|
||||||
};
|
};
|
||||||
|
|
||||||
const int jpeg_natural_order5[5*5+16] = {
|
const int jpeg_natural_order5[5*5+16] = {
|
||||||
0, 1, 8, 16, 9, 2, 3, 10,
|
0, 1, 8, 16, 9, 2, 3, 10,
|
||||||
17, 24, 32, 25, 18, 11, 4, 12,
|
17, 24, 32, 25, 18, 11, 4, 12,
|
||||||
19, 26, 33, 34, 27, 20, 28, 35,
|
19, 26, 33, 34, 27, 20, 28, 35,
|
||||||
36,
|
36,
|
||||||
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
|
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
|
||||||
63, 63, 63, 63, 63, 63, 63, 63
|
63, 63, 63, 63, 63, 63, 63, 63
|
||||||
};
|
};
|
||||||
|
|
||||||
const int jpeg_natural_order4[4*4+16] = {
|
const int jpeg_natural_order4[4*4+16] = {
|
||||||
0, 1, 8, 16, 9, 2, 3, 10,
|
0, 1, 8, 16, 9, 2, 3, 10,
|
||||||
17, 24, 25, 18, 11, 19, 26, 27,
|
17, 24, 25, 18, 11, 19, 26, 27,
|
||||||
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
|
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
|
||||||
63, 63, 63, 63, 63, 63, 63, 63
|
63, 63, 63, 63, 63, 63, 63, 63
|
||||||
};
|
};
|
||||||
|
|
||||||
const int jpeg_natural_order3[3*3+16] = {
|
const int jpeg_natural_order3[3*3+16] = {
|
||||||
0, 1, 8, 16, 9, 2, 10, 17,
|
0, 1, 8, 16, 9, 2, 10, 17,
|
||||||
18,
|
18,
|
||||||
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
|
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
|
||||||
63, 63, 63, 63, 63, 63, 63, 63
|
63, 63, 63, 63, 63, 63, 63, 63
|
||||||
};
|
};
|
||||||
|
|
||||||
const int jpeg_natural_order2[2*2+16] = {
|
const int jpeg_natural_order2[2*2+16] = {
|
||||||
0, 1, 8, 9,
|
0, 1, 8, 9,
|
||||||
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
|
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
|
||||||
63, 63, 63, 63, 63, 63, 63, 63
|
63, 63, 63, 63, 63, 63, 63, 63
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -174,12 +174,12 @@ jzero_far (void FAR * target, size_t bytestozero)
|
||||||
|
|
||||||
|
|
||||||
GLOBAL(void)
|
GLOBAL(void)
|
||||||
jcopy_sample_rows (JSAMPARRAY input_array, int source_row,
|
jcopy_sample_rows (JSAMPARRAY input_array,
|
||||||
JSAMPARRAY output_array, int dest_row,
|
JSAMPARRAY output_array,
|
||||||
int num_rows, JDIMENSION num_cols)
|
int num_rows, JDIMENSION num_cols)
|
||||||
/* Copy some rows of samples from one place to another.
|
/* Copy some rows of samples from one place to another.
|
||||||
* num_rows rows are copied from input_array[source_row++]
|
* num_rows rows are copied from *input_array++ to *output_array++;
|
||||||
* to output_array[dest_row++]; these areas may overlap for duplication.
|
* these areas may overlap for duplication.
|
||||||
* The source and destination arrays must be at least as wide as num_cols.
|
* The source and destination arrays must be at least as wide as num_cols.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
|
@ -191,9 +191,6 @@ jcopy_sample_rows (JSAMPARRAY input_array, int source_row,
|
||||||
#endif
|
#endif
|
||||||
register int row;
|
register int row;
|
||||||
|
|
||||||
input_array += source_row;
|
|
||||||
output_array += dest_row;
|
|
||||||
|
|
||||||
for (row = num_rows; row > 0; row--) {
|
for (row = num_rows; row > 0; row--) {
|
||||||
inptr = *input_array++;
|
inptr = *input_array++;
|
||||||
outptr = *output_array++;
|
outptr = *output_array++;
|
||||||
|
|
Loading…
Reference in New Issue