Compare commits
2 Commits
main
...
fix-bypass
Author | SHA1 | Date | |
---|---|---|---|
![]() |
bdb4bfaf05 | ||
![]() |
51a51bdd03 |
17
.gitignore
vendored
17
.gitignore
vendored
@ -1,17 +0,0 @@
|
|||||||
# Ignore files and directories made by `cmake .`.
|
|
||||||
CMakeFiles/
|
|
||||||
Makefile
|
|
||||||
cmake_install.cmake
|
|
||||||
/CMakeCache.txt
|
|
||||||
/CPackConfig.cmake
|
|
||||||
/CPackSourceConfig.cmake
|
|
||||||
/CTestCustom.cmake
|
|
||||||
/LICENSE.txt
|
|
||||||
/OpenJPEGConfig.cmake
|
|
||||||
/libopenjp2.pc
|
|
||||||
/src/bin/common/opj_apps_config.h
|
|
||||||
/src/lib/openjp2/opj_config.h
|
|
||||||
/src/lib/openjp2/opj_config_private.h
|
|
||||||
|
|
||||||
# Ignore directories made by `make`.
|
|
||||||
/bin/
|
|
34
.travis.yml
34
.travis.yml
@ -4,13 +4,10 @@ matrix:
|
|||||||
include:
|
include:
|
||||||
- os: osx
|
- os: osx
|
||||||
compiler: clang
|
compiler: clang
|
||||||
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Release OPJ_CI_INCLUDE_IF_DEPLOY=1
|
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Release
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: gcc
|
compiler: gcc
|
||||||
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Release OPJ_CI_INCLUDE_IF_DEPLOY=1
|
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Release
|
||||||
- os: linux
|
|
||||||
compiler: gcc
|
|
||||||
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Release OPJ_NUM_THREADS=2
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: gcc
|
compiler: gcc
|
||||||
env: OPJ_CI_ARCH=i386 OPJ_CI_BUILD_CONFIGURATION=Release
|
env: OPJ_CI_ARCH=i386 OPJ_CI_BUILD_CONFIGURATION=Release
|
||||||
@ -25,15 +22,9 @@ matrix:
|
|||||||
compiler: clang
|
compiler: clang
|
||||||
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Debug OPJ_CI_ASAN=1
|
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Debug OPJ_CI_ASAN=1
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: clang-3.8
|
compiler: clang-3.9
|
||||||
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Release
|
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Release
|
||||||
addons:
|
sudo: true
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- llvm-toolchain-precise-3.8
|
|
||||||
- ubuntu-toolchain-r-test
|
|
||||||
packages:
|
|
||||||
- clang-3.8
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: x86_64-w64-mingw32-gcc
|
compiler: x86_64-w64-mingw32-gcc
|
||||||
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Release
|
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Release
|
||||||
@ -74,20 +65,3 @@ install:
|
|||||||
script:
|
script:
|
||||||
- ./tools/travis-ci/run.sh
|
- ./tools/travis-ci/run.sh
|
||||||
- ./tools/travis-ci/abi-check.sh
|
- ./tools/travis-ci/abi-check.sh
|
||||||
|
|
||||||
before_deploy:
|
|
||||||
- export OPJ_RELEASE_PKG_FILE=$(ls build/openjpeg-${TRAVIS_TAG}*)
|
|
||||||
- echo "deploying $OPJ_RELEASE_PKG_FILE to GitHub releases"
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
provider: releases
|
|
||||||
api_key:
|
|
||||||
secure: Npi13uOffALCVNwea4p4q8v85Lo/WsRqaeZQcWrAkt8MxRnfvWQtmnuwmHnVB6Cig+T1lVUHrklOaJIApIb6nkGq3CS/9bD8+SCS2NEdAAP/QYWnBi0ubWXVMRyDLypmwRpzLNSZ0xLYGFUl2PjieZYKRcz1dd/J7S+FnXhPtdjXweq0FS63zTcMe7ggjfmzSOWUCEFmMjZPaM0Be+3PweieCO1dxlHuy7ugCkx2S7d+5hNsicIhQmTADjqtJAkHoMhYqu6/yLFxhjO/+f938PATFULdODTvjCsUwdN/ySWi1Oj4uPAntfytZP7H6YrzLh8dS73QCsdkhhDJIgJskHIBSbRyyEVUnOvQgD9VaBVGHtc1KtZQTwc41OUO3BGPHl97s3oX6bqWqo/L53dB3TPHGx+1+2HL/F0zaDZuHhAKMkPwe8LFPMPB/ur65zXMHjnWb2ZTVVdoIvkbQ7nu8ApI60ejxocYBsEyAuC2CPXU2ki4jdEhm0E1hIziWNE9/LTuM17ziQuJ6WpXOSMrfP4o5aVDmLp5ZGBSocrspOksgyI9XogHaO/r+Y6N3exy+giObFfMHkZVUpsKrKmtOJ7TC1Vg5HsYGlWW8RN8dkJV47bUXm9K4sMos9eYMUt/czykPAs+132cogpII3QxXpFZQqZg6SEPVfOiyqQzTUI=
|
|
||||||
file_glob: true
|
|
||||||
file: "${OPJ_RELEASE_PKG_FILE}"
|
|
||||||
skip_cleanup: true
|
|
||||||
on:
|
|
||||||
repo: uclouvain/openjpeg
|
|
||||||
tags: true
|
|
||||||
condition: "$OPJ_CI_INCLUDE_IF_DEPLOY = 1"
|
|
||||||
|
|
||||||
|
@ -1,18 +1,12 @@
|
|||||||
# Authors of OpenJPEG
|
Authors of OpenJPEG
|
||||||
See also [THANKS](https://github.com/uclouvain/openjpeg/blob/master/THANKS.md)
|
See also the files THANKS and CHANGES
|
||||||
|
|
||||||
David Janssens designed and implemented the first version of OpenJPEG.
|
David Janssens designed and implemented the first version of OpenJPEG.
|
||||||
|
|
||||||
Kaori Hagihara designed and implemented the first version of OpenJPIP.
|
Kaori Hagihara designed and implemented the first version of OpenJPIP.
|
||||||
|
|
||||||
Jerome Fimes implemented the alpha version of OpenJPEG 2.0.
|
Jerome Fimes implemented the alpha version of OpenJPEG 2.0.
|
||||||
|
|
||||||
Giuseppe Baruffa added the JPWL functionalities.
|
Giuseppe Baruffa added the JPWL functionalities.
|
||||||
|
Mickaël Savinaud implemented the final OpenJPEG 2.0 version based on a big merge between 1.5 version and alpha version of 2.0.
|
||||||
Mickaël Savinaud implemented the final OpenJPEG 2.0 version based on a big merge between 1.5 version and alpha version of 2.0.
|
|
||||||
|
|
||||||
Mathieu Malaterre participated to the OpenJPEG 2.0 version and improved the libraries and utilities.
|
Mathieu Malaterre participated to the OpenJPEG 2.0 version and improved the libraries and utilities.
|
||||||
|
|
||||||
Yannick Verschueren,
|
Yannick Verschueren,
|
||||||
Herve Drolon,
|
Herve Drolon,
|
||||||
Francois-Olivier Devaux,
|
Francois-Olivier Devaux,
|
446
CHANGELOG.md
446
CHANGELOG.md
@ -1,446 +0,0 @@
|
|||||||
# Changelog
|
|
||||||
|
|
||||||
## [v2.1.2](https://github.com/uclouvain/openjpeg/releases/v2.1.2) (2016-09-28)
|
|
||||||
[Full Changelog](https://github.com/uclouvain/openjpeg/compare/v2.1.1...v2.1.2)
|
|
||||||
|
|
||||||
**Closed issues:**
|
|
||||||
|
|
||||||
- null ptr dereference in convert.c:1331 [\#843](https://github.com/uclouvain/openjpeg/issues/843)
|
|
||||||
- Out-of-Bounds Read in function bmp24toimage of convertbmp.c [\#833](https://github.com/uclouvain/openjpeg/issues/833)
|
|
||||||
- Disable automatic compilation of t1\_generate\_luts in CMakeLists.txt [\#831](https://github.com/uclouvain/openjpeg/issues/831)
|
|
||||||
- CVE-2016-7163 Integer overflow in opj\_pi\_create\_decode [\#826](https://github.com/uclouvain/openjpeg/issues/826)
|
|
||||||
- Security Advisory for OpenJPEG [\#810](https://github.com/uclouvain/openjpeg/issues/810)
|
|
||||||
- Add dashboard with static lib [\#804](https://github.com/uclouvain/openjpeg/issues/804)
|
|
||||||
- hidden visibility for the static library / building with -DOPJ\_STATIC against shared lib [\#802](https://github.com/uclouvain/openjpeg/issues/802)
|
|
||||||
- Optimization when building library from source [\#799](https://github.com/uclouvain/openjpeg/issues/799)
|
|
||||||
- unsigned int16 on Solaris 11.2/sparc [\#796](https://github.com/uclouvain/openjpeg/issues/796)
|
|
||||||
- appveyor [\#793](https://github.com/uclouvain/openjpeg/issues/793)
|
|
||||||
- Please make a new release [\#782](https://github.com/uclouvain/openjpeg/issues/782)
|
|
||||||
- FFMpeg will not link to 2.1.1 release built as shared library [\#766](https://github.com/uclouvain/openjpeg/issues/766)
|
|
||||||
- API change since v2: opj\_event\_mgr\_t not available [\#754](https://github.com/uclouvain/openjpeg/issues/754)
|
|
||||||
- openjpeg.h needs dependencies [\#673](https://github.com/uclouvain/openjpeg/issues/673)
|
|
||||||
- "master" does not build on ubuntu [\#658](https://github.com/uclouvain/openjpeg/issues/658)
|
|
||||||
- Package 'openjp2', required by 'libopenjpip', not found [\#594](https://github.com/uclouvain/openjpeg/issues/594)
|
|
||||||
|
|
||||||
**Merged pull requests:**
|
|
||||||
|
|
||||||
- Fix PNM file reading [\#847](https://github.com/uclouvain/openjpeg/pull/847) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix some issues reported by Coverity Scan [\#846](https://github.com/uclouvain/openjpeg/pull/846) ([stweil](https://github.com/stweil))
|
|
||||||
- Fix potential out-of-bounds read \(coverity\) [\#844](https://github.com/uclouvain/openjpeg/pull/844) ([stweil](https://github.com/stweil))
|
|
||||||
- Remove TODO for overflow check [\#842](https://github.com/uclouvain/openjpeg/pull/842) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add overflow checks for opj\_aligned\_malloc [\#841](https://github.com/uclouvain/openjpeg/pull/841) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Flags in T1 shall be unsigned [\#840](https://github.com/uclouvain/openjpeg/pull/840) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix some warnings [\#838](https://github.com/uclouvain/openjpeg/pull/838) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix issue 833. [\#834](https://github.com/uclouvain/openjpeg/pull/834) ([trylab](https://github.com/trylab))
|
|
||||||
- Add overflow checks for opj\_aligned\_malloc [\#832](https://github.com/uclouvain/openjpeg/pull/832) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add test for issue 820 [\#829](https://github.com/uclouvain/openjpeg/pull/829) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add test for issue 826 [\#827](https://github.com/uclouvain/openjpeg/pull/827) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix coverity 113065 \(CWE-484\) [\#824](https://github.com/uclouvain/openjpeg/pull/824) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add sanity check for tile coordinates [\#823](https://github.com/uclouvain/openjpeg/pull/823) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add test for PR 818 [\#822](https://github.com/uclouvain/openjpeg/pull/822) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Update to libpng 1.6.25 [\#821](https://github.com/uclouvain/openjpeg/pull/821) ([mayeut](https://github.com/mayeut))
|
|
||||||
- CVE-2016-8332: fix incrementing of "l\_tcp-\>m\_nb\_mcc\_records" in opj\_j2k\_read\_mcc [\#820](https://github.com/uclouvain/openjpeg/pull/820) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add overflow check in opj\_tcd\_init\_tile [\#819](https://github.com/uclouvain/openjpeg/pull/819) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix leak & invalid behavior of opj\_jp2\_read\_ihdr [\#818](https://github.com/uclouvain/openjpeg/pull/818) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add overflow check in opj\_j2k\_update\_image\_data [\#817](https://github.com/uclouvain/openjpeg/pull/817) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Change 'restrict' define to 'OPJ\_RESTRICT' [\#816](https://github.com/uclouvain/openjpeg/pull/816) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Switch to clang 3.8 [\#814](https://github.com/uclouvain/openjpeg/pull/814) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix an integer overflow issue [\#809](https://github.com/uclouvain/openjpeg/pull/809) ([trylab](https://github.com/trylab))
|
|
||||||
- Update to lcms 2.8 [\#808](https://github.com/uclouvain/openjpeg/pull/808) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Update to libpng 1.6.24 [\#807](https://github.com/uclouvain/openjpeg/pull/807) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Reenable clang-3.9 build on travis [\#806](https://github.com/uclouvain/openjpeg/pull/806) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Bit fields type [\#805](https://github.com/uclouvain/openjpeg/pull/805) ([smuehlst](https://github.com/smuehlst))
|
|
||||||
- Add compilation test for standalone inclusion of openjpeg.h [\#798](https://github.com/uclouvain/openjpeg/pull/798) ([mayeut](https://github.com/mayeut))
|
|
||||||
- jpwl: Remove non-portable data type u\_int16\_t \(fix issue \#796\) [\#797](https://github.com/uclouvain/openjpeg/pull/797) ([stweil](https://github.com/stweil))
|
|
||||||
- Fix dependency for pkg-config \(issue \#594\) [\#795](https://github.com/uclouvain/openjpeg/pull/795) ([stweil](https://github.com/stweil))
|
|
||||||
- Add .gitignore [\#787](https://github.com/uclouvain/openjpeg/pull/787) ([stweil](https://github.com/stweil))
|
|
||||||
|
|
||||||
## [v2.1.1](https://github.com/uclouvain/openjpeg/releases/tag/v2.1.1) (2016-07-05)
|
|
||||||
[Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.2.1...v2.1.1)
|
|
||||||
|
|
||||||
**Implemented enhancements:**
|
|
||||||
|
|
||||||
- opj\_malloc replacement [\#625](https://github.com/uclouvain/openjpeg/issues/625)
|
|
||||||
- backport "-p" and "-force-rgb" options in 1.5 [\#606](https://github.com/uclouvain/openjpeg/issues/606)
|
|
||||||
- Use travis-ci matrix build [\#581](https://github.com/uclouvain/openjpeg/issues/581)
|
|
||||||
- Add Coverity Scan analysis [\#580](https://github.com/uclouvain/openjpeg/issues/580)
|
|
||||||
- Unnecessary rate distortion calculations [\#479](https://github.com/uclouvain/openjpeg/issues/479)
|
|
||||||
- Add images from various security issues to test suite [\#415](https://github.com/uclouvain/openjpeg/issues/415)
|
|
||||||
- Coding speed for 9/7 on 32bits platforms \(x86/ARM\) can be improved with a quick fix [\#220](https://github.com/uclouvain/openjpeg/issues/220)
|
|
||||||
|
|
||||||
**Fixed bugs:**
|
|
||||||
|
|
||||||
- Out-of-Bounds Access in function opj\_tgt\_reset of tgt.c [\#775](https://github.com/uclouvain/openjpeg/issues/775)
|
|
||||||
- Heap Buffer Overflow in function color\_cmyk\_to\_rgb of color.c [\#774](https://github.com/uclouvain/openjpeg/issues/774)
|
|
||||||
- division-by-zero \(SIGFPE\) error in opj\_tcd\_init\_tile function \(line 730 of tcd.c\) [\#733](https://github.com/uclouvain/openjpeg/issues/733)
|
|
||||||
- Out-Of-Bounds Read in sycc422\_to\_rgb function [\#726](https://github.com/uclouvain/openjpeg/issues/726)
|
|
||||||
- Heap Corruption in opj\_free function [\#725](https://github.com/uclouvain/openjpeg/issues/725)
|
|
||||||
- Out-Of-Bounds Read in opj\_tcd\_free\_tile function [\#724](https://github.com/uclouvain/openjpeg/issues/724)
|
|
||||||
- Cannot handle box of undefined size [\#653](https://github.com/uclouvain/openjpeg/issues/653)
|
|
||||||
- Compilation fails without platform-supplied aligned malloc [\#642](https://github.com/uclouvain/openjpeg/issues/642)
|
|
||||||
- HP compiler warns about redeclaration of static function [\#640](https://github.com/uclouvain/openjpeg/issues/640)
|
|
||||||
- Implementation-defined behavior of malloc causes different behavior on Linux and AIX [\#635](https://github.com/uclouvain/openjpeg/issues/635)
|
|
||||||
- Build on AIX fails because "opj\_includes.h" is included after system headers [\#633](https://github.com/uclouvain/openjpeg/issues/633)
|
|
||||||
- Compiling with SSE2 on Linux 32-bit causes crashes in OpenJPEG [\#624](https://github.com/uclouvain/openjpeg/issues/624)
|
|
||||||
- Build on AIX fails because of "restrict" pointers [\#620](https://github.com/uclouvain/openjpeg/issues/620)
|
|
||||||
- bug in new tif conversion code [\#609](https://github.com/uclouvain/openjpeg/issues/609)
|
|
||||||
- bin/jp2/convert.c line 1085 Resource leak [\#607](https://github.com/uclouvain/openjpeg/issues/607)
|
|
||||||
- bin/jp2/convert.c memory leak [\#601](https://github.com/uclouvain/openjpeg/issues/601)
|
|
||||||
- Resource leak in opj\_j2k\_create\_cstr\_index in case of failure [\#599](https://github.com/uclouvain/openjpeg/issues/599)
|
|
||||||
- Resource leak in opj\_j2k\_encode in case of failure [\#598](https://github.com/uclouvain/openjpeg/issues/598)
|
|
||||||
- Resource leak in opj\_j2k\_decode\_one\_tile in case of failure [\#597](https://github.com/uclouvain/openjpeg/issues/597)
|
|
||||||
- Resource Leak [\#573](https://github.com/uclouvain/openjpeg/issues/573)
|
|
||||||
- opj\_compress fails to compress lossless on gcc/x86 \(-m32\) [\#571](https://github.com/uclouvain/openjpeg/issues/571)
|
|
||||||
- Use-after-free in opj\_j2k\_write\_mco [\#563](https://github.com/uclouvain/openjpeg/issues/563)
|
|
||||||
- openjpeg-master-2015-07-30 failed to compile on LINUX [\#556](https://github.com/uclouvain/openjpeg/issues/556)
|
|
||||||
- PNG images are always read as RGB\(A\) images [\#536](https://github.com/uclouvain/openjpeg/issues/536)
|
|
||||||
- g4\_colr.j2c not handled properly [\#532](https://github.com/uclouvain/openjpeg/issues/532)
|
|
||||||
- Bigendian: opj\_compress + opj\_decompress fails [\#518](https://github.com/uclouvain/openjpeg/issues/518)
|
|
||||||
- Suspicious code in j2k.c [\#517](https://github.com/uclouvain/openjpeg/issues/517)
|
|
||||||
- Decode times almost double\(!!\) on Visual Studio 2013, 2015 [\#505](https://github.com/uclouvain/openjpeg/issues/505)
|
|
||||||
- opj\_data/input/nonregression/issue226.j2k [\#500](https://github.com/uclouvain/openjpeg/issues/500)
|
|
||||||
- opj\_setup\_encoder always returns true [\#497](https://github.com/uclouvain/openjpeg/issues/497)
|
|
||||||
- Double free in j2k\_read\_ppm\_v3 parsing \(\(presumably invalid\) image. [\#496](https://github.com/uclouvain/openjpeg/issues/496)
|
|
||||||
- Invalid write in opj\_j2k\_update\_image\_data [\#495](https://github.com/uclouvain/openjpeg/issues/495)
|
|
||||||
- Undefined printf format specifier %ud used in code [\#494](https://github.com/uclouvain/openjpeg/issues/494)
|
|
||||||
- Potential double free on malloc failure in opj\_j2k\_copy\_default\_tcp\_and\_create\_tcp\(\) [\#492](https://github.com/uclouvain/openjpeg/issues/492)
|
|
||||||
- Do not link with -ffast-math [\#488](https://github.com/uclouvain/openjpeg/issues/488)
|
|
||||||
- Heap-buffer-overflow in opj\_dwt\_decode [\#486](https://github.com/uclouvain/openjpeg/issues/486)
|
|
||||||
- opj\_dump fails on Windows 7, 64 bits [\#482](https://github.com/uclouvain/openjpeg/issues/482)
|
|
||||||
- SIGSEGV in opj\_j2k\_update\_image\_data via pdfium\_test [\#481](https://github.com/uclouvain/openjpeg/issues/481)
|
|
||||||
- Heap-buffer-overflow in opj\_j2k\_tcp\_destroy [\#477](https://github.com/uclouvain/openjpeg/issues/477)
|
|
||||||
- Invalid image causes write past end of heap buffer [\#476](https://github.com/uclouvain/openjpeg/issues/476)
|
|
||||||
- Assertion `l\_res-\>x0 \>= 0' fails when parsing invalid images [\#475](https://github.com/uclouvain/openjpeg/issues/475)
|
|
||||||
- Bug on opj\_write\_bytes\_BE function [\#472](https://github.com/uclouvain/openjpeg/issues/472)
|
|
||||||
- Refactor j2k\_read\_ppm\_v3 function [\#470](https://github.com/uclouvain/openjpeg/issues/470)
|
|
||||||
- compression: strange precinct dimensions [\#466](https://github.com/uclouvain/openjpeg/issues/466)
|
|
||||||
- \(:- Console message in opj\_decompress -:\) [\#465](https://github.com/uclouvain/openjpeg/issues/465)
|
|
||||||
- opj\_decompress fails to decompress any files [\#463](https://github.com/uclouvain/openjpeg/issues/463)
|
|
||||||
- bio-\>ct is unnecessarily set to zero in opj\_bio\_flush method [\#461](https://github.com/uclouvain/openjpeg/issues/461)
|
|
||||||
- Maximal unsigned short is 65535, not 65536 [\#460](https://github.com/uclouvain/openjpeg/issues/460)
|
|
||||||
- OpenJpeg fails to encode components with different precision properly [\#459](https://github.com/uclouvain/openjpeg/issues/459)
|
|
||||||
- component precision upscaling isn't correct in opj\_decompress [\#458](https://github.com/uclouvain/openjpeg/issues/458)
|
|
||||||
- Multiple precision components won't get encoded to jp2 if 1 component is unsigned 1 bit [\#457](https://github.com/uclouvain/openjpeg/issues/457)
|
|
||||||
- Incorrect code in ../bin/jp2/convert.c, function rawtoimage\_common\(...\) [\#456](https://github.com/uclouvain/openjpeg/issues/456)
|
|
||||||
- \[OpenJPEG-trunk\] opj\_stream\_get\_number\_byte\_left throws assert [\#455](https://github.com/uclouvain/openjpeg/issues/455)
|
|
||||||
- NR-DEC-kodak\_2layers\_lrcp.j2c-31-decode-md5 fails randomly when running tests in parallel [\#454](https://github.com/uclouvain/openjpeg/issues/454)
|
|
||||||
- compare\_raw\_files doesn't report an error on invalid arguments / missing input files [\#453](https://github.com/uclouvain/openjpeg/issues/453)
|
|
||||||
- Forward discrete wavelet transform: implement periodic symmetric extension at boundaries [\#452](https://github.com/uclouvain/openjpeg/issues/452)
|
|
||||||
- Bug in tiff reading method in convert.c [\#449](https://github.com/uclouvain/openjpeg/issues/449)
|
|
||||||
- Image in pdf don't display [\#447](https://github.com/uclouvain/openjpeg/issues/447)
|
|
||||||
- Multiple issues causing opj\_decompress to segfault [\#446](https://github.com/uclouvain/openjpeg/issues/446)
|
|
||||||
- opj\_compress: 40% of encode time is spent freeing data [\#445](https://github.com/uclouvain/openjpeg/issues/445)
|
|
||||||
- Multiple warnings when configuring OpenJPEG on MacOS with CMake 3.x \(trunk\) [\#443](https://github.com/uclouvain/openjpeg/issues/443)
|
|
||||||
- valgrind memleak found [\#437](https://github.com/uclouvain/openjpeg/issues/437)
|
|
||||||
- global-buffer-overflow src/lib/openjp2/t1.c:1146 opj\_t1\_getwmsedec [\#436](https://github.com/uclouvain/openjpeg/issues/436)
|
|
||||||
- Warning introduced on trunk r2923 & r2924 [\#435](https://github.com/uclouvain/openjpeg/issues/435)
|
|
||||||
- heap-buffer-overflow in opj\_t1\_decode\_cblks [\#432](https://github.com/uclouvain/openjpeg/issues/432)
|
|
||||||
- Heap-buffer-overflow in opj\_tcd\_init\_decode\_tile [\#431](https://github.com/uclouvain/openjpeg/issues/431)
|
|
||||||
- Heap-buffer-overflow in opj\_j2k\_tcp\_destroy [\#430](https://github.com/uclouvain/openjpeg/issues/430)
|
|
||||||
- Heap-buffer-overflow in opj\_jp2\_apply\_pclr [\#429](https://github.com/uclouvain/openjpeg/issues/429)
|
|
||||||
- issue412 revisited [\#428](https://github.com/uclouvain/openjpeg/issues/428)
|
|
||||||
- Image distorted \(sides look cankered\) [\#423](https://github.com/uclouvain/openjpeg/issues/423)
|
|
||||||
- openjpeg-2.x-trunk-r2918 is broken in color.c [\#422](https://github.com/uclouvain/openjpeg/issues/422)
|
|
||||||
- Heap-buffer-overflow in opj\_tcd\_init\_decode\_tile [\#420](https://github.com/uclouvain/openjpeg/issues/420)
|
|
||||||
- Heap-use-after-free in opj\_t1\_decode\_cblks [\#418](https://github.com/uclouvain/openjpeg/issues/418)
|
|
||||||
- UNKNOWN in opj\_read\_bytes\_LE [\#417](https://github.com/uclouvain/openjpeg/issues/417)
|
|
||||||
- Transparency problem [\#416](https://github.com/uclouvain/openjpeg/issues/416)
|
|
||||||
- Image with per channel alpha \(cdef\) does not decode properly [\#414](https://github.com/uclouvain/openjpeg/issues/414)
|
|
||||||
- OpenJPEG crashes with attached image [\#413](https://github.com/uclouvain/openjpeg/issues/413)
|
|
||||||
- Palette image with cdef fails to decompress [\#412](https://github.com/uclouvain/openjpeg/issues/412)
|
|
||||||
- Invalid member values from opj\_read\_header or opj\_decode ? [\#411](https://github.com/uclouvain/openjpeg/issues/411)
|
|
||||||
- MD5 Checksum hangs under valgrind on MacOS X [\#410](https://github.com/uclouvain/openjpeg/issues/410)
|
|
||||||
- Heap-buffer-overflow in opj\_tcd\_get\_decoded\_tile\_size [\#408](https://github.com/uclouvain/openjpeg/issues/408)
|
|
||||||
- C++ style comments in trunk/src/lib/openjp2/j2k.c [\#407](https://github.com/uclouvain/openjpeg/issues/407)
|
|
||||||
- Backport bugfixes from trunk to 2.1 branch [\#405](https://github.com/uclouvain/openjpeg/issues/405)
|
|
||||||
- Heap-buffer-overflow in parse\_cmdline\_encoder [\#403](https://github.com/uclouvain/openjpeg/issues/403)
|
|
||||||
- Heap-buffer-overflow in opj\_v4dwt\_interleave\_h [\#400](https://github.com/uclouvain/openjpeg/issues/400)
|
|
||||||
- Heap-buffer-overflow in opj\_dwt\_decode [\#399](https://github.com/uclouvain/openjpeg/issues/399)
|
|
||||||
- Heap-use-after-free in opj\_t1\_decode\_cblks [\#398](https://github.com/uclouvain/openjpeg/issues/398)
|
|
||||||
- Heap-buffer-overflow in opj\_jp2\_apply\_cdef [\#397](https://github.com/uclouvain/openjpeg/issues/397)
|
|
||||||
- Heap-buffer-overflow in opj\_t2\_read\_packet\_header [\#396](https://github.com/uclouvain/openjpeg/issues/396)
|
|
||||||
- Heap-buffer-overflow in opj\_t2\_read\_packet\_header [\#395](https://github.com/uclouvain/openjpeg/issues/395)
|
|
||||||
- Heap-buffer-overflow in opj\_dwt\_decode\_1 [\#394](https://github.com/uclouvain/openjpeg/issues/394)
|
|
||||||
- Heap-double-free in j2k\_read\_ppm\_v3 [\#393](https://github.com/uclouvain/openjpeg/issues/393)
|
|
||||||
- Security hole in j2k.c [\#392](https://github.com/uclouvain/openjpeg/issues/392)
|
|
||||||
- Security: double-free in opj\_tcd\_code\_block\_dec\_deallocate [\#391](https://github.com/uclouvain/openjpeg/issues/391)
|
|
||||||
- check for negative-size params in code [\#390](https://github.com/uclouvain/openjpeg/issues/390)
|
|
||||||
- Heap-buffer-overflow in opj\_t2\_read\_packet\_header [\#389](https://github.com/uclouvain/openjpeg/issues/389)
|
|
||||||
- Heap overflow in OpenJpeg 1.5.2 [\#388](https://github.com/uclouvain/openjpeg/issues/388)
|
|
||||||
- openjpip.so.6 file too short [\#387](https://github.com/uclouvain/openjpeg/issues/387)
|
|
||||||
- Corrupted JP3D file [\#386](https://github.com/uclouvain/openjpeg/issues/386)
|
|
||||||
- variable assigned to itself [\#383](https://github.com/uclouvain/openjpeg/issues/383)
|
|
||||||
- Null pointer dereferencing [\#382](https://github.com/uclouvain/openjpeg/issues/382)
|
|
||||||
- bad use of case statement [\#381](https://github.com/uclouvain/openjpeg/issues/381)
|
|
||||||
- Release 2.1 as a Ubuntu package [\#380](https://github.com/uclouvain/openjpeg/issues/380)
|
|
||||||
- Bug in libopenjpwl.pc [\#374](https://github.com/uclouvain/openjpeg/issues/374)
|
|
||||||
- inconsistent tile numbering in decode output message [\#370](https://github.com/uclouvain/openjpeg/issues/370)
|
|
||||||
- error in code block calculations [\#369](https://github.com/uclouvain/openjpeg/issues/369)
|
|
||||||
- r2872 fails to compile due to "attempt to use poisoned malloc" error in j2k.c [\#368](https://github.com/uclouvain/openjpeg/issues/368)
|
|
||||||
- OSX build gives libopenjp2.6.dylib with not-absolute install name id [\#367](https://github.com/uclouvain/openjpeg/issues/367)
|
|
||||||
- opj\_decompress gives error but successfully decompress in OPJ 2.1 [\#366](https://github.com/uclouvain/openjpeg/issues/366)
|
|
||||||
- pngtoimage\(\) and imagetopng\(\) have wrong byte order for 16-Bit image [\#365](https://github.com/uclouvain/openjpeg/issues/365)
|
|
||||||
- PDF crash in chrome - part2 \(due to attachment limit\) [\#364](https://github.com/uclouvain/openjpeg/issues/364)
|
|
||||||
- PDF crash in chrome - part1 [\#363](https://github.com/uclouvain/openjpeg/issues/363)
|
|
||||||
- PDF crash in chrome - part0 [\#362](https://github.com/uclouvain/openjpeg/issues/362)
|
|
||||||
- Compilation fails on Windows with mingw32 gcc4.8 [\#361](https://github.com/uclouvain/openjpeg/issues/361)
|
|
||||||
- security issue [\#360](https://github.com/uclouvain/openjpeg/issues/360)
|
|
||||||
- improve memory management [\#359](https://github.com/uclouvain/openjpeg/issues/359)
|
|
||||||
- how to compress a yuv420 raw data using opj\_compress [\#357](https://github.com/uclouvain/openjpeg/issues/357)
|
|
||||||
- Some memory allocation are not checked [\#355](https://github.com/uclouvain/openjpeg/issues/355)
|
|
||||||
- Static library symbols shall be marked as hidden [\#354](https://github.com/uclouvain/openjpeg/issues/354)
|
|
||||||
- opj\_compress rejects valid bmp files [\#353](https://github.com/uclouvain/openjpeg/issues/353)
|
|
||||||
- opj\_compress crashes when number of resolutions is set to zero [\#352](https://github.com/uclouvain/openjpeg/issues/352)
|
|
||||||
- Compilation error under Visual Studio 2003 [\#351](https://github.com/uclouvain/openjpeg/issues/351)
|
|
||||||
- opj\_compress description example error \[Low priority\] [\#350](https://github.com/uclouvain/openjpeg/issues/350)
|
|
||||||
- opj\_write\_bytes\_BE is wrong in trunk [\#345](https://github.com/uclouvain/openjpeg/issues/345)
|
|
||||||
- PART1ONLY option in release.sh doesn't work properly [\#332](https://github.com/uclouvain/openjpeg/issues/332)
|
|
||||||
- openjpeg crash error [\#330](https://github.com/uclouvain/openjpeg/issues/330)
|
|
||||||
- openjpeg decompress error [\#329](https://github.com/uclouvain/openjpeg/issues/329)
|
|
||||||
- openjpeg decompress issue [\#326](https://github.com/uclouvain/openjpeg/issues/326)
|
|
||||||
- limited tif support [\#322](https://github.com/uclouvain/openjpeg/issues/322)
|
|
||||||
- asoc value of 65536 is allowed [\#321](https://github.com/uclouvain/openjpeg/issues/321)
|
|
||||||
- opj\_skip\_from\_file error [\#314](https://github.com/uclouvain/openjpeg/issues/314)
|
|
||||||
- Heavy quota usage in openjpeg [\#309](https://github.com/uclouvain/openjpeg/issues/309)
|
|
||||||
- Verify -help actually match letter [\#307](https://github.com/uclouvain/openjpeg/issues/307)
|
|
||||||
- g3\_colr.j2c not handled [\#288](https://github.com/uclouvain/openjpeg/issues/288)
|
|
||||||
- reopen/fix issue 165 [\#280](https://github.com/uclouvain/openjpeg/issues/280)
|
|
||||||
- kakadu conformance tests [\#279](https://github.com/uclouvain/openjpeg/issues/279)
|
|
||||||
- missing break after case statement in opj\_dwt\_decode\_real [\#274](https://github.com/uclouvain/openjpeg/issues/274)
|
|
||||||
- Run Coverity on trunk [\#270](https://github.com/uclouvain/openjpeg/issues/270)
|
|
||||||
- NR-ENC-random-issue-0005.tif-12-encode [\#259](https://github.com/uclouvain/openjpeg/issues/259)
|
|
||||||
- Use new add\_test signature to handle cross compilation [\#258](https://github.com/uclouvain/openjpeg/issues/258)
|
|
||||||
- Loss decoding quality in 2.0.0 [\#254](https://github.com/uclouvain/openjpeg/issues/254)
|
|
||||||
- Decompress that worked in 1.5.1 fails in 2.0 [\#252](https://github.com/uclouvain/openjpeg/issues/252)
|
|
||||||
- Expected endianness with raw input is not documented leading to SEGFAULT [\#251](https://github.com/uclouvain/openjpeg/issues/251)
|
|
||||||
- OpenJPEG writes to stderr [\#246](https://github.com/uclouvain/openjpeg/issues/246)
|
|
||||||
- Inconsistent logging of tile index [\#245](https://github.com/uclouvain/openjpeg/issues/245)
|
|
||||||
- patch for openjpeg-trunk-r2347 and BIG\_ENDIAN [\#242](https://github.com/uclouvain/openjpeg/issues/242)
|
|
||||||
- CMAP: MTYP == 0 \(direct use\) not handled properly [\#235](https://github.com/uclouvain/openjpeg/issues/235)
|
|
||||||
- Black Pixel [\#233](https://github.com/uclouvain/openjpeg/issues/233)
|
|
||||||
- opj\_compress runtime error after fresh Linux install due to apparent failure to execute ldconfig [\#219](https://github.com/uclouvain/openjpeg/issues/219)
|
|
||||||
- openjp2 debug works, release build does not [\#217](https://github.com/uclouvain/openjpeg/issues/217)
|
|
||||||
- openjpeg-branch15-r2299 and openjpeg-trunk-r2299 fail to decode a JP2 file [\#212](https://github.com/uclouvain/openjpeg/issues/212)
|
|
||||||
- openjpeg-trunk issue with Win7 [\#201](https://github.com/uclouvain/openjpeg/issues/201)
|
|
||||||
- undefined reference to `opj\_version' [\#200](https://github.com/uclouvain/openjpeg/issues/200)
|
|
||||||
- In tgt.c we used fprintf not the openjpeg message reporter [\#184](https://github.com/uclouvain/openjpeg/issues/184)
|
|
||||||
- Windows binaries not working under WinXP [\#176](https://github.com/uclouvain/openjpeg/issues/176)
|
|
||||||
- add ability to use intel ipp \(performance primitive\) within OpenJPEG [\#164](https://github.com/uclouvain/openjpeg/issues/164)
|
|
||||||
- Migration guide v2 [\#160](https://github.com/uclouvain/openjpeg/issues/160)
|
|
||||||
- Cannot decompress JPEG2000Aware3.18.7.3Win32\_kdutranscode6.3.1.j2k [\#158](https://github.com/uclouvain/openjpeg/issues/158)
|
|
||||||
- Cannot decompress JPEG2000Aware3.18.7.3Win32.j2k [\#157](https://github.com/uclouvain/openjpeg/issues/157)
|
|
||||||
- openjpeg@googlegroups.com has disappeard [\#153](https://github.com/uclouvain/openjpeg/issues/153)
|
|
||||||
- OpenJPEG 1.5.0 crashes on a ridiculously big file... [\#151](https://github.com/uclouvain/openjpeg/issues/151)
|
|
||||||
- opj\_image vs free [\#146](https://github.com/uclouvain/openjpeg/issues/146)
|
|
||||||
- Windows .dll file invalid [\#140](https://github.com/uclouvain/openjpeg/issues/140)
|
|
||||||
- Problem with second layer of a 2 layer coded LRCP \(with precincts\) [\#135](https://github.com/uclouvain/openjpeg/issues/135)
|
|
||||||
- version 1.4 crashes when opening PDF file with JPEG2000 images [\#133](https://github.com/uclouvain/openjpeg/issues/133)
|
|
||||||
- Setup a win64 dashboard [\#132](https://github.com/uclouvain/openjpeg/issues/132)
|
|
||||||
- J2KP4files/codestreams\_profile0/p0\_13.j2k question jpeg2000 [\#131](https://github.com/uclouvain/openjpeg/issues/131)
|
|
||||||
- Out of memory: Kill process 11204 \(opj\_server\) score 917 or sacrifice child [\#123](https://github.com/uclouvain/openjpeg/issues/123)
|
|
||||||
- FILE\* in opj API is unsafe [\#120](https://github.com/uclouvain/openjpeg/issues/120)
|
|
||||||
- third-party lib order [\#119](https://github.com/uclouvain/openjpeg/issues/119)
|
|
||||||
- openjpeg-1.5.0-Darwin-powerpc.dmg is huge ! [\#113](https://github.com/uclouvain/openjpeg/issues/113)
|
|
||||||
- misleading info in JP2 box lead to wrong number of components [\#110](https://github.com/uclouvain/openjpeg/issues/110)
|
|
||||||
- Image\_to\_j2k says that j2k files is generated but no file is on the HDD [\#109](https://github.com/uclouvain/openjpeg/issues/109)
|
|
||||||
- Error in openjpegV1.4 on compiling image\_to\_j2k: crash on reading bmp file [\#108](https://github.com/uclouvain/openjpeg/issues/108)
|
|
||||||
- Update to abi-compliance-checker 1.96 [\#106](https://github.com/uclouvain/openjpeg/issues/106)
|
|
||||||
- Decode error on the attached JPEG...works in KDU and with JASPER...please help! [\#101](https://github.com/uclouvain/openjpeg/issues/101)
|
|
||||||
- Mac binaries v1.4 is broken [\#95](https://github.com/uclouvain/openjpeg/issues/95)
|
|
||||||
- jp2\_read\_boxhdr\(\) has size bug in version 1 [\#92](https://github.com/uclouvain/openjpeg/issues/92)
|
|
||||||
- Support for Java JAI Imageio [\#90](https://github.com/uclouvain/openjpeg/issues/90)
|
|
||||||
- encoding test failing [\#86](https://github.com/uclouvain/openjpeg/issues/86)
|
|
||||||
- source archive on demand [\#85](https://github.com/uclouvain/openjpeg/issues/85)
|
|
||||||
- CMakeLists.txt and Makefile.am for JPIP are buggy [\#84](https://github.com/uclouvain/openjpeg/issues/84)
|
|
||||||
- pclr-cmap-cdef [\#82](https://github.com/uclouvain/openjpeg/issues/82)
|
|
||||||
- Error when compiling openjpeg\_v1\_4\_sources\_r697 [\#79](https://github.com/uclouvain/openjpeg/issues/79)
|
|
||||||
- J2K codec issue on Windows Mobile [\#77](https://github.com/uclouvain/openjpeg/issues/77)
|
|
||||||
- image\_to\_j2k.exe crashes on large .bmp file [\#75](https://github.com/uclouvain/openjpeg/issues/75)
|
|
||||||
- fatal error C1900 building the project on windows [\#65](https://github.com/uclouvain/openjpeg/issues/65)
|
|
||||||
- same option but different size [\#54](https://github.com/uclouvain/openjpeg/issues/54)
|
|
||||||
- Missing openjpegConfigure.h [\#38](https://github.com/uclouvain/openjpeg/issues/38)
|
|
||||||
- Not an issue in openjpeg, but ... [\#37](https://github.com/uclouvain/openjpeg/issues/37)
|
|
||||||
- OpenJPEG-1.3.0 pclr, cmap and cdef [\#27](https://github.com/uclouvain/openjpeg/issues/27)
|
|
||||||
- realloc maybe too big \(t2.c\) [\#26](https://github.com/uclouvain/openjpeg/issues/26)
|
|
||||||
- libopenjpeg/opj\_malloc.h breaks on FreeBSD/Darwin systems [\#20](https://github.com/uclouvain/openjpeg/issues/20)
|
|
||||||
- image\_to\_j2k not outputting to win32 console properly [\#18](https://github.com/uclouvain/openjpeg/issues/18)
|
|
||||||
- \[OpenJPEG\] OpenJPEG\_v13: tiled image part 2 [\#17](https://github.com/uclouvain/openjpeg/issues/17)
|
|
||||||
- JP2 Color Space modification by Matteo Italia [\#13](https://github.com/uclouvain/openjpeg/issues/13)
|
|
||||||
- Patch submission \( exotic video formats, and a few things \) [\#12](https://github.com/uclouvain/openjpeg/issues/12)
|
|
||||||
- 16 bits lossy compression [\#10](https://github.com/uclouvain/openjpeg/issues/10)
|
|
||||||
- pnm file formats not accepting bitdepth greater than 8 bpp [\#8](https://github.com/uclouvain/openjpeg/issues/8)
|
|
||||||
- Heap corruption in j2k encoder [\#5](https://github.com/uclouvain/openjpeg/issues/5)
|
|
||||||
- JPWL crash in marker reallocation\(+patch\), segfault while decoding image with main header protection [\#4](https://github.com/uclouvain/openjpeg/issues/4)
|
|
||||||
- a couple of small errors in libopenjpeg detected by coverity [\#1](https://github.com/uclouvain/openjpeg/issues/1)
|
|
||||||
|
|
||||||
**Closed issues:**
|
|
||||||
|
|
||||||
- Shared library build broken on ubuntu [\#728](https://github.com/uclouvain/openjpeg/issues/728)
|
|
||||||
- opj\_includes.h shouldn't define `\_\_attribute\_\_` [\#727](https://github.com/uclouvain/openjpeg/issues/727)
|
|
||||||
- Possible website problems due to Jekyll upgrade [\#713](https://github.com/uclouvain/openjpeg/issues/713)
|
|
||||||
- Stable Release? [\#712](https://github.com/uclouvain/openjpeg/issues/712)
|
|
||||||
- Meta Issue : try to fix some of these critical bugs before thinking about optimizing the library [\#710](https://github.com/uclouvain/openjpeg/issues/710)
|
|
||||||
- Tiled encoding broken for images with non power of 2 dimensions [\#702](https://github.com/uclouvain/openjpeg/issues/702)
|
|
||||||
- install\_name \(still\) not set on OS X [\#700](https://github.com/uclouvain/openjpeg/issues/700)
|
|
||||||
- Add section in wiki describing where one can get test images [\#699](https://github.com/uclouvain/openjpeg/issues/699)
|
|
||||||
- Make EvenManager into singleton [\#698](https://github.com/uclouvain/openjpeg/issues/698)
|
|
||||||
- Remove old branches from repo [\#696](https://github.com/uclouvain/openjpeg/issues/696)
|
|
||||||
- MQ Coder encode: Conditional jump or move depends on uninitialised value\(s\) [\#695](https://github.com/uclouvain/openjpeg/issues/695)
|
|
||||||
- Can we add these files to our test suite ? [\#688](https://github.com/uclouvain/openjpeg/issues/688)
|
|
||||||
- -t and -d command line flags for decode are not documented on OpenJPEG website [\#685](https://github.com/uclouvain/openjpeg/issues/685)
|
|
||||||
- Decoding at the precinct level [\#676](https://github.com/uclouvain/openjpeg/issues/676)
|
|
||||||
- Support unscaled 10 bit data for 2K cinema @ 48 FPS, as per DCI standard [\#671](https://github.com/uclouvain/openjpeg/issues/671)
|
|
||||||
- Use parallel jobs in ctest [\#664](https://github.com/uclouvain/openjpeg/issues/664)
|
|
||||||
- \[Security\]Multiple Memory error [\#663](https://github.com/uclouvain/openjpeg/issues/663)
|
|
||||||
- lossy encoding a 16 bit TIF file : severe artifiacts in decompressed image [\#660](https://github.com/uclouvain/openjpeg/issues/660)
|
|
||||||
- opj\_compress and opj\_decompress : get\_next\_file method uses hard-coded unix path separator [\#630](https://github.com/uclouvain/openjpeg/issues/630)
|
|
||||||
- Uninitialized variable [\#629](https://github.com/uclouvain/openjpeg/issues/629)
|
|
||||||
- Use of enum variable for bit flags prevents compilation as C++ source [\#619](https://github.com/uclouvain/openjpeg/issues/619)
|
|
||||||
- Serious problem with quantization during lossy encoding [\#615](https://github.com/uclouvain/openjpeg/issues/615)
|
|
||||||
- Decompression does not work with sequential data source [\#613](https://github.com/uclouvain/openjpeg/issues/613)
|
|
||||||
- potential overflow in opj\_tcd\_tile\_t [\#605](https://github.com/uclouvain/openjpeg/issues/605)
|
|
||||||
- Logical condition [\#596](https://github.com/uclouvain/openjpeg/issues/596)
|
|
||||||
- file9.jp2 does not dump correctly on 1.5 [\#595](https://github.com/uclouvain/openjpeg/issues/595)
|
|
||||||
- opj\_compress man page is missing documentation of -jpip option [\#593](https://github.com/uclouvain/openjpeg/issues/593)
|
|
||||||
- opj\_compress fails to compress lossless on gcc/x86 \(-m32\) in 1.5 branch [\#591](https://github.com/uclouvain/openjpeg/issues/591)
|
|
||||||
- Example: opj\_compress -i image.j2k -o image.pgm [\#577](https://github.com/uclouvain/openjpeg/issues/577)
|
|
||||||
- Mismatching delete [\#575](https://github.com/uclouvain/openjpeg/issues/575)
|
|
||||||
- Compilation fails on Win7 [\#546](https://github.com/uclouvain/openjpeg/issues/546)
|
|
||||||
- NR-JP2-file5.jp2-compare2base fails with third party libcms [\#540](https://github.com/uclouvain/openjpeg/issues/540)
|
|
||||||
- CTest spits out an error at the end of the test run [\#516](https://github.com/uclouvain/openjpeg/issues/516)
|
|
||||||
- opj\_uint\_adds\(\) is questionable [\#515](https://github.com/uclouvain/openjpeg/issues/515)
|
|
||||||
- Might consider renaming this method: [\#491](https://github.com/uclouvain/openjpeg/issues/491)
|
|
||||||
- opj\_compress run twice gives different fiile sizes for same file [\#490](https://github.com/uclouvain/openjpeg/issues/490)
|
|
||||||
- Android Support [\#483](https://github.com/uclouvain/openjpeg/issues/483)
|
|
||||||
- Add SSE2/SSE41 implementations for mct.c [\#451](https://github.com/uclouvain/openjpeg/issues/451)
|
|
||||||
- Reduce encoder code block memory usage for non 64x64 code block sizes [\#444](https://github.com/uclouvain/openjpeg/issues/444)
|
|
||||||
- valgrind "Uninitialized Memory Read" & "Uninitialized Memory Conditional" found [\#438](https://github.com/uclouvain/openjpeg/issues/438)
|
|
||||||
- No way to debug opj\_tcd\_init\_encode\_tile or opj\_tcd\_init\_decode\_tile [\#433](https://github.com/uclouvain/openjpeg/issues/433)
|
|
||||||
- Add option to call dsymutil on built binaries [\#409](https://github.com/uclouvain/openjpeg/issues/409)
|
|
||||||
- Allow opj\_compress and opj\_decompress to read/write images over stdin/stdout [\#379](https://github.com/uclouvain/openjpeg/issues/379)
|
|
||||||
- reduce memory significantly for single tile RGB encoding [\#375](https://github.com/uclouvain/openjpeg/issues/375)
|
|
||||||
- Switch code repo to github and start using pull request workflow [\#373](https://github.com/uclouvain/openjpeg/issues/373)
|
|
||||||
- This is a BigTIFF file. This format not supported [\#125](https://github.com/uclouvain/openjpeg/issues/125)
|
|
||||||
- Add a test suite to check the convert functions [\#99](https://github.com/uclouvain/openjpeg/issues/99)
|
|
||||||
- Add build config to the dashboard to verify the autotools build [\#88](https://github.com/uclouvain/openjpeg/issues/88)
|
|
||||||
|
|
||||||
**Merged pull requests:**
|
|
||||||
|
|
||||||
- Correct abi-check.sh for PR [\#791](https://github.com/uclouvain/openjpeg/pull/791) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Update tcd.c [\#790](https://github.com/uclouvain/openjpeg/pull/790) ([maddin200](https://github.com/maddin200))
|
|
||||||
- Update lcms2 [\#773](https://github.com/uclouvain/openjpeg/pull/773) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Use lowercase for cmake commands consistenly [\#769](https://github.com/uclouvain/openjpeg/pull/769) ([julienmalik](https://github.com/julienmalik))
|
|
||||||
- Ignore clang's summary warning [\#768](https://github.com/uclouvain/openjpeg/pull/768) ([julienmalik](https://github.com/julienmalik))
|
|
||||||
- Fix UBSan gcc warning for first arg to memset non null [\#767](https://github.com/uclouvain/openjpeg/pull/767) ([julienmalik](https://github.com/julienmalik))
|
|
||||||
- Update to libtiff-4.0.6 [\#764](https://github.com/uclouvain/openjpeg/pull/764) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix warnings [\#763](https://github.com/uclouvain/openjpeg/pull/763) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Check SSIZ is valid in opj\_j2k\_read\_siz [\#762](https://github.com/uclouvain/openjpeg/pull/762) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix unsigned int overflow reported by UBSan [\#761](https://github.com/uclouvain/openjpeg/pull/761) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix unsigned int overflow reported by UBSan [\#759](https://github.com/uclouvain/openjpeg/pull/759) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix negative shift left reported by UBSan [\#758](https://github.com/uclouvain/openjpeg/pull/758) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix negative shift left reported by UBSan [\#757](https://github.com/uclouvain/openjpeg/pull/757) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add clang 3.9 build to Travis matrix [\#753](https://github.com/uclouvain/openjpeg/pull/753) ([julienmalik](https://github.com/julienmalik))
|
|
||||||
- Fix implicit floating bool conversion [\#752](https://github.com/uclouvain/openjpeg/pull/752) ([julienmalik](https://github.com/julienmalik))
|
|
||||||
- Do not define \_\_attribute\_\_ in opj\_includes.h [\#751](https://github.com/uclouvain/openjpeg/pull/751) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Allow to read/write 3/5/7/9/11/13/15 bpp TIF files [\#750](https://github.com/uclouvain/openjpeg/pull/750) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix heap-buffer-overflow in color\_esycc\_to\_rgb [\#748](https://github.com/uclouvain/openjpeg/pull/748) ([mayeut](https://github.com/mayeut))
|
|
||||||
- update libpng to from 1.6.17 to 1.6.21 [\#747](https://github.com/uclouvain/openjpeg/pull/747) ([julienmalik](https://github.com/julienmalik))
|
|
||||||
- Update cmake & jpylyzer for travis builds [\#746](https://github.com/uclouvain/openjpeg/pull/746) ([julienmalik](https://github.com/julienmalik))
|
|
||||||
- Fix Out-Of-Bounds Read in sycc42x\_to\_rgb function [\#745](https://github.com/uclouvain/openjpeg/pull/745) ([mayeut](https://github.com/mayeut))
|
|
||||||
- cppcheck fix for openjp2 [\#740](https://github.com/uclouvain/openjpeg/pull/740) ([julienmalik](https://github.com/julienmalik))
|
|
||||||
- Fix uninitialized variable reported by cppcheck [\#735](https://github.com/uclouvain/openjpeg/pull/735) ([julienmalik](https://github.com/julienmalik))
|
|
||||||
- Remove dead code in opj\_dump [\#734](https://github.com/uclouvain/openjpeg/pull/734) ([julienmalik](https://github.com/julienmalik))
|
|
||||||
- issue \#695 MQ Encode: ensure that bp pointer never points to uninitialized memory [\#708](https://github.com/uclouvain/openjpeg/pull/708) ([boxerab](https://github.com/boxerab))
|
|
||||||
- Fix issue 135 [\#706](https://github.com/uclouvain/openjpeg/pull/706) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix implementation of opj\_calloc [\#705](https://github.com/uclouvain/openjpeg/pull/705) ([stweil](https://github.com/stweil))
|
|
||||||
- \[git/2.1 regression\] Fix opj\_write\_tile\(\) failure when numresolutions=1 [\#690](https://github.com/uclouvain/openjpeg/pull/690) ([rouault](https://github.com/rouault))
|
|
||||||
- Fix fatal crash on 64 bit Linux [\#687](https://github.com/uclouvain/openjpeg/pull/687) ([stweil](https://github.com/stweil))
|
|
||||||
- \[libtiff\] Add missing include statement for ssize\_t [\#686](https://github.com/uclouvain/openjpeg/pull/686) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix duplicate article in comments [\#684](https://github.com/uclouvain/openjpeg/pull/684) ([stweil](https://github.com/stweil))
|
|
||||||
- Fix grammar in comment [\#679](https://github.com/uclouvain/openjpeg/pull/679) ([stweil](https://github.com/stweil))
|
|
||||||
- Remove whitespace and CR at line endings [\#678](https://github.com/uclouvain/openjpeg/pull/678) ([stweil](https://github.com/stweil))
|
|
||||||
- Fix typos [\#665](https://github.com/uclouvain/openjpeg/pull/665) ([jwilk](https://github.com/jwilk))
|
|
||||||
- Add missing source for the JPIP library and executables \(issue \#658\) [\#659](https://github.com/uclouvain/openjpeg/pull/659) ([stweil](https://github.com/stweil))
|
|
||||||
- Fix undefined size jp2 box handling [\#654](https://github.com/uclouvain/openjpeg/pull/654) ([mayeut](https://github.com/mayeut))
|
|
||||||
- opj\_decompress: Update error message [\#651](https://github.com/uclouvain/openjpeg/pull/651) ([stweil](https://github.com/stweil))
|
|
||||||
- Fix support of posix\_memalloc for Linux [\#648](https://github.com/uclouvain/openjpeg/pull/648) ([stweil](https://github.com/stweil))
|
|
||||||
- Fix typo in comments [\#647](https://github.com/uclouvain/openjpeg/pull/647) ([stweil](https://github.com/stweil))
|
|
||||||
- Avoid pointer arithmetic with \(void \*\) pointers [\#644](https://github.com/uclouvain/openjpeg/pull/644) ([smuehlst](https://github.com/smuehlst))
|
|
||||||
- Fix HP compiler warning about redeclaration of function \(\#640\) [\#641](https://github.com/uclouvain/openjpeg/pull/641) ([smuehlst](https://github.com/smuehlst))
|
|
||||||
- Fix format strings and unneeded assignment [\#638](https://github.com/uclouvain/openjpeg/pull/638) ([stweil](https://github.com/stweil))
|
|
||||||
- Fix repository for JPEG2000 test data [\#637](https://github.com/uclouvain/openjpeg/pull/637) ([stweil](https://github.com/stweil))
|
|
||||||
- Update allocation functions [\#636](https://github.com/uclouvain/openjpeg/pull/636) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix OpenJPEG GitHub issue \#633. [\#634](https://github.com/uclouvain/openjpeg/pull/634) ([smuehlst](https://github.com/smuehlst))
|
|
||||||
- travis-ci: Include add ons in matrix [\#632](https://github.com/uclouvain/openjpeg/pull/632) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add Appveyor [\#627](https://github.com/uclouvain/openjpeg/pull/627) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Use Travis-ci to run ABI check [\#626](https://github.com/uclouvain/openjpeg/pull/626) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix warnings for C++ [\#623](https://github.com/uclouvain/openjpeg/pull/623) ([stweil](https://github.com/stweil))
|
|
||||||
- Fixed problem that C++ compilation failed because of enum variable. [\#622](https://github.com/uclouvain/openjpeg/pull/622) ([smuehlst](https://github.com/smuehlst))
|
|
||||||
- Added missing casts for return values of opj\_malloc\(\)/opj\_calloc\(\). [\#618](https://github.com/uclouvain/openjpeg/pull/618) ([smuehlst](https://github.com/smuehlst))
|
|
||||||
- Add check for seek support before trying TPsot==TNsot workaround [\#617](https://github.com/uclouvain/openjpeg/pull/617) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix some typos found by codespell [\#610](https://github.com/uclouvain/openjpeg/pull/610) ([stweil](https://github.com/stweil))
|
|
||||||
- Correct leak in color\_cielab\_to\_rgb [\#590](https://github.com/uclouvain/openjpeg/pull/590) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add Travis-ci build matrix [\#584](https://github.com/uclouvain/openjpeg/pull/584) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Correct lossless issue on linux x86 [\#579](https://github.com/uclouvain/openjpeg/pull/579) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Travis-ci update [\#578](https://github.com/uclouvain/openjpeg/pull/578) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Correct CMake version requirements [\#572](https://github.com/uclouvain/openjpeg/pull/572) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add tests for CMYK/esYCC/CIELab [\#567](https://github.com/uclouvain/openjpeg/pull/567) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add support for CIELab, EYCC and CMYK [\#559](https://github.com/uclouvain/openjpeg/pull/559) ([szukw000](https://github.com/szukw000))
|
|
||||||
- Remove printf/fprintf to stdout/stderr throughout openjp2 lib [\#558](https://github.com/uclouvain/openjpeg/pull/558) ([mayeut](https://github.com/mayeut))
|
|
||||||
- better -ffast-math handling [\#555](https://github.com/uclouvain/openjpeg/pull/555) ([rdieter](https://github.com/rdieter))
|
|
||||||
- Add jpylyzer tests for JP2 compression [\#552](https://github.com/uclouvain/openjpeg/pull/552) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add COC/QCC in main header when needed [\#551](https://github.com/uclouvain/openjpeg/pull/551) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Use \_\_emul under msvc x86 for fast 64 = 32 \* 32 [\#550](https://github.com/uclouvain/openjpeg/pull/550) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Update convert for PNG output [\#549](https://github.com/uclouvain/openjpeg/pull/549) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Remove some warnings when building [\#548](https://github.com/uclouvain/openjpeg/pull/548) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Switch to libpng-1.6.17 [\#547](https://github.com/uclouvain/openjpeg/pull/547) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add some missing static keywords [\#545](https://github.com/uclouvain/openjpeg/pull/545) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Switch to libcms2 mm2/Little-CMS@0e8234e090d6aab33f90e2eb0296f30aa0705e57 [\#544](https://github.com/uclouvain/openjpeg/pull/544) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Prevent overflow when coding 16 bits images [\#543](https://github.com/uclouvain/openjpeg/pull/543) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Switch to libcms2-2.6 [\#542](https://github.com/uclouvain/openjpeg/pull/542) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Update PNG support [\#538](https://github.com/uclouvain/openjpeg/pull/538) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Various Minor fixes [\#537](https://github.com/uclouvain/openjpeg/pull/537) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Update TIFF conversion to support more bit depth. [\#535](https://github.com/uclouvain/openjpeg/pull/535) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add checks for odd looking cmap & for cmap outside jp2h box [\#534](https://github.com/uclouvain/openjpeg/pull/534) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Refactor opj\_j2k\_read\_ppm & opj\_j2k\_read\_ppt [\#533](https://github.com/uclouvain/openjpeg/pull/533) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Add option to force component splitting in imagetopnm [\#531](https://github.com/uclouvain/openjpeg/pull/531) ([mayeut](https://github.com/mayeut))
|
|
||||||
- fix Suspicious code in j2k.c \#517 [\#529](https://github.com/uclouvain/openjpeg/pull/529) ([renevanderark](https://github.com/renevanderark))
|
|
||||||
- Update zlib to version 1.2.8 [\#528](https://github.com/uclouvain/openjpeg/pull/528) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fix opj\_write\_bytes\_BE \(\#518\) [\#521](https://github.com/uclouvain/openjpeg/pull/521) ([manisandro](https://github.com/manisandro))
|
|
||||||
- Correctly decode files with incorrect tile-part header fields \(TPsot==TNsot\) [\#514](https://github.com/uclouvain/openjpeg/pull/514) ([mayeut](https://github.com/mayeut))
|
|
||||||
- Fixed typos [\#510](https://github.com/uclouvain/openjpeg/pull/510) ([radarhere](https://github.com/radarhere))
|
|
||||||
- Formatted the readme file [\#507](https://github.com/uclouvain/openjpeg/pull/507) ([htmfilho](https://github.com/htmfilho))
|
|
||||||
|
|
||||||
## [version.2.1](https://github.com/uclouvain/openjpeg/releases/tag/version.2.1) (2014-04-29)
|
|
||||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.2.0.1...version.2.1)
|
|
||||||
|
|
||||||
## [version.2.0.1](https://github.com/uclouvain/openjpeg/releases/tag/version.2.0.1) (2014-04-22)
|
|
||||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.5.2...version.2.0.1)
|
|
||||||
|
|
||||||
## [version.1.5.2](https://github.com/uclouvain/openjpeg/releases/tag/version.1.5.2) (2014-03-28)
|
|
||||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.2.0...version.1.5.2)
|
|
||||||
|
|
||||||
## [version.2.0](https://github.com/uclouvain/openjpeg/releases/tag/version.2.0) (2014-03-28)
|
|
||||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.5.1...version.2.0)
|
|
||||||
|
|
||||||
## [version.1.5.1](https://github.com/uclouvain/openjpeg/releases/tag/version.1.5.1) (2012-09-13)
|
|
||||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.5...version.1.5.1)
|
|
||||||
|
|
||||||
## [version.1.5](https://github.com/uclouvain/openjpeg/releases/tag/version.1.5) (2012-02-07)
|
|
||||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.3...version.1.5)
|
|
||||||
|
|
||||||
## [version.1.3](https://github.com/uclouvain/openjpeg/releases/tag/version.1.3) (2011-07-03)
|
|
||||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.4...version.1.3)
|
|
||||||
|
|
||||||
## [version.1.4](https://github.com/uclouvain/openjpeg/releases/tag/version.1.4) (2011-07-03)
|
|
||||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.2...version.1.4)
|
|
||||||
|
|
||||||
## [version.1.2](https://github.com/uclouvain/openjpeg/releases/tag/version.1.2) (2007-06-04)
|
|
||||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.1...version.1.2)
|
|
||||||
|
|
||||||
## [version.1.1](https://github.com/uclouvain/openjpeg/releases/tag/version.1.1) (2007-01-31)
|
|
||||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.0...version.1.1)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
|
|
@ -32,7 +32,7 @@ include_regular_expression("^.*$")
|
|||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# OPENJPEG version number, useful for packaging and doxygen doc:
|
# OPENJPEG version number, useful for packaging and doxygen doc:
|
||||||
set(OPENJPEG_VERSION_MAJOR 2)
|
set(OPENJPEG_VERSION_MAJOR 2)
|
||||||
set(OPENJPEG_VERSION_MINOR 2)
|
set(OPENJPEG_VERSION_MINOR 1)
|
||||||
set(OPENJPEG_VERSION_BUILD 0)
|
set(OPENJPEG_VERSION_BUILD 0)
|
||||||
set(OPENJPEG_VERSION
|
set(OPENJPEG_VERSION
|
||||||
"${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}")
|
"${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}")
|
||||||
@ -52,9 +52,6 @@ set(PACKAGE_VERSION
|
|||||||
# 2.0 | 6
|
# 2.0 | 6
|
||||||
# 2.0.1 | 6
|
# 2.0.1 | 6
|
||||||
# 2.1 | 7
|
# 2.1 | 7
|
||||||
# 2.1.1 | 7
|
|
||||||
# 2.1.2 | 7
|
|
||||||
# 2.2.0 | 8
|
|
||||||
# above is the recommendation by the OPJ team. If you really need to override this default,
|
# above is the recommendation by the OPJ team. If you really need to override this default,
|
||||||
# you can specify your own OPENJPEG_SOVERSION at cmake configuration time:
|
# you can specify your own OPENJPEG_SOVERSION at cmake configuration time:
|
||||||
# cmake -DOPENJPEG_SOVERSION:STRING=42 /path/to/openjpeg
|
# cmake -DOPENJPEG_SOVERSION:STRING=42 /path/to/openjpeg
|
||||||
@ -69,7 +66,7 @@ set(OPENJPEG_LIBRARY_PROPERTIES
|
|||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
# Path to additional CMake modules
|
# Path to additional CMake modules
|
||||||
set(CMAKE_MODULE_PATH
|
set(CMAKE_MODULE_PATH
|
||||||
${${OPENJPEG_NAMESPACE}_SOURCE_DIR}/cmake
|
${CMAKE_SOURCE_DIR}/cmake
|
||||||
${CMAKE_MODULE_PATH})
|
${CMAKE_MODULE_PATH})
|
||||||
|
|
||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
@ -165,8 +162,8 @@ TEST_BIG_ENDIAN(OPJ_BIG_ENDIAN)
|
|||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# Setup file for setting custom ctest vars
|
# Setup file for setting custom ctest vars
|
||||||
configure_file(
|
configure_file(
|
||||||
${${OPENJPEG_NAMESPACE}_SOURCE_DIR}/cmake/CTestCustom.cmake.in
|
${CMAKE_SOURCE_DIR}/cmake/CTestCustom.cmake.in
|
||||||
${${OPENJPEG_NAMESPACE}_BINARY_DIR}/CTestCustom.cmake
|
${CMAKE_BINARY_DIR}/CTestCustom.cmake
|
||||||
@ONLY
|
@ONLY
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -228,7 +225,7 @@ CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
|
|||||||
include(TestLargeFiles)
|
include(TestLargeFiles)
|
||||||
OPJ_TEST_LARGE_FILES(OPJ_HAVE_LARGEFILES)
|
OPJ_TEST_LARGE_FILES(OPJ_HAVE_LARGEFILES)
|
||||||
|
|
||||||
# Allocating Aligned Memory Blocks
|
# Allocating Aligned Memory Blocks
|
||||||
include(CheckIncludeFiles)
|
include(CheckIncludeFiles)
|
||||||
check_include_files(malloc.h OPJ_HAVE_MALLOC_H)
|
check_include_files(malloc.h OPJ_HAVE_MALLOC_H)
|
||||||
include(CheckSymbolExists)
|
include(CheckSymbolExists)
|
||||||
@ -251,7 +248,6 @@ if(BUILD_JPIP_SERVER)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
add_subdirectory(src/lib)
|
add_subdirectory(src/lib)
|
||||||
option(BUILD_LUTS_GENERATOR "Build utility to generate t1_luts.h" OFF)
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# Build Applications
|
# Build Applications
|
||||||
@ -325,8 +321,8 @@ endif()
|
|||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# install all targets referenced as OPENJPEGTargets
|
# install all targets referenced as OPENJPEGTargets
|
||||||
install(EXPORT OpenJPEGTargets DESTINATION ${OPENJPEG_INSTALL_PACKAGE_DIR})
|
install(EXPORT OpenJPEGTargets DESTINATION ${OPENJPEG_INSTALL_PACKAGE_DIR})
|
||||||
configure_file( ${${OPENJPEG_NAMESPACE}_SOURCE_DIR}/cmake/OpenJPEGConfig.cmake.in
|
configure_file( ${OPENJPEG_SOURCE_DIR}/cmake/OpenJPEGConfig.cmake.in
|
||||||
${${OPENJPEG_NAMESPACE}_BINARY_DIR}/OpenJPEGConfig.cmake
|
${OPENJPEG_BINARY_DIR}/OpenJPEGConfig.cmake
|
||||||
@ONLY
|
@ONLY
|
||||||
)
|
)
|
||||||
install( FILES ${OPENJPEG_BINARY_DIR}/OpenJPEGConfig.cmake
|
install( FILES ${OPENJPEG_BINARY_DIR}/OpenJPEGConfig.cmake
|
||||||
|
69
INSTALL
Normal file
69
INSTALL
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
|
||||||
|
How to build and install openjpeg binaries
|
||||||
|
==========================================
|
||||||
|
|
||||||
|
UNIX/LINUX/MacOSX/Windows systems
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Using cmake (see www.cmake.org)
|
||||||
|
|
||||||
|
Type:
|
||||||
|
cmake .
|
||||||
|
make
|
||||||
|
|
||||||
|
If you are root:
|
||||||
|
make install
|
||||||
|
|
||||||
|
else if you have sudo power:
|
||||||
|
sudo make install
|
||||||
|
|
||||||
|
else
|
||||||
|
DESTDIR=$HOME/local make install
|
||||||
|
|
||||||
|
To build the Doxygen documentation (Doxygen needs to be found on the system):
|
||||||
|
(A 'html' directory is generated in the 'doc' directory)
|
||||||
|
make doc
|
||||||
|
|
||||||
|
Binaries are located in the 'bin' directory.
|
||||||
|
|
||||||
|
Main available cmake flags:
|
||||||
|
* To specify the install path: '-DCMAKE_INSTALL_PREFIX=/path', or use DESTDIR env variable (see above)
|
||||||
|
* To build the shared libraries and links the executables against it: '-DBUILD_SHARED_LIBS:bool=on' (default: 'ON')
|
||||||
|
Note: when using this option, static libraries are not built and executables are dynamically linked.
|
||||||
|
* To build the CODEC executables: '-DBUILD_CODEC:bool=on' (default: 'ON')
|
||||||
|
* To build the documentation: '-DBUILD_DOC:bool=on' (default: 'OFF')
|
||||||
|
* To build the MJ2 executables: '-DBUILD_MJ2:bool=on' (default: 'OFF')
|
||||||
|
* To build the JPWL executables and JPWL library: '-DBUILD_JPWL:bool=on' (default: 'OFF')
|
||||||
|
* To build the JPIP library and utilities: '-DBUILD_JPIP:bool=on' (default: 'OFF')
|
||||||
|
** To build the JPIP server: '-DBUILD_JPIP_SERVER:bool=on' (default: 'OFF')
|
||||||
|
* To build the JP3D library and utilities: '-DBUILD_JP3D:bool=on' (default: 'OFF') (experimental)
|
||||||
|
* To build the Java binding: '-DBUILD_JAVA:bool=on' (default: 'OFF') (experimental).
|
||||||
|
** to choose which java implementation, you can set your JAVA_HOME env var.
|
||||||
|
* To build the wxWidgets/C++ viewer: 'BUILD_VIEWER:BOOL=ON' (default OFF) (experimental)
|
||||||
|
* To enable testing (and automatic result upload to http://my.cdash.org/index.php?project=OPENJPEG):
|
||||||
|
cmake . -DBUILD_TESTING:BOOL=ON -DOPJ_DATA_ROOT:PATH='path/to/the/data/directory'
|
||||||
|
make
|
||||||
|
make Experimental
|
||||||
|
Note : JPEG2000 test files are available with 'git clone https://github.com/uclouvain/openjpeg-data.git'.
|
||||||
|
If '-DOPJ_DATA_ROOT:PATH' option is omitted, test files will be automatically searched in '${CMAKE_SOURCE_DIR}/../data',
|
||||||
|
corresponding to the location of the data directory when compiling from the trunk (and assuming the data directory has
|
||||||
|
been checked out of course).
|
||||||
|
|
||||||
|
MACOSX
|
||||||
|
------
|
||||||
|
|
||||||
|
The same building procedures as above work for MACOSX.
|
||||||
|
The xcode project file can also be used.
|
||||||
|
|
||||||
|
If it does not work, try adding the following flag to the cmake command :
|
||||||
|
'-DCMAKE_OSX_ARCHITECTURES:STRING=i386'
|
||||||
|
|
||||||
|
WINDOWS
|
||||||
|
-------
|
||||||
|
|
||||||
|
You can use cmake to generate project files for the IDE you are using (VS2010, NMake, etc).
|
||||||
|
Type 'cmake --help' for available generators on your platform.
|
||||||
|
|
||||||
|
Make sure to build the third party libs (png, zlib ...):
|
||||||
|
|
||||||
|
'-DBUILD_THIRDPARTY:BOOL=ON'
|
75
INSTALL.md
75
INSTALL.md
@ -1,75 +0,0 @@
|
|||||||
|
|
||||||
# OpenJPEG installation
|
|
||||||
|
|
||||||
The build method maintained by OpenJPEG is [CMake](https://cmake.org/).
|
|
||||||
|
|
||||||
## UNIX/LINUX - MacOS (terminal) - WINDOWS (cygwin, MinGW)
|
|
||||||
|
|
||||||
To build the library, type from source tree directory:
|
|
||||||
```
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
cmake ..
|
|
||||||
make
|
|
||||||
```
|
|
||||||
Binaries are then located in the 'bin' directory.
|
|
||||||
|
|
||||||
To install the library, type with root privileges:
|
|
||||||
```
|
|
||||||
make install
|
|
||||||
make clean
|
|
||||||
```
|
|
||||||
|
|
||||||
To build the html documentation, you need doxygen to be installed on your system.
|
|
||||||
It will create an "html" directory in TOP\_LEVEL/build/doc)
|
|
||||||
```
|
|
||||||
make doc
|
|
||||||
```
|
|
||||||
|
|
||||||
Main available cmake flags:
|
|
||||||
* To specify the install path: '-DCMAKE\_INSTALL\_PREFIX=/path'
|
|
||||||
* To build the shared libraries and links the executables against it: '-DBUILD\_SHARED\_LIBS:bool=on' (default: 'ON')
|
|
||||||
> Note: when using this option, static libraries are not built and executables are dynamically linked.
|
|
||||||
* To build the CODEC executables: '-DBUILD\_CODEC:bool=on' (default: 'ON')
|
|
||||||
* [OBSOLETE] To build the MJ2 executables: '-DBUILD\_MJ2:bool=on' (default: 'OFF')
|
|
||||||
* [OBSOLETE] To build the JPWL executables and JPWL library: '-DBUILD\_JPWL:bool=on' (default: 'OFF')
|
|
||||||
* [OBSOLETE] To build the JPIP client (java compiler recommended) library and executables: '-DBUILD\_JPIP:bool=on' (default: 'OFF')
|
|
||||||
* [OBSOLETE] To build the JPIP server (need fcgi) library and executables: '-DBUILD\_JPIP\_SERVER:bool=on' (default: 'OFF')
|
|
||||||
* To enable testing (and automatic result upload to http://my.cdash.org/index.php?project=OPENJPEG):
|
|
||||||
```
|
|
||||||
cmake . -DBUILD_TESTING:BOOL=ON -DOPJ_DATA_ROOT:PATH='path/to/the/data/directory' -DBUILDNAME:STRING='name_of_the_build'
|
|
||||||
make
|
|
||||||
make Experimental
|
|
||||||
```
|
|
||||||
Note : test data is available on the following github repo: https://github.com/uclouvain/openjpeg-data
|
|
||||||
|
|
||||||
If '-DOPJ\_DATA\_ROOT:PATH' option is omitted, test files will be automatically searched in '${CMAKE\_SOURCE\_DIR}/../data'.
|
|
||||||
|
|
||||||
Note 2 : to execute the encoding test suite, kakadu binaries are needed to decode encoded image and compare it to the baseline. Kakadu binaries are freely available for non-commercial purposes at http://www.kakadusoftware.com. kdu\_expand will need to be in your PATH for cmake to find it.
|
|
||||||
|
|
||||||
Note 3 : OpenJPEG encoder and decoder (not the library itself !) depends on several libraries: png, tiff, lcms, z. If these libraries are not found on the system, they are automatically built from the versions available in the source tree. You can force the use of these embedded version with BUILD\_THIRDPARTY:BOOL=ON. On a Debian-like system you can also simply install these libraries with:
|
|
||||||
```
|
|
||||||
sudo apt-get install liblcms2-dev libtiff-dev libpng-dev libz-dev
|
|
||||||
```
|
|
||||||
|
|
||||||
Note 4 : On MacOS, if it does not work, try adding the following flag to the cmake command :
|
|
||||||
```
|
|
||||||
-DCMAKE_OSX_ARCHITECTURES:STRING=i386
|
|
||||||
```
|
|
||||||
|
|
||||||
## MacOS (XCode) - WINDOWS (VisualStudio, etc)
|
|
||||||
|
|
||||||
You can use cmake to generate the project files for the IDE you are using (VC2010, XCode, etc).
|
|
||||||
Type 'cmake --help' for available generators on your platform.
|
|
||||||
|
|
||||||
# Using OpenJPEG
|
|
||||||
|
|
||||||
To use openjpeg exported cmake file, simply create your application doing:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cat CMakeLists.txt
|
|
||||||
find_package(OpenJPEG REQUIRED)
|
|
||||||
include_directories(${OPENJPEG_INCLUDE_DIRS})
|
|
||||||
add_executable(myapp myapp.c)
|
|
||||||
target_link_libraries(myapp ${OPENJPEG_LIBRARIES})
|
|
||||||
```
|
|
61
NEWS
Normal file
61
NEWS
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
|
||||||
|
OpenJPEG NEWS - user visible changes
|
||||||
|
====================================
|
||||||
|
|
||||||
|
Changes from OpenJPEG 2.0.0 to OpenJPEG 2.X.X
|
||||||
|
----------------------------------------------
|
||||||
|
|
||||||
|
New Features:
|
||||||
|
|
||||||
|
* Digital Cinema profiles have been fixed and updated
|
||||||
|
* New option to disable MCT if needed
|
||||||
|
* extended RAW support: it is now possible to input raw images
|
||||||
|
with subsampled color components (422, 420, etc)
|
||||||
|
* New way to deal with profiles
|
||||||
|
|
||||||
|
API/ABI modifications: (see abi_compat_report in dev-utils/scripts)
|
||||||
|
|
||||||
|
* Removed deprecated functions
|
||||||
|
- opj_stream_create_default_file_stream(FILE*,...)
|
||||||
|
- opj_stream_create_file_stream(FILE*,...)
|
||||||
|
- opj_stream_set_user_data (opj_stream_t* p_stream, void * p_data)
|
||||||
|
* Added
|
||||||
|
- opj_stream_create_default_file_stream(char*,...)
|
||||||
|
- opj_stream_create_file_stream(char*,...)
|
||||||
|
- opj_stream_destroy(opj_stream_t*)
|
||||||
|
- opj_stream_set_user_data (opj_stream_t* p_stream, void * p_data,
|
||||||
|
... opj_stream_free_user_data_fn p_function)
|
||||||
|
- JPEG 2000 profiles and Part-2 extensions defined through '#define'
|
||||||
|
* Changed
|
||||||
|
- 'alpha' field added to 'opj_image_comp' structure
|
||||||
|
- 'OPJ_CLRSPC_EYCC' added to enum COLOR_SPACE
|
||||||
|
- 'OPJ_CLRSPC_CMYK' added to enum COLOR_SPACE
|
||||||
|
- 'OPJ_CODEC_JPP' and 'OPJ_CODEC_JPX' added to CODEC_FORMAT
|
||||||
|
(not yet used in use)
|
||||||
|
- 'max_cs_size' and 'rsiz' fields added to opj_cparameters_t
|
||||||
|
|
||||||
|
Misc:
|
||||||
|
|
||||||
|
* OpenJPEG is now officially conformant with JPEG 2000 Part-1
|
||||||
|
and will soon become official reference software at the
|
||||||
|
JPEG committee.
|
||||||
|
* Huge amount of bug fixes. See CHANGES for details.
|
||||||
|
|
||||||
|
|
||||||
|
Changes from OpenJPEG 1.5.x to OpenJPEG 2.0.0
|
||||||
|
----------------------------------------------
|
||||||
|
|
||||||
|
New Features:
|
||||||
|
|
||||||
|
* streaming capabilities
|
||||||
|
* merge JP3D
|
||||||
|
|
||||||
|
API modifications:
|
||||||
|
|
||||||
|
* Use a 64bits capable API
|
||||||
|
|
||||||
|
Misc:
|
||||||
|
|
||||||
|
* removed autotools build system
|
||||||
|
* folders hierarchies reorganisation
|
||||||
|
* Huge amount of bug fixes. See CHANGES for details.
|
72
NEWS.md
72
NEWS.md
@ -1,72 +0,0 @@
|
|||||||
# OpenJPEG NEWS
|
|
||||||
|
|
||||||
More details in the [Changelog](https://github.com/uclouvain/openjpeg/blob/master/CHANGELOG.md)
|
|
||||||
|
|
||||||
## OpenJPEG 2.1.2
|
|
||||||
|
|
||||||
* Bug fixes (including security fixes)
|
|
||||||
* No API/ABI break compared to v2.1.1
|
|
||||||
|
|
||||||
## OpenJPEG 2.1.1
|
|
||||||
|
|
||||||
* Huge amount of critical bugfixes
|
|
||||||
* Speed improvements
|
|
||||||
* No API/ABI break compared to v2.1
|
|
||||||
|
|
||||||
## OpenJPEG 2.1.0
|
|
||||||
|
|
||||||
### New Features
|
|
||||||
|
|
||||||
* Digital Cinema profiles have been fixed and updated
|
|
||||||
* New option to disable MCT if needed
|
|
||||||
* extended RAW support: it is now possible to input raw images
|
|
||||||
with subsampled color components (422, 420, etc)
|
|
||||||
* New way to deal with profiles
|
|
||||||
|
|
||||||
### API/ABI modifications
|
|
||||||
(see [here](http://www.openjpeg.org/abi-check/timeline/openjpeg/) for details)
|
|
||||||
|
|
||||||
* Removed deprecated functions
|
|
||||||
* opj_stream_create_default_file_stream(FILE*,...)
|
|
||||||
* opj_stream_create_file_stream(FILE*,...)
|
|
||||||
* opj_stream_set_user_data (opj_stream_t* p_stream, void * p_data)
|
|
||||||
* Added
|
|
||||||
* opj_stream_create_default_file_stream(char*,...)
|
|
||||||
* opj_stream_create_file_stream(char*,...)
|
|
||||||
* opj_stream_destroy(opj_stream_t*)
|
|
||||||
* opj_stream_set_user_data (opj_stream_t* p_stream, void * p_data,
|
|
||||||
... opj_stream_free_user_data_fn p_function)
|
|
||||||
* JPEG 2000 profiles and Part-2 extensions defined through '#define'
|
|
||||||
* Changed
|
|
||||||
* 'alpha' field added to 'opj_image_comp' structure
|
|
||||||
* 'OPJ_CLRSPC_EYCC' added to enum COLOR_SPACE
|
|
||||||
* 'OPJ_CLRSPC_CMYK' added to enum COLOR_SPACE
|
|
||||||
* 'OPJ_CODEC_JPP' and 'OPJ_CODEC_JPX' added to CODEC_FORMAT
|
|
||||||
(not yet used in use)
|
|
||||||
* 'max_cs_size' and 'rsiz' fields added to opj_cparameters_t
|
|
||||||
|
|
||||||
### Misc
|
|
||||||
|
|
||||||
* OpenJPEG is now officially conformant with JPEG 2000 Part-1
|
|
||||||
and will soon become official reference software at the
|
|
||||||
JPEG committee.
|
|
||||||
* Huge amount of bug fixes. See CHANGES for details.
|
|
||||||
|
|
||||||
|
|
||||||
## OpenJPEG 2.0.0
|
|
||||||
|
|
||||||
### New Features
|
|
||||||
|
|
||||||
* streaming capabilities
|
|
||||||
* merge JP3D
|
|
||||||
|
|
||||||
### API modifications
|
|
||||||
(see [here](http://www.openjpeg.org/abi-check/timeline/openjpeg/) for details)
|
|
||||||
|
|
||||||
* Use a 64bits capable API
|
|
||||||
|
|
||||||
### Misc
|
|
||||||
|
|
||||||
* removed autotools build system
|
|
||||||
* folders hierarchies reorganisation
|
|
||||||
* Huge amount of bug fixes. See CHANGES for details.
|
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
# OPENJPEG Library and Applications
|
# OPENJPEG Library and Applications
|
||||||
|
|
||||||
## What is OpenJPEG ?
|
## What is OpenJPEG ?
|
||||||
|
|
||||||
OpenJPEG is an open-source JPEG 2000 codec written in C language. It has been developed in order to promote the use of [JPEG 2000](http://www.jpeg.org/jpeg2000), a still-image compression standard from the Joint Photographic Experts Group ([JPEG](http://www.jpeg.org)). Since April 2015, it is officially recognized by ISO/IEC and ITU-T as a [JPEG 2000 Reference Software](http://www.itu.int/rec/T-REC-T.804-201504-I!Amd2).
|
OpenJPEG is an open-source JPEG 2000 codec written in C language. It has been developed in order to promote the use of [JPEG 2000](http://www.jpeg.org/jpeg2000), a still-image compression standard from the Joint Photographic Experts Group ([JPEG](http://www.jpeg.org)). Since April 2015, it is officially recognized by ISO/IEC and ITU-T as a [JPEG 2000 Reference Software](http://www.itu.int/rec/T-REC-T.804-201504-I!Amd2).
|
||||||
|
|
||||||
@ -52,14 +52,12 @@ The library is developed and maintained by the Image and Signal Processing Group
|
|||||||
|
|
||||||
See [LICENSE][link-license] for license and copyright information.
|
See [LICENSE][link-license] for license and copyright information.
|
||||||
|
|
||||||
See [INSTALL](https://github.com/uclouvain/openjpeg/blob/master/INSTALL.md) for installation procedures.
|
See [INSTALL](https://github.com/uclouvain/openjpeg/blob/master/INSTALL) for installation procedures.
|
||||||
|
|
||||||
See [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) for user visible changes in successive releases.
|
See [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS) for user visible changes in successive releases.
|
||||||
|
|
||||||
## API/ABI
|
## API/ABI
|
||||||
|
|
||||||
An API/ABI timeline is automatically updated [here][link-api-timeline].
|
|
||||||
|
|
||||||
OpenJPEG strives to provide a stable API/ABI for your applications. As such it
|
OpenJPEG strives to provide a stable API/ABI for your applications. As such it
|
||||||
only exposes a limited subset of its functions. It uses a mechanism of
|
only exposes a limited subset of its functions. It uses a mechanism of
|
||||||
exporting/hiding functions. If you are unsure which functions you can use in
|
exporting/hiding functions. If you are unsure which functions you can use in
|
||||||
@ -79,4 +77,3 @@ API available is the one supported by OpenJPEG.
|
|||||||
[link-msvc-build]: https://ci.appveyor.com/project/detonin/openjpeg/branch/master "Windows Build Status"
|
[link-msvc-build]: https://ci.appveyor.com/project/detonin/openjpeg/branch/master "Windows Build Status"
|
||||||
[badge-coverity]: https://scan.coverity.com/projects/6383/badge.svg "Coverity Scan Build Status"
|
[badge-coverity]: https://scan.coverity.com/projects/6383/badge.svg "Coverity Scan Build Status"
|
||||||
[link-coverity]: https://scan.coverity.com/projects/uclouvain-openjpeg "Coverity Scan Build Status"
|
[link-coverity]: https://scan.coverity.com/projects/uclouvain-openjpeg "Coverity Scan Build Status"
|
||||||
[link-api-timeline]: http://www.openjpeg.org/abi-check/timeline/openjpeg "OpenJPEG API/ABI timeline"
|
|
||||||
|
35
THANKS
Normal file
35
THANKS
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
OpenJPEG THANKS file
|
||||||
|
|
||||||
|
Many people have contributed to OpenJPEG by reporting problems, suggesting various improvements,
|
||||||
|
or submitting actual code. Here is a list of these people. Help me keep
|
||||||
|
it complete and exempt of errors.
|
||||||
|
|
||||||
|
Giuseppe Baruffa
|
||||||
|
Ben Boeckel
|
||||||
|
Aaron Boxer
|
||||||
|
David Burken
|
||||||
|
Matthieu Darbois
|
||||||
|
Rex Dieter
|
||||||
|
Herve Drolon
|
||||||
|
Antonin Descampe
|
||||||
|
Francois-Olivier Devaux
|
||||||
|
Parvatha Elangovan
|
||||||
|
Jerôme Fimes
|
||||||
|
Bob Friesenhahn
|
||||||
|
Kaori Hagihara
|
||||||
|
Luc Hermitte
|
||||||
|
Luis Ibanez
|
||||||
|
David Janssens
|
||||||
|
Hans Johnson
|
||||||
|
Callum Lerwick
|
||||||
|
Sebastien Lugan
|
||||||
|
Benoit Macq
|
||||||
|
Arnaud Maye
|
||||||
|
Julien Malik
|
||||||
|
Vincent Nicolas
|
||||||
|
Glenn Pearson
|
||||||
|
Dzonatas Sol
|
||||||
|
Winfried Szukalski
|
||||||
|
Vincent Torri
|
||||||
|
Yannick Verschueren
|
||||||
|
Peter Wimmer
|
39
THANKS.md
39
THANKS.md
@ -1,39 +0,0 @@
|
|||||||
# OpenJPEG THANKS file
|
|
||||||
|
|
||||||
Many people have contributed to OpenJPEG by reporting problems, suggesting various improvements,
|
|
||||||
or submitting actual code. Here is a list of these people. Help me keep
|
|
||||||
it complete and exempt of errors.
|
|
||||||
|
|
||||||
* Giuseppe Baruffa
|
|
||||||
* Ben Boeckel
|
|
||||||
* Aaron Boxer
|
|
||||||
* David Burken
|
|
||||||
* Matthieu Darbois
|
|
||||||
* Rex Dieter
|
|
||||||
* Herve Drolon
|
|
||||||
* Antonin Descampe
|
|
||||||
* Francois-Olivier Devaux
|
|
||||||
* Parvatha Elangovan
|
|
||||||
* Jerôme Fimes
|
|
||||||
* Bob Friesenhahn
|
|
||||||
* Kaori Hagihara
|
|
||||||
* Luc Hermitte
|
|
||||||
* Luis Ibanez
|
|
||||||
* David Janssens
|
|
||||||
* Hans Johnson
|
|
||||||
* Callum Lerwick
|
|
||||||
* Ke Liu (Tencent's Xuanwu LAB)
|
|
||||||
* Sebastien Lugan
|
|
||||||
* Benoit Macq
|
|
||||||
* Mathieu Malaterre
|
|
||||||
* Julien Malik
|
|
||||||
* Arnaud Maye
|
|
||||||
* Vincent Nicolas
|
|
||||||
* Aleksander Nikolic (Cisco Talos)
|
|
||||||
* Glenn Pearson
|
|
||||||
* Even Rouault
|
|
||||||
* Dzonatas Sol
|
|
||||||
* Winfried Szukalski
|
|
||||||
* Vincent Torri
|
|
||||||
* Yannick Verschueren
|
|
||||||
* Peter Wimmer
|
|
19
appveyor.yml
19
appveyor.yml
@ -2,16 +2,14 @@ version: 2.1.1.{build}
|
|||||||
branches:
|
branches:
|
||||||
except:
|
except:
|
||||||
- coverity_scan
|
- coverity_scan
|
||||||
skip_tags: false
|
skip_tags: true
|
||||||
clone_depth: 50
|
clone_depth: 50
|
||||||
environment:
|
environment:
|
||||||
matrix:
|
matrix:
|
||||||
- OPJ_CI_ARCH: x86
|
- OPJ_CI_ARCH: x86
|
||||||
OPJ_CI_VSCOMNTOOLS: $(VS140COMNTOOLS)
|
OPJ_CI_VSCOMNTOOLS: $(VS140COMNTOOLS)
|
||||||
OPJ_CI_INCLUDE_IF_DEPLOY: 1
|
|
||||||
- OPJ_CI_ARCH: x64
|
- OPJ_CI_ARCH: x64
|
||||||
OPJ_CI_VSCOMNTOOLS: $(VS140COMNTOOLS)
|
OPJ_CI_VSCOMNTOOLS: $(VS140COMNTOOLS)
|
||||||
OPJ_CI_INCLUDE_IF_DEPLOY: 1
|
|
||||||
- OPJ_CI_ARCH: x86
|
- OPJ_CI_ARCH: x86
|
||||||
OPJ_CI_VSCOMNTOOLS: $(VS100COMNTOOLS)
|
OPJ_CI_VSCOMNTOOLS: $(VS100COMNTOOLS)
|
||||||
install:
|
install:
|
||||||
@ -22,17 +20,4 @@ build_script:
|
|||||||
|
|
||||||
bash ./tools/travis-ci/run.sh
|
bash ./tools/travis-ci/run.sh
|
||||||
test: off
|
test: off
|
||||||
#before_deploy:
|
deploy: off
|
||||||
#- cmd: c:\cygwin\bin\bash ./tools/travis-ci/before_deploy.sh
|
|
||||||
deploy:
|
|
||||||
#release: openjpeg-$(appveyor_repo_tag_name)
|
|
||||||
description: 'OpenJPEG $(appveyor_repo_tag_name) has been released. More info [here](https://github.com/uclouvain/openjpeg/blob/$(appveyor_repo_tag_name)/NEWS) and a detailed view [here](https://github.com/uclouvain/openjpeg/blob/$(appveyor_repo_tag_name)/CHANGES).'
|
|
||||||
provider: GitHub
|
|
||||||
auth_token:
|
|
||||||
secure: Huk03f1heCD/HMyA+4ZeVmICdmKn9rPxK5p8/KxzgL+FtJDHlqcllcCrtN9bDxRH # your encrypted token from GitHub
|
|
||||||
artifact: /.*\.zip/ # upload all zip packages to release assets
|
|
||||||
draft: false
|
|
||||||
prerelease: false
|
|
||||||
on:
|
|
||||||
appveyor_repo_tag: true # deploy on tag push only
|
|
||||||
OPJ_CI_INCLUDE_IF_DEPLOY: 1
|
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
.TH opj_compress 1 "Version 2.1.1" "opj_compress" "converts to jpeg2000 files"
|
.TH opj_compress 1 "Version 2.1.1" "opj_compress" "converts to jpeg2000 files"
|
||||||
.P
|
.P
|
||||||
.SH NAME
|
.SH NAME
|
||||||
opj_compress \-
|
opj_compress -
|
||||||
This program reads in an image of a certain type and converts it to a
|
This program reads in an image of a certain type and converts it to a
|
||||||
jpeg2000 file. It is part of the OpenJPEG library.
|
jpeg2000 file. It is part of the OpenJPEG library.
|
||||||
.SP
|
.SP
|
||||||
@ -43,20 +43,20 @@ Valid output image extensions are
|
|||||||
.B .j2k, .jp2
|
.B .j2k, .jp2
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.P
|
.P
|
||||||
.B opj_compress \-i \fRinfile.bmp \fB-o \fRoutfile.j2k
|
.B opj_compress -i \fRinfile.bmp \fB-o \fRoutfile.j2k
|
||||||
.P
|
.P
|
||||||
.B opj_compress \-ImgDir \fRdirectory_name \fB-OutFor \fRjp2
|
.B opj_compress -ImgDir \fRdirectory_name \fB-OutFor \fRjp2
|
||||||
.P
|
.P
|
||||||
.B opj_compress \-h \fRPrint a help message and exit.
|
.B opj_compress -h \fRPrint a help message and exit.
|
||||||
.P
|
.P
|
||||||
.R See JPWL OPTIONS for special options
|
.R See JPWL OPTIONS for special options
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
.B \-\^b " n,n"
|
.B \-\^b " n,n"
|
||||||
(Size of code block (e.g. \-b 32,32). Default: 64 x 64)
|
(Size of code block (e.g. -b 32,32). Default: 64 x 64)
|
||||||
.TP
|
.TP
|
||||||
.B \-\^c " n"
|
.B \-\^c " n"
|
||||||
(Size of precinct (e.g. \-c 128,128). Default: 2^15 x 2^15)
|
(Size of precinct (e.g. -c 128,128). Default: 2^15 x 2^15)
|
||||||
.TP
|
.TP
|
||||||
.B \-\^cinema2K " fps"
|
.B \-\^cinema2K " fps"
|
||||||
Digital Cinema 2K profile compliant codestream. Valid \fBfps\fR values are 24 or 48.
|
Digital Cinema 2K profile compliant codestream. Valid \fBfps\fR values are 24 or 48.
|
||||||
@ -65,7 +65,7 @@ Digital Cinema 2K profile compliant codestream. Valid \fBfps\fR values are 24 or
|
|||||||
Digital Cinema 4K profile compliant codestream. Does not need an fps: default is 24 fps.
|
Digital Cinema 4K profile compliant codestream. Does not need an fps: default is 24 fps.
|
||||||
.TP
|
.TP
|
||||||
.B \-\^d " X,Y"
|
.B \-\^d " X,Y"
|
||||||
(Offset of image origin (e.g. \-d 150,300))
|
(Offset of image origin (e.g. -d 150,300))
|
||||||
.TP
|
.TP
|
||||||
.B \-\^h
|
.B \-\^h
|
||||||
Print a help message and exit.
|
Print a help message and exit.
|
||||||
@ -85,20 +85,20 @@ Progression order. \fBname\fR can be one out of:LRCP, RLCP, RPCL, PCRL, CPRL. De
|
|||||||
.B \-\^q " n"
|
.B \-\^q " n"
|
||||||
different psnr for successive layers
|
different psnr for successive layers
|
||||||
.br
|
.br
|
||||||
.B Note: \fR(options \-r and \-q cannot be used together)
|
.B Note: \fR(options -r and -q cannot be used together)
|
||||||
.TP
|
.TP
|
||||||
.B \-\^r " n"
|
.B \-\^r " n"
|
||||||
different compression ratio(s) for successive layers. The rate specified for each quality level is the desired compression factor.
|
different compression ratio(s) for successive layers. The rate specified for each quality level is the desired compression factor.
|
||||||
.br
|
.br
|
||||||
.B Note: \fR(options \-r and \-q cannot be used together)
|
.B Note: \fR(options -r and -q cannot be used together)
|
||||||
.TP
|
.TP
|
||||||
.B \-\^s " X,Y"
|
.B \-\^s " X,Y"
|
||||||
sub-sampling factor (e.g. \-s 2,2). Default: No sub-sampling in x or y direction.
|
sub-sampling factor (e.g. -s 2,2). Default: No sub-sampling in x or y direction.
|
||||||
.br
|
.br
|
||||||
.B Remark: \fRsub-sampling bigger than 2 can produce errors.
|
.B Remark: \fRsub-sampling bigger than 2 can produce errors.
|
||||||
.TP
|
.TP
|
||||||
.B \-\^t " W,H"
|
.B \-\^t " W,H"
|
||||||
(Size of tile (e.g. \-t 512,512) )
|
(Size of tile (e.g. -t 512,512) )
|
||||||
.TP
|
.TP
|
||||||
.B \-\^x " name"
|
.B \-\^x " name"
|
||||||
(Create index file and fill it. Default: no index file)
|
(Create index file and fill it. Default: no index file)
|
||||||
@ -132,7 +132,7 @@ ERTERM(16)
|
|||||||
.br
|
.br
|
||||||
SEGMARK(32)
|
SEGMARK(32)
|
||||||
.br
|
.br
|
||||||
Values can be added: RESTART(4) + RESET(2) + SEGMARK(32) = \-M 38
|
Values can be added: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38
|
||||||
.TP
|
.TP
|
||||||
.B \-\^OutFor "ext"
|
.B \-\^OutFor "ext"
|
||||||
(extension for output files)
|
(extension for output files)
|
||||||
@ -149,7 +149,7 @@ e.g. \fB-ROI c=0,U=25\fR
|
|||||||
(Write SOP marker before each packet. Default: No SOP marker in the codestream.)
|
(Write SOP marker before each packet. Default: No SOP marker in the codestream.)
|
||||||
.TP
|
.TP
|
||||||
.B \-\^T "X,Y"
|
.B \-\^T "X,Y"
|
||||||
(Offset of the origin of the tiles (e.g. \-T 100,75) )
|
(Offset of the origin of the tiles (e.g. -T 100,75) )
|
||||||
.TP
|
.TP
|
||||||
.B \-\^W
|
.B \-\^W
|
||||||
(see JPWL OPTIONS)
|
(see JPWL OPTIONS)
|
||||||
@ -157,7 +157,7 @@ e.g. \fB-ROI c=0,U=25\fR
|
|||||||
.SH JPWL OPTIONS
|
.SH JPWL OPTIONS
|
||||||
Options usable only if the library has been compiled with \fB-DUSE_JPWL\fR
|
Options usable only if the library has been compiled with \fB-DUSE_JPWL\fR
|
||||||
.P
|
.P
|
||||||
.B \-W h<tilepart><=type>, s<tilepart><=method>, a=<addr>, z=<size>, g=<range>, p<tilepart:pack><=type>
|
.B -W h<tilepart><=type>, s<tilepart><=method>, a=<addr>, z=<size>, g=<range>, p<tilepart:pack><=type>
|
||||||
.P
|
.P
|
||||||
.B h\fR selects the header error protection (EPB): \fBtype\fR can be
|
.B h\fR selects the header error protection (EPB): \fBtype\fR can be
|
||||||
[0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]
|
[0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]
|
||||||
@ -176,7 +176,7 @@ Options usable only if the library has been compiled with \fB-DUSE_JPWL\fR
|
|||||||
(max. 16 specs)
|
(max. 16 specs)
|
||||||
.P
|
.P
|
||||||
.B s \fRenables sensitivity data insertion (ESD): \fBmethod\fR can be
|
.B s \fRenables sensitivity data insertion (ESD): \fBmethod\fR can be
|
||||||
[\-1=NO ESD 0=RELATIVE ERROR 1=MSE 2=MSE REDUCTION 3=PSNR
|
[-1=NO ESD 0=RELATIVE ERROR 1=MSE 2=MSE REDUCTION 3=PSNR
|
||||||
4=PSNR INCREMENT 5=MAXERR 6=TSE 7=RESERVED]
|
4=PSNR INCREMENT 5=MAXERR 6=TSE 7=RESERVED]
|
||||||
if \fBtilepart\fR is absent, it is for main header only
|
if \fBtilepart\fR is absent, it is for main header only
|
||||||
if \fBtilepart\fR is present, it applies from that tile
|
if \fBtilepart\fR is present, it applies from that tile
|
||||||
@ -194,13 +194,13 @@ Options usable only if the library has been compiled with \fB-DUSE_JPWL\fR
|
|||||||
.P
|
.P
|
||||||
.SH EXAMPLES
|
.SH EXAMPLES
|
||||||
.P
|
.P
|
||||||
.B opj_compress \-i \fRfile.bmp \fB-o \fRfile.j2k \fB-r \fR20,10,1 (compress 20x, then 10x, then lossless).
|
.B opj_compress -i \fRfile.bmp \fB-o \fRfile.j2k \fB-r \fR20,10,1 (compress 20x, then 10x, then lossless).
|
||||||
.P
|
.P
|
||||||
.B opj_compress \-i \fRfile.ppm \fB-o \fRfile.j2k \fB-q \fR30,40,50
|
.B opj_compress -i \fRfile.ppm \fB-o \fRfile.j2k \fB-q \fR30,40,50
|
||||||
.P
|
.P
|
||||||
.B opj_compress \-i \fRfile.pgx \fB-o \fRfile.j2k \fB-POC \fRT1=0,0,1,5,3,CPRL
|
.B opj_compress -i \fRfile.pgx \fB-o \fRfile.j2k \fB-POC \fRT1=0,0,1,5,3,CPRL
|
||||||
.P
|
.P
|
||||||
.B opj_compress \-i \fRlena.raw \fB-o \fRlena.j2k \fB-F \fR512,512,3,8,u
|
.B opj_compress -i \fRlena.raw \fB-o \fRlena.j2k \fB-F \fR512,512,3,8,u
|
||||||
.P
|
.P
|
||||||
.SH AUTHORS
|
.SH AUTHORS
|
||||||
Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
.TH opj_decompress 1 "Version 2.1.1" "opj_decompress" "converts jpeg2000 files"
|
.TH opj_decompress 1 "Version 2.1.1" "opj_decompress" "converts jpeg2000 files"
|
||||||
.P
|
.P
|
||||||
.SH NAME
|
.SH NAME
|
||||||
opj_decompress \-
|
opj_decompress -
|
||||||
This program reads in a jpeg2000 image and converts it to another
|
This program reads in a jpeg2000 image and converts it to another
|
||||||
image type. It is part of the OpenJPEG library.
|
image type. It is part of the OpenJPEG library.
|
||||||
.SP
|
.SP
|
||||||
@ -43,11 +43,11 @@ Valid output image extensions are
|
|||||||
.B .bmp, .pgm, .pgx, .png, .pnm, .ppm, .raw, .tga, .tif \fR. For PNG resp. TIF it needs libpng resp. libtiff .
|
.B .bmp, .pgm, .pgx, .png, .pnm, .ppm, .raw, .tga, .tif \fR. For PNG resp. TIF it needs libpng resp. libtiff .
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.P
|
.P
|
||||||
.B opj_decompress \-i \fRinfile.j2k \fB-o \fRoutfile.png
|
.B opj_decompress -i \fRinfile.j2k \fB-o \fRoutfile.png
|
||||||
.P
|
.P
|
||||||
.B opj_decompress \-ImgDir \fRimages/ \fB-OutFor \fRbmp
|
.B opj_decompress -ImgDir \fRimages/ \fB-OutFor \fRbmp
|
||||||
.P
|
.P
|
||||||
.B opj_decompress \-h \fRPrint help message and exit
|
.B opj_decompress -h \fRPrint help message and exit
|
||||||
.P
|
.P
|
||||||
.R See JPWL OPTIONS for special options
|
.R See JPWL OPTIONS for special options
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
.TH opj_dump 1 "Version 2.1.1" "opj_dump" "dumps jpeg2000 files"
|
.TH opj_dump 1 "Version 2.1.1" "opj_dump" "dumps jpeg2000 files"
|
||||||
.P
|
.P
|
||||||
.SH NAME
|
.SH NAME
|
||||||
opj_dump \-
|
opj_dump -
|
||||||
This program reads in a jpeg2000 image and dumps the contents to stdout. It is part of the OpenJPEG library.
|
This program reads in a jpeg2000 image and dumps the contents to stdout. It is part of the OpenJPEG library.
|
||||||
.SP
|
.SP
|
||||||
Valid input image extensions are
|
Valid input image extensions are
|
||||||
@ -40,11 +40,11 @@ Valid input image extensions are
|
|||||||
.SP
|
.SP
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.P
|
.P
|
||||||
.B opj_dump \-i \fRinfile.j2k
|
.B opj_dump -i \fRinfile.j2k
|
||||||
.P
|
.P
|
||||||
.B opj_dump \-ImgDir \fRimages/ \fRDump all files in images/
|
.B opj_dump -ImgDir \fRimages/ \fRDump all files in images/
|
||||||
.P
|
.P
|
||||||
.B opj_dump \-h \fRPrint help message and exit
|
.B opj_dump -h \fRPrint help message and exit
|
||||||
.P
|
.P
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
|
@ -855,14 +855,7 @@ void color_cmyk_to_rgb(opj_image_t *image)
|
|||||||
w = image->comps[0].w;
|
w = image->comps[0].w;
|
||||||
h = image->comps[0].h;
|
h = image->comps[0].h;
|
||||||
|
|
||||||
if (
|
if(image->numcomps < 4) return;
|
||||||
(image->numcomps < 4)
|
|
||||||
|| (image->comps[0].dx != image->comps[1].dx) || (image->comps[0].dx != image->comps[2].dx) || (image->comps[0].dx != image->comps[3].dx)
|
|
||||||
|| (image->comps[0].dy != image->comps[1].dy) || (image->comps[0].dy != image->comps[2].dy) || (image->comps[0].dy != image->comps[3].dy)
|
|
||||||
) {
|
|
||||||
fprintf(stderr,"%s:%d:color_cmyk_to_rgb\n\tCAN NOT CONVERT\n", __FILE__,__LINE__);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
max = w * h;
|
max = w * h;
|
||||||
|
|
||||||
|
@ -57,9 +57,6 @@ foreach(exe opj_decompress opj_compress opj_dump)
|
|||||||
# On unix you need to link to the math library:
|
# On unix you need to link to the math library:
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
target_link_libraries(${exe} m)
|
target_link_libraries(${exe} m)
|
||||||
IF("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
|
|
||||||
target_link_libraries(${exe} rt)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
# Install exe
|
# Install exe
|
||||||
install(TARGETS ${exe}
|
install(TARGETS ${exe}
|
||||||
|
@ -1328,14 +1328,11 @@ struct pnm_header
|
|||||||
|
|
||||||
static char *skip_white(char *s)
|
static char *skip_white(char *s)
|
||||||
{
|
{
|
||||||
if (s != NULL)
|
while(*s)
|
||||||
{
|
{
|
||||||
while(*s)
|
if(*s == '\n' || *s == '\r') return NULL;
|
||||||
{
|
if(isspace(*s)) { ++s; continue; }
|
||||||
if(*s == '\n' || *s == '\r') return NULL;
|
return s;
|
||||||
if(isspace(*s)) { ++s; continue; }
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1380,7 +1377,7 @@ static char *skip_idf(char *start, char out_idf[256])
|
|||||||
|
|
||||||
static void read_pnm_header(FILE *reader, struct pnm_header *ph)
|
static void read_pnm_header(FILE *reader, struct pnm_header *ph)
|
||||||
{
|
{
|
||||||
int format, end, ttype;
|
int format, have_wh, end, ttype;
|
||||||
char idf[256], type[256];
|
char idf[256], type[256];
|
||||||
char line[256];
|
char line[256];
|
||||||
|
|
||||||
@ -1401,12 +1398,11 @@ static void read_pnm_header(FILE *reader, struct pnm_header *ph)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ph->format = format;
|
ph->format = format;
|
||||||
ttype = end = 0;
|
ttype = end = have_wh = 0;
|
||||||
|
|
||||||
while(fgets(line, 250, reader))
|
while(fgets(line, 250, reader))
|
||||||
{
|
{
|
||||||
char *s;
|
char *s;
|
||||||
int allow_null = 0;
|
|
||||||
|
|
||||||
if(*line == '#') continue;
|
if(*line == '#') continue;
|
||||||
|
|
||||||
@ -1482,25 +1478,36 @@ static void read_pnm_header(FILE *reader, struct pnm_header *ph)
|
|||||||
return;
|
return;
|
||||||
} /* if(format == 7) */
|
} /* if(format == 7) */
|
||||||
|
|
||||||
/* Here format is in range [1,6] */
|
if( !have_wh)
|
||||||
if (ph->width == 0) {
|
{
|
||||||
s = skip_int(s, &ph->width);
|
s = skip_int(s, &ph->width);
|
||||||
if ((s == NULL) || (*s == 0) || (ph->width < 1)) return;
|
|
||||||
allow_null = 1;
|
|
||||||
}
|
|
||||||
if (ph->height == 0) {
|
|
||||||
s = skip_int(s, &ph->height);
|
s = skip_int(s, &ph->height);
|
||||||
if ((s == NULL) && allow_null) continue;
|
|
||||||
if ((s == NULL) || (*s == 0) || (ph->height < 1)) return;
|
have_wh = 1;
|
||||||
if(format == 1 || format == 4) {
|
|
||||||
break;
|
if(format == 1 || format == 4) break;
|
||||||
|
|
||||||
|
if(format == 2 || format == 3 || format == 5 || format == 6)
|
||||||
|
{
|
||||||
|
if (skip_int(s, &ph->maxval) != NULL) {
|
||||||
|
if(ph->maxval > 65535) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
allow_null = 1;
|
continue;
|
||||||
|
}
|
||||||
|
if(format == 2 || format == 3 || format == 5 || format == 6)
|
||||||
|
{
|
||||||
|
/* P2, P3, P5, P6: */
|
||||||
|
s = skip_int(s, &ph->maxval);
|
||||||
|
|
||||||
|
if(ph->maxval > 65535) return;
|
||||||
}
|
}
|
||||||
/* here, format is in P2, P3, P5, P6 */
|
|
||||||
s = skip_int(s, &ph->maxval);
|
|
||||||
if ((s == NULL) && allow_null) continue;
|
|
||||||
if ((s == NULL) || (*s == 0)) return;
|
|
||||||
break;
|
break;
|
||||||
}/* while(fgets( ) */
|
}/* while(fgets( ) */
|
||||||
if(format == 2 || format == 3 || format > 4)
|
if(format == 2 || format == 3 || format > 4)
|
||||||
@ -1517,14 +1524,18 @@ static void read_pnm_header(FILE *reader, struct pnm_header *ph)
|
|||||||
}
|
}
|
||||||
if(ph->depth < 1 || ph->depth > 4) return;
|
if(ph->depth < 1 || ph->depth > 4) return;
|
||||||
|
|
||||||
if (ttype)
|
if(ph->width && ph->height && ph->depth && ph->maxval && ttype)
|
||||||
ph->ok = 1;
|
ph->ok = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ph->ok = 1;
|
if(format != 1 && format != 4)
|
||||||
if(format == 1 || format == 4)
|
|
||||||
{
|
{
|
||||||
|
if(ph->width && ph->height && ph->maxval) ph->ok = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(ph->width && ph->height) ph->ok = 1;
|
||||||
ph->maxval = 255;
|
ph->maxval = 255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -675,28 +675,10 @@ opj_image_t* bmptoimage(const char *filename, opj_cparameters_t *parameters)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Info_h.biWidth == 0 || Info_h.biHeight == 0) {
|
|
||||||
fclose(IN);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Info_h.biBitCount > (((OPJ_UINT32)-1) - 31) / Info_h.biWidth) {
|
|
||||||
fclose(IN);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
stride = ((Info_h.biWidth * Info_h.biBitCount + 31U) / 32U) * 4U; /* rows are aligned on 32bits */
|
stride = ((Info_h.biWidth * Info_h.biBitCount + 31U) / 32U) * 4U; /* rows are aligned on 32bits */
|
||||||
if (Info_h.biBitCount == 4 && Info_h.biCompression == 2) { /* RLE 4 gets decoded as 8 bits data for now... */
|
if (Info_h.biBitCount == 4 && Info_h.biCompression == 2) { /* RLE 4 gets decoded as 8 bits data for now... */
|
||||||
if (8 > (((OPJ_UINT32)-1) - 31) / Info_h.biWidth) {
|
|
||||||
fclose(IN);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
stride = ((Info_h.biWidth * 8U + 31U) / 32U) * 4U;
|
stride = ((Info_h.biWidth * 8U + 31U) / 32U) * 4U;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stride > ((OPJ_UINT32)-1) / sizeof(OPJ_UINT8) / Info_h.biHeight) {
|
|
||||||
fclose(IN);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
pData = (OPJ_UINT8 *) calloc(1, stride * Info_h.biHeight * sizeof(OPJ_UINT8));
|
pData = (OPJ_UINT8 *) calloc(1, stride * Info_h.biHeight * sizeof(OPJ_UINT8));
|
||||||
if (pData == NULL) {
|
if (pData == NULL) {
|
||||||
fclose(IN);
|
fclose(IN);
|
||||||
|
@ -236,7 +236,7 @@ static void encode_help_display(void) {
|
|||||||
fprintf(stdout,"-I\n");
|
fprintf(stdout,"-I\n");
|
||||||
fprintf(stdout," Use the irreversible DWT 9-7.\n");
|
fprintf(stdout," Use the irreversible DWT 9-7.\n");
|
||||||
fprintf(stdout,"-mct <0|1|2>\n");
|
fprintf(stdout,"-mct <0|1|2>\n");
|
||||||
fprintf(stdout," Explicitly specifies if a Multiple Component Transform has to be used.\n");
|
fprintf(stdout," Explicitely specifies if a Multiple Component Transform has to be used.\n");
|
||||||
fprintf(stdout," 0: no MCT ; 1: RGB->YCC conversion ; 2: custom MCT.\n");
|
fprintf(stdout," 0: no MCT ; 1: RGB->YCC conversion ; 2: custom MCT.\n");
|
||||||
fprintf(stdout," If custom MCT, \"-m\" option has to be used (see hereunder).\n");
|
fprintf(stdout," If custom MCT, \"-m\" option has to be used (see hereunder).\n");
|
||||||
fprintf(stdout," By default, RGB->YCC conversion is used if there are 3 components or more,\n");
|
fprintf(stdout," By default, RGB->YCC conversion is used if there are 3 components or more,\n");
|
||||||
@ -1029,7 +1029,7 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
fprintf(stdout,"CINEMA 2K profile activated\n"
|
fprintf(stdout,"CINEMA 2K profile activated\n"
|
||||||
"Other options specified could be overridden\n");
|
"Other options specified could be overriden\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1040,7 +1040,7 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param
|
|||||||
{
|
{
|
||||||
parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
|
parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
|
||||||
fprintf(stdout,"CINEMA 4K profile activated\n"
|
fprintf(stdout,"CINEMA 4K profile activated\n"
|
||||||
"Other options specified could be overridden\n");
|
"Other options specified could be overriden\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -43,7 +43,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include "windirent.h"
|
#include "windirent.h"
|
||||||
@ -151,8 +150,6 @@ typedef struct opj_decompress_params
|
|||||||
int upsample;
|
int upsample;
|
||||||
/* split output components to different files */
|
/* split output components to different files */
|
||||||
int split_pnm;
|
int split_pnm;
|
||||||
/** number of threads */
|
|
||||||
int num_threads;
|
|
||||||
}opj_decompress_parameters;
|
}opj_decompress_parameters;
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
@ -227,11 +224,8 @@ static void decode_help_display(void) {
|
|||||||
" -upsample\n"
|
" -upsample\n"
|
||||||
" Downsampled components will be upsampled to image size\n"
|
" Downsampled components will be upsampled to image size\n"
|
||||||
" -split-pnm\n"
|
" -split-pnm\n"
|
||||||
" Split output components to different files when writing to PNM\n");
|
" Split output components to different files when writing to PNM\n"
|
||||||
if( opj_has_thread_support() ) {
|
"\n");
|
||||||
fprintf(stdout," -threads <num_threads>\n"
|
|
||||||
" Number of threads to use for decoding.\n");
|
|
||||||
}
|
|
||||||
/* UniPG>> */
|
/* UniPG>> */
|
||||||
#ifdef USE_JPWL
|
#ifdef USE_JPWL
|
||||||
fprintf(stdout," -W <options>\n"
|
fprintf(stdout," -W <options>\n"
|
||||||
@ -526,8 +520,7 @@ int parse_cmdline_decoder(int argc, char **argv, opj_decompress_parameters *para
|
|||||||
{"OutFor", REQ_ARG, NULL,'O'},
|
{"OutFor", REQ_ARG, NULL,'O'},
|
||||||
{"force-rgb", NO_ARG, NULL, 1},
|
{"force-rgb", NO_ARG, NULL, 1},
|
||||||
{"upsample", NO_ARG, NULL, 1},
|
{"upsample", NO_ARG, NULL, 1},
|
||||||
{"split-pnm", NO_ARG, NULL, 1},
|
{"split-pnm", NO_ARG, NULL, 1}
|
||||||
{"threads", REQ_ARG, NULL, 'T'}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const char optlist[] = "i:o:r:l:x:d:t:p:"
|
const char optlist[] = "i:o:r:l:x:d:t:p:"
|
||||||
@ -815,22 +808,6 @@ int parse_cmdline_decoder(int argc, char **argv, opj_decompress_parameters *para
|
|||||||
break;
|
break;
|
||||||
#endif /* USE_JPWL */
|
#endif /* USE_JPWL */
|
||||||
/* <<UniPG */
|
/* <<UniPG */
|
||||||
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 'T': /* Number of threads */
|
|
||||||
{
|
|
||||||
if( strcmp(opj_optarg, "ALL_CPUS") == 0 )
|
|
||||||
{
|
|
||||||
parameters->num_threads = opj_get_num_cpus();
|
|
||||||
if( parameters->num_threads == 1 )
|
|
||||||
parameters->num_threads = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sscanf(opj_optarg, "%d", ¶meters->num_threads);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* ----------------------------------------------------- */
|
/* ----------------------------------------------------- */
|
||||||
|
|
||||||
@ -908,22 +885,17 @@ OPJ_FLOAT64 opj_clock(void) {
|
|||||||
/* t is the high resolution performance counter (see MSDN) */
|
/* t is the high resolution performance counter (see MSDN) */
|
||||||
QueryPerformanceCounter ( & t ) ;
|
QueryPerformanceCounter ( & t ) ;
|
||||||
return freq.QuadPart ? (t.QuadPart / (OPJ_FLOAT64)freq.QuadPart) : 0;
|
return freq.QuadPart ? (t.QuadPart / (OPJ_FLOAT64)freq.QuadPart) : 0;
|
||||||
#elif defined(__linux)
|
|
||||||
struct timespec ts;
|
|
||||||
clock_gettime(CLOCK_REALTIME, &ts);
|
|
||||||
return( (OPJ_FLOAT64)ts.tv_sec + (OPJ_FLOAT64)ts.tv_nsec * 1e-9 );
|
|
||||||
#else
|
#else
|
||||||
/* Unix : use resource usage */
|
/* Unix or Linux: use resource usage */
|
||||||
/* FIXME: this counts the total CPU time, instead of the user perceived time */
|
struct rusage t;
|
||||||
struct rusage t;
|
OPJ_FLOAT64 procTime;
|
||||||
OPJ_FLOAT64 procTime;
|
/* (1) Get the rusage data structure at this moment (man getrusage) */
|
||||||
/* (1) Get the rusage data structure at this moment (man getrusage) */
|
getrusage(0,&t);
|
||||||
getrusage(0,&t);
|
/* (2) What is the elapsed time ? - CPU time = User time + System time */
|
||||||
/* (2) What is the elapsed time ? - CPU time = User time + System time */
|
|
||||||
/* (2a) Get the seconds */
|
/* (2a) Get the seconds */
|
||||||
procTime = (OPJ_FLOAT64)(t.ru_utime.tv_sec + t.ru_stime.tv_sec);
|
procTime = (OPJ_FLOAT64)(t.ru_utime.tv_sec + t.ru_stime.tv_sec);
|
||||||
/* (2b) More precisely! Get the microseconds part ! */
|
/* (2b) More precisely! Get the microseconds part ! */
|
||||||
return ( procTime + (OPJ_FLOAT64)(t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ;
|
return ( procTime + (OPJ_FLOAT64)(t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1334,13 +1306,7 @@ int main(int argc, char **argv)
|
|||||||
opj_destroy_codec(l_codec);
|
opj_destroy_codec(l_codec);
|
||||||
failed = 1; goto fin;
|
failed = 1; goto fin;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( parameters.num_threads >= 1 && !opj_codec_set_threads(l_codec, parameters.num_threads) ) {
|
|
||||||
fprintf(stderr, "ERROR -> opj_decompress: failed to set number of threads\n");
|
|
||||||
opj_stream_destroy(l_stream);
|
|
||||||
opj_destroy_codec(l_codec);
|
|
||||||
failed = 1; goto fin;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read the main header of the codestream and if necessary the JP2 boxes*/
|
/* Read the main header of the codestream and if necessary the JP2 boxes*/
|
||||||
if(! opj_read_header(l_stream, l_codec, &image)){
|
if(! opj_read_header(l_stream, l_codec, &image)){
|
||||||
|
@ -187,9 +187,10 @@ static int tga_readheader(FILE *fp, unsigned int *bits_per_pixel,
|
|||||||
|
|
||||||
#ifdef OPJ_BIG_ENDIAN
|
#ifdef OPJ_BIG_ENDIAN
|
||||||
|
|
||||||
static inline uint16_t swap16(uint16_t x)
|
static inline int16_t swap16(int16_t x)
|
||||||
{
|
{
|
||||||
return(((x & 0x00ffU) << 8) | ((x & 0xff00U) >> 8));
|
return((((u_int16_t)x & 0x00ffU) << 8) |
|
||||||
|
(((u_int16_t)x & 0xff00U) >> 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -5,12 +5,10 @@ install( FILES ${CMAKE_CURRENT_BINARY_DIR}/opj_config.h
|
|||||||
DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR} COMPONENT Headers)
|
DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR} COMPONENT Headers)
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
${${OPENJPEG_NAMESPACE}_BINARY_DIR}/src/lib/openjp2 # opj_config.h and opj_config_private.h
|
${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h and opj_config_private.h
|
||||||
)
|
)
|
||||||
# Defines the source code for the library
|
# Defines the source code for the library
|
||||||
set(OPENJPEG_SRCS
|
set(OPENJPEG_SRCS
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/thread.c
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/thread.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/bio.c
|
${CMAKE_CURRENT_SOURCE_DIR}/bio.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/bio.h
|
${CMAKE_CURRENT_SOURCE_DIR}/bio.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/cio.c
|
${CMAKE_CURRENT_SOURCE_DIR}/cio.c
|
||||||
@ -31,7 +29,6 @@ set(OPENJPEG_SRCS
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/mct.h
|
${CMAKE_CURRENT_SOURCE_DIR}/mct.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/mqc.c
|
${CMAKE_CURRENT_SOURCE_DIR}/mqc.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/mqc.h
|
${CMAKE_CURRENT_SOURCE_DIR}/mqc.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/mqc_inl.h
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/openjpeg.c
|
${CMAKE_CURRENT_SOURCE_DIR}/openjpeg.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/openjpeg.h
|
${CMAKE_CURRENT_SOURCE_DIR}/openjpeg.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/opj_clock.c
|
${CMAKE_CURRENT_SOURCE_DIR}/opj_clock.c
|
||||||
@ -76,11 +73,6 @@ if(OPJ_DISABLE_TPSOT_FIX)
|
|||||||
add_definitions(-DOPJ_DISABLE_TPSOT_FIX)
|
add_definitions(-DOPJ_DISABLE_TPSOT_FIX)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Special case for old i586-mingw32msvc-gcc cross compiler
|
|
||||||
if(NOT WIN32 AND CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER MATCHES ".*mingw32msvc.*" )
|
|
||||||
set(WIN32 YES)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Build the library
|
# Build the library
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
if(BUILD_SHARED_LIBS)
|
if(BUILD_SHARED_LIBS)
|
||||||
@ -118,18 +110,16 @@ install(
|
|||||||
DESTINATION ${OPENJPEG_INSTALL_MAN_DIR}/man3)
|
DESTINATION ${OPENJPEG_INSTALL_MAN_DIR}/man3)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(BUILD_LUTS_GENERATOR)
|
# internal utilities to generate t1_luts.h (part of the jp2 lib)
|
||||||
# internal utility to generate t1_luts.h (part of the jp2 lib)
|
|
||||||
# no need to install:
|
# no need to install:
|
||||||
add_executable(t1_generate_luts t1_generate_luts.c)
|
add_executable(t1_generate_luts t1_generate_luts.c)
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
target_link_libraries(t1_generate_luts m)
|
target_link_libraries(t1_generate_luts m)
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Experimental option; let's how cppcheck performs
|
# Experimental option; let's how cppcheck performs
|
||||||
# Implementation details:
|
# Implementation details:
|
||||||
# I could not figure out how to easily upload a file to CDash. Instead simply
|
# I could not figure out how to easily upload a file to CDash. Instead simply
|
||||||
# pretend cppcheck is part of the Build step. Technically cppcheck can even
|
# pretend cppcheck is part of the Build step. Technically cppcheck can even
|
||||||
# output gcc formatted error/warning report
|
# output gcc formatted error/warning report
|
||||||
# Another implementation detail: I could not redirect error to the error
|
# Another implementation detail: I could not redirect error to the error
|
||||||
@ -152,36 +142,3 @@ if(OPJ_USE_DSYMUTIL)
|
|||||||
DEPENDS ${OPENJPEG_LIBRARY_NAME})
|
DEPENDS ${OPENJPEG_LIBRARY_NAME})
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
#################################################################################
|
|
||||||
# threading configuration
|
|
||||||
#################################################################################
|
|
||||||
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
|
|
||||||
|
|
||||||
option(OPJ_USE_THREAD "Build with thread/mutex support " ON)
|
|
||||||
if(NOT OPJ_USE_THREAD)
|
|
||||||
add_definitions( -DMUTEX_stub)
|
|
||||||
endif(NOT OPJ_USE_THREAD)
|
|
||||||
|
|
||||||
find_package(Threads QUIET)
|
|
||||||
|
|
||||||
if(OPJ_USE_THREAD AND WIN32 AND NOT Threads_FOUND )
|
|
||||||
add_definitions( -DMUTEX_win32)
|
|
||||||
set(Threads_FOUND YES)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_WIN32_THREADS_INIT )
|
|
||||||
add_definitions( -DMUTEX_win32)
|
|
||||||
endif(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_WIN32_THREADS_INIT )
|
|
||||||
|
|
||||||
if(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_PTHREADS_INIT )
|
|
||||||
add_definitions( -DMUTEX_pthread)
|
|
||||||
endif(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_PTHREADS_INIT )
|
|
||||||
|
|
||||||
if(OPJ_USE_THREAD AND NOT Threads_FOUND)
|
|
||||||
message(FATAL_ERROR "No thread library found and thread/mutex support is required by OPJ_USE_THREAD option")
|
|
||||||
endif(OPJ_USE_THREAD AND NOT Threads_FOUND)
|
|
||||||
|
|
||||||
if(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
|
|
||||||
TARGET_LINK_LIBRARIES(${OPENJPEG_LIBRARY_NAME} ${CMAKE_THREAD_LIBS_INIT})
|
|
||||||
endif(OPJ_USE_THREAD AND Threads_FOUND AND CMAKE_USE_PTHREADS_INIT)
|
|
||||||
|
@ -124,21 +124,21 @@ static void opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps, opj_st
|
|||||||
/**
|
/**
|
||||||
Inverse wavelet transform in 2-D.
|
Inverse wavelet transform in 2-D.
|
||||||
*/
|
*/
|
||||||
static OPJ_BOOL opj_dwt_decode_tile(opj_thread_pool_t* tp, opj_tcd_tilecomp_t* tilec, OPJ_UINT32 i, DWT1DFN fn);
|
static OPJ_BOOL opj_dwt_decode_tile(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 i, DWT1DFN fn);
|
||||||
|
|
||||||
static OPJ_BOOL opj_dwt_encode_procedure( opj_tcd_tilecomp_t * tilec,
|
static OPJ_BOOL opj_dwt_encode_procedure( opj_tcd_tilecomp_t * tilec,
|
||||||
void (*p_function)(OPJ_INT32 *, OPJ_INT32,OPJ_INT32,OPJ_INT32) );
|
void (*p_function)(OPJ_INT32 *, OPJ_INT32,OPJ_INT32,OPJ_INT32) );
|
||||||
|
|
||||||
static OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* OPJ_RESTRICT r, OPJ_UINT32 i);
|
static OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* restrict r, OPJ_UINT32 i);
|
||||||
|
|
||||||
/* <summary> */
|
/* <summary> */
|
||||||
/* Inverse 9-7 wavelet transform in 1-D. */
|
/* Inverse 9-7 wavelet transform in 1-D. */
|
||||||
/* </summary> */
|
/* </summary> */
|
||||||
static void opj_v4dwt_decode(opj_v4dwt_t* OPJ_RESTRICT dwt);
|
static void opj_v4dwt_decode(opj_v4dwt_t* restrict dwt);
|
||||||
|
|
||||||
static void opj_v4dwt_interleave_h(opj_v4dwt_t* OPJ_RESTRICT w, OPJ_FLOAT32* OPJ_RESTRICT a, OPJ_INT32 x, OPJ_INT32 size);
|
static void opj_v4dwt_interleave_h(opj_v4dwt_t* restrict w, OPJ_FLOAT32* restrict a, OPJ_INT32 x, OPJ_INT32 size);
|
||||||
|
|
||||||
static void opj_v4dwt_interleave_v(opj_v4dwt_t* OPJ_RESTRICT v , OPJ_FLOAT32* OPJ_RESTRICT a , OPJ_INT32 x, OPJ_INT32 nb_elts_read);
|
static void opj_v4dwt_interleave_v(opj_v4dwt_t* restrict v , OPJ_FLOAT32* restrict a , OPJ_INT32 x, OPJ_INT32 nb_elts_read);
|
||||||
|
|
||||||
#ifdef __SSE__
|
#ifdef __SSE__
|
||||||
static void opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count, const __m128 c);
|
static void opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count, const __m128 c);
|
||||||
@ -395,7 +395,7 @@ static INLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,void
|
|||||||
|
|
||||||
OPJ_INT32 rw; /* width of the resolution level computed */
|
OPJ_INT32 rw; /* width of the resolution level computed */
|
||||||
OPJ_INT32 rh; /* height of the resolution level computed */
|
OPJ_INT32 rh; /* height of the resolution level computed */
|
||||||
size_t l_data_size;
|
OPJ_UINT32 l_data_size;
|
||||||
|
|
||||||
opj_tcd_resolution_t * l_cur_res = 0;
|
opj_tcd_resolution_t * l_cur_res = 0;
|
||||||
opj_tcd_resolution_t * l_last_res = 0;
|
opj_tcd_resolution_t * l_last_res = 0;
|
||||||
@ -407,14 +407,8 @@ static INLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,void
|
|||||||
l_cur_res = tilec->resolutions + l;
|
l_cur_res = tilec->resolutions + l;
|
||||||
l_last_res = l_cur_res - 1;
|
l_last_res = l_cur_res - 1;
|
||||||
|
|
||||||
l_data_size = opj_dwt_max_resolution( tilec->resolutions,tilec->numresolutions);
|
l_data_size = opj_dwt_max_resolution( tilec->resolutions,tilec->numresolutions) * (OPJ_UINT32)sizeof(OPJ_INT32);
|
||||||
/* overflow check */
|
bj = (OPJ_INT32*)opj_malloc((size_t)l_data_size);
|
||||||
if (l_data_size > (SIZE_MAX / sizeof(OPJ_INT32))) {
|
|
||||||
/* FIXME event manager error callback */
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
l_data_size *= sizeof(OPJ_INT32);
|
|
||||||
bj = (OPJ_INT32*)opj_malloc(l_data_size);
|
|
||||||
/* l_data_size is equal to 0 when numresolutions == 1 but bj is not used */
|
/* l_data_size is equal to 0 when numresolutions == 1 but bj is not used */
|
||||||
/* in that case, so do not error out */
|
/* in that case, so do not error out */
|
||||||
if (l_data_size != 0 && ! bj) {
|
if (l_data_size != 0 && ! bj) {
|
||||||
@ -479,8 +473,8 @@ OPJ_BOOL opj_dwt_encode(opj_tcd_tilecomp_t * tilec)
|
|||||||
/* <summary> */
|
/* <summary> */
|
||||||
/* Inverse 5-3 wavelet transform in 2-D. */
|
/* Inverse 5-3 wavelet transform in 2-D. */
|
||||||
/* </summary> */
|
/* </summary> */
|
||||||
OPJ_BOOL opj_dwt_decode(opj_thread_pool_t* tp, opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres) {
|
OPJ_BOOL opj_dwt_decode(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres) {
|
||||||
return opj_dwt_decode_tile(tp, tilec, numres, &opj_dwt_decode_1);
|
return opj_dwt_decode_tile(tilec, numres, &opj_dwt_decode_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -549,7 +543,7 @@ void opj_dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, OPJ_UINT32 prec) {
|
|||||||
/* <summary> */
|
/* <summary> */
|
||||||
/* Determine maximum computed resolution level for inverse wavelet transform */
|
/* Determine maximum computed resolution level for inverse wavelet transform */
|
||||||
/* </summary> */
|
/* </summary> */
|
||||||
static OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* OPJ_RESTRICT r, OPJ_UINT32 i) {
|
static OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* restrict r, OPJ_UINT32 i) {
|
||||||
OPJ_UINT32 mr = 0;
|
OPJ_UINT32 mr = 0;
|
||||||
OPJ_UINT32 w;
|
OPJ_UINT32 w;
|
||||||
while( --i ) {
|
while( --i ) {
|
||||||
@ -562,73 +556,10 @@ static OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* OPJ_RESTRICT r, O
|
|||||||
return mr ;
|
return mr ;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
opj_dwt_t h;
|
|
||||||
DWT1DFN dwt_1D;
|
|
||||||
OPJ_UINT32 rw;
|
|
||||||
OPJ_UINT32 w;
|
|
||||||
OPJ_INT32 * OPJ_RESTRICT tiledp;
|
|
||||||
OPJ_UINT32 min_j;
|
|
||||||
OPJ_UINT32 max_j;
|
|
||||||
} opj_dwd_decode_h_job_t;
|
|
||||||
|
|
||||||
static void opj_dwt_decode_h_func(void* user_data, opj_tls_t* tls)
|
|
||||||
{
|
|
||||||
OPJ_UINT32 j;
|
|
||||||
opj_dwd_decode_h_job_t* job;
|
|
||||||
(void)tls;
|
|
||||||
|
|
||||||
job = (opj_dwd_decode_h_job_t*)user_data;
|
|
||||||
for( j = job->min_j; j < job->max_j; j++ )
|
|
||||||
{
|
|
||||||
opj_dwt_interleave_h(&job->h, &job->tiledp[j*job->w]);
|
|
||||||
(job->dwt_1D)(&job->h);
|
|
||||||
memcpy(&job->tiledp[j*job->w], job->h.mem, job->rw * sizeof(OPJ_INT32));
|
|
||||||
}
|
|
||||||
|
|
||||||
opj_aligned_free(job->h.mem);
|
|
||||||
opj_free(job);
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
opj_dwt_t v;
|
|
||||||
DWT1DFN dwt_1D;
|
|
||||||
OPJ_UINT32 rh;
|
|
||||||
OPJ_UINT32 w;
|
|
||||||
OPJ_INT32 * OPJ_RESTRICT tiledp;
|
|
||||||
OPJ_UINT32 min_j;
|
|
||||||
OPJ_UINT32 max_j;
|
|
||||||
} opj_dwd_decode_v_job_t;
|
|
||||||
|
|
||||||
static void opj_dwt_decode_v_func(void* user_data, opj_tls_t* tls)
|
|
||||||
{
|
|
||||||
OPJ_UINT32 j;
|
|
||||||
opj_dwd_decode_v_job_t* job;
|
|
||||||
(void)tls;
|
|
||||||
|
|
||||||
job = (opj_dwd_decode_v_job_t*)user_data;
|
|
||||||
for( j = job->min_j; j < job->max_j; j++ )
|
|
||||||
{
|
|
||||||
OPJ_UINT32 k;
|
|
||||||
opj_dwt_interleave_v(&job->v, &job->tiledp[j], (OPJ_INT32)job->w);
|
|
||||||
(job->dwt_1D)(&job->v);
|
|
||||||
for(k = 0; k < job->rh; ++k) {
|
|
||||||
job->tiledp[k * job->w + j] = job->v.mem[k];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
opj_aligned_free(job->v.mem);
|
|
||||||
opj_free(job);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* <summary> */
|
/* <summary> */
|
||||||
/* Inverse wavelet transform in 2-D. */
|
/* Inverse wavelet transform in 2-D. */
|
||||||
/* </summary> */
|
/* </summary> */
|
||||||
static OPJ_BOOL opj_dwt_decode_tile(opj_thread_pool_t* tp, opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres, DWT1DFN dwt_1D)
|
static OPJ_BOOL opj_dwt_decode_tile(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres, DWT1DFN dwt_1D) {
|
||||||
{
|
|
||||||
opj_dwt_t h;
|
opj_dwt_t h;
|
||||||
opj_dwt_t v;
|
opj_dwt_t v;
|
||||||
|
|
||||||
@ -638,21 +569,11 @@ static OPJ_BOOL opj_dwt_decode_tile(opj_thread_pool_t* tp, opj_tcd_tilecomp_t* t
|
|||||||
OPJ_UINT32 rh = (OPJ_UINT32)(tr->y1 - tr->y0); /* height of the resolution level computed */
|
OPJ_UINT32 rh = (OPJ_UINT32)(tr->y1 - tr->y0); /* height of the resolution level computed */
|
||||||
|
|
||||||
OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
|
OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
|
||||||
size_t h_mem_size;
|
|
||||||
int num_threads;
|
|
||||||
|
|
||||||
if (numres == 1U) {
|
if (numres == 1U) {
|
||||||
return OPJ_TRUE;
|
return OPJ_TRUE;
|
||||||
}
|
}
|
||||||
num_threads = opj_thread_pool_get_thread_count(tp);
|
h.mem = (OPJ_INT32*)opj_aligned_malloc(opj_dwt_max_resolution(tr, numres) * sizeof(OPJ_INT32));
|
||||||
h_mem_size = opj_dwt_max_resolution(tr, numres);
|
|
||||||
/* overflow check */
|
|
||||||
if (h_mem_size > (SIZE_MAX / sizeof(OPJ_INT32))) {
|
|
||||||
/* FIXME event manager error callback */
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
h_mem_size *= sizeof(OPJ_INT32);
|
|
||||||
h.mem = (OPJ_INT32*)opj_aligned_malloc(h_mem_size);
|
|
||||||
if (! h.mem){
|
if (! h.mem){
|
||||||
/* FIXME event manager error callback */
|
/* FIXME event manager error callback */
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
@ -661,7 +582,7 @@ static OPJ_BOOL opj_dwt_decode_tile(opj_thread_pool_t* tp, opj_tcd_tilecomp_t* t
|
|||||||
v.mem = h.mem;
|
v.mem = h.mem;
|
||||||
|
|
||||||
while( --numres) {
|
while( --numres) {
|
||||||
OPJ_INT32 * OPJ_RESTRICT tiledp = tilec->data;
|
OPJ_INT32 * restrict tiledp = tilec->data;
|
||||||
OPJ_UINT32 j;
|
OPJ_UINT32 j;
|
||||||
|
|
||||||
++tr;
|
++tr;
|
||||||
@ -674,134 +595,30 @@ static OPJ_BOOL opj_dwt_decode_tile(opj_thread_pool_t* tp, opj_tcd_tilecomp_t* t
|
|||||||
h.dn = (OPJ_INT32)(rw - (OPJ_UINT32)h.sn);
|
h.dn = (OPJ_INT32)(rw - (OPJ_UINT32)h.sn);
|
||||||
h.cas = tr->x0 % 2;
|
h.cas = tr->x0 % 2;
|
||||||
|
|
||||||
if( num_threads <= 1 || rh <= 1 )
|
for(j = 0; j < rh; ++j) {
|
||||||
{
|
opj_dwt_interleave_h(&h, &tiledp[j*w]);
|
||||||
for(j = 0; j < rh; ++j) {
|
(dwt_1D)(&h);
|
||||||
opj_dwt_interleave_h(&h, &tiledp[j*w]);
|
memcpy(&tiledp[j*w], h.mem, rw * sizeof(OPJ_INT32));
|
||||||
(dwt_1D)(&h);
|
|
||||||
memcpy(&tiledp[j*w], h.mem, rw * sizeof(OPJ_INT32));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
OPJ_UINT32 num_jobs = (OPJ_UINT32)num_threads;
|
|
||||||
OPJ_UINT32 step_j;
|
|
||||||
|
|
||||||
if( rh < num_jobs ) {
|
|
||||||
num_jobs = rh;
|
|
||||||
}
|
|
||||||
step_j = (rh / num_jobs);
|
|
||||||
|
|
||||||
for(j = 0; j < num_jobs; j++)
|
|
||||||
{
|
|
||||||
opj_dwd_decode_h_job_t* job;
|
|
||||||
|
|
||||||
job = (opj_dwd_decode_h_job_t*) opj_malloc(sizeof(opj_dwd_decode_h_job_t));
|
|
||||||
if( !job )
|
|
||||||
{
|
|
||||||
/* It would be nice to fallback to single thread case, but */
|
|
||||||
/* unfortunately some jobs may be launched and have modified */
|
|
||||||
/* tiledp, so it is not practical to recover from that error */
|
|
||||||
/* FIXME event manager error callback */
|
|
||||||
opj_thread_pool_wait_completion(tp, 0);
|
|
||||||
opj_aligned_free(h.mem);
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
job->h = h;
|
|
||||||
job->dwt_1D = dwt_1D;
|
|
||||||
job->rw = rw;
|
|
||||||
job->w = w;
|
|
||||||
job->tiledp = tiledp;
|
|
||||||
job->min_j = j * step_j;
|
|
||||||
job->max_j = (j + 1U) * step_j; /* this can overflow */
|
|
||||||
if( j == (num_jobs - 1U) ) { /* this will take care of the overflow */
|
|
||||||
job->max_j = rh;
|
|
||||||
}
|
|
||||||
job->h.mem = (OPJ_INT32*)opj_aligned_malloc(h_mem_size);
|
|
||||||
if (!job->h.mem)
|
|
||||||
{
|
|
||||||
/* FIXME event manager error callback */
|
|
||||||
opj_thread_pool_wait_completion(tp, 0);
|
|
||||||
opj_free(job);
|
|
||||||
opj_aligned_free(h.mem);
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
opj_thread_pool_submit_job( tp, opj_dwt_decode_h_func, job );
|
|
||||||
}
|
|
||||||
opj_thread_pool_wait_completion(tp, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
v.dn = (OPJ_INT32)(rh - (OPJ_UINT32)v.sn);
|
v.dn = (OPJ_INT32)(rh - (OPJ_UINT32)v.sn);
|
||||||
v.cas = tr->y0 % 2;
|
v.cas = tr->y0 % 2;
|
||||||
|
|
||||||
if( num_threads <= 1 || rw <= 1 )
|
for(j = 0; j < rw; ++j){
|
||||||
{
|
OPJ_UINT32 k;
|
||||||
for(j = 0; j < rw; ++j){
|
opj_dwt_interleave_v(&v, &tiledp[j], (OPJ_INT32)w);
|
||||||
OPJ_UINT32 k;
|
(dwt_1D)(&v);
|
||||||
|
for(k = 0; k < rh; ++k) {
|
||||||
opj_dwt_interleave_v(&v, &tiledp[j], (OPJ_INT32)w);
|
tiledp[k * w + j] = v.mem[k];
|
||||||
(dwt_1D)(&v);
|
|
||||||
for(k = 0; k < rh; ++k) {
|
|
||||||
tiledp[k * w + j] = v.mem[k];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
OPJ_UINT32 num_jobs = (OPJ_UINT32)num_threads;
|
|
||||||
OPJ_UINT32 step_j;
|
|
||||||
|
|
||||||
if( rw < num_jobs ) {
|
|
||||||
num_jobs = rw;
|
|
||||||
}
|
|
||||||
step_j = (rw / num_jobs);
|
|
||||||
|
|
||||||
for( j = 0; j < num_jobs; j++ )
|
|
||||||
{
|
|
||||||
opj_dwd_decode_v_job_t* job;
|
|
||||||
|
|
||||||
job = (opj_dwd_decode_v_job_t*) opj_malloc(sizeof(opj_dwd_decode_v_job_t));
|
|
||||||
if( !job )
|
|
||||||
{
|
|
||||||
/* It would be nice to fallback to single thread case, but */
|
|
||||||
/* unfortunately some jobs may be launched and have modified */
|
|
||||||
/* tiledp, so it is not practical to recover from that error */
|
|
||||||
/* FIXME event manager error callback */
|
|
||||||
opj_thread_pool_wait_completion(tp, 0);
|
|
||||||
opj_aligned_free(v.mem);
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
job->v = v;
|
|
||||||
job->dwt_1D = dwt_1D;
|
|
||||||
job->rh = rh;
|
|
||||||
job->w = w;
|
|
||||||
job->tiledp = tiledp;
|
|
||||||
job->min_j = j * step_j;
|
|
||||||
job->max_j = (j + 1U) * step_j; /* this can overflow */
|
|
||||||
if( j == (num_jobs - 1U) ) { /* this will take care of the overflow */
|
|
||||||
job->max_j = rw;
|
|
||||||
}
|
|
||||||
job->v.mem = (OPJ_INT32*)opj_aligned_malloc(h_mem_size);
|
|
||||||
if (!job->v.mem)
|
|
||||||
{
|
|
||||||
/* FIXME event manager error callback */
|
|
||||||
opj_thread_pool_wait_completion(tp, 0);
|
|
||||||
opj_free(job);
|
|
||||||
opj_aligned_free(v.mem);
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
opj_thread_pool_submit_job( tp, opj_dwt_decode_v_func, job );
|
|
||||||
}
|
|
||||||
opj_thread_pool_wait_completion(tp, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
opj_aligned_free(h.mem);
|
opj_aligned_free(h.mem);
|
||||||
return OPJ_TRUE;
|
return OPJ_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void opj_v4dwt_interleave_h(opj_v4dwt_t* OPJ_RESTRICT w, OPJ_FLOAT32* OPJ_RESTRICT a, OPJ_INT32 x, OPJ_INT32 size)
|
static void opj_v4dwt_interleave_h(opj_v4dwt_t* restrict w, OPJ_FLOAT32* restrict a, OPJ_INT32 x, OPJ_INT32 size){
|
||||||
{
|
OPJ_FLOAT32* restrict bi = (OPJ_FLOAT32*) (w->wavelet + w->cas);
|
||||||
OPJ_FLOAT32* OPJ_RESTRICT bi = (OPJ_FLOAT32*) (w->wavelet + w->cas);
|
|
||||||
OPJ_INT32 count = w->sn;
|
OPJ_INT32 count = w->sn;
|
||||||
OPJ_INT32 i, k;
|
OPJ_INT32 i, k;
|
||||||
|
|
||||||
@ -843,8 +660,8 @@ static void opj_v4dwt_interleave_h(opj_v4dwt_t* OPJ_RESTRICT w, OPJ_FLOAT32* OPJ
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void opj_v4dwt_interleave_v(opj_v4dwt_t* OPJ_RESTRICT v , OPJ_FLOAT32* OPJ_RESTRICT a , OPJ_INT32 x, OPJ_INT32 nb_elts_read){
|
static void opj_v4dwt_interleave_v(opj_v4dwt_t* restrict v , OPJ_FLOAT32* restrict a , OPJ_INT32 x, OPJ_INT32 nb_elts_read){
|
||||||
opj_v4_t* OPJ_RESTRICT bi = v->wavelet + v->cas;
|
opj_v4_t* restrict bi = v->wavelet + v->cas;
|
||||||
OPJ_INT32 i;
|
OPJ_INT32 i;
|
||||||
|
|
||||||
for(i = 0; i < v->sn; ++i){
|
for(i = 0; i < v->sn; ++i){
|
||||||
@ -862,7 +679,7 @@ static void opj_v4dwt_interleave_v(opj_v4dwt_t* OPJ_RESTRICT v , OPJ_FLOAT32* OP
|
|||||||
#ifdef __SSE__
|
#ifdef __SSE__
|
||||||
|
|
||||||
static void opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count, const __m128 c){
|
static void opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count, const __m128 c){
|
||||||
__m128* OPJ_RESTRICT vw = (__m128*) w;
|
__m128* restrict vw = (__m128*) w;
|
||||||
OPJ_INT32 i;
|
OPJ_INT32 i;
|
||||||
/* 4x unrolled loop */
|
/* 4x unrolled loop */
|
||||||
for(i = 0; i < count >> 2; ++i){
|
for(i = 0; i < count >> 2; ++i){
|
||||||
@ -883,8 +700,8 @@ static void opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count, const __m12
|
|||||||
}
|
}
|
||||||
|
|
||||||
void opj_v4dwt_decode_step2_sse(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, __m128 c){
|
void opj_v4dwt_decode_step2_sse(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, __m128 c){
|
||||||
__m128* OPJ_RESTRICT vl = (__m128*) l;
|
__m128* restrict vl = (__m128*) l;
|
||||||
__m128* OPJ_RESTRICT vw = (__m128*) w;
|
__m128* restrict vw = (__m128*) w;
|
||||||
OPJ_INT32 i;
|
OPJ_INT32 i;
|
||||||
__m128 tmp1, tmp2, tmp3;
|
__m128 tmp1, tmp2, tmp3;
|
||||||
tmp1 = vl[0];
|
tmp1 = vl[0];
|
||||||
@ -912,7 +729,7 @@ void opj_v4dwt_decode_step2_sse(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32
|
|||||||
|
|
||||||
static void opj_v4dwt_decode_step1(opj_v4_t* w, OPJ_INT32 count, const OPJ_FLOAT32 c)
|
static void opj_v4dwt_decode_step1(opj_v4_t* w, OPJ_INT32 count, const OPJ_FLOAT32 c)
|
||||||
{
|
{
|
||||||
OPJ_FLOAT32* OPJ_RESTRICT fw = (OPJ_FLOAT32*) w;
|
OPJ_FLOAT32* restrict fw = (OPJ_FLOAT32*) w;
|
||||||
OPJ_INT32 i;
|
OPJ_INT32 i;
|
||||||
for(i = 0; i < count; ++i){
|
for(i = 0; i < count; ++i){
|
||||||
OPJ_FLOAT32 tmp1 = fw[i*8 ];
|
OPJ_FLOAT32 tmp1 = fw[i*8 ];
|
||||||
@ -980,7 +797,7 @@ static void opj_v4dwt_decode_step2(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_IN
|
|||||||
/* <summary> */
|
/* <summary> */
|
||||||
/* Inverse 9-7 wavelet transform in 1-D. */
|
/* Inverse 9-7 wavelet transform in 1-D. */
|
||||||
/* </summary> */
|
/* </summary> */
|
||||||
static void opj_v4dwt_decode(opj_v4dwt_t* OPJ_RESTRICT dwt)
|
static void opj_v4dwt_decode(opj_v4dwt_t* restrict dwt)
|
||||||
{
|
{
|
||||||
OPJ_INT32 a, b;
|
OPJ_INT32 a, b;
|
||||||
if(dwt->cas == 0) {
|
if(dwt->cas == 0) {
|
||||||
@ -1017,7 +834,7 @@ static void opj_v4dwt_decode(opj_v4dwt_t* OPJ_RESTRICT dwt)
|
|||||||
/* <summary> */
|
/* <summary> */
|
||||||
/* Inverse 9-7 wavelet transform in 2-D. */
|
/* Inverse 9-7 wavelet transform in 2-D. */
|
||||||
/* </summary> */
|
/* </summary> */
|
||||||
OPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* OPJ_RESTRICT tilec, OPJ_UINT32 numres)
|
OPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, OPJ_UINT32 numres)
|
||||||
{
|
{
|
||||||
opj_v4dwt_t h;
|
opj_v4dwt_t h;
|
||||||
opj_v4dwt_t v;
|
opj_v4dwt_t v;
|
||||||
@ -1029,21 +846,7 @@ OPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* OPJ_RESTRICT tilec, OPJ_UINT32
|
|||||||
|
|
||||||
OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
|
OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
|
||||||
|
|
||||||
size_t l_data_size;
|
h.wavelet = (opj_v4_t*) opj_aligned_malloc((opj_dwt_max_resolution(res, numres)+5) * sizeof(opj_v4_t));
|
||||||
|
|
||||||
l_data_size = opj_dwt_max_resolution(res, numres);
|
|
||||||
/* overflow check */
|
|
||||||
if (l_data_size > (SIZE_MAX - 5U)) {
|
|
||||||
/* FIXME event manager error callback */
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
l_data_size += 5U;
|
|
||||||
/* overflow check */
|
|
||||||
if (l_data_size > (SIZE_MAX / sizeof(opj_v4_t))) {
|
|
||||||
/* FIXME event manager error callback */
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
h.wavelet = (opj_v4_t*) opj_aligned_malloc(l_data_size * sizeof(opj_v4_t));
|
|
||||||
if (!h.wavelet) {
|
if (!h.wavelet) {
|
||||||
/* FIXME event manager error callback */
|
/* FIXME event manager error callback */
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
@ -1051,7 +854,7 @@ OPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* OPJ_RESTRICT tilec, OPJ_UINT32
|
|||||||
v.wavelet = h.wavelet;
|
v.wavelet = h.wavelet;
|
||||||
|
|
||||||
while( --numres) {
|
while( --numres) {
|
||||||
OPJ_FLOAT32 * OPJ_RESTRICT aj = (OPJ_FLOAT32*) tilec->data;
|
OPJ_FLOAT32 * restrict aj = (OPJ_FLOAT32*) tilec->data;
|
||||||
OPJ_UINT32 bufsize = (OPJ_UINT32)((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0));
|
OPJ_UINT32 bufsize = (OPJ_UINT32)((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0));
|
||||||
OPJ_INT32 j;
|
OPJ_INT32 j;
|
||||||
|
|
||||||
|
@ -63,11 +63,10 @@ OPJ_BOOL opj_dwt_encode(opj_tcd_tilecomp_t * tilec);
|
|||||||
/**
|
/**
|
||||||
Inverse 5-3 wavelet transform in 2-D.
|
Inverse 5-3 wavelet transform in 2-D.
|
||||||
Apply a reversible inverse DWT transform to a component of an image.
|
Apply a reversible inverse DWT transform to a component of an image.
|
||||||
@param tp Thread pool
|
|
||||||
@param tilec Tile component information (current tile)
|
@param tilec Tile component information (current tile)
|
||||||
@param numres Number of resolution levels to decode
|
@param numres Number of resolution levels to decode
|
||||||
*/
|
*/
|
||||||
OPJ_BOOL opj_dwt_decode(opj_thread_pool_t* tp, opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres);
|
OPJ_BOOL opj_dwt_decode(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get the gain of a subband for the reversible 5-3 DWT.
|
Get the gain of a subband for the reversible 5-3 DWT.
|
||||||
@ -94,7 +93,7 @@ Apply an irreversible inverse DWT transform to a component of an image.
|
|||||||
@param tilec Tile component information (current tile)
|
@param tilec Tile component information (current tile)
|
||||||
@param numres Number of resolution levels to decode
|
@param numres Number of resolution levels to decode
|
||||||
*/
|
*/
|
||||||
OPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* OPJ_RESTRICT tilec, OPJ_UINT32 numres);
|
OPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, OPJ_UINT32 numres);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get the gain of a subband for the irreversible 9-7 DWT.
|
Get the gain of a subband for the irreversible 9-7 DWT.
|
||||||
|
@ -5405,7 +5405,6 @@ static OPJ_BOOL opj_j2k_read_mcc ( opj_j2k_t *p_j2k,
|
|||||||
OPJ_UINT32 l_nb_collections;
|
OPJ_UINT32 l_nb_collections;
|
||||||
OPJ_UINT32 l_nb_comps;
|
OPJ_UINT32 l_nb_comps;
|
||||||
OPJ_UINT32 l_nb_bytes_by_comp;
|
OPJ_UINT32 l_nb_bytes_by_comp;
|
||||||
OPJ_BOOL l_new_mcc = OPJ_FALSE;
|
|
||||||
|
|
||||||
/* preconditions */
|
/* preconditions */
|
||||||
assert(p_header_data != 00);
|
assert(p_header_data != 00);
|
||||||
@ -5467,7 +5466,6 @@ static OPJ_BOOL opj_j2k_read_mcc ( opj_j2k_t *p_j2k,
|
|||||||
memset(l_mcc_record,0,(l_tcp->m_nb_max_mcc_records-l_tcp->m_nb_mcc_records) * sizeof(opj_simple_mcc_decorrelation_data_t));
|
memset(l_mcc_record,0,(l_tcp->m_nb_max_mcc_records-l_tcp->m_nb_mcc_records) * sizeof(opj_simple_mcc_decorrelation_data_t));
|
||||||
}
|
}
|
||||||
l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
|
l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
|
||||||
l_new_mcc = OPJ_TRUE;
|
|
||||||
}
|
}
|
||||||
l_mcc_record->m_index = l_indix;
|
l_mcc_record->m_index = l_indix;
|
||||||
|
|
||||||
@ -5603,9 +5601,7 @@ static OPJ_BOOL opj_j2k_read_mcc ( opj_j2k_t *p_j2k,
|
|||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (l_new_mcc) {
|
++l_tcp->m_nb_mcc_records;
|
||||||
++l_tcp->m_nb_mcc_records;
|
|
||||||
}
|
|
||||||
|
|
||||||
return OPJ_TRUE;
|
return OPJ_TRUE;
|
||||||
}
|
}
|
||||||
@ -5948,35 +5944,6 @@ void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
OPJ_BOOL opj_j2k_set_threads(opj_j2k_t *j2k, OPJ_UINT32 num_threads)
|
|
||||||
{
|
|
||||||
if( opj_has_thread_support() )
|
|
||||||
{
|
|
||||||
opj_thread_pool_destroy(j2k->m_tp);
|
|
||||||
j2k->m_tp = NULL;
|
|
||||||
if (num_threads <= (OPJ_UINT32)INT_MAX ) {
|
|
||||||
j2k->m_tp = opj_thread_pool_create((int)num_threads);
|
|
||||||
}
|
|
||||||
if( j2k->m_tp == NULL )
|
|
||||||
{
|
|
||||||
j2k->m_tp = opj_thread_pool_create(0);
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
return OPJ_TRUE;
|
|
||||||
}
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int opj_j2k_get_default_thread_count()
|
|
||||||
{
|
|
||||||
const char* num_threads = getenv("OPJ_NUM_THREADS");
|
|
||||||
if( num_threads == NULL || !opj_has_thread_support() )
|
|
||||||
return 0;
|
|
||||||
if( strcmp(num_threads, "ALL_CPUS") == 0 )
|
|
||||||
return opj_get_num_cpus();
|
|
||||||
return atoi(num_threads);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
/* J2K encoder interface */
|
/* J2K encoder interface */
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
@ -6014,17 +5981,6 @@ opj_j2k_t* opj_j2k_create_compress(void)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
l_j2k->m_tp = opj_thread_pool_create(opj_j2k_get_default_thread_count());
|
|
||||||
if( !l_j2k->m_tp )
|
|
||||||
{
|
|
||||||
l_j2k->m_tp = opj_thread_pool_create(0);
|
|
||||||
}
|
|
||||||
if( !l_j2k->m_tp )
|
|
||||||
{
|
|
||||||
opj_j2k_destroy(l_j2k);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return l_j2k;
|
return l_j2k;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7530,7 +7486,7 @@ static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd ( opj_j2k_t * p_j2
|
|||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !opj_tcd_init(p_j2k->m_tcd, l_image, &(p_j2k->m_cp), p_j2k->m_tp) ) {
|
if ( !opj_tcd_init(p_j2k->m_tcd, l_image, &(p_j2k->m_cp)) ) {
|
||||||
opj_tcd_destroy(p_j2k->m_tcd);
|
opj_tcd_destroy(p_j2k->m_tcd);
|
||||||
p_j2k->m_tcd = 00;
|
p_j2k->m_tcd = 00;
|
||||||
opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
|
opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
|
||||||
@ -7611,9 +7567,6 @@ void opj_j2k_destroy (opj_j2k_t *p_j2k)
|
|||||||
opj_image_destroy(p_j2k->m_output_image);
|
opj_image_destroy(p_j2k->m_output_image);
|
||||||
p_j2k->m_output_image = NULL;
|
p_j2k->m_output_image = NULL;
|
||||||
|
|
||||||
opj_thread_pool_destroy(p_j2k->m_tp);
|
|
||||||
p_j2k->m_tp = NULL;
|
|
||||||
|
|
||||||
opj_free(p_j2k);
|
opj_free(p_j2k);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8264,14 +8217,8 @@ static OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data,
|
|||||||
|
|
||||||
/* Allocate output component buffer if necessary */
|
/* Allocate output component buffer if necessary */
|
||||||
if (!l_img_comp_dest->data) {
|
if (!l_img_comp_dest->data) {
|
||||||
OPJ_SIZE_T l_width = l_img_comp_dest->w;
|
|
||||||
OPJ_SIZE_T l_height = l_img_comp_dest->h;
|
|
||||||
|
|
||||||
if ((l_height == 0U) || (l_width > (SIZE_MAX / l_height))) {
|
l_img_comp_dest->data = (OPJ_INT32*) opj_calloc((OPJ_SIZE_T)l_img_comp_dest->w * (OPJ_SIZE_T)l_img_comp_dest->h, sizeof(OPJ_INT32));
|
||||||
/* would overflow */
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
l_img_comp_dest->data = (OPJ_INT32*) opj_calloc(l_width * l_height, sizeof(OPJ_INT32));
|
|
||||||
if (! l_img_comp_dest->data) {
|
if (! l_img_comp_dest->data) {
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
}
|
}
|
||||||
@ -8711,17 +8658,6 @@ opj_j2k_t* opj_j2k_create_decompress(void)
|
|||||||
return 00;
|
return 00;
|
||||||
}
|
}
|
||||||
|
|
||||||
l_j2k->m_tp = opj_thread_pool_create(opj_j2k_get_default_thread_count());
|
|
||||||
if( !l_j2k->m_tp )
|
|
||||||
{
|
|
||||||
l_j2k->m_tp = opj_thread_pool_create(0);
|
|
||||||
}
|
|
||||||
if( !l_j2k->m_tp )
|
|
||||||
{
|
|
||||||
opj_j2k_destroy(l_j2k);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return l_j2k;
|
return l_j2k;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8953,10 +8889,6 @@ static OPJ_BOOL opj_j2k_read_SPCod_SPCoc( opj_j2k_t *p_j2k,
|
|||||||
|
|
||||||
opj_read_bytes(l_current_ptr,&l_tccp->cblksty ,1); /* SPcoc (G) */
|
opj_read_bytes(l_current_ptr,&l_tccp->cblksty ,1); /* SPcoc (G) */
|
||||||
++l_current_ptr;
|
++l_current_ptr;
|
||||||
if (l_tccp->cblksty & 0xC0U) { /* 2 msb are reserved, assume we can't read */
|
|
||||||
opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element, Invalid code-block style found\n");
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
opj_read_bytes(l_current_ptr,&l_tccp->qmfbid ,1); /* SPcoc (H) */
|
opj_read_bytes(l_current_ptr,&l_tccp->qmfbid ,1); /* SPcoc (H) */
|
||||||
++l_current_ptr;
|
++l_current_ptr;
|
||||||
@ -10998,7 +10930,7 @@ static OPJ_BOOL opj_j2k_create_tcd( opj_j2k_t *p_j2k,
|
|||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!opj_tcd_init(p_j2k->m_tcd,p_j2k->m_private_image,&p_j2k->m_cp, p_j2k->m_tp)) {
|
if (!opj_tcd_init(p_j2k->m_tcd,p_j2k->m_private_image,&p_j2k->m_cp)) {
|
||||||
opj_tcd_destroy(p_j2k->m_tcd);
|
opj_tcd_destroy(p_j2k->m_tcd);
|
||||||
p_j2k->m_tcd = 00;
|
p_j2k->m_tcd = 00;
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
|
@ -228,7 +228,7 @@ typedef struct opj_simple_mcc_decorrelation_data
|
|||||||
OPJ_UINT32 m_nb_comps;
|
OPJ_UINT32 m_nb_comps;
|
||||||
opj_mct_data_t * m_decorrelation_array;
|
opj_mct_data_t * m_decorrelation_array;
|
||||||
opj_mct_data_t * m_offset_array;
|
opj_mct_data_t * m_offset_array;
|
||||||
OPJ_BITFIELD m_is_irreversible : 1;
|
OPJ_UINT32 m_is_irreversible : 1;
|
||||||
}
|
}
|
||||||
opj_simple_mcc_decorrelation_data_t;
|
opj_simple_mcc_decorrelation_data_t;
|
||||||
|
|
||||||
@ -306,11 +306,11 @@ typedef struct opj_tcp
|
|||||||
|
|
||||||
/***** FLAGS *******/
|
/***** FLAGS *******/
|
||||||
/** If cod == 1 --> there was a COD marker for the present tile */
|
/** If cod == 1 --> there was a COD marker for the present tile */
|
||||||
OPJ_BITFIELD cod : 1;
|
OPJ_UINT32 cod : 1;
|
||||||
/** If ppt == 1 --> there was a PPT marker for the present tile */
|
/** If ppt == 1 --> there was a PPT marker for the present tile */
|
||||||
OPJ_BITFIELD ppt : 1;
|
OPJ_UINT32 ppt : 1;
|
||||||
/** indicates if a POC marker has been used O:NO, 1:YES */
|
/** indicates if a POC marker has been used O:NO, 1:YES */
|
||||||
OPJ_BITFIELD POC : 1;
|
OPJ_UINT32 POC : 1;
|
||||||
} opj_tcp_t;
|
} opj_tcp_t;
|
||||||
|
|
||||||
|
|
||||||
@ -327,13 +327,13 @@ typedef struct opj_encoding_param
|
|||||||
/** Flag determining tile part generation*/
|
/** Flag determining tile part generation*/
|
||||||
OPJ_BYTE m_tp_flag;
|
OPJ_BYTE m_tp_flag;
|
||||||
/** allocation by rate/distortion */
|
/** allocation by rate/distortion */
|
||||||
OPJ_BITFIELD m_disto_alloc : 1;
|
OPJ_UINT32 m_disto_alloc : 1;
|
||||||
/** allocation by fixed layer */
|
/** allocation by fixed layer */
|
||||||
OPJ_BITFIELD m_fixed_alloc : 1;
|
OPJ_UINT32 m_fixed_alloc : 1;
|
||||||
/** add fixed_quality */
|
/** add fixed_quality */
|
||||||
OPJ_BITFIELD m_fixed_quality : 1;
|
OPJ_UINT32 m_fixed_quality : 1;
|
||||||
/** Enabling Tile part generation*/
|
/** Enabling Tile part generation*/
|
||||||
OPJ_BITFIELD m_tp_on : 1;
|
OPJ_UINT32 m_tp_on : 1;
|
||||||
}
|
}
|
||||||
opj_encoding_param_t;
|
opj_encoding_param_t;
|
||||||
|
|
||||||
@ -453,9 +453,9 @@ typedef struct opj_cp
|
|||||||
|
|
||||||
/******** FLAGS *********/
|
/******** FLAGS *********/
|
||||||
/** if ppm == 1 --> there was a PPM marker*/
|
/** if ppm == 1 --> there was a PPM marker*/
|
||||||
OPJ_BITFIELD ppm : 1;
|
OPJ_UINT32 ppm : 1;
|
||||||
/** tells if the parameter is a coding or decoding one */
|
/** tells if the parameter is a coding or decoding one */
|
||||||
OPJ_BITFIELD m_is_decoder : 1;
|
OPJ_UINT32 m_is_decoder : 1;
|
||||||
/* <<UniPG */
|
/* <<UniPG */
|
||||||
} opj_cp_t;
|
} opj_cp_t;
|
||||||
|
|
||||||
@ -497,12 +497,12 @@ typedef struct opj_j2k_dec
|
|||||||
*/
|
*/
|
||||||
OPJ_BOOL m_last_tile_part;
|
OPJ_BOOL m_last_tile_part;
|
||||||
/** to tell that a tile can be decoded. */
|
/** to tell that a tile can be decoded. */
|
||||||
OPJ_BITFIELD m_can_decode : 1;
|
OPJ_UINT32 m_can_decode : 1;
|
||||||
OPJ_BITFIELD m_discard_tiles : 1;
|
OPJ_UINT32 m_discard_tiles : 1;
|
||||||
OPJ_BITFIELD m_skip_data : 1;
|
OPJ_UINT32 m_skip_data : 1;
|
||||||
/** TNsot correction : see issue 254 **/
|
/** TNsot correction : see issue 254 **/
|
||||||
OPJ_BITFIELD m_nb_tile_parts_correction_checked : 1;
|
OPJ_UINT32 m_nb_tile_parts_correction_checked : 1;
|
||||||
OPJ_BITFIELD m_nb_tile_parts_correction : 1;
|
OPJ_UINT32 m_nb_tile_parts_correction : 1;
|
||||||
|
|
||||||
} opj_j2k_dec_t;
|
} opj_j2k_dec_t;
|
||||||
|
|
||||||
@ -589,12 +589,6 @@ typedef struct opj_j2k
|
|||||||
|
|
||||||
/** the current tile coder/decoder **/
|
/** the current tile coder/decoder **/
|
||||||
struct opj_tcd * m_tcd;
|
struct opj_tcd * m_tcd;
|
||||||
|
|
||||||
/** Number of threads to use */
|
|
||||||
int m_num_threads;
|
|
||||||
|
|
||||||
/** Thread pool */
|
|
||||||
opj_thread_pool_t* m_tp;
|
|
||||||
}
|
}
|
||||||
opj_j2k_t;
|
opj_j2k_t;
|
||||||
|
|
||||||
@ -613,8 +607,6 @@ Decoding parameters are returned in j2k->cp.
|
|||||||
*/
|
*/
|
||||||
void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);
|
void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);
|
||||||
|
|
||||||
OPJ_BOOL opj_j2k_set_threads(opj_j2k_t *j2k, OPJ_UINT32 num_threads);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a J2K compression structure
|
* Creates a J2K compression structure
|
||||||
*
|
*
|
||||||
|
@ -552,11 +552,6 @@ static OPJ_BOOL opj_jp2_read_ihdr( opj_jp2_t *jp2,
|
|||||||
assert(jp2 != 00);
|
assert(jp2 != 00);
|
||||||
assert(p_manager != 00);
|
assert(p_manager != 00);
|
||||||
|
|
||||||
if (jp2->comps != NULL) {
|
|
||||||
opj_event_msg(p_manager, EVT_WARNING, "Ignoring ihdr box. First ihdr box already read\n");
|
|
||||||
return OPJ_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p_image_header_size != 14) {
|
if (p_image_header_size != 14) {
|
||||||
opj_event_msg(p_manager, EVT_ERROR, "Bad image header box (bad size)\n");
|
opj_event_msg(p_manager, EVT_ERROR, "Bad image header box (bad size)\n");
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
@ -568,11 +563,6 @@ static OPJ_BOOL opj_jp2_read_ihdr( opj_jp2_t *jp2,
|
|||||||
p_image_header_data += 4;
|
p_image_header_data += 4;
|
||||||
opj_read_bytes(p_image_header_data,&(jp2->numcomps),2); /* NC */
|
opj_read_bytes(p_image_header_data,&(jp2->numcomps),2); /* NC */
|
||||||
p_image_header_data += 2;
|
p_image_header_data += 2;
|
||||||
|
|
||||||
if ((jp2->numcomps - 1U) >= 16384U) { /* unsigned underflow is well defined: 1U <= jp2->numcomps <= 16384U */
|
|
||||||
opj_event_msg(p_manager, EVT_ERROR, "Invalid number of components (ihdr)\n");
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* allocate memory for components */
|
/* allocate memory for components */
|
||||||
jp2->comps = (opj_jp2_comps_t*) opj_calloc(jp2->numcomps, sizeof(opj_jp2_comps_t));
|
jp2->comps = (opj_jp2_comps_t*) opj_calloc(jp2->numcomps, sizeof(opj_jp2_comps_t));
|
||||||
@ -1774,12 +1764,7 @@ void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters)
|
|||||||
|
|
||||||
/* further JP2 initializations go here */
|
/* further JP2 initializations go here */
|
||||||
jp2->color.jp2_has_colr = 0;
|
jp2->color.jp2_has_colr = 0;
|
||||||
jp2->ignore_pclr_cmap_cdef = parameters->flags & OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
|
jp2->ignore_pclr_cmap_cdef = parameters->flags & OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
|
||||||
}
|
|
||||||
|
|
||||||
OPJ_BOOL opj_jp2_set_threads(opj_jp2_t *jp2, OPJ_UINT32 num_threads)
|
|
||||||
{
|
|
||||||
return opj_j2k_set_threads(jp2->j2k, num_threads);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
@ -1825,6 +1810,7 @@ OPJ_BOOL opj_jp2_setup_encoder( opj_jp2_t *jp2,
|
|||||||
jp2->numcl = 1;
|
jp2->numcl = 1;
|
||||||
jp2->cl = (OPJ_UINT32*) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));
|
jp2->cl = (OPJ_UINT32*) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));
|
||||||
if (!jp2->cl){
|
if (!jp2->cl){
|
||||||
|
jp2->cl = NULL;
|
||||||
opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
|
opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
}
|
}
|
||||||
@ -1835,6 +1821,7 @@ OPJ_BOOL opj_jp2_setup_encoder( opj_jp2_t *jp2,
|
|||||||
jp2->numcomps = image->numcomps; /* NC */
|
jp2->numcomps = image->numcomps; /* NC */
|
||||||
jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
|
jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
|
||||||
if (!jp2->comps) {
|
if (!jp2->comps) {
|
||||||
|
jp2->comps = NULL;
|
||||||
opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
|
opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
|
||||||
/* Memory of jp2->cl will be freed by opj_jp2_destroy */
|
/* Memory of jp2->cl will be freed by opj_jp2_destroy */
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
|
@ -243,8 +243,6 @@ Decoding parameters are returned in jp2->j2k->cp.
|
|||||||
*/
|
*/
|
||||||
void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters);
|
void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters);
|
||||||
|
|
||||||
OPJ_BOOL opj_jp2_set_threads(opj_jp2_t *jp2, OPJ_UINT32 num_threads);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode an image from a JPEG-2000 file stream
|
* Decode an image from a JPEG-2000 file stream
|
||||||
* @param jp2 JP2 decompressor handle
|
* @param jp2 JP2 decompressor handle
|
||||||
|
@ -74,9 +74,9 @@ const OPJ_FLOAT64 * opj_mct_get_mct_norms_real ()
|
|||||||
/* </summary> */
|
/* </summary> */
|
||||||
#ifdef __SSE2__
|
#ifdef __SSE2__
|
||||||
void opj_mct_encode(
|
void opj_mct_encode(
|
||||||
OPJ_INT32* OPJ_RESTRICT c0,
|
OPJ_INT32* restrict c0,
|
||||||
OPJ_INT32* OPJ_RESTRICT c1,
|
OPJ_INT32* restrict c1,
|
||||||
OPJ_INT32* OPJ_RESTRICT c2,
|
OPJ_INT32* restrict c2,
|
||||||
OPJ_UINT32 n)
|
OPJ_UINT32 n)
|
||||||
{
|
{
|
||||||
OPJ_SIZE_T i;
|
OPJ_SIZE_T i;
|
||||||
@ -116,9 +116,9 @@ void opj_mct_encode(
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void opj_mct_encode(
|
void opj_mct_encode(
|
||||||
OPJ_INT32* OPJ_RESTRICT c0,
|
OPJ_INT32* restrict c0,
|
||||||
OPJ_INT32* OPJ_RESTRICT c1,
|
OPJ_INT32* restrict c1,
|
||||||
OPJ_INT32* OPJ_RESTRICT c2,
|
OPJ_INT32* restrict c2,
|
||||||
OPJ_UINT32 n)
|
OPJ_UINT32 n)
|
||||||
{
|
{
|
||||||
OPJ_SIZE_T i;
|
OPJ_SIZE_T i;
|
||||||
@ -143,9 +143,9 @@ void opj_mct_encode(
|
|||||||
/* </summary> */
|
/* </summary> */
|
||||||
#ifdef __SSE2__
|
#ifdef __SSE2__
|
||||||
void opj_mct_decode(
|
void opj_mct_decode(
|
||||||
OPJ_INT32* OPJ_RESTRICT c0,
|
OPJ_INT32* restrict c0,
|
||||||
OPJ_INT32* OPJ_RESTRICT c1,
|
OPJ_INT32* restrict c1,
|
||||||
OPJ_INT32* OPJ_RESTRICT c2,
|
OPJ_INT32* restrict c2,
|
||||||
OPJ_UINT32 n)
|
OPJ_UINT32 n)
|
||||||
{
|
{
|
||||||
OPJ_SIZE_T i;
|
OPJ_SIZE_T i;
|
||||||
@ -178,9 +178,9 @@ void opj_mct_decode(
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void opj_mct_decode(
|
void opj_mct_decode(
|
||||||
OPJ_INT32* OPJ_RESTRICT c0,
|
OPJ_INT32* restrict c0,
|
||||||
OPJ_INT32* OPJ_RESTRICT c1,
|
OPJ_INT32* restrict c1,
|
||||||
OPJ_INT32* OPJ_RESTRICT c2,
|
OPJ_INT32* restrict c2,
|
||||||
OPJ_UINT32 n)
|
OPJ_UINT32 n)
|
||||||
{
|
{
|
||||||
OPJ_UINT32 i;
|
OPJ_UINT32 i;
|
||||||
@ -210,9 +210,9 @@ OPJ_FLOAT64 opj_mct_getnorm(OPJ_UINT32 compno) {
|
|||||||
/* </summary> */
|
/* </summary> */
|
||||||
#ifdef __SSE4_1__
|
#ifdef __SSE4_1__
|
||||||
void opj_mct_encode_real(
|
void opj_mct_encode_real(
|
||||||
OPJ_INT32* OPJ_RESTRICT c0,
|
OPJ_INT32* restrict c0,
|
||||||
OPJ_INT32* OPJ_RESTRICT c1,
|
OPJ_INT32* restrict c1,
|
||||||
OPJ_INT32* OPJ_RESTRICT c2,
|
OPJ_INT32* restrict c2,
|
||||||
OPJ_UINT32 n)
|
OPJ_UINT32 n)
|
||||||
{
|
{
|
||||||
OPJ_SIZE_T i;
|
OPJ_SIZE_T i;
|
||||||
@ -351,9 +351,9 @@ void opj_mct_encode_real(
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void opj_mct_encode_real(
|
void opj_mct_encode_real(
|
||||||
OPJ_INT32* OPJ_RESTRICT c0,
|
OPJ_INT32* restrict c0,
|
||||||
OPJ_INT32* OPJ_RESTRICT c1,
|
OPJ_INT32* restrict c1,
|
||||||
OPJ_INT32* OPJ_RESTRICT c2,
|
OPJ_INT32* restrict c2,
|
||||||
OPJ_UINT32 n)
|
OPJ_UINT32 n)
|
||||||
{
|
{
|
||||||
OPJ_UINT32 i;
|
OPJ_UINT32 i;
|
||||||
@ -375,9 +375,9 @@ void opj_mct_encode_real(
|
|||||||
/* Inverse irreversible MCT. */
|
/* Inverse irreversible MCT. */
|
||||||
/* </summary> */
|
/* </summary> */
|
||||||
void opj_mct_decode_real(
|
void opj_mct_decode_real(
|
||||||
OPJ_FLOAT32* OPJ_RESTRICT c0,
|
OPJ_FLOAT32* restrict c0,
|
||||||
OPJ_FLOAT32* OPJ_RESTRICT c1,
|
OPJ_FLOAT32* restrict c1,
|
||||||
OPJ_FLOAT32* OPJ_RESTRICT c2,
|
OPJ_FLOAT32* restrict c2,
|
||||||
OPJ_UINT32 n)
|
OPJ_UINT32 n)
|
||||||
{
|
{
|
||||||
OPJ_UINT32 i;
|
OPJ_UINT32 i;
|
||||||
|
@ -60,7 +60,7 @@ Apply a reversible multi-component transform to an image
|
|||||||
@param c2 Samples blue component
|
@param c2 Samples blue component
|
||||||
@param n Number of samples for each component
|
@param n Number of samples for each component
|
||||||
*/
|
*/
|
||||||
void opj_mct_encode(OPJ_INT32* OPJ_RESTRICT c0, OPJ_INT32* OPJ_RESTRICT c1, OPJ_INT32* OPJ_RESTRICT c2, OPJ_UINT32 n);
|
void opj_mct_encode(OPJ_INT32 *c0, OPJ_INT32 *c1, OPJ_INT32 *c2, OPJ_UINT32 n);
|
||||||
/**
|
/**
|
||||||
Apply a reversible multi-component inverse transform to an image
|
Apply a reversible multi-component inverse transform to an image
|
||||||
@param c0 Samples for luminance component
|
@param c0 Samples for luminance component
|
||||||
@ -68,7 +68,7 @@ Apply a reversible multi-component inverse transform to an image
|
|||||||
@param c2 Samples for blue chrominance component
|
@param c2 Samples for blue chrominance component
|
||||||
@param n Number of samples for each component
|
@param n Number of samples for each component
|
||||||
*/
|
*/
|
||||||
void opj_mct_decode(OPJ_INT32* OPJ_RESTRICT c0, OPJ_INT32* OPJ_RESTRICT c1, OPJ_INT32* OPJ_RESTRICT c2, OPJ_UINT32 n);
|
void opj_mct_decode(OPJ_INT32 *c0, OPJ_INT32 *c1, OPJ_INT32 *c2, OPJ_UINT32 n);
|
||||||
/**
|
/**
|
||||||
Get norm of the basis function used for the reversible multi-component transform
|
Get norm of the basis function used for the reversible multi-component transform
|
||||||
@param compno Number of the component (0->Y, 1->U, 2->V)
|
@param compno Number of the component (0->Y, 1->U, 2->V)
|
||||||
@ -83,7 +83,7 @@ Apply an irreversible multi-component transform to an image
|
|||||||
@param c2 Samples blue component
|
@param c2 Samples blue component
|
||||||
@param n Number of samples for each component
|
@param n Number of samples for each component
|
||||||
*/
|
*/
|
||||||
void opj_mct_encode_real(OPJ_INT32* OPJ_RESTRICT c0, OPJ_INT32* OPJ_RESTRICT c1, OPJ_INT32* OPJ_RESTRICT c2, OPJ_UINT32 n);
|
void opj_mct_encode_real(OPJ_INT32 *c0, OPJ_INT32 *c1, OPJ_INT32 *c2, OPJ_UINT32 n);
|
||||||
/**
|
/**
|
||||||
Apply an irreversible multi-component inverse transform to an image
|
Apply an irreversible multi-component inverse transform to an image
|
||||||
@param c0 Samples for luminance component
|
@param c0 Samples for luminance component
|
||||||
@ -91,7 +91,7 @@ Apply an irreversible multi-component inverse transform to an image
|
|||||||
@param c2 Samples for blue chrominance component
|
@param c2 Samples for blue chrominance component
|
||||||
@param n Number of samples for each component
|
@param n Number of samples for each component
|
||||||
*/
|
*/
|
||||||
void opj_mct_decode_real(OPJ_FLOAT32* OPJ_RESTRICT c0, OPJ_FLOAT32* OPJ_RESTRICT c1, OPJ_FLOAT32* OPJ_RESTRICT c2, OPJ_UINT32 n);
|
void opj_mct_decode_real(OPJ_FLOAT32* c0, OPJ_FLOAT32* c1, OPJ_FLOAT32* c2, OPJ_UINT32 n);
|
||||||
/**
|
/**
|
||||||
Get norm of the basis function used for the irreversible multi-component transform
|
Get norm of the basis function used for the irreversible multi-component transform
|
||||||
@param compno Number of the component (0->Y, 1->U, 2->V)
|
@param compno Number of the component (0->Y, 1->U, 2->V)
|
||||||
|
@ -70,6 +70,28 @@ Fill mqc->c with 1's for flushing
|
|||||||
@param mqc MQC handle
|
@param mqc MQC handle
|
||||||
*/
|
*/
|
||||||
static void opj_mqc_setbits(opj_mqc_t *mqc);
|
static void opj_mqc_setbits(opj_mqc_t *mqc);
|
||||||
|
/**
|
||||||
|
FIXME DOC
|
||||||
|
@param mqc MQC handle
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
static INLINE OPJ_INT32 opj_mqc_mpsexchange(opj_mqc_t *const mqc);
|
||||||
|
/**
|
||||||
|
FIXME DOC
|
||||||
|
@param mqc MQC handle
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
static INLINE OPJ_INT32 opj_mqc_lpsexchange(opj_mqc_t *const mqc);
|
||||||
|
/**
|
||||||
|
Input a byte
|
||||||
|
@param mqc MQC handle
|
||||||
|
*/
|
||||||
|
static INLINE void opj_mqc_bytein(opj_mqc_t *const mqc);
|
||||||
|
/**
|
||||||
|
Renormalize mqc->a and mqc->c while decoding
|
||||||
|
@param mqc MQC handle
|
||||||
|
*/
|
||||||
|
static INLINE void opj_mqc_renormd(opj_mqc_t *const mqc);
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
/*@}*/
|
/*@}*/
|
||||||
@ -262,6 +284,82 @@ static void opj_mqc_setbits(opj_mqc_t *mqc) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static INLINE OPJ_INT32 opj_mqc_mpsexchange(opj_mqc_t *const mqc) {
|
||||||
|
OPJ_INT32 d;
|
||||||
|
if (mqc->a < (*mqc->curctx)->qeval) {
|
||||||
|
d = (OPJ_INT32)(1 - (*mqc->curctx)->mps);
|
||||||
|
*mqc->curctx = (*mqc->curctx)->nlps;
|
||||||
|
} else {
|
||||||
|
d = (OPJ_INT32)(*mqc->curctx)->mps;
|
||||||
|
*mqc->curctx = (*mqc->curctx)->nmps;
|
||||||
|
}
|
||||||
|
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
static INLINE OPJ_INT32 opj_mqc_lpsexchange(opj_mqc_t *const mqc) {
|
||||||
|
OPJ_INT32 d;
|
||||||
|
if (mqc->a < (*mqc->curctx)->qeval) {
|
||||||
|
mqc->a = (*mqc->curctx)->qeval;
|
||||||
|
d = (OPJ_INT32)(*mqc->curctx)->mps;
|
||||||
|
*mqc->curctx = (*mqc->curctx)->nmps;
|
||||||
|
} else {
|
||||||
|
mqc->a = (*mqc->curctx)->qeval;
|
||||||
|
d = (OPJ_INT32)(1 - (*mqc->curctx)->mps);
|
||||||
|
*mqc->curctx = (*mqc->curctx)->nlps;
|
||||||
|
}
|
||||||
|
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MQC_PERF_OPT
|
||||||
|
static INLINE void opj_mqc_bytein(opj_mqc_t *const mqc) {
|
||||||
|
unsigned int i = *((unsigned int *) mqc->bp);
|
||||||
|
mqc->c += i & 0xffff00;
|
||||||
|
mqc->ct = i & 0x0f;
|
||||||
|
mqc->bp += (i >> 2) & 0x04;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static void opj_mqc_bytein(opj_mqc_t *const mqc) {
|
||||||
|
if (mqc->bp != mqc->end) {
|
||||||
|
OPJ_UINT32 c;
|
||||||
|
if (mqc->bp + 1 != mqc->end) {
|
||||||
|
c = *(mqc->bp + 1);
|
||||||
|
} else {
|
||||||
|
c = 0xff;
|
||||||
|
}
|
||||||
|
if (*mqc->bp == 0xff) {
|
||||||
|
if (c > 0x8f) {
|
||||||
|
mqc->c += 0xff00;
|
||||||
|
mqc->ct = 8;
|
||||||
|
} else {
|
||||||
|
mqc->bp++;
|
||||||
|
mqc->c += c << 9;
|
||||||
|
mqc->ct = 7;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mqc->bp++;
|
||||||
|
mqc->c += c << 8;
|
||||||
|
mqc->ct = 8;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mqc->c += 0xff00;
|
||||||
|
mqc->ct = 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static INLINE void opj_mqc_renormd(opj_mqc_t *const mqc) {
|
||||||
|
do {
|
||||||
|
if (mqc->ct == 0) {
|
||||||
|
opj_mqc_bytein(mqc);
|
||||||
|
}
|
||||||
|
mqc->a <<= 1;
|
||||||
|
mqc->c <<= 1;
|
||||||
|
mqc->ct--;
|
||||||
|
} while (mqc->a < 0x8000);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==========================================================
|
==========================================================
|
||||||
MQ-Coder interface
|
MQ-Coder interface
|
||||||
@ -487,6 +585,25 @@ OPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len) {
|
|||||||
return OPJ_TRUE;
|
return OPJ_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OPJ_INT32 opj_mqc_decode(opj_mqc_t *const mqc) {
|
||||||
|
OPJ_INT32 d;
|
||||||
|
mqc->a -= (*mqc->curctx)->qeval;
|
||||||
|
if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
|
||||||
|
d = opj_mqc_lpsexchange(mqc);
|
||||||
|
opj_mqc_renormd(mqc);
|
||||||
|
} else {
|
||||||
|
mqc->c -= (*mqc->curctx)->qeval << 16;
|
||||||
|
if ((mqc->a & 0x8000) == 0) {
|
||||||
|
d = opj_mqc_mpsexchange(mqc);
|
||||||
|
opj_mqc_renormd(mqc);
|
||||||
|
} else {
|
||||||
|
d = (OPJ_INT32)(*mqc->curctx)->mps;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
void opj_mqc_resetstates(opj_mqc_t *mqc) {
|
void opj_mqc_resetstates(opj_mqc_t *mqc) {
|
||||||
OPJ_UINT32 i;
|
OPJ_UINT32 i;
|
||||||
for (i = 0; i < MQC_NUMCTXS; i++) {
|
for (i = 0; i < MQC_NUMCTXS; i++) {
|
||||||
|
@ -77,14 +77,11 @@ typedef struct opj_mqc {
|
|||||||
OPJ_BYTE *end;
|
OPJ_BYTE *end;
|
||||||
opj_mqc_state_t *ctxs[MQC_NUMCTXS];
|
opj_mqc_state_t *ctxs[MQC_NUMCTXS];
|
||||||
opj_mqc_state_t **curctx;
|
opj_mqc_state_t **curctx;
|
||||||
const OPJ_BYTE *lut_ctxno_zc_orient; /* lut_ctxno_zc shifted by 256 * bandno */
|
|
||||||
#ifdef MQC_PERF_OPT
|
#ifdef MQC_PERF_OPT
|
||||||
unsigned char *buffer;
|
unsigned char *buffer;
|
||||||
#endif
|
#endif
|
||||||
} opj_mqc_t;
|
} opj_mqc_t;
|
||||||
|
|
||||||
#include "mqc_inl.h"
|
|
||||||
|
|
||||||
/** @name Exported functions */
|
/** @name Exported functions */
|
||||||
/*@{*/
|
/*@{*/
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
@ -201,7 +198,7 @@ Decode a symbol
|
|||||||
@param mqc MQC handle
|
@param mqc MQC handle
|
||||||
@return Returns the decoded symbol (0 or 1)
|
@return Returns the decoded symbol (0 or 1)
|
||||||
*/
|
*/
|
||||||
static INLINE OPJ_INT32 opj_mqc_decode(opj_mqc_t * const mqc);
|
OPJ_INT32 opj_mqc_decode(opj_mqc_t * const mqc);
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
|
@ -1,159 +0,0 @@
|
|||||||
/*
|
|
||||||
* The copyright in this software is being made available under the 2-clauses
|
|
||||||
* BSD License, included below. This software may be subject to other third
|
|
||||||
* party and contributor rights, including patent rights, and no such rights
|
|
||||||
* are granted under this license.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2007, Francois-Olivier Devaux
|
|
||||||
* Copyright (c) 2003-2014, Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MQC_INL_H
|
|
||||||
#define __MQC_INL_H
|
|
||||||
/**
|
|
||||||
FIXME DOC
|
|
||||||
@param mqc MQC handle
|
|
||||||
@return
|
|
||||||
*/
|
|
||||||
static INLINE OPJ_INT32 opj_mqc_mpsexchange(opj_mqc_t *const mqc) {
|
|
||||||
OPJ_INT32 d;
|
|
||||||
if (mqc->a < (*mqc->curctx)->qeval) {
|
|
||||||
d = (OPJ_INT32)(1 - (*mqc->curctx)->mps);
|
|
||||||
*mqc->curctx = (*mqc->curctx)->nlps;
|
|
||||||
} else {
|
|
||||||
d = (OPJ_INT32)(*mqc->curctx)->mps;
|
|
||||||
*mqc->curctx = (*mqc->curctx)->nmps;
|
|
||||||
}
|
|
||||||
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
FIXME DOC
|
|
||||||
@param mqc MQC handle
|
|
||||||
@return
|
|
||||||
*/
|
|
||||||
static INLINE OPJ_INT32 opj_mqc_lpsexchange(opj_mqc_t *const mqc) {
|
|
||||||
OPJ_INT32 d;
|
|
||||||
if (mqc->a < (*mqc->curctx)->qeval) {
|
|
||||||
mqc->a = (*mqc->curctx)->qeval;
|
|
||||||
d = (OPJ_INT32)(*mqc->curctx)->mps;
|
|
||||||
*mqc->curctx = (*mqc->curctx)->nmps;
|
|
||||||
} else {
|
|
||||||
mqc->a = (*mqc->curctx)->qeval;
|
|
||||||
d = (OPJ_INT32)(1 - (*mqc->curctx)->mps);
|
|
||||||
*mqc->curctx = (*mqc->curctx)->nlps;
|
|
||||||
}
|
|
||||||
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Input a byte
|
|
||||||
@param mqc MQC handle
|
|
||||||
*/
|
|
||||||
#ifdef MQC_PERF_OPT
|
|
||||||
static INLINE void opj_mqc_bytein(opj_mqc_t *const mqc) {
|
|
||||||
unsigned int i = *((unsigned int *) mqc->bp);
|
|
||||||
mqc->c += i & 0xffff00;
|
|
||||||
mqc->ct = i & 0x0f;
|
|
||||||
mqc->bp += (i >> 2) & 0x04;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static INLINE void opj_mqc_bytein(opj_mqc_t *const mqc) {
|
|
||||||
if (mqc->bp != mqc->end) {
|
|
||||||
OPJ_UINT32 c;
|
|
||||||
if (mqc->bp + 1 != mqc->end) {
|
|
||||||
c = *(mqc->bp + 1);
|
|
||||||
} else {
|
|
||||||
c = 0xff;
|
|
||||||
}
|
|
||||||
if (*mqc->bp == 0xff) {
|
|
||||||
if (c > 0x8f) {
|
|
||||||
mqc->c += 0xff00;
|
|
||||||
mqc->ct = 8;
|
|
||||||
} else {
|
|
||||||
mqc->bp++;
|
|
||||||
mqc->c += c << 9;
|
|
||||||
mqc->ct = 7;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
mqc->bp++;
|
|
||||||
mqc->c += c << 8;
|
|
||||||
mqc->ct = 8;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
mqc->c += 0xff00;
|
|
||||||
mqc->ct = 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
Renormalize mqc->a and mqc->c while decoding
|
|
||||||
@param mqc MQC handle
|
|
||||||
*/
|
|
||||||
static INLINE void opj_mqc_renormd(opj_mqc_t *const mqc) {
|
|
||||||
do {
|
|
||||||
if (mqc->ct == 0) {
|
|
||||||
opj_mqc_bytein(mqc);
|
|
||||||
}
|
|
||||||
mqc->a <<= 1;
|
|
||||||
mqc->c <<= 1;
|
|
||||||
mqc->ct--;
|
|
||||||
} while (mqc->a < 0x8000);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Decode a symbol
|
|
||||||
@param mqc MQC handle
|
|
||||||
@return Returns the decoded symbol (0 or 1)
|
|
||||||
*/
|
|
||||||
static INLINE OPJ_INT32 opj_mqc_decode(opj_mqc_t *const mqc) {
|
|
||||||
OPJ_INT32 d;
|
|
||||||
mqc->a -= (*mqc->curctx)->qeval;
|
|
||||||
if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
|
|
||||||
d = opj_mqc_lpsexchange(mqc);
|
|
||||||
opj_mqc_renormd(mqc);
|
|
||||||
} else {
|
|
||||||
mqc->c -= (*mqc->curctx)->qeval << 16;
|
|
||||||
if ((mqc->a & 0x8000) == 0) {
|
|
||||||
d = opj_mqc_mpsexchange(mqc);
|
|
||||||
opj_mqc_renormd(mqc);
|
|
||||||
} else {
|
|
||||||
d = (OPJ_INT32)(*mqc->curctx)->mps;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __MQC_INL_H */
|
|
@ -239,9 +239,6 @@ opj_codec_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT p_format)
|
|||||||
OPJ_UINT32 res_factor,
|
OPJ_UINT32 res_factor,
|
||||||
struct opj_event_mgr * p_manager)) opj_j2k_set_decoded_resolution_factor;
|
struct opj_event_mgr * p_manager)) opj_j2k_set_decoded_resolution_factor;
|
||||||
|
|
||||||
l_codec->opj_set_threads =
|
|
||||||
(OPJ_BOOL (*) ( void * p_codec, OPJ_UINT32 num_threads )) opj_j2k_set_threads;
|
|
||||||
|
|
||||||
l_codec->m_codec = opj_j2k_create_decompress();
|
l_codec->m_codec = opj_j2k_create_decompress();
|
||||||
|
|
||||||
if (! l_codec->m_codec) {
|
if (! l_codec->m_codec) {
|
||||||
@ -318,9 +315,6 @@ opj_codec_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT p_format)
|
|||||||
OPJ_UINT32 res_factor,
|
OPJ_UINT32 res_factor,
|
||||||
opj_event_mgr_t * p_manager)) opj_jp2_set_decoded_resolution_factor;
|
opj_event_mgr_t * p_manager)) opj_jp2_set_decoded_resolution_factor;
|
||||||
|
|
||||||
l_codec->opj_set_threads =
|
|
||||||
(OPJ_BOOL (*) ( void * p_codec, OPJ_UINT32 num_threads )) opj_jp2_set_threads;
|
|
||||||
|
|
||||||
l_codec->m_codec = opj_jp2_create(OPJ_TRUE);
|
l_codec->m_codec = opj_jp2_create(OPJ_TRUE);
|
||||||
|
|
||||||
if (! l_codec->m_codec) {
|
if (! l_codec->m_codec) {
|
||||||
@ -360,18 +354,6 @@ void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *paramete
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
OPJ_BOOL OPJ_CALLCONV opj_codec_set_threads(opj_codec_t *p_codec,
|
|
||||||
int num_threads)
|
|
||||||
{
|
|
||||||
if (p_codec && (num_threads >= 0)) {
|
|
||||||
opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
|
|
||||||
|
|
||||||
return l_codec->opj_set_threads(l_codec->m_codec, (OPJ_UINT32)num_threads);
|
|
||||||
}
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
OPJ_BOOL OPJ_CALLCONV opj_setup_decoder(opj_codec_t *p_codec,
|
OPJ_BOOL OPJ_CALLCONV opj_setup_decoder(opj_codec_t *p_codec,
|
||||||
opj_dparameters_t *parameters
|
opj_dparameters_t *parameters
|
||||||
)
|
)
|
||||||
|
@ -1262,25 +1262,6 @@ OPJ_API void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *
|
|||||||
OPJ_API OPJ_BOOL OPJ_CALLCONV opj_setup_decoder(opj_codec_t *p_codec,
|
OPJ_API OPJ_BOOL OPJ_CALLCONV opj_setup_decoder(opj_codec_t *p_codec,
|
||||||
opj_dparameters_t *parameters );
|
opj_dparameters_t *parameters );
|
||||||
|
|
||||||
/**
|
|
||||||
* Allocates worker threads for the compressor/decompressor.
|
|
||||||
*
|
|
||||||
* By default, only the main thread is used. If this function is not used,
|
|
||||||
* but the OPJ_NUM_THREADS environment variable is set, its value will be
|
|
||||||
* used to initialize the number of threads. The value can be either an integer
|
|
||||||
* number, or "ALL_CPUS". If OPJ_NUM_THREADS is set and this function is called,
|
|
||||||
* this function will override the behaviour of the environment variable.
|
|
||||||
*
|
|
||||||
* Note: currently only has effect on the decompressor.
|
|
||||||
*
|
|
||||||
* @param p_codec decompressor handler
|
|
||||||
* @param num_threads number of threads.
|
|
||||||
*
|
|
||||||
* @return OPJ_TRUE if the decoder is correctly set
|
|
||||||
*/
|
|
||||||
OPJ_API OPJ_BOOL OPJ_CALLCONV opj_codec_set_threads(opj_codec_t *p_codec,
|
|
||||||
int num_threads);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes an image header.
|
* Decodes an image header.
|
||||||
*
|
*
|
||||||
@ -1573,19 +1554,6 @@ OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_MCT( opj_cparameters_t *parameters,
|
|||||||
OPJ_INT32 * p_dc_shift,
|
OPJ_INT32 * p_dc_shift,
|
||||||
OPJ_UINT32 pNbComp);
|
OPJ_UINT32 pNbComp);
|
||||||
|
|
||||||
/*
|
|
||||||
==========================================================
|
|
||||||
Thread functions
|
|
||||||
==========================================================
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** Returns if the library is built with thread support.
|
|
||||||
* OPJ_TRUE if mutex, condition, thread, thread pool are available.
|
|
||||||
*/
|
|
||||||
OPJ_API OPJ_BOOL OPJ_CALLCONV opj_has_thread_support(void);
|
|
||||||
|
|
||||||
/** Return the number of virtual CPUs */
|
|
||||||
OPJ_API int OPJ_CALLCONV opj_get_num_cpus(void);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -113,7 +113,6 @@ typedef struct opj_codec_private
|
|||||||
OPJ_BOOL (*opj_set_decoded_resolution_factor) ( void * p_codec,
|
OPJ_BOOL (*opj_set_decoded_resolution_factor) ( void * p_codec,
|
||||||
OPJ_UINT32 res_factor,
|
OPJ_UINT32 res_factor,
|
||||||
opj_event_mgr_t * p_manager);
|
opj_event_mgr_t * p_manager);
|
||||||
|
|
||||||
} m_decompression;
|
} m_decompression;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -158,9 +157,6 @@ typedef struct opj_codec_private
|
|||||||
void (*opj_dump_codec) (void * p_codec, OPJ_INT32 info_flag, FILE* output_stream);
|
void (*opj_dump_codec) (void * p_codec, OPJ_INT32 info_flag, FILE* output_stream);
|
||||||
opj_codestream_info_v2_t* (*opj_get_codec_info)(void* p_codec);
|
opj_codestream_info_v2_t* (*opj_get_codec_info)(void* p_codec);
|
||||||
opj_codestream_index_t* (*opj_get_codec_index)(void* p_codec);
|
opj_codestream_index_t* (*opj_get_codec_index)(void* p_codec);
|
||||||
|
|
||||||
/** Set number of threads */
|
|
||||||
OPJ_BOOL (*opj_set_threads) ( void * p_codec, OPJ_UINT32 num_threads );
|
|
||||||
}
|
}
|
||||||
opj_codec_private_t;
|
opj_codec_private_t;
|
||||||
|
|
||||||
|
@ -54,7 +54,6 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Use fseeko() and ftello() if they are available since they use
|
Use fseeko() and ftello() if they are available since they use
|
||||||
@ -104,21 +103,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Are restricted pointers available? (C99) */
|
/* Are restricted pointers available? (C99) */
|
||||||
#if (__STDC_VERSION__ >= 199901L)
|
#if (__STDC_VERSION__ != 199901L)
|
||||||
#define OPJ_RESTRICT restrict
|
|
||||||
#else
|
|
||||||
/* Not a C99 compiler */
|
/* Not a C99 compiler */
|
||||||
#if defined(__GNUC__)
|
#ifdef __GNUC__
|
||||||
#define OPJ_RESTRICT __restrict__
|
#define restrict __restrict__
|
||||||
|
|
||||||
/*
|
|
||||||
vc14 (2015) outputs wrong results.
|
|
||||||
Need to check OPJ_RESTRICT usage (or a bug in vc14)
|
|
||||||
#elif defined(_MSC_VER) && (_MSC_VER >= 1400)
|
|
||||||
#define OPJ_RESTRICT __restrict
|
|
||||||
*/
|
|
||||||
#else
|
#else
|
||||||
#define OPJ_RESTRICT /* restrict */
|
#define restrict /* restrict */
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -184,9 +174,6 @@ static INLINE long opj_lrintf(float f) {
|
|||||||
# pragma intrinsic(__emul)
|
# pragma intrinsic(__emul)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Type to use for bit-fields in internal headers */
|
|
||||||
typedef unsigned int OPJ_BITFIELD;
|
|
||||||
|
|
||||||
#include "opj_inttypes.h"
|
#include "opj_inttypes.h"
|
||||||
#include "opj_clock.h"
|
#include "opj_clock.h"
|
||||||
#include "opj_malloc.h"
|
#include "opj_malloc.h"
|
||||||
@ -195,9 +182,6 @@ typedef unsigned int OPJ_BITFIELD;
|
|||||||
#include "bio.h"
|
#include "bio.h"
|
||||||
#include "cio.h"
|
#include "cio.h"
|
||||||
|
|
||||||
#include "thread.h"
|
|
||||||
#include "tls_keys.h"
|
|
||||||
|
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
#include "invert.h"
|
#include "invert.h"
|
||||||
#include "j2k.h"
|
#include "j2k.h"
|
||||||
|
@ -196,10 +196,10 @@ void * opj_malloc(size_t size)
|
|||||||
}
|
}
|
||||||
void * opj_calloc(size_t num, size_t size)
|
void * opj_calloc(size_t num, size_t size)
|
||||||
{
|
{
|
||||||
if (num == 0 || size == 0) {
|
if (size == 0U) { /* prevent implementation defined behavior of realloc */
|
||||||
/* prevent implementation defined behavior of realloc */
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
/* according to C89 standard, num == 0 shall return a valid pointer */
|
||||||
return calloc(num, size);
|
return calloc(num, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1237,15 +1237,9 @@ opj_pi_iterator_t *opj_pi_create_decode(opj_image_t *p_image,
|
|||||||
l_current_pi = l_pi;
|
l_current_pi = l_pi;
|
||||||
|
|
||||||
/* memory allocation for include */
|
/* memory allocation for include */
|
||||||
/* prevent an integer overflow issue */
|
l_current_pi->include = (OPJ_INT16*) opj_calloc((l_tcp->numlayers +1) * l_step_l, sizeof(OPJ_INT16));
|
||||||
/* 0 < l_tcp->numlayers < 65536 c.f. opj_j2k_read_cod in j2k.c */
|
if
|
||||||
l_current_pi->include = 00;
|
(!l_current_pi->include)
|
||||||
if (l_step_l <= (SIZE_MAX / (l_tcp->numlayers + 1U)))
|
|
||||||
{
|
|
||||||
l_current_pi->include = (OPJ_INT16*) opj_calloc((size_t)(l_tcp->numlayers + 1U) * l_step_l, sizeof(OPJ_INT16));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!l_current_pi->include)
|
|
||||||
{
|
{
|
||||||
opj_free(l_tmp_data);
|
opj_free(l_tmp_data);
|
||||||
opj_free(l_tmp_ptr);
|
opj_free(l_tmp_ptr);
|
||||||
|
1424
src/lib/openjp2/t1.c
1424
src/lib/openjp2/t1.c
File diff suppressed because it is too large
Load Diff
@ -50,74 +50,48 @@ in T1.C are used by some function in TCD.C.
|
|||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
#define T1_NMSEDEC_BITS 7
|
#define T1_NMSEDEC_BITS 7
|
||||||
|
|
||||||
/* CAUTION: the value of those constants must not be changed, otherwise the */
|
#define T1_SIG_NE 0x0001 /**< Context orientation : North-East direction */
|
||||||
/* optimization of opj_t1_updateflags() will break! */
|
#define T1_SIG_SE 0x0002 /**< Context orientation : South-East direction */
|
||||||
/* BEGINNING of flags that apply to opj_flag_t */
|
#define T1_SIG_SW 0x0004 /**< Context orientation : South-West direction */
|
||||||
#define T1_SIG_NE 0x0001U /**< Context orientation : North-East direction */
|
#define T1_SIG_NW 0x0008 /**< Context orientation : North-West direction */
|
||||||
#define T1_SIG_SE 0x0002U /**< Context orientation : South-East direction */
|
#define T1_SIG_N 0x0010 /**< Context orientation : North direction */
|
||||||
#define T1_SIG_SW 0x0004U /**< Context orientation : South-West direction */
|
#define T1_SIG_E 0x0020 /**< Context orientation : East direction */
|
||||||
#define T1_SIG_NW 0x0008U /**< Context orientation : North-West direction */
|
#define T1_SIG_S 0x0040 /**< Context orientation : South direction */
|
||||||
#define T1_SIG_N 0x0010U /**< Context orientation : North direction */
|
#define T1_SIG_W 0x0080 /**< Context orientation : West direction */
|
||||||
#define T1_SIG_E 0x0020U /**< Context orientation : East direction */
|
|
||||||
#define T1_SIG_S 0x0040U /**< Context orientation : South direction */
|
|
||||||
#define T1_SIG_W 0x0080U /**< Context orientation : West direction */
|
|
||||||
#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW)
|
#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW)
|
||||||
#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W)
|
#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W)
|
||||||
|
|
||||||
#define T1_SGN_N 0x0100U
|
#define T1_SGN_N 0x0100
|
||||||
#define T1_SGN_E 0x0200U
|
#define T1_SGN_E 0x0200
|
||||||
#define T1_SGN_S 0x0400U
|
#define T1_SGN_S 0x0400
|
||||||
#define T1_SGN_W 0x0800U
|
#define T1_SGN_W 0x0800
|
||||||
#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W)
|
#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W)
|
||||||
|
|
||||||
#define T1_SIG 0x1000U /**< No longer used by decoder */
|
#define T1_SIG 0x1000
|
||||||
#define T1_REFINE 0x2000U /**< No longer used by decoder */
|
#define T1_REFINE 0x2000
|
||||||
#define T1_VISIT 0x4000U /**< No longer used by decoder */
|
#define T1_VISIT 0x4000
|
||||||
/* END of flags that apply to opj_flag_t */
|
|
||||||
|
|
||||||
#define T1_NUMCTXS_ZC 9
|
#define T1_NUMCTXS_ZC 9
|
||||||
#define T1_NUMCTXS_SC 5
|
#define T1_NUMCTXS_SC 5
|
||||||
#define T1_NUMCTXS_MAG 3
|
#define T1_NUMCTXS_MAG 3
|
||||||
#define T1_NUMCTXS_AGG 1
|
#define T1_NUMCTXS_AGG 1
|
||||||
#define T1_NUMCTXS_UNI 1
|
#define T1_NUMCTXS_UNI 1
|
||||||
|
|
||||||
#define T1_CTXNO_ZC 0
|
#define T1_CTXNO_ZC 0
|
||||||
#define T1_CTXNO_SC (T1_CTXNO_ZC+T1_NUMCTXS_ZC)
|
#define T1_CTXNO_SC (T1_CTXNO_ZC+T1_NUMCTXS_ZC)
|
||||||
#define T1_CTXNO_MAG (T1_CTXNO_SC+T1_NUMCTXS_SC)
|
#define T1_CTXNO_MAG (T1_CTXNO_SC+T1_NUMCTXS_SC)
|
||||||
#define T1_CTXNO_AGG (T1_CTXNO_MAG+T1_NUMCTXS_MAG)
|
#define T1_CTXNO_AGG (T1_CTXNO_MAG+T1_NUMCTXS_MAG)
|
||||||
#define T1_CTXNO_UNI (T1_CTXNO_AGG+T1_NUMCTXS_AGG)
|
#define T1_CTXNO_UNI (T1_CTXNO_AGG+T1_NUMCTXS_AGG)
|
||||||
#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI)
|
#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI)
|
||||||
|
|
||||||
#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1)
|
#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1)
|
||||||
|
|
||||||
#define T1_TYPE_MQ 0 /**< Normal coding using entropy coder */
|
#define T1_TYPE_MQ 0 /**< Normal coding using entropy coder */
|
||||||
#define T1_TYPE_RAW 1 /**< No encoding the information is store under raw format in codestream (mode switch RAW)*/
|
#define T1_TYPE_RAW 1 /**< No encoding the information is store under raw format in codestream (mode switch RAW)*/
|
||||||
|
|
||||||
/* Those flags are used by opj_colflag_t */
|
|
||||||
#define T1_COLFLAG_RBS 4U /* RBS = Row Bit Shift */
|
|
||||||
#define T1_COLFLAG_SIG_OTHER_ROW_0 (1U << 0U) /**< This sample has at least one significant neighbour */
|
|
||||||
#define T1_COLFLAG_SIG_ROW_0 (1U << 1U) /**< This sample is significant */
|
|
||||||
#define T1_COLFLAG_VISIT_ROW_0 (1U << 2U) /**< This sample has been visited */
|
|
||||||
#define T1_COLFLAG_REFINE_ROW_0 (1U << 3U) /**< This sample has been refined */
|
|
||||||
#define T1_COLFLAG_SIG_OTHER_ROW_1 (T1_COLFLAG_SIG_OTHER_ROW_0 << (1U * T1_COLFLAG_RBS))
|
|
||||||
#define T1_COLFLAG_SIG_ROW_1 (T1_COLFLAG_SIG_ROW_0 << (1U * T1_COLFLAG_RBS))
|
|
||||||
#define T1_COLFLAG_VISIT_ROW_1 (T1_COLFLAG_VISIT_ROW_0 << (1U * T1_COLFLAG_RBS))
|
|
||||||
#define T1_COLFLAG_REFINE_ROW_1 (T1_COLFLAG_REFINE_ROW_0 << (1U * T1_COLFLAG_RBS))
|
|
||||||
#define T1_COLFLAG_SIG_OTHER_ROW_2 (T1_COLFLAG_SIG_OTHER_ROW_0 << (2U * T1_COLFLAG_RBS))
|
|
||||||
#define T1_COLFLAG_SIG_ROW_2 (T1_COLFLAG_SIG_ROW_0 << (2U * T1_COLFLAG_RBS))
|
|
||||||
#define T1_COLFLAG_VISIT_ROW_2 (T1_COLFLAG_VISIT_ROW_0 << (2U * T1_COLFLAG_RBS))
|
|
||||||
#define T1_COLFLAG_REFINE_ROW_2 (T1_COLFLAG_REFINE_ROW_0 << (2U * T1_COLFLAG_RBS))
|
|
||||||
#define T1_COLFLAG_SIG_OTHER_ROW_3 (T1_COLFLAG_SIG_OTHER_ROW_0 << (3U * T1_COLFLAG_RBS))
|
|
||||||
#define T1_COLFLAG_SIG_ROW_3 (T1_COLFLAG_SIG_ROW_0 << (3U * T1_COLFLAG_RBS))
|
|
||||||
#define T1_COLFLAG_VISIT_ROW_3 (T1_COLFLAG_VISIT_ROW_0 << (3U * T1_COLFLAG_RBS))
|
|
||||||
#define T1_COLFLAG_REFINE_ROW_3 (T1_COLFLAG_REFINE_ROW_0 << (3U * T1_COLFLAG_RBS))
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
typedef OPJ_UINT16 opj_flag_t;
|
typedef OPJ_INT16 opj_flag_t;
|
||||||
|
|
||||||
/** Flags for 4 consecutive rows of a column */
|
|
||||||
typedef OPJ_UINT16 opj_colflag_t;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Tier-1 coding (coding of code-block coefficients)
|
Tier-1 coding (coding of code-block coefficients)
|
||||||
@ -131,17 +105,11 @@ typedef struct opj_t1 {
|
|||||||
|
|
||||||
OPJ_INT32 *data;
|
OPJ_INT32 *data;
|
||||||
opj_flag_t *flags;
|
opj_flag_t *flags;
|
||||||
/** Addition flag array such that colflags[1+0] is for state of col=0,row=0..3,
|
|
||||||
colflags[1+1] for col=1, row=0..3, colflags[1+flags_stride] for col=0,row=4..7, ...
|
|
||||||
This array avoids too much cache trashing when processing by 4 vertical samples
|
|
||||||
as done in the various decoding steps. */
|
|
||||||
opj_colflag_t* colflags;
|
|
||||||
OPJ_UINT32 w;
|
OPJ_UINT32 w;
|
||||||
OPJ_UINT32 h;
|
OPJ_UINT32 h;
|
||||||
OPJ_UINT32 datasize;
|
OPJ_UINT32 datasize;
|
||||||
OPJ_UINT32 flagssize;
|
OPJ_UINT32 flagssize;
|
||||||
OPJ_UINT32 flags_stride;
|
OPJ_UINT32 flags_stride;
|
||||||
OPJ_UINT32 colflags_size;
|
|
||||||
OPJ_UINT32 data_stride;
|
OPJ_UINT32 data_stride;
|
||||||
OPJ_BOOL encoder;
|
OPJ_BOOL encoder;
|
||||||
} opj_t1_t;
|
} opj_t1_t;
|
||||||
@ -172,8 +140,7 @@ Decode the code-blocks of a tile
|
|||||||
@param tilec The tile to decode
|
@param tilec The tile to decode
|
||||||
@param tccp Tile coding parameters
|
@param tccp Tile coding parameters
|
||||||
*/
|
*/
|
||||||
void opj_t1_decode_cblks( opj_thread_pool_t* tp,
|
OPJ_BOOL opj_t1_decode_cblks( opj_t1_t* t1,
|
||||||
volatile OPJ_BOOL* pret,
|
|
||||||
opj_tcd_tilecomp_t* tilec,
|
opj_tcd_tilecomp_t* tilec,
|
||||||
opj_tccp_t* tccp);
|
opj_tccp_t* tccp);
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
#include "opj_includes.h"
|
#include "opj_includes.h"
|
||||||
|
|
||||||
static int t1_init_ctxno_zc(unsigned int f, unsigned int orient) {
|
static int t1_init_ctxno_zc(int f, int orient) {
|
||||||
int h, v, d, n, t, hv;
|
int h, v, d, n, t, hv;
|
||||||
h = ((f & T1_SIG_W) != 0) + ((f & T1_SIG_E) != 0);
|
h = ((f & T1_SIG_W) != 0) + ((f & T1_SIG_E) != 0);
|
||||||
v = ((f & T1_SIG_N) != 0) + ((f & T1_SIG_S) != 0);
|
v = ((f & T1_SIG_N) != 0) + ((f & T1_SIG_S) != 0);
|
||||||
@ -52,7 +52,6 @@ static int t1_init_ctxno_zc(unsigned int f, unsigned int orient) {
|
|||||||
t = h;
|
t = h;
|
||||||
h = v;
|
h = v;
|
||||||
v = t;
|
v = t;
|
||||||
/* fall through */
|
|
||||||
case 0:
|
case 0:
|
||||||
case 1:
|
case 1:
|
||||||
if (!h) {
|
if (!h) {
|
||||||
@ -113,7 +112,7 @@ static int t1_init_ctxno_zc(unsigned int f, unsigned int orient) {
|
|||||||
return (T1_CTXNO_ZC + n);
|
return (T1_CTXNO_ZC + n);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int t1_init_ctxno_sc(unsigned int f) {
|
static int t1_init_ctxno_sc(int f) {
|
||||||
int hc, vc, n;
|
int hc, vc, n;
|
||||||
n = 0;
|
n = 0;
|
||||||
|
|
||||||
@ -154,7 +153,7 @@ static int t1_init_ctxno_sc(unsigned int f) {
|
|||||||
return (T1_CTXNO_SC + n);
|
return (T1_CTXNO_SC + n);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int t1_init_spb(unsigned int f) {
|
static int t1_init_spb(int f) {
|
||||||
int hc, vc, n;
|
int hc, vc, n;
|
||||||
|
|
||||||
hc = opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
|
hc = opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
|
||||||
@ -192,7 +191,7 @@ static void dump_array16(int array[],int size){
|
|||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
int i, j;
|
||||||
double u, v, t;
|
double u, v, t;
|
||||||
|
|
||||||
int lut_ctxno_zc[1024];
|
int lut_ctxno_zc[1024];
|
||||||
@ -205,47 +204,47 @@ int main(int argc, char **argv)
|
|||||||
printf("/* This file was automatically generated by t1_generate_luts.c */\n\n");
|
printf("/* This file was automatically generated by t1_generate_luts.c */\n\n");
|
||||||
|
|
||||||
/* lut_ctxno_zc */
|
/* lut_ctxno_zc */
|
||||||
for (j = 0U; j < 4U; ++j) {
|
for (j = 0; j < 4; ++j) {
|
||||||
for (i = 0U; i < 256U; ++i) {
|
for (i = 0; i < 256; ++i) {
|
||||||
unsigned int orient = j;
|
int orient = j;
|
||||||
if (orient == 2U) {
|
if (orient == 2) {
|
||||||
orient = 1U;
|
orient = 1;
|
||||||
} else if (orient == 1U) {
|
} else if (orient == 1) {
|
||||||
orient = 2U;
|
orient = 2;
|
||||||
}
|
}
|
||||||
lut_ctxno_zc[(orient << 8) | i] = t1_init_ctxno_zc(i, j);
|
lut_ctxno_zc[(orient << 8) | i] = t1_init_ctxno_zc(i, j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("static const OPJ_BYTE lut_ctxno_zc[1024] = {\n ");
|
printf("static OPJ_BYTE lut_ctxno_zc[1024] = {\n ");
|
||||||
for (i = 0U; i < 1023U; ++i) {
|
for (i = 0; i < 1023; ++i) {
|
||||||
printf("%i, ", lut_ctxno_zc[i]);
|
printf("%i, ", lut_ctxno_zc[i]);
|
||||||
if(!((i+1U)&0x1fU))
|
if(!((i+1)&0x1f))
|
||||||
printf("\n ");
|
printf("\n ");
|
||||||
}
|
}
|
||||||
printf("%i\n};\n\n", lut_ctxno_zc[1023]);
|
printf("%i\n};\n\n", lut_ctxno_zc[1023]);
|
||||||
|
|
||||||
/* lut_ctxno_sc */
|
/* lut_ctxno_sc */
|
||||||
printf("static const OPJ_BYTE lut_ctxno_sc[256] = {\n ");
|
printf("static OPJ_BYTE lut_ctxno_sc[256] = {\n ");
|
||||||
for (i = 0U; i < 255U; ++i) {
|
for (i = 0; i < 255; ++i) {
|
||||||
printf("0x%x, ", t1_init_ctxno_sc(i << 4));
|
printf("0x%x, ", t1_init_ctxno_sc(i << 4));
|
||||||
if(!((i+1U)&0xfU))
|
if(!((i+1)&0xf))
|
||||||
printf("\n ");
|
printf("\n ");
|
||||||
}
|
}
|
||||||
printf("0x%x\n};\n\n", t1_init_ctxno_sc(255U << 4));
|
printf("0x%x\n};\n\n", t1_init_ctxno_sc(255 << 4));
|
||||||
|
|
||||||
/* lut_spb */
|
/* lut_spb */
|
||||||
printf("static const OPJ_BYTE lut_spb[256] = {\n ");
|
printf("static OPJ_BYTE lut_spb[256] = {\n ");
|
||||||
for (i = 0U; i < 255U; ++i) {
|
for (i = 0; i < 255; ++i) {
|
||||||
printf("%i, ", t1_init_spb(i << 4));
|
printf("%i, ", t1_init_spb(i << 4));
|
||||||
if(!((i+1U)&0x1fU))
|
if(!((i+1)&0x1f))
|
||||||
printf("\n ");
|
printf("\n ");
|
||||||
}
|
}
|
||||||
printf("%i\n};\n\n", t1_init_spb(255U << 4));
|
printf("%i\n};\n\n", t1_init_spb(255 << 4));
|
||||||
|
|
||||||
/* FIXME FIXME FIXME */
|
/* FIXME FIXME FIXME */
|
||||||
/* fprintf(stdout,"nmsedec luts:\n"); */
|
/* fprintf(stdout,"nmsedec luts:\n"); */
|
||||||
for (i = 0U; i < (1U << T1_NMSEDEC_BITS); ++i) {
|
for (i = 0; i < (1 << T1_NMSEDEC_BITS); ++i) {
|
||||||
t = i / pow(2, T1_NMSEDEC_FRACBITS);
|
t = i / pow(2, T1_NMSEDEC_FRACBITS);
|
||||||
u = t;
|
u = t;
|
||||||
v = t - 1.5;
|
v = t - 1.5;
|
||||||
@ -269,17 +268,17 @@ int main(int argc, char **argv)
|
|||||||
(int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
|
(int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("static const OPJ_INT16 lut_nmsedec_sig[1U << T1_NMSEDEC_BITS] = {\n ");
|
printf("static OPJ_INT16 lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {\n ");
|
||||||
dump_array16(lut_nmsedec_sig, 1U << T1_NMSEDEC_BITS);
|
dump_array16(lut_nmsedec_sig, 1 << T1_NMSEDEC_BITS);
|
||||||
|
|
||||||
printf("static const OPJ_INT16 lut_nmsedec_sig0[1U << T1_NMSEDEC_BITS] = {\n ");
|
printf("static OPJ_INT16 lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {\n ");
|
||||||
dump_array16(lut_nmsedec_sig0, 1U << T1_NMSEDEC_BITS);
|
dump_array16(lut_nmsedec_sig0, 1 << T1_NMSEDEC_BITS);
|
||||||
|
|
||||||
printf("static const OPJ_INT16 lut_nmsedec_ref[1U << T1_NMSEDEC_BITS] = {\n ");
|
printf("static OPJ_INT16 lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {\n ");
|
||||||
dump_array16(lut_nmsedec_ref, 1U << T1_NMSEDEC_BITS);
|
dump_array16(lut_nmsedec_ref, 1 << T1_NMSEDEC_BITS);
|
||||||
|
|
||||||
printf("static const OPJ_INT16 lut_nmsedec_ref0[1U << T1_NMSEDEC_BITS] = {\n ");
|
printf("static OPJ_INT16 lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {\n ");
|
||||||
dump_array16(lut_nmsedec_ref0, 1U << T1_NMSEDEC_BITS);
|
dump_array16(lut_nmsedec_ref0, 1 << T1_NMSEDEC_BITS);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* This file was automatically generated by t1_generate_luts.c */
|
/* This file was automatically generated by t1_generate_luts.c */
|
||||||
|
|
||||||
static const OPJ_BYTE lut_ctxno_zc[1024] = {
|
static OPJ_BYTE lut_ctxno_zc[1024] = {
|
||||||
0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||||
5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||||
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||||
@ -35,7 +35,7 @@ static const OPJ_BYTE lut_ctxno_zc[1024] = {
|
|||||||
2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8
|
2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8
|
||||||
};
|
};
|
||||||
|
|
||||||
static const OPJ_BYTE lut_ctxno_sc[256] = {
|
static OPJ_BYTE lut_ctxno_sc[256] = {
|
||||||
0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd,
|
0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd,
|
||||||
0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc,
|
0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc,
|
||||||
0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa,
|
0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa,
|
||||||
@ -54,7 +54,7 @@ static const OPJ_BYTE lut_ctxno_sc[256] = {
|
|||||||
0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd
|
0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd
|
||||||
};
|
};
|
||||||
|
|
||||||
static const OPJ_BYTE lut_spb[256] = {
|
static OPJ_BYTE lut_spb[256] = {
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0,
|
0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
@ -65,7 +65,7 @@ static const OPJ_BYTE lut_spb[256] = {
|
|||||||
0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
|
0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
|
||||||
};
|
};
|
||||||
|
|
||||||
static const OPJ_INT16 lut_nmsedec_sig[1U << T1_NMSEDEC_BITS] = {
|
static OPJ_INT16 lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {
|
||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
@ -84,7 +84,7 @@ static const OPJ_INT16 lut_nmsedec_sig[1U << T1_NMSEDEC_BITS] = {
|
|||||||
0x6c00, 0x6d80, 0x6f00, 0x7080, 0x7200, 0x7380, 0x7500, 0x7680
|
0x6c00, 0x6d80, 0x6f00, 0x7080, 0x7200, 0x7380, 0x7500, 0x7680
|
||||||
};
|
};
|
||||||
|
|
||||||
static const OPJ_INT16 lut_nmsedec_sig0[1U << T1_NMSEDEC_BITS] = {
|
static OPJ_INT16 lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {
|
||||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080,
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080,
|
||||||
0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200,
|
0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200,
|
||||||
0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400,
|
0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400,
|
||||||
@ -103,7 +103,7 @@ static const OPJ_INT16 lut_nmsedec_sig0[1U << T1_NMSEDEC_BITS] = {
|
|||||||
0x7080, 0x7280, 0x7480, 0x7600, 0x7800, 0x7a00, 0x7c00, 0x7e00
|
0x7080, 0x7280, 0x7480, 0x7600, 0x7800, 0x7a00, 0x7c00, 0x7e00
|
||||||
};
|
};
|
||||||
|
|
||||||
static const OPJ_INT16 lut_nmsedec_ref[1U << T1_NMSEDEC_BITS] = {
|
static OPJ_INT16 lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {
|
||||||
0x1800, 0x1780, 0x1700, 0x1680, 0x1600, 0x1580, 0x1500, 0x1480,
|
0x1800, 0x1780, 0x1700, 0x1680, 0x1600, 0x1580, 0x1500, 0x1480,
|
||||||
0x1400, 0x1380, 0x1300, 0x1280, 0x1200, 0x1180, 0x1100, 0x1080,
|
0x1400, 0x1380, 0x1300, 0x1280, 0x1200, 0x1180, 0x1100, 0x1080,
|
||||||
0x1000, 0x0f80, 0x0f00, 0x0e80, 0x0e00, 0x0d80, 0x0d00, 0x0c80,
|
0x1000, 0x0f80, 0x0f00, 0x0e80, 0x0e00, 0x0d80, 0x0d00, 0x0c80,
|
||||||
@ -122,7 +122,7 @@ static const OPJ_INT16 lut_nmsedec_ref[1U << T1_NMSEDEC_BITS] = {
|
|||||||
0x1400, 0x1480, 0x1500, 0x1580, 0x1600, 0x1680, 0x1700, 0x1780
|
0x1400, 0x1480, 0x1500, 0x1580, 0x1600, 0x1680, 0x1700, 0x1780
|
||||||
};
|
};
|
||||||
|
|
||||||
static const OPJ_INT16 lut_nmsedec_ref0[1U << T1_NMSEDEC_BITS] = {
|
static OPJ_INT16 lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {
|
||||||
0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x1b00, 0x1a80, 0x1980,
|
0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x1b00, 0x1a80, 0x1980,
|
||||||
0x1880, 0x1780, 0x1700, 0x1600, 0x1500, 0x1480, 0x1380, 0x1300,
|
0x1880, 0x1780, 0x1700, 0x1600, 0x1500, 0x1480, 0x1380, 0x1300,
|
||||||
0x1200, 0x1180, 0x1080, 0x1000, 0x0f00, 0x0e80, 0x0e00, 0x0d00,
|
0x1200, 0x1180, 0x1080, 0x1000, 0x0f00, 0x0e80, 0x0e00, 0x0d00,
|
||||||
|
@ -868,14 +868,9 @@ static OPJ_BOOL opj_t2_read_packet_header( opj_t2_t* p_t2,
|
|||||||
|
|
||||||
/* reset tagtrees */
|
/* reset tagtrees */
|
||||||
for (bandno = 0; bandno < l_res->numbands; ++bandno) {
|
for (bandno = 0; bandno < l_res->numbands; ++bandno) {
|
||||||
|
opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
|
||||||
|
|
||||||
if ( ! ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) ) {
|
if ( ! ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) ) {
|
||||||
opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
|
|
||||||
if (!(p_pi->precno < (l_band->precincts_data_size / sizeof(opj_tcd_precinct_t)))) {
|
|
||||||
opj_event_msg(p_manager, EVT_ERROR, "Invalid precinct\n");
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
opj_tgt_reset(l_prc->incltree);
|
opj_tgt_reset(l_prc->incltree);
|
||||||
opj_tgt_reset(l_prc->imsbtree);
|
opj_tgt_reset(l_prc->imsbtree);
|
||||||
l_cblk = l_prc->cblks.dec;
|
l_cblk = l_prc->cblks.dec;
|
||||||
|
@ -580,8 +580,7 @@ OPJ_BOOL opj_tcd_rateallocate( opj_tcd_t *tcd,
|
|||||||
|
|
||||||
OPJ_BOOL opj_tcd_init( opj_tcd_t *p_tcd,
|
OPJ_BOOL opj_tcd_init( opj_tcd_t *p_tcd,
|
||||||
opj_image_t * p_image,
|
opj_image_t * p_image,
|
||||||
opj_cp_t * p_cp,
|
opj_cp_t * p_cp )
|
||||||
opj_thread_pool_t* p_tp )
|
|
||||||
{
|
{
|
||||||
p_tcd->image = p_image;
|
p_tcd->image = p_image;
|
||||||
p_tcd->cp = p_cp;
|
p_tcd->cp = p_cp;
|
||||||
@ -598,7 +597,6 @@ OPJ_BOOL opj_tcd_init( opj_tcd_t *p_tcd,
|
|||||||
|
|
||||||
p_tcd->tcd_image->tiles->numcomps = p_image->numcomps;
|
p_tcd->tcd_image->tiles->numcomps = p_image->numcomps;
|
||||||
p_tcd->tp_pos = p_cp->m_specific_param.m_enc.m_tp_pos;
|
p_tcd->tp_pos = p_cp->m_specific_param.m_enc.m_tp_pos;
|
||||||
p_tcd->thread_pool = p_tp;
|
|
||||||
|
|
||||||
return OPJ_TRUE;
|
return OPJ_TRUE;
|
||||||
}
|
}
|
||||||
@ -698,20 +696,9 @@ static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
|
|||||||
l_tx0 = l_cp->tx0 + p * l_cp->tdx; /* can't be greater than l_image->x1 so won't overflow */
|
l_tx0 = l_cp->tx0 + p * l_cp->tdx; /* can't be greater than l_image->x1 so won't overflow */
|
||||||
l_tile->x0 = (OPJ_INT32)opj_uint_max(l_tx0, l_image->x0);
|
l_tile->x0 = (OPJ_INT32)opj_uint_max(l_tx0, l_image->x0);
|
||||||
l_tile->x1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_tx0, l_cp->tdx), l_image->x1);
|
l_tile->x1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_tx0, l_cp->tdx), l_image->x1);
|
||||||
/* all those OPJ_UINT32 are casted to OPJ_INT32, let's do some sanity check */
|
|
||||||
if ((l_tile->x0 < 0) || (l_tile->x1 <= l_tile->x0)) {
|
|
||||||
opj_event_msg(manager, EVT_ERROR, "Tile X coordinates are not supported\n");
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
l_ty0 = l_cp->ty0 + q * l_cp->tdy; /* can't be greater than l_image->y1 so won't overflow */
|
l_ty0 = l_cp->ty0 + q * l_cp->tdy; /* can't be greater than l_image->y1 so won't overflow */
|
||||||
l_tile->y0 = (OPJ_INT32)opj_uint_max(l_ty0, l_image->y0);
|
l_tile->y0 = (OPJ_INT32)opj_uint_max(l_ty0, l_image->y0);
|
||||||
l_tile->y1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_ty0, l_cp->tdy), l_image->y1);
|
l_tile->y1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_ty0, l_cp->tdy), l_image->y1);
|
||||||
/* all those OPJ_UINT32 are casted to OPJ_INT32, let's do some sanity check */
|
|
||||||
if ((l_tile->y0 < 0) || (l_tile->y1 <= l_tile->y0)) {
|
|
||||||
opj_event_msg(manager, EVT_ERROR, "Tile Y coordinates are not supported\n");
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* testcase 1888.pdf.asan.35.988 */
|
/* testcase 1888.pdf.asan.35.988 */
|
||||||
if (l_tccp->numresolutions == 0) {
|
if (l_tccp->numresolutions == 0) {
|
||||||
@ -733,8 +720,7 @@ static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
|
|||||||
|
|
||||||
/* compute l_data_size with overflow check */
|
/* compute l_data_size with overflow check */
|
||||||
l_data_size = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
|
l_data_size = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
|
||||||
/* issue 733, l_data_size == 0U, probably something wrong should be checked before getting here */
|
if ((((OPJ_UINT32)-1) / l_data_size) < (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0)) {
|
||||||
if ((l_data_size > 0U) && ((((OPJ_UINT32)-1) / l_data_size) < (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0))) {
|
|
||||||
opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile data\n");
|
opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile data\n");
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
}
|
}
|
||||||
@ -821,22 +807,12 @@ static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
|
|||||||
l_br_prc_y_end = opj_int_ceildivpow2(l_res->y1, (OPJ_INT32)l_pdy) << l_pdy;
|
l_br_prc_y_end = opj_int_ceildivpow2(l_res->y1, (OPJ_INT32)l_pdy) << l_pdy;
|
||||||
/*fprintf(stderr, "\t\t\tprc_x_start=%d, prc_y_start=%d, br_prc_x_end=%d, br_prc_y_end=%d \n", l_tl_prc_x_start, l_tl_prc_y_start, l_br_prc_x_end ,l_br_prc_y_end );*/
|
/*fprintf(stderr, "\t\t\tprc_x_start=%d, prc_y_start=%d, br_prc_x_end=%d, br_prc_y_end=%d \n", l_tl_prc_x_start, l_tl_prc_y_start, l_br_prc_x_end ,l_br_prc_y_end );*/
|
||||||
|
|
||||||
l_res->pw = (l_res->x0 == l_res->x1) ? 0U : (OPJ_UINT32)((l_br_prc_x_end - l_tl_prc_x_start) >> l_pdx);
|
l_res->pw = (l_res->x0 == l_res->x1) ? 0 : (OPJ_UINT32)((l_br_prc_x_end - l_tl_prc_x_start) >> l_pdx);
|
||||||
l_res->ph = (l_res->y0 == l_res->y1) ? 0U : (OPJ_UINT32)((l_br_prc_y_end - l_tl_prc_y_start) >> l_pdy);
|
l_res->ph = (l_res->y0 == l_res->y1) ? 0 : (OPJ_UINT32)((l_br_prc_y_end - l_tl_prc_y_start) >> l_pdy);
|
||||||
/*fprintf(stderr, "\t\t\tres_pw=%d, res_ph=%d\n", l_res->pw, l_res->ph );*/
|
/*fprintf(stderr, "\t\t\tres_pw=%d, res_ph=%d\n", l_res->pw, l_res->ph );*/
|
||||||
|
|
||||||
if ((l_res->pw != 0U) && ((((OPJ_UINT32)-1) / l_res->pw) < l_res->ph)) {
|
|
||||||
opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile data\n");
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
l_nb_precincts = l_res->pw * l_res->ph;
|
l_nb_precincts = l_res->pw * l_res->ph;
|
||||||
|
|
||||||
if ((((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof(opj_tcd_precinct_t)) < l_nb_precincts) {
|
|
||||||
opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile data\n");
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
l_nb_precinct_size = l_nb_precincts * (OPJ_UINT32)sizeof(opj_tcd_precinct_t);
|
l_nb_precinct_size = l_nb_precincts * (OPJ_UINT32)sizeof(opj_tcd_precinct_t);
|
||||||
|
|
||||||
if (resno == 0) {
|
if (resno == 0) {
|
||||||
tlcbgxstart = l_tl_prc_x_start;
|
tlcbgxstart = l_tl_prc_x_start;
|
||||||
tlcbgystart = l_tl_prc_y_start;
|
tlcbgystart = l_tl_prc_y_start;
|
||||||
@ -893,7 +869,6 @@ static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
|
|||||||
if (!l_band->precincts && (l_nb_precincts > 0U)) {
|
if (!l_band->precincts && (l_nb_precincts > 0U)) {
|
||||||
l_band->precincts = (opj_tcd_precinct_t *) opj_malloc( /*3 * */ l_nb_precinct_size);
|
l_band->precincts = (opj_tcd_precinct_t *) opj_malloc( /*3 * */ l_nb_precinct_size);
|
||||||
if (! l_band->precincts) {
|
if (! l_band->precincts) {
|
||||||
opj_event_msg(manager, EVT_ERROR, "Not enough memory to handle band precints\n");
|
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
}
|
}
|
||||||
/*fprintf(stderr, "\t\t\t\tAllocate precincts of a band (opj_tcd_precinct_t): %d\n",l_nb_precinct_size); */
|
/*fprintf(stderr, "\t\t\t\tAllocate precincts of a band (opj_tcd_precinct_t): %d\n",l_nb_precinct_size); */
|
||||||
@ -1590,22 +1565,30 @@ static OPJ_BOOL opj_tcd_t2_decode (opj_tcd_t *p_tcd,
|
|||||||
static OPJ_BOOL opj_tcd_t1_decode ( opj_tcd_t *p_tcd )
|
static OPJ_BOOL opj_tcd_t1_decode ( opj_tcd_t *p_tcd )
|
||||||
{
|
{
|
||||||
OPJ_UINT32 compno;
|
OPJ_UINT32 compno;
|
||||||
|
opj_t1_t * l_t1;
|
||||||
opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
|
opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
|
||||||
opj_tcd_tilecomp_t* l_tile_comp = l_tile->comps;
|
opj_tcd_tilecomp_t* l_tile_comp = l_tile->comps;
|
||||||
opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
|
opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
|
||||||
volatile OPJ_BOOL ret = OPJ_TRUE;
|
|
||||||
|
|
||||||
|
l_t1 = opj_t1_create(OPJ_FALSE);
|
||||||
|
if (l_t1 == 00) {
|
||||||
|
return OPJ_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
for (compno = 0; compno < l_tile->numcomps; ++compno) {
|
for (compno = 0; compno < l_tile->numcomps; ++compno) {
|
||||||
opj_t1_decode_cblks(p_tcd->thread_pool, &ret, l_tile_comp, l_tccp);
|
/* The +3 is headroom required by the vectorized DWT */
|
||||||
if( !ret )
|
if (OPJ_FALSE == opj_t1_decode_cblks(l_t1, l_tile_comp, l_tccp)) {
|
||||||
break;
|
opj_t1_destroy(l_t1);
|
||||||
|
return OPJ_FALSE;
|
||||||
|
}
|
||||||
++l_tile_comp;
|
++l_tile_comp;
|
||||||
++l_tccp;
|
++l_tccp;
|
||||||
}
|
}
|
||||||
|
|
||||||
opj_thread_pool_wait_completion(p_tcd->thread_pool, 0);
|
opj_t1_destroy(l_t1);
|
||||||
|
|
||||||
return ret;
|
return OPJ_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1632,7 +1615,7 @@ static OPJ_BOOL opj_tcd_dwt_decode ( opj_tcd_t *p_tcd )
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if (l_tccp->qmfbid == 1) {
|
if (l_tccp->qmfbid == 1) {
|
||||||
if (! opj_dwt_decode(p_tcd->thread_pool, l_tile_comp, l_img_comp->resno_decoded+1)) {
|
if (! opj_dwt_decode(l_tile_comp, l_img_comp->resno_decoded+1)) {
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,7 +70,7 @@ typedef struct opj_tcd_pass {
|
|||||||
OPJ_UINT32 rate;
|
OPJ_UINT32 rate;
|
||||||
OPJ_FLOAT64 distortiondec;
|
OPJ_FLOAT64 distortiondec;
|
||||||
OPJ_UINT32 len;
|
OPJ_UINT32 len;
|
||||||
OPJ_BITFIELD term : 1;
|
OPJ_UINT32 term : 1;
|
||||||
} opj_tcd_pass_t;
|
} opj_tcd_pass_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -219,9 +219,7 @@ typedef struct opj_tcd
|
|||||||
/** current encoded/decoded tile */
|
/** current encoded/decoded tile */
|
||||||
OPJ_UINT32 tcd_tileno;
|
OPJ_UINT32 tcd_tileno;
|
||||||
/** tell if the tcd is a decoder. */
|
/** tell if the tcd is a decoder. */
|
||||||
OPJ_BITFIELD m_is_decoder : 1;
|
OPJ_UINT32 m_is_decoder : 1;
|
||||||
/** Thread pool */
|
|
||||||
opj_thread_pool_t* thread_pool;
|
|
||||||
} opj_tcd_t;
|
} opj_tcd_t;
|
||||||
|
|
||||||
/** @name Exported functions */
|
/** @name Exported functions */
|
||||||
@ -251,14 +249,12 @@ void opj_tcd_destroy(opj_tcd_t *tcd);
|
|||||||
* @param p_tcd TCD handle.
|
* @param p_tcd TCD handle.
|
||||||
* @param p_image raw image.
|
* @param p_image raw image.
|
||||||
* @param p_cp coding parameters.
|
* @param p_cp coding parameters.
|
||||||
* @param p_tp thread pool
|
|
||||||
*
|
*
|
||||||
* @return true if the encoding values could be set (false otherwise).
|
* @return true if the encoding values could be set (false otherwise).
|
||||||
*/
|
*/
|
||||||
OPJ_BOOL opj_tcd_init( opj_tcd_t *p_tcd,
|
OPJ_BOOL opj_tcd_init( opj_tcd_t *p_tcd,
|
||||||
opj_image_t * p_image,
|
opj_image_t * p_image,
|
||||||
opj_cp_t * p_cp,
|
opj_cp_t * p_cp );
|
||||||
opj_thread_pool_t* p_tp);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allocates memory for decoding a specific tile.
|
* Allocates memory for decoding a specific tile.
|
||||||
|
@ -1,968 +0,0 @@
|
|||||||
/*
|
|
||||||
* The copyright in this software is being made available under the 2-clauses
|
|
||||||
* BSD License, included below. This software may be subject to other third
|
|
||||||
* party and contributor rights, including patent rights, and no such rights
|
|
||||||
* are granted under this license.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2016, Even Rouault
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "opj_includes.h"
|
|
||||||
|
|
||||||
#include "thread.h"
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
#ifdef MUTEX_win32
|
|
||||||
|
|
||||||
/* Some versions of x86_64-w64-mingw32-gc -m32 resolve InterlockedCompareExchange() */
|
|
||||||
/* as __sync_val_compare_and_swap_4 but fails to link it. As this protects against */
|
|
||||||
/* a rather unlikely race, skip it */
|
|
||||||
#if !(defined(__MINGW32__) && defined(__i386__))
|
|
||||||
#define HAVE_INTERLOCKED_COMPARE_EXCHANGE 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include <process.h>
|
|
||||||
|
|
||||||
OPJ_BOOL OPJ_CALLCONV opj_has_thread_support(void)
|
|
||||||
{
|
|
||||||
return OPJ_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int OPJ_CALLCONV opj_get_num_cpus(void)
|
|
||||||
{
|
|
||||||
SYSTEM_INFO info;
|
|
||||||
DWORD dwNum;
|
|
||||||
GetSystemInfo(&info);
|
|
||||||
dwNum = info.dwNumberOfProcessors;
|
|
||||||
if( dwNum < 1 )
|
|
||||||
return 1;
|
|
||||||
return (int)dwNum;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct opj_mutex_t
|
|
||||||
{
|
|
||||||
CRITICAL_SECTION cs;
|
|
||||||
};
|
|
||||||
|
|
||||||
opj_mutex_t* opj_mutex_create(void)
|
|
||||||
{
|
|
||||||
opj_mutex_t* mutex = (opj_mutex_t*) opj_malloc(sizeof(opj_mutex_t));
|
|
||||||
if( !mutex )
|
|
||||||
return NULL;
|
|
||||||
InitializeCriticalSectionAndSpinCount(&(mutex->cs), 4000);
|
|
||||||
return mutex;
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_mutex_lock(opj_mutex_t* mutex)
|
|
||||||
{
|
|
||||||
EnterCriticalSection( &(mutex->cs) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_mutex_unlock(opj_mutex_t* mutex)
|
|
||||||
{
|
|
||||||
LeaveCriticalSection( &(mutex->cs) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_mutex_destroy(opj_mutex_t* mutex)
|
|
||||||
{
|
|
||||||
if( !mutex ) return;
|
|
||||||
DeleteCriticalSection( &(mutex->cs) );
|
|
||||||
opj_free( mutex );
|
|
||||||
}
|
|
||||||
|
|
||||||
struct opj_cond_waiter_list_t
|
|
||||||
{
|
|
||||||
HANDLE hEvent;
|
|
||||||
struct opj_cond_waiter_list_t* next;
|
|
||||||
};
|
|
||||||
typedef struct opj_cond_waiter_list_t opj_cond_waiter_list_t;
|
|
||||||
|
|
||||||
struct opj_cond_t
|
|
||||||
{
|
|
||||||
opj_mutex_t *internal_mutex;
|
|
||||||
opj_cond_waiter_list_t *waiter_list;
|
|
||||||
};
|
|
||||||
|
|
||||||
static DWORD TLSKey = 0;
|
|
||||||
static volatile LONG inTLSLockedSection = 0;
|
|
||||||
static volatile int TLSKeyInit = OPJ_FALSE;
|
|
||||||
|
|
||||||
opj_cond_t* opj_cond_create(void)
|
|
||||||
{
|
|
||||||
opj_cond_t* cond = (opj_cond_t*) opj_malloc(sizeof(opj_cond_t));
|
|
||||||
if( !cond )
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* Make sure that the TLS key is allocated in a thread-safe way */
|
|
||||||
/* We cannot use a global mutex/critical section since its creation itself would not be */
|
|
||||||
/* thread-safe, so use InterlockedCompareExchange trick */
|
|
||||||
while( OPJ_TRUE )
|
|
||||||
{
|
|
||||||
|
|
||||||
#if HAVE_INTERLOCKED_COMPARE_EXCHANGE
|
|
||||||
if( InterlockedCompareExchange(&inTLSLockedSection, 1, 0) == 0 )
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
if( !TLSKeyInit )
|
|
||||||
{
|
|
||||||
TLSKey = TlsAlloc();
|
|
||||||
TLSKeyInit = OPJ_TRUE;
|
|
||||||
}
|
|
||||||
#if HAVE_INTERLOCKED_COMPARE_EXCHANGE
|
|
||||||
InterlockedCompareExchange(&inTLSLockedSection, 0, 1);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( TLSKey == TLS_OUT_OF_INDEXES )
|
|
||||||
{
|
|
||||||
opj_free(cond);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
cond->internal_mutex = opj_mutex_create();
|
|
||||||
if (cond->internal_mutex == NULL)
|
|
||||||
{
|
|
||||||
opj_free(cond);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
cond->waiter_list = NULL;
|
|
||||||
return cond;
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_cond_wait(opj_cond_t* cond, opj_mutex_t* mutex)
|
|
||||||
{
|
|
||||||
opj_cond_waiter_list_t* item;
|
|
||||||
HANDLE hEvent = (HANDLE) TlsGetValue( TLSKey );
|
|
||||||
if (hEvent == NULL)
|
|
||||||
{
|
|
||||||
hEvent = CreateEvent(NULL, /* security attributes */
|
|
||||||
0, /* manual reset = no */
|
|
||||||
0, /* initial state = unsignaled */
|
|
||||||
NULL /* no name */);
|
|
||||||
assert(hEvent);
|
|
||||||
|
|
||||||
TlsSetValue( TLSKey, hEvent );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Insert the waiter into the waiter list of the condition */
|
|
||||||
opj_mutex_lock(cond->internal_mutex);
|
|
||||||
|
|
||||||
item = (opj_cond_waiter_list_t*)opj_malloc(sizeof(opj_cond_waiter_list_t));
|
|
||||||
assert(item != NULL);
|
|
||||||
|
|
||||||
item->hEvent = hEvent;
|
|
||||||
item->next = cond->waiter_list;
|
|
||||||
|
|
||||||
cond->waiter_list = item;
|
|
||||||
|
|
||||||
opj_mutex_unlock(cond->internal_mutex);
|
|
||||||
|
|
||||||
/* Release the client mutex before waiting for the event being signaled */
|
|
||||||
opj_mutex_unlock(mutex);
|
|
||||||
|
|
||||||
/* Ideally we would check that we do not get WAIT_FAILED but it is hard */
|
|
||||||
/* to report a failure. */
|
|
||||||
WaitForSingleObject(hEvent, INFINITE);
|
|
||||||
|
|
||||||
/* Reacquire the client mutex */
|
|
||||||
opj_mutex_lock(mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_cond_signal(opj_cond_t* cond)
|
|
||||||
{
|
|
||||||
opj_cond_waiter_list_t* psIter;
|
|
||||||
|
|
||||||
/* Signal the first registered event, and remove it from the list */
|
|
||||||
opj_mutex_lock(cond->internal_mutex);
|
|
||||||
|
|
||||||
psIter = cond->waiter_list;
|
|
||||||
if (psIter != NULL)
|
|
||||||
{
|
|
||||||
SetEvent(psIter->hEvent);
|
|
||||||
cond->waiter_list = psIter->next;
|
|
||||||
opj_free(psIter);
|
|
||||||
}
|
|
||||||
|
|
||||||
opj_mutex_unlock(cond->internal_mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_cond_destroy(opj_cond_t* cond)
|
|
||||||
{
|
|
||||||
if( !cond ) return;
|
|
||||||
opj_mutex_destroy(cond->internal_mutex);
|
|
||||||
assert(cond->waiter_list == NULL);
|
|
||||||
opj_free(cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct opj_thread_t
|
|
||||||
{
|
|
||||||
opj_thread_fn thread_fn;
|
|
||||||
void* user_data;
|
|
||||||
HANDLE hThread;
|
|
||||||
};
|
|
||||||
|
|
||||||
unsigned int __stdcall opj_thread_callback_adapter( void *info )
|
|
||||||
{
|
|
||||||
opj_thread_t* thread = (opj_thread_t*) info;
|
|
||||||
HANDLE hEvent = NULL;
|
|
||||||
|
|
||||||
thread->thread_fn( thread->user_data );
|
|
||||||
|
|
||||||
/* Free the handle possible allocated by a cond */
|
|
||||||
while( OPJ_TRUE )
|
|
||||||
{
|
|
||||||
/* Make sure TLSKey is not being created just at that moment... */
|
|
||||||
#if HAVE_INTERLOCKED_COMPARE_EXCHANGE
|
|
||||||
if( InterlockedCompareExchange(&inTLSLockedSection, 1, 0) == 0 )
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
if( TLSKeyInit )
|
|
||||||
{
|
|
||||||
hEvent = (HANDLE) TlsGetValue( TLSKey );
|
|
||||||
}
|
|
||||||
#if HAVE_INTERLOCKED_COMPARE_EXCHANGE
|
|
||||||
InterlockedCompareExchange(&inTLSLockedSection, 0, 1);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( hEvent )
|
|
||||||
CloseHandle(hEvent);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
opj_thread_t* opj_thread_create( opj_thread_fn thread_fn, void* user_data )
|
|
||||||
{
|
|
||||||
opj_thread_t* thread;
|
|
||||||
|
|
||||||
assert( thread_fn );
|
|
||||||
|
|
||||||
thread = (opj_thread_t*) opj_malloc( sizeof(opj_thread_t) );
|
|
||||||
if( !thread )
|
|
||||||
return NULL;
|
|
||||||
thread->thread_fn = thread_fn;
|
|
||||||
thread->user_data = user_data;
|
|
||||||
|
|
||||||
thread->hThread = (HANDLE)_beginthreadex(NULL, 0,
|
|
||||||
opj_thread_callback_adapter, thread, 0, NULL);
|
|
||||||
|
|
||||||
if( thread->hThread == NULL )
|
|
||||||
{
|
|
||||||
opj_free( thread );
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return thread;
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_thread_join( opj_thread_t* thread )
|
|
||||||
{
|
|
||||||
WaitForSingleObject(thread->hThread, INFINITE);
|
|
||||||
CloseHandle( thread->hThread );
|
|
||||||
|
|
||||||
opj_free(thread);
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif MUTEX_pthread
|
|
||||||
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
OPJ_BOOL OPJ_CALLCONV opj_has_thread_support(void)
|
|
||||||
{
|
|
||||||
return OPJ_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int OPJ_CALLCONV opj_get_num_cpus(void)
|
|
||||||
{
|
|
||||||
#ifdef _SC_NPROCESSORS_ONLN
|
|
||||||
return (int)sysconf(_SC_NPROCESSORS_ONLN);
|
|
||||||
#else
|
|
||||||
return 1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
struct opj_mutex_t
|
|
||||||
{
|
|
||||||
pthread_mutex_t mutex;
|
|
||||||
};
|
|
||||||
|
|
||||||
opj_mutex_t* opj_mutex_create(void)
|
|
||||||
{
|
|
||||||
opj_mutex_t* mutex = (opj_mutex_t*) opj_calloc(1U, sizeof(opj_mutex_t));
|
|
||||||
if( mutex != NULL ) {
|
|
||||||
if ( pthread_mutex_init(&mutex->mutex, NULL) != 0) {
|
|
||||||
opj_free(mutex);
|
|
||||||
mutex = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return mutex;
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_mutex_lock(opj_mutex_t* mutex)
|
|
||||||
{
|
|
||||||
pthread_mutex_lock(&(mutex->mutex));
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_mutex_unlock(opj_mutex_t* mutex)
|
|
||||||
{
|
|
||||||
pthread_mutex_unlock(&(mutex->mutex));
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_mutex_destroy(opj_mutex_t* mutex)
|
|
||||||
{
|
|
||||||
if( !mutex ) return;
|
|
||||||
pthread_mutex_destroy(&(mutex->mutex));
|
|
||||||
opj_free(mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct opj_cond_t
|
|
||||||
{
|
|
||||||
pthread_cond_t cond;
|
|
||||||
};
|
|
||||||
|
|
||||||
opj_cond_t* opj_cond_create(void)
|
|
||||||
{
|
|
||||||
opj_cond_t* cond = (opj_cond_t*) opj_malloc(sizeof(opj_cond_t));
|
|
||||||
if( !cond )
|
|
||||||
return NULL;
|
|
||||||
if( pthread_cond_init(&(cond->cond), NULL) != 0 )
|
|
||||||
{
|
|
||||||
opj_free(cond);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return cond;
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_cond_wait(opj_cond_t* cond, opj_mutex_t* mutex)
|
|
||||||
{
|
|
||||||
pthread_cond_wait(&(cond->cond), &(mutex->mutex));
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_cond_signal(opj_cond_t* cond)
|
|
||||||
{
|
|
||||||
int ret = pthread_cond_signal(&(cond->cond));
|
|
||||||
(void)ret;
|
|
||||||
assert(ret == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_cond_destroy(opj_cond_t* cond)
|
|
||||||
{
|
|
||||||
if( !cond ) return;
|
|
||||||
pthread_cond_destroy(&(cond->cond));
|
|
||||||
opj_free(cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
struct opj_thread_t
|
|
||||||
{
|
|
||||||
opj_thread_fn thread_fn;
|
|
||||||
void* user_data;
|
|
||||||
pthread_t thread;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void* opj_thread_callback_adapter( void* info )
|
|
||||||
{
|
|
||||||
opj_thread_t* thread = (opj_thread_t*) info;
|
|
||||||
thread->thread_fn( thread->user_data );
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
opj_thread_t* opj_thread_create( opj_thread_fn thread_fn, void* user_data )
|
|
||||||
{
|
|
||||||
pthread_attr_t attr;
|
|
||||||
opj_thread_t* thread;
|
|
||||||
|
|
||||||
assert( thread_fn );
|
|
||||||
|
|
||||||
thread = (opj_thread_t*) opj_malloc( sizeof(opj_thread_t) );
|
|
||||||
if( !thread )
|
|
||||||
return NULL;
|
|
||||||
thread->thread_fn = thread_fn;
|
|
||||||
thread->user_data = user_data;
|
|
||||||
|
|
||||||
pthread_attr_init( &attr );
|
|
||||||
pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE );
|
|
||||||
if( pthread_create( &(thread->thread), &attr,
|
|
||||||
opj_thread_callback_adapter, (void *) thread ) != 0 )
|
|
||||||
{
|
|
||||||
opj_free( thread );
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return thread;
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_thread_join( opj_thread_t* thread )
|
|
||||||
{
|
|
||||||
void* status;
|
|
||||||
pthread_join( thread->thread, &status);
|
|
||||||
|
|
||||||
opj_free(thread);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
/* Stub implementation */
|
|
||||||
|
|
||||||
OPJ_BOOL OPJ_CALLCONV opj_has_thread_support(void)
|
|
||||||
{
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int OPJ_CALLCONV opj_get_num_cpus(void)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
opj_mutex_t* opj_mutex_create(void)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_mutex_lock(opj_mutex_t* mutex)
|
|
||||||
{
|
|
||||||
(void) mutex;
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_mutex_unlock(opj_mutex_t* mutex)
|
|
||||||
{
|
|
||||||
(void) mutex;
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_mutex_destroy(opj_mutex_t* mutex)
|
|
||||||
{
|
|
||||||
(void) mutex;
|
|
||||||
}
|
|
||||||
|
|
||||||
opj_cond_t* opj_cond_create(void)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_cond_wait(opj_cond_t* cond, opj_mutex_t* mutex)
|
|
||||||
{
|
|
||||||
(void) cond;
|
|
||||||
(void) mutex;
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_cond_signal(opj_cond_t* cond)
|
|
||||||
{
|
|
||||||
(void) cond;
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_cond_destroy(opj_cond_t* cond)
|
|
||||||
{
|
|
||||||
(void) cond;
|
|
||||||
}
|
|
||||||
|
|
||||||
opj_thread_t* opj_thread_create( opj_thread_fn thread_fn, void* user_data )
|
|
||||||
{
|
|
||||||
(void) thread_fn;
|
|
||||||
(void) user_data;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_thread_join( opj_thread_t* thread )
|
|
||||||
{
|
|
||||||
(void) thread;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int key;
|
|
||||||
void* value;
|
|
||||||
opj_tls_free_func opj_free_func;
|
|
||||||
} opj_tls_key_val_t;
|
|
||||||
|
|
||||||
struct opj_tls_t
|
|
||||||
{
|
|
||||||
opj_tls_key_val_t* key_val;
|
|
||||||
int key_val_count;
|
|
||||||
};
|
|
||||||
|
|
||||||
static opj_tls_t* opj_tls_new(void)
|
|
||||||
{
|
|
||||||
return (opj_tls_t*) opj_calloc(1, sizeof(opj_tls_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void opj_tls_destroy(opj_tls_t* tls)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
if( !tls ) return;
|
|
||||||
for(i=0;i<tls->key_val_count;i++)
|
|
||||||
{
|
|
||||||
if( tls->key_val[i].opj_free_func )
|
|
||||||
tls->key_val[i].opj_free_func(tls->key_val[i].value);
|
|
||||||
}
|
|
||||||
opj_free(tls->key_val);
|
|
||||||
opj_free(tls);
|
|
||||||
}
|
|
||||||
|
|
||||||
void* opj_tls_get(opj_tls_t* tls, int key)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0;i<tls->key_val_count;i++)
|
|
||||||
{
|
|
||||||
if( tls->key_val[i].key == key )
|
|
||||||
return tls->key_val[i].value;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
OPJ_BOOL opj_tls_set(opj_tls_t* tls, int key, void* value, opj_tls_free_func opj_free_func)
|
|
||||||
{
|
|
||||||
opj_tls_key_val_t* new_key_val;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (tls->key_val_count == INT_MAX) {
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
for(i=0;i<tls->key_val_count;i++)
|
|
||||||
{
|
|
||||||
if( tls->key_val[i].key == key )
|
|
||||||
{
|
|
||||||
if( tls->key_val[i].opj_free_func ) {
|
|
||||||
tls->key_val[i].opj_free_func(tls->key_val[i].value);
|
|
||||||
}
|
|
||||||
tls->key_val[i].value = value;
|
|
||||||
tls->key_val[i].opj_free_func = opj_free_func;
|
|
||||||
return OPJ_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
new_key_val = (opj_tls_key_val_t*) opj_realloc( tls->key_val,
|
|
||||||
((size_t)tls->key_val_count + 1U) * sizeof(opj_tls_key_val_t) );
|
|
||||||
if( !new_key_val )
|
|
||||||
return OPJ_FALSE;
|
|
||||||
tls->key_val = new_key_val;
|
|
||||||
new_key_val[tls->key_val_count].key = key;
|
|
||||||
new_key_val[tls->key_val_count].value = value;
|
|
||||||
new_key_val[tls->key_val_count].opj_free_func = opj_free_func;
|
|
||||||
tls->key_val_count ++;
|
|
||||||
return OPJ_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
opj_job_fn job_fn;
|
|
||||||
void *user_data;
|
|
||||||
} opj_worker_thread_job_t;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
opj_thread_pool_t *tp;
|
|
||||||
opj_thread_t *thread;
|
|
||||||
int marked_as_waiting;
|
|
||||||
|
|
||||||
opj_mutex_t *mutex;
|
|
||||||
opj_cond_t *cond;
|
|
||||||
} opj_worker_thread_t;
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
OPJWTS_OK,
|
|
||||||
OPJWTS_STOP,
|
|
||||||
OPJWTS_ERROR
|
|
||||||
} opj_worker_thread_state;
|
|
||||||
|
|
||||||
struct opj_job_list_t
|
|
||||||
{
|
|
||||||
opj_worker_thread_job_t* job;
|
|
||||||
struct opj_job_list_t* next;
|
|
||||||
};
|
|
||||||
typedef struct opj_job_list_t opj_job_list_t;
|
|
||||||
|
|
||||||
struct opj_worker_thread_list_t
|
|
||||||
{
|
|
||||||
opj_worker_thread_t* worker_thread;
|
|
||||||
struct opj_worker_thread_list_t* next;
|
|
||||||
};
|
|
||||||
typedef struct opj_worker_thread_list_t opj_worker_thread_list_t;
|
|
||||||
|
|
||||||
struct opj_thread_pool_t
|
|
||||||
{
|
|
||||||
opj_worker_thread_t* worker_threads;
|
|
||||||
int worker_threads_count;
|
|
||||||
opj_cond_t* cond;
|
|
||||||
opj_mutex_t* mutex;
|
|
||||||
volatile opj_worker_thread_state state;
|
|
||||||
opj_job_list_t* job_queue;
|
|
||||||
volatile int pending_jobs_count;
|
|
||||||
opj_worker_thread_list_t* waiting_worker_thread_list;
|
|
||||||
int waiting_worker_thread_count;
|
|
||||||
opj_tls_t* tls;
|
|
||||||
int signaling_threshold;
|
|
||||||
};
|
|
||||||
|
|
||||||
static OPJ_BOOL opj_thread_pool_setup(opj_thread_pool_t* tp, int num_threads);
|
|
||||||
static opj_worker_thread_job_t* opj_thread_pool_get_next_job(opj_thread_pool_t* tp,
|
|
||||||
opj_worker_thread_t* worker_thread,
|
|
||||||
OPJ_BOOL signal_job_finished);
|
|
||||||
|
|
||||||
opj_thread_pool_t* opj_thread_pool_create(int num_threads)
|
|
||||||
{
|
|
||||||
opj_thread_pool_t* tp;
|
|
||||||
|
|
||||||
tp = (opj_thread_pool_t*) opj_calloc(1, sizeof(opj_thread_pool_t));
|
|
||||||
if( !tp )
|
|
||||||
return NULL;
|
|
||||||
tp->state = OPJWTS_OK;
|
|
||||||
|
|
||||||
if( num_threads <= 0 )
|
|
||||||
{
|
|
||||||
tp->tls = opj_tls_new();
|
|
||||||
if( !tp->tls )
|
|
||||||
{
|
|
||||||
opj_free(tp);
|
|
||||||
tp = NULL;
|
|
||||||
}
|
|
||||||
return tp;
|
|
||||||
}
|
|
||||||
|
|
||||||
tp->mutex = opj_mutex_create();
|
|
||||||
if( !tp->mutex )
|
|
||||||
{
|
|
||||||
opj_free(tp);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if( !opj_thread_pool_setup(tp, num_threads) )
|
|
||||||
{
|
|
||||||
opj_thread_pool_destroy(tp);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return tp;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void opj_worker_thread_function(void* user_data)
|
|
||||||
{
|
|
||||||
opj_worker_thread_t* worker_thread;
|
|
||||||
opj_thread_pool_t* tp;
|
|
||||||
opj_tls_t* tls;
|
|
||||||
OPJ_BOOL job_finished = OPJ_FALSE;
|
|
||||||
|
|
||||||
worker_thread = (opj_worker_thread_t* ) user_data;
|
|
||||||
tp = worker_thread->tp;
|
|
||||||
tls = opj_tls_new();
|
|
||||||
|
|
||||||
while( OPJ_TRUE )
|
|
||||||
{
|
|
||||||
opj_worker_thread_job_t* job = opj_thread_pool_get_next_job(tp, worker_thread, job_finished);
|
|
||||||
if( job == NULL )
|
|
||||||
break;
|
|
||||||
|
|
||||||
if( job->job_fn )
|
|
||||||
{
|
|
||||||
job->job_fn(job->user_data, tls);
|
|
||||||
}
|
|
||||||
opj_free(job);
|
|
||||||
job_finished = OPJ_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
opj_tls_destroy(tls);
|
|
||||||
}
|
|
||||||
|
|
||||||
static OPJ_BOOL opj_thread_pool_setup(opj_thread_pool_t* tp, int num_threads)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
OPJ_BOOL bRet = OPJ_TRUE;
|
|
||||||
|
|
||||||
assert( num_threads > 0 );
|
|
||||||
|
|
||||||
tp->cond = opj_cond_create();
|
|
||||||
if( tp->cond == NULL )
|
|
||||||
return OPJ_FALSE;
|
|
||||||
|
|
||||||
tp->worker_threads = (opj_worker_thread_t*) opj_calloc( (size_t)num_threads,
|
|
||||||
sizeof(opj_worker_thread_t) );
|
|
||||||
if( tp->worker_threads == NULL )
|
|
||||||
return OPJ_FALSE;
|
|
||||||
tp->worker_threads_count = num_threads;
|
|
||||||
|
|
||||||
for(i=0;i<num_threads;i++)
|
|
||||||
{
|
|
||||||
tp->worker_threads[i].tp = tp;
|
|
||||||
|
|
||||||
tp->worker_threads[i].mutex = opj_mutex_create();
|
|
||||||
if( tp->worker_threads[i].mutex == NULL )
|
|
||||||
{
|
|
||||||
tp->worker_threads_count = i;
|
|
||||||
bRet = OPJ_FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
tp->worker_threads[i].cond = opj_cond_create();
|
|
||||||
if( tp->worker_threads[i].cond == NULL )
|
|
||||||
{
|
|
||||||
opj_mutex_destroy(tp->worker_threads[i].mutex);
|
|
||||||
tp->worker_threads_count = i;
|
|
||||||
bRet = OPJ_FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
tp->worker_threads[i].marked_as_waiting = OPJ_FALSE;
|
|
||||||
|
|
||||||
tp->worker_threads[i].thread = opj_thread_create(opj_worker_thread_function,
|
|
||||||
&(tp->worker_threads[i]));
|
|
||||||
if( tp->worker_threads[i].thread == NULL )
|
|
||||||
{
|
|
||||||
tp->worker_threads_count = i;
|
|
||||||
bRet = OPJ_FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wait all threads to be started */
|
|
||||||
/* printf("waiting for all threads to be started\n"); */
|
|
||||||
opj_mutex_lock(tp->mutex);
|
|
||||||
while( tp->waiting_worker_thread_count < num_threads )
|
|
||||||
{
|
|
||||||
opj_cond_wait(tp->cond, tp->mutex);
|
|
||||||
}
|
|
||||||
opj_mutex_unlock(tp->mutex);
|
|
||||||
/* printf("all threads started\n"); */
|
|
||||||
|
|
||||||
if( tp->state == OPJWTS_ERROR )
|
|
||||||
bRet = OPJ_FALSE;
|
|
||||||
|
|
||||||
return bRet;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
void opj_waiting()
|
|
||||||
{
|
|
||||||
printf("waiting!\n");
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
static opj_worker_thread_job_t* opj_thread_pool_get_next_job(opj_thread_pool_t* tp,
|
|
||||||
opj_worker_thread_t* worker_thread,
|
|
||||||
OPJ_BOOL signal_job_finished)
|
|
||||||
{
|
|
||||||
while( OPJ_TRUE )
|
|
||||||
{
|
|
||||||
opj_job_list_t* top_job_iter;
|
|
||||||
|
|
||||||
opj_mutex_lock(tp->mutex);
|
|
||||||
|
|
||||||
if( signal_job_finished )
|
|
||||||
{
|
|
||||||
signal_job_finished = OPJ_FALSE;
|
|
||||||
tp->pending_jobs_count --;
|
|
||||||
/*printf("tp=%p, remaining jobs: %d\n", tp, tp->pending_jobs_count);*/
|
|
||||||
if( tp->pending_jobs_count <= tp->signaling_threshold )
|
|
||||||
opj_cond_signal(tp->cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
if( tp->state == OPJWTS_STOP )
|
|
||||||
{
|
|
||||||
opj_mutex_unlock(tp->mutex);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
top_job_iter = tp->job_queue;
|
|
||||||
if( top_job_iter )
|
|
||||||
{
|
|
||||||
opj_worker_thread_job_t* job;
|
|
||||||
tp->job_queue = top_job_iter->next;
|
|
||||||
|
|
||||||
job = top_job_iter->job;
|
|
||||||
opj_mutex_unlock(tp->mutex);
|
|
||||||
opj_free(top_job_iter);
|
|
||||||
return job;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* opj_waiting(); */
|
|
||||||
if( !worker_thread->marked_as_waiting )
|
|
||||||
{
|
|
||||||
opj_worker_thread_list_t* item;
|
|
||||||
|
|
||||||
worker_thread->marked_as_waiting = OPJ_TRUE;
|
|
||||||
tp->waiting_worker_thread_count ++;
|
|
||||||
assert(tp->waiting_worker_thread_count <= tp->worker_threads_count);
|
|
||||||
|
|
||||||
item= (opj_worker_thread_list_t*) opj_malloc(sizeof(opj_worker_thread_list_t));
|
|
||||||
if( item == NULL )
|
|
||||||
{
|
|
||||||
tp->state = OPJWTS_ERROR;
|
|
||||||
opj_cond_signal(tp->cond);
|
|
||||||
|
|
||||||
opj_mutex_unlock(tp->mutex);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
item->worker_thread = worker_thread;
|
|
||||||
item->next = tp->waiting_worker_thread_list;
|
|
||||||
tp->waiting_worker_thread_list = item;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* printf("signaling that worker thread is ready\n"); */
|
|
||||||
opj_cond_signal(tp->cond);
|
|
||||||
|
|
||||||
opj_mutex_lock(worker_thread->mutex);
|
|
||||||
opj_mutex_unlock(tp->mutex);
|
|
||||||
|
|
||||||
/* printf("waiting for job\n"); */
|
|
||||||
opj_cond_wait( worker_thread->cond, worker_thread->mutex );
|
|
||||||
|
|
||||||
opj_mutex_unlock(worker_thread->mutex);
|
|
||||||
/* printf("got job\n"); */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
OPJ_BOOL opj_thread_pool_submit_job(opj_thread_pool_t* tp,
|
|
||||||
opj_job_fn job_fn,
|
|
||||||
void* user_data)
|
|
||||||
{
|
|
||||||
opj_worker_thread_job_t* job;
|
|
||||||
opj_job_list_t* item;
|
|
||||||
|
|
||||||
if( tp->mutex == NULL )
|
|
||||||
{
|
|
||||||
job_fn( user_data, tp->tls );
|
|
||||||
return OPJ_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
job = (opj_worker_thread_job_t*)opj_malloc(sizeof(opj_worker_thread_job_t));
|
|
||||||
if( job == NULL )
|
|
||||||
return OPJ_FALSE;
|
|
||||||
job->job_fn = job_fn;
|
|
||||||
job->user_data = user_data;
|
|
||||||
|
|
||||||
item = (opj_job_list_t*) opj_malloc(sizeof(opj_job_list_t));
|
|
||||||
if( item == NULL )
|
|
||||||
{
|
|
||||||
opj_free(job);
|
|
||||||
return OPJ_FALSE;
|
|
||||||
}
|
|
||||||
item->job = job;
|
|
||||||
|
|
||||||
opj_mutex_lock(tp->mutex);
|
|
||||||
|
|
||||||
tp->signaling_threshold = 100 * tp->worker_threads_count;
|
|
||||||
while( tp->pending_jobs_count > tp->signaling_threshold )
|
|
||||||
{
|
|
||||||
/* printf("%d jobs enqueued. Waiting\n", tp->pending_jobs_count); */
|
|
||||||
opj_cond_wait(tp->cond, tp->mutex);
|
|
||||||
/* printf("...%d jobs enqueued.\n", tp->pending_jobs_count); */
|
|
||||||
}
|
|
||||||
|
|
||||||
item->next = tp->job_queue;
|
|
||||||
tp->job_queue = item;
|
|
||||||
tp->pending_jobs_count ++;
|
|
||||||
|
|
||||||
if( tp->waiting_worker_thread_list )
|
|
||||||
{
|
|
||||||
opj_worker_thread_t* worker_thread;
|
|
||||||
opj_worker_thread_list_t* next;
|
|
||||||
opj_worker_thread_list_t* to_opj_free;
|
|
||||||
|
|
||||||
worker_thread = tp->waiting_worker_thread_list->worker_thread;
|
|
||||||
|
|
||||||
assert( worker_thread->marked_as_waiting );
|
|
||||||
worker_thread->marked_as_waiting = OPJ_FALSE;
|
|
||||||
|
|
||||||
next = tp->waiting_worker_thread_list->next;
|
|
||||||
to_opj_free = tp->waiting_worker_thread_list;
|
|
||||||
tp->waiting_worker_thread_list = next;
|
|
||||||
tp->waiting_worker_thread_count --;
|
|
||||||
|
|
||||||
opj_mutex_lock(worker_thread->mutex);
|
|
||||||
opj_mutex_unlock(tp->mutex);
|
|
||||||
opj_cond_signal(worker_thread->cond);
|
|
||||||
opj_mutex_unlock(worker_thread->mutex);
|
|
||||||
|
|
||||||
opj_free(to_opj_free);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
opj_mutex_unlock(tp->mutex);
|
|
||||||
|
|
||||||
return OPJ_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_thread_pool_wait_completion(opj_thread_pool_t* tp, int max_remaining_jobs)
|
|
||||||
{
|
|
||||||
if( tp->mutex == NULL )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( max_remaining_jobs < 0 )
|
|
||||||
max_remaining_jobs = 0;
|
|
||||||
opj_mutex_lock(tp->mutex);
|
|
||||||
tp->signaling_threshold = max_remaining_jobs;
|
|
||||||
while( tp->pending_jobs_count > max_remaining_jobs )
|
|
||||||
{
|
|
||||||
/*printf("tp=%p, jobs before wait = %d, max_remaining_jobs = %d\n", tp, tp->pending_jobs_count, max_remaining_jobs);*/
|
|
||||||
opj_cond_wait(tp->cond, tp->mutex);
|
|
||||||
/*printf("tp=%p, jobs after wait = %d\n", tp, tp->pending_jobs_count);*/
|
|
||||||
}
|
|
||||||
opj_mutex_unlock(tp->mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
int opj_thread_pool_get_thread_count(opj_thread_pool_t* tp)
|
|
||||||
{
|
|
||||||
return tp->worker_threads_count;
|
|
||||||
}
|
|
||||||
|
|
||||||
void opj_thread_pool_destroy(opj_thread_pool_t* tp)
|
|
||||||
{
|
|
||||||
if( !tp ) return;
|
|
||||||
if( tp->cond )
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
opj_thread_pool_wait_completion(tp, 0);
|
|
||||||
|
|
||||||
opj_mutex_lock(tp->mutex);
|
|
||||||
tp->state = OPJWTS_STOP;
|
|
||||||
opj_mutex_unlock(tp->mutex);
|
|
||||||
|
|
||||||
for(i=0;i<tp->worker_threads_count;i++)
|
|
||||||
{
|
|
||||||
opj_mutex_lock(tp->worker_threads[i].mutex);
|
|
||||||
opj_cond_signal(tp->worker_threads[i].cond);
|
|
||||||
opj_mutex_unlock(tp->worker_threads[i].mutex);
|
|
||||||
opj_thread_join(tp->worker_threads[i].thread);
|
|
||||||
opj_cond_destroy(tp->worker_threads[i].cond);
|
|
||||||
opj_mutex_destroy(tp->worker_threads[i].mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
opj_free(tp->worker_threads);
|
|
||||||
|
|
||||||
while( tp->waiting_worker_thread_list != NULL )
|
|
||||||
{
|
|
||||||
opj_worker_thread_list_t* next = tp->waiting_worker_thread_list->next;
|
|
||||||
opj_free( tp->waiting_worker_thread_list );
|
|
||||||
tp->waiting_worker_thread_list = next;
|
|
||||||
}
|
|
||||||
|
|
||||||
opj_cond_destroy(tp->cond);
|
|
||||||
}
|
|
||||||
opj_mutex_destroy(tp->mutex);
|
|
||||||
opj_tls_destroy(tp->tls);
|
|
||||||
opj_free(tp);
|
|
||||||
}
|
|
@ -1,253 +0,0 @@
|
|||||||
/*
|
|
||||||
* The copyright in this software is being made available under the 2-clauses
|
|
||||||
* BSD License, included below. This software may be subject to other third
|
|
||||||
* party and contributor rights, including patent rights, and no such rights
|
|
||||||
* are granted under this license.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2016, Even Rouault
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef THREAD_H
|
|
||||||
#define THREAD_H
|
|
||||||
|
|
||||||
#include "openjpeg.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
@file thread.h
|
|
||||||
@brief Thread API
|
|
||||||
|
|
||||||
The functions in thread.c have for goal to manage mutex, conditions, thread
|
|
||||||
creation and thread pools that accept jobs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup THREAD THREAD - Mutex, conditions, threads and thread pools */
|
|
||||||
/*@{*/
|
|
||||||
|
|
||||||
/** @name Mutex */
|
|
||||||
/*@{*/
|
|
||||||
|
|
||||||
/** Opaque type for a mutex */
|
|
||||||
typedef struct opj_mutex_t opj_mutex_t;
|
|
||||||
|
|
||||||
/** Creates a mutex.
|
|
||||||
* @return the mutex or NULL in case of error (can for example happen if the library
|
|
||||||
* is built without thread support)
|
|
||||||
*/
|
|
||||||
opj_mutex_t* opj_mutex_create(void);
|
|
||||||
|
|
||||||
/** Lock/acquire the mutex.
|
|
||||||
* @param mutex the mutex to acquire.
|
|
||||||
*/
|
|
||||||
void opj_mutex_lock(opj_mutex_t* mutex);
|
|
||||||
|
|
||||||
/** Unlock/release the mutex.
|
|
||||||
* @param mutex the mutex to release.
|
|
||||||
*/
|
|
||||||
void opj_mutex_unlock(opj_mutex_t* mutex);
|
|
||||||
|
|
||||||
/** Destroy a mutex
|
|
||||||
* @param mutex the mutex to destroy.
|
|
||||||
*/
|
|
||||||
void opj_mutex_destroy(opj_mutex_t* mutex);
|
|
||||||
|
|
||||||
/*@}*/
|
|
||||||
|
|
||||||
/** @name Condition */
|
|
||||||
/*@{*/
|
|
||||||
|
|
||||||
/** Opaque type for a condition */
|
|
||||||
typedef struct opj_cond_t opj_cond_t;
|
|
||||||
|
|
||||||
/** Creates a condition.
|
|
||||||
* @return the condition or NULL in case of error (can for example happen if the library
|
|
||||||
* is built without thread support)
|
|
||||||
*/
|
|
||||||
opj_cond_t* opj_cond_create(void);
|
|
||||||
|
|
||||||
/** Wait for the condition to be signaled.
|
|
||||||
* The semantics is the same as the POSIX pthread_cond_wait.
|
|
||||||
* The provided mutex *must* be acquired before calling this function, and
|
|
||||||
* released afterwards.
|
|
||||||
* The mutex will be released by this function while it must wait for the condition
|
|
||||||
* and reacquired afterwards.
|
|
||||||
* In some particular situations, the function might return even if the condition is not signaled
|
|
||||||
* with opj_cond_signal(), hence the need to check with an application level
|
|
||||||
* mechanism.
|
|
||||||
*
|
|
||||||
* Waiting thread :
|
|
||||||
* \code
|
|
||||||
* opj_mutex_lock(mutex);
|
|
||||||
* while( !some_application_level_condition )
|
|
||||||
* {
|
|
||||||
* opj_cond_wait(cond, mutex);
|
|
||||||
* }
|
|
||||||
* opj_mutex_unlock(mutex);
|
|
||||||
* \endcode
|
|
||||||
*
|
|
||||||
* Signaling thread :
|
|
||||||
* \code
|
|
||||||
* opj_mutex_lock(mutex);
|
|
||||||
* some_application_level_condition = TRUE;
|
|
||||||
* opj_cond_signal(cond);
|
|
||||||
* opj_mutex_unlock(mutex);
|
|
||||||
* \endcode
|
|
||||||
*
|
|
||||||
* @param cond the condition to wait.
|
|
||||||
* @param mutex the mutex (in acquired state before calling this function)
|
|
||||||
*/
|
|
||||||
void opj_cond_wait(opj_cond_t* cond, opj_mutex_t* mutex);
|
|
||||||
|
|
||||||
/** Signal waiting threads on a condition.
|
|
||||||
* One of the thread waiting with opj_cond_wait() will be waken up.
|
|
||||||
* It is strongly advised that this call is done with the mutex that is used
|
|
||||||
* by opj_cond_wait(), in a acquired state.
|
|
||||||
* @param cond the condition to signal.
|
|
||||||
*/
|
|
||||||
void opj_cond_signal(opj_cond_t* cond);
|
|
||||||
|
|
||||||
/** Destroy a condition
|
|
||||||
* @param cond the condition to destroy.
|
|
||||||
*/
|
|
||||||
void opj_cond_destroy(opj_cond_t* cond);
|
|
||||||
|
|
||||||
/*@}*/
|
|
||||||
|
|
||||||
/** @name Thread */
|
|
||||||
/*@{*/
|
|
||||||
|
|
||||||
/** Opaque type for a thread handle */
|
|
||||||
typedef struct opj_thread_t opj_thread_t;
|
|
||||||
|
|
||||||
/** User function to execute in a thread
|
|
||||||
* @param user_data user data provided with opj_thread_create()
|
|
||||||
*/
|
|
||||||
typedef void (*opj_thread_fn)(void* user_data);
|
|
||||||
|
|
||||||
/** Creates a new thread.
|
|
||||||
* @param thread_fn Function to run in the new thread.
|
|
||||||
* @param user_data user data provided to the thread function. Might be NULL.
|
|
||||||
* @return a thread handle or NULL in case of failure (can for example happen if the library
|
|
||||||
* is built without thread support)
|
|
||||||
*/
|
|
||||||
opj_thread_t* opj_thread_create( opj_thread_fn thread_fn, void* user_data );
|
|
||||||
|
|
||||||
/** Wait for a thread to be finished and release associated resources to the
|
|
||||||
* thread handle.
|
|
||||||
* @param thread the thread to wait for being finished.
|
|
||||||
*/
|
|
||||||
void opj_thread_join( opj_thread_t* thread );
|
|
||||||
|
|
||||||
/*@}*/
|
|
||||||
|
|
||||||
/** @name Thread local storage */
|
|
||||||
/*@{*/
|
|
||||||
/** Opaque type for a thread local storage */
|
|
||||||
typedef struct opj_tls_t opj_tls_t;
|
|
||||||
|
|
||||||
/** Get a thread local value corresponding to the provided key.
|
|
||||||
* @param tls thread local storage handle
|
|
||||||
* @param key key whose value to retrieve.
|
|
||||||
* @return value associated with the key, or NULL is missing.
|
|
||||||
*/
|
|
||||||
void* opj_tls_get(opj_tls_t* tls, int key);
|
|
||||||
|
|
||||||
/** Type of the function used to free a TLS value */
|
|
||||||
typedef void (*opj_tls_free_func)(void* value);
|
|
||||||
|
|
||||||
/** Set a thread local value corresponding to the provided key.
|
|
||||||
* @param tls thread local storage handle
|
|
||||||
* @param key key whose value to set.
|
|
||||||
* @param value value to set (may be NULL).
|
|
||||||
* @param free_func function to call currently installed value.
|
|
||||||
* @return OPJ_TRUE if successful.
|
|
||||||
*/
|
|
||||||
OPJ_BOOL opj_tls_set(opj_tls_t* tls, int key, void* value, opj_tls_free_func free_func);
|
|
||||||
|
|
||||||
/*@}*/
|
|
||||||
|
|
||||||
/** @name Thread pool */
|
|
||||||
/*@{*/
|
|
||||||
|
|
||||||
/** Opaque type for a thread pool */
|
|
||||||
typedef struct opj_thread_pool_t opj_thread_pool_t;
|
|
||||||
|
|
||||||
/** Create a new thread pool.
|
|
||||||
* num_thread must nominally be >= 1 to create a real thread pool. If num_threads
|
|
||||||
* is negative or null, then a dummy thread pool will be created. All functions
|
|
||||||
* operating on the thread pool will work, but job submission will be run
|
|
||||||
* synchronously in the calling thread.
|
|
||||||
*
|
|
||||||
* @param num_threads the number of threads to allocate for this thread pool.
|
|
||||||
* @return a thread pool handle, or NULL in case of failure (can for example happen if the library
|
|
||||||
* is built without thread support)
|
|
||||||
*/
|
|
||||||
opj_thread_pool_t* opj_thread_pool_create(int num_threads);
|
|
||||||
|
|
||||||
/** User function to execute in a thread
|
|
||||||
* @param user_data user data provided with opj_thread_create()
|
|
||||||
* @param tls handle to thread local storage
|
|
||||||
*/
|
|
||||||
typedef void (*opj_job_fn)(void* user_data, opj_tls_t* tls);
|
|
||||||
|
|
||||||
|
|
||||||
/** Submit a new job to be run by one of the thread in the thread pool.
|
|
||||||
* The job ( thread_fn, user_data ) will be added in the queue of jobs managed
|
|
||||||
* by the thread pool, and run by the first thread that is no longer busy.
|
|
||||||
*
|
|
||||||
* @param tp the thread pool handle.
|
|
||||||
* @param job_fn Function to run. Must not be NULL.
|
|
||||||
* @param user_data User data provided to thread_fn.
|
|
||||||
* @return OPJ_TRUE if the job was successfully submitted.
|
|
||||||
*/
|
|
||||||
OPJ_BOOL opj_thread_pool_submit_job(opj_thread_pool_t* tp, opj_job_fn job_fn, void* user_data);
|
|
||||||
|
|
||||||
/** Wait that no more than max_remaining_jobs jobs are remaining in the queue of
|
|
||||||
* the thread pool. The aim of this function is to avoid submitting too many
|
|
||||||
* jobs while the thread pool cannot cope fast enough with them, which would
|
|
||||||
* result potentially in out-of-memory situations with too many job descriptions
|
|
||||||
* being queued.
|
|
||||||
*
|
|
||||||
* @param tp the thread pool handle
|
|
||||||
* @param max_remaining_jobs maximum number of jobs allowed to be queued without waiting.
|
|
||||||
*/
|
|
||||||
void opj_thread_pool_wait_completion(opj_thread_pool_t* tp, int max_remaining_jobs);
|
|
||||||
|
|
||||||
/** Return the number of threads associated with the thread pool.
|
|
||||||
*
|
|
||||||
* @param tp the thread pool handle.
|
|
||||||
* @return number of threads associated with the thread pool.
|
|
||||||
*/
|
|
||||||
int opj_thread_pool_get_thread_count(opj_thread_pool_t* tp);
|
|
||||||
|
|
||||||
/** Destroy a thread pool.
|
|
||||||
* @param tp the thread pool handle.
|
|
||||||
*/
|
|
||||||
void opj_thread_pool_destroy(opj_thread_pool_t* tp);
|
|
||||||
|
|
||||||
/*@}*/
|
|
||||||
|
|
||||||
/*@}*/
|
|
||||||
|
|
||||||
#endif /* THREAD_H */
|
|
@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* The copyright in this software is being made available under the 2-clauses
|
|
||||||
* BSD License, included below. This software may be subject to other third
|
|
||||||
* party and contributor rights, including patent rights, and no such rights
|
|
||||||
* are granted under this license.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2016, Even Rouault
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef TLS_KEYS_H
|
|
||||||
#define TLS_KEYS_H
|
|
||||||
|
|
||||||
#define OPJ_TLS_KEY_T1 0
|
|
||||||
|
|
||||||
#endif
|
|
@ -9,7 +9,7 @@
|
|||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||||
* Copyright (c) 2006, Mónica Díez, LPI-UVA, Spain
|
* Copyright (c) 2006, Mónica Díez, LPI-UVA, Spain
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -1389,7 +1389,7 @@ bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_volume_i
|
|||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_volume_info_t * volume_info) {
|
int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_volume_info_t * volume_info) {
|
||||||
int compno;
|
int compno;
|
||||||
int l = 0, i, npck = 0;
|
int l, i, npck = 0;
|
||||||
double encoding_time;
|
double encoding_time;
|
||||||
|
|
||||||
opj_tcd_tile_t *tile = NULL;
|
opj_tcd_tile_t *tile = NULL;
|
||||||
|
@ -36,7 +36,6 @@ set(OPENJPIP_SRCS
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/session_manager.c
|
${CMAKE_CURRENT_SOURCE_DIR}/session_manager.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/jpip_parser.c
|
${CMAKE_CURRENT_SOURCE_DIR}/jpip_parser.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/sock_manager.c
|
${CMAKE_CURRENT_SOURCE_DIR}/sock_manager.c
|
||||||
${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/opj_malloc.c
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set(SERVER_SRCS
|
set(SERVER_SRCS
|
||||||
|
@ -117,7 +117,6 @@ CODmarker_param_t get_CODmkrdata_from_j2kstream( Byte_t *CODstream)
|
|||||||
|
|
||||||
if( *CODstream++ != 0xff || *CODstream++ != 0x52){
|
if( *CODstream++ != 0xff || *CODstream++ != 0x52){
|
||||||
fprintf( FCGI_stderr, "Error, COD marker not found in the reconstructed j2kstream\n");
|
fprintf( FCGI_stderr, "Error, COD marker not found in the reconstructed j2kstream\n");
|
||||||
memset(&COD, 0, sizeof(COD));
|
|
||||||
return COD;
|
return COD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,7 +438,7 @@ void enqueue_allprecincts( int tile_id, int level, int lastcomp, OPJ_BOOL *comps
|
|||||||
OPJ_BOOL enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue)
|
OPJ_BOOL enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for( i=0; i<MAX_NUMOFBOX && query_param.box_type[i][0]!=0; i++){
|
for( i=0; query_param.box_type[i][0]!=0 && i<MAX_NUMOFBOX; i++){
|
||||||
if( query_param.box_type[i][0] == '*'){
|
if( query_param.box_type[i][0] == '*'){
|
||||||
fprintf( FCGI_stdout, "Status: 501\r\n");
|
fprintf( FCGI_stdout, "Status: 501\r\n");
|
||||||
fprintf( FCGI_stdout, "Reason: metareq with all box-property * not implemented\r\n");
|
fprintf( FCGI_stdout, "Reason: metareq with all box-property * not implemented\r\n");
|
||||||
|
@ -9,7 +9,7 @@ Name: openjpip
|
|||||||
Description: JPEG2000 Interactivity tools, APIs and protocols (Part 9)
|
Description: JPEG2000 Interactivity tools, APIs and protocols (Part 9)
|
||||||
URL: http://www.openjpeg.org/
|
URL: http://www.openjpeg.org/
|
||||||
Version: @OPENJPEG_VERSION@
|
Version: @OPENJPEG_VERSION@
|
||||||
Requires: libopenjp2
|
Requires: openjp2
|
||||||
Libs: -L${libdir} -lopenjpip
|
Libs: -L${libdir} -lopenjpip
|
||||||
Libs.private: -lm -lcurl -lfcgi -lpthread
|
Libs.private: -lm -lcurl -lfcgi -lpthread
|
||||||
Cflags: -I${includedir}
|
Cflags: -I${includedir}
|
||||||
|
@ -264,7 +264,7 @@ void print_queryparam( query_param_t query_param)
|
|||||||
}
|
}
|
||||||
|
|
||||||
fprintf( logstream, "\t req-box-prop\n");
|
fprintf( logstream, "\t req-box-prop\n");
|
||||||
for( i=0; i<MAX_NUMOFBOX && query_param.box_type[i][0]!=0; i++){
|
for( i=0; query_param.box_type[i][0]!=0 && i<MAX_NUMOFBOX; i++){
|
||||||
fprintf( logstream, "\t\t box_type: %.4s limit: %d w:%d s:%d g:%d a:%d priority:%d\n", query_param.box_type[i], query_param.limit[i], query_param.w[i], query_param.s[i], query_param.g[i], query_param.a[i], query_param.priority[i]);
|
fprintf( logstream, "\t\t box_type: %.4s limit: %d w:%d s:%d g:%d a:%d priority:%d\n", query_param.box_type[i], query_param.limit[i], query_param.w[i], query_param.s[i], query_param.g[i], query_param.a[i], query_param.priority[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ Name: openjpwl
|
|||||||
Description: JPEG2000 Wireless library (Part 11)
|
Description: JPEG2000 Wireless library (Part 11)
|
||||||
URL: http://www.openjpeg.org/
|
URL: http://www.openjpeg.org/
|
||||||
Version: @OPENJPEG_VERSION@
|
Version: @OPENJPEG_VERSION@
|
||||||
Requires: libopenjp2
|
Requires: openjp2
|
||||||
Libs: -L${libdir} -lopenjpwl
|
Libs: -L${libdir} -lopenjpwl
|
||||||
Libs.private: -lm
|
Libs.private: -lm
|
||||||
Cflags: -I${includedir}
|
Cflags: -I${includedir}
|
||||||
|
@ -80,8 +80,6 @@ set_property(TEST rta4 APPEND PROPERTY DEPENDS tte4)
|
|||||||
add_test(NAME rta5 COMMAND j2k_random_tile_access tte5.j2k)
|
add_test(NAME rta5 COMMAND j2k_random_tile_access tte5.j2k)
|
||||||
set_property(TEST rta5 APPEND PROPERTY DEPENDS tte5)
|
set_property(TEST rta5 APPEND PROPERTY DEPENDS tte5)
|
||||||
|
|
||||||
add_executable(include_openjpeg include_openjpeg.c)
|
|
||||||
|
|
||||||
# No image send to the dashboard if lib PNG is not available.
|
# No image send to the dashboard if lib PNG is not available.
|
||||||
if(NOT OPJ_HAVE_LIBPNG)
|
if(NOT OPJ_HAVE_LIBPNG)
|
||||||
message(WARNING "Lib PNG seems to be not available: if you want run the non-regression tests with images reported to the dashboard, you need it (try BUILD_THIRDPARTY)")
|
message(WARNING "Lib PNG seems to be not available: if you want run the non-regression tests with images reported to the dashboard, you need it (try BUILD_THIRDPARTY)")
|
||||||
|
@ -118,10 +118,10 @@ int main(int argc, char **argv)
|
|||||||
test_cmp_parameters inParam;
|
test_cmp_parameters inParam;
|
||||||
FILE *fbase=NULL, *ftest=NULL;
|
FILE *fbase=NULL, *ftest=NULL;
|
||||||
int same = 0;
|
int same = 0;
|
||||||
char lbase[512];
|
char lbase[256];
|
||||||
char strbase[512];
|
char strbase[256];
|
||||||
char ltest[512];
|
char ltest[256];
|
||||||
char strtest[512];
|
char strtest[256];
|
||||||
|
|
||||||
if( parse_cmdline_cmp(argc, argv, &inParam) == 1 )
|
if( parse_cmdline_cmp(argc, argv, &inParam) == 1 )
|
||||||
{
|
{
|
||||||
@ -154,9 +154,9 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
while (fgets(lbase, sizeof(lbase), fbase) && fgets(ltest,sizeof(ltest),ftest))
|
while (fgets(lbase, sizeof(lbase), fbase) && fgets(ltest,sizeof(ltest),ftest))
|
||||||
{
|
{
|
||||||
int nbase = sscanf(lbase, "%511[^\r\n]", strbase);
|
int nbase = sscanf(lbase, "%255[^\r\n]", strbase);
|
||||||
int ntest = sscanf(ltest, "%511[^\r\n]", strtest);
|
int ntest = sscanf(ltest, "%255[^\r\n]", strtest);
|
||||||
assert( nbase != 511 && ntest != 511 );
|
assert( nbase != 255 && ntest != 255 );
|
||||||
if( nbase != 1 || ntest != 1 )
|
if( nbase != 1 || ntest != 1 )
|
||||||
{
|
{
|
||||||
fprintf(stderr, "could not parse line from files\n" );
|
fprintf(stderr, "could not parse line from files\n" );
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
#include <openjpeg.h>
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
(void)argc;
|
|
||||||
(void)argv;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -50,8 +50,6 @@ set(BLACKLIST_JPEG2000_TMP
|
|||||||
issue429.jp2
|
issue429.jp2
|
||||||
issue427-null-image-size.jp2
|
issue427-null-image-size.jp2
|
||||||
issue427-illegal-tile-offset.jp2
|
issue427-illegal-tile-offset.jp2
|
||||||
issue495.jp2
|
|
||||||
issue820.jp2
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Define a list of file which should be gracefully rejected:
|
# Define a list of file which should be gracefully rejected:
|
||||||
|
@ -299,4 +299,3 @@ a190e10941e6145e69816c909f832c1a issue559-eci-091-CIELab.jp2_0.pgx
|
|||||||
f3081c8e9e9a175f223382a7443b480f issue559-eci-091-CIELab.jp2_2.pgx
|
f3081c8e9e9a175f223382a7443b480f issue559-eci-091-CIELab.jp2_2.pgx
|
||||||
3bf91c974abc17e520c6a5efa883a58a issue653-zero-unknownbox.jp2.png
|
3bf91c974abc17e520c6a5efa883a58a issue653-zero-unknownbox.jp2.png
|
||||||
8d7a866d29d5c68dc540b0f0011959a5 issue726.png
|
8d7a866d29d5c68dc540b0f0011959a5 issue726.png
|
||||||
3bf91c974abc17e520c6a5efa883a58a issue818.png
|
|
||||||
|
@ -146,8 +146,6 @@ opj_compress -i @INPUT_NR_PATH@/flower-minisblack-11.tif -o @TEMP_PATH@/flower-m
|
|||||||
opj_compress -i @INPUT_NR_PATH@/flower-minisblack-13.tif -o @TEMP_PATH@/flower-minisblack-13.tif.jp2
|
opj_compress -i @INPUT_NR_PATH@/flower-minisblack-13.tif -o @TEMP_PATH@/flower-minisblack-13.tif.jp2
|
||||||
opj_compress -i @INPUT_NR_PATH@/flower-minisblack-15.tif -o @TEMP_PATH@/flower-minisblack-15.tif.jp2
|
opj_compress -i @INPUT_NR_PATH@/flower-minisblack-15.tif -o @TEMP_PATH@/flower-minisblack-15.tif.jp2
|
||||||
|
|
||||||
# issue 843 Crash with invalid ppm file
|
|
||||||
!opj_compress -i @INPUT_NR_PATH@/issue843.ppm -o @TEMP_PATH@/issue843.ppm.jp2
|
|
||||||
|
|
||||||
# DECODER TEST SUITE
|
# DECODER TEST SUITE
|
||||||
opj_decompress -i @INPUT_NR_PATH@/Bretagne2.j2k -o @TEMP_PATH@/Bretagne2.j2k.pgx
|
opj_decompress -i @INPUT_NR_PATH@/Bretagne2.j2k -o @TEMP_PATH@/Bretagne2.j2k.pgx
|
||||||
@ -340,7 +338,7 @@ opj_decompress -i @INPUT_NR_PATH@/issue458.jp2 -o @TEMP_PATH@/issue458.jp2.pgx
|
|||||||
# issue 475 Invalid number of layers
|
# issue 475 Invalid number of layers
|
||||||
!opj_decompress -i @INPUT_NR_PATH@/issue475.jp2 -o @TEMP_PATH@/issue475.jp2.pgx
|
!opj_decompress -i @INPUT_NR_PATH@/issue475.jp2 -o @TEMP_PATH@/issue475.jp2.pgx
|
||||||
# issue 495 Overflow op_image_comp_header_updat
|
# issue 495 Overflow op_image_comp_header_updat
|
||||||
!opj_decompress -i @INPUT_NR_PATH@/issue495.jp2 -o @TEMP_PATH@/issue495.jp2.pgx
|
opj_decompress -i @INPUT_NR_PATH@/issue495.jp2 -o @TEMP_PATH@/issue495.jp2.pgx
|
||||||
|
|
||||||
|
|
||||||
# decode with specific area
|
# decode with specific area
|
||||||
@ -559,18 +557,3 @@ opj_decompress -i @INPUT_NR_PATH@/basn6a08.jp2 -o @TEMP_PATH@/basn6a08_tif-15.ti
|
|||||||
!opj_decompress -i @INPUT_NR_PATH@/issue725.jp2 -o @TEMP_PATH@/issue725.png
|
!opj_decompress -i @INPUT_NR_PATH@/issue725.jp2 -o @TEMP_PATH@/issue725.png
|
||||||
# issue 726
|
# issue 726
|
||||||
opj_decompress -i @INPUT_NR_PATH@/issue726.j2k -o @TEMP_PATH@/issue726.png
|
opj_decompress -i @INPUT_NR_PATH@/issue726.j2k -o @TEMP_PATH@/issue726.png
|
||||||
# issue 733
|
|
||||||
!opj_decompress -i @INPUT_NR_PATH@/issue733.jp2 -o @TEMP_PATH@/issue733.png
|
|
||||||
# issue 774
|
|
||||||
!opj_decompress -i @INPUT_NR_PATH@/issue774.jp2 -o @TEMP_PATH@/issue774.png
|
|
||||||
# issue 775
|
|
||||||
!opj_decompress -i @INPUT_NR_PATH@/issue775.j2k -o @TEMP_PATH@/issue775.png
|
|
||||||
!opj_decompress -i @INPUT_NR_PATH@/issue775-2.j2k -o @TEMP_PATH@/issue775-2.png
|
|
||||||
# issue 818
|
|
||||||
opj_decompress -i @INPUT_NR_PATH@/issue818.jp2 -o @TEMP_PATH@/issue818.png
|
|
||||||
# issue 823
|
|
||||||
!opj_decompress -i @INPUT_NR_PATH@/issue823.jp2 -o @TEMP_PATH@/issue823.png
|
|
||||||
# issue 826
|
|
||||||
!opj_decompress -i @INPUT_NR_PATH@/issue826.jp2 -o @TEMP_PATH@/issue826.png
|
|
||||||
# issue 820
|
|
||||||
!opj_decompress -i @INPUT_NR_PATH@/issue820.jp2 -o @TEMP_PATH@/issue820.png
|
|
||||||
|
@ -178,7 +178,7 @@ int main (int argc, char *argv[])
|
|||||||
int da_y0=0;
|
int da_y0=0;
|
||||||
int da_x1=1000;
|
int da_x1=1000;
|
||||||
int da_y1=1000;
|
int da_y1=1000;
|
||||||
const char *input_file;
|
char input_file[64];
|
||||||
|
|
||||||
/* should be test_tile_decoder 0 0 1000 1000 tte1.j2k */
|
/* should be test_tile_decoder 0 0 1000 1000 tte1.j2k */
|
||||||
if( argc == 6 )
|
if( argc == 6 )
|
||||||
@ -187,7 +187,7 @@ int main (int argc, char *argv[])
|
|||||||
da_y0=atoi(argv[2]);
|
da_y0=atoi(argv[2]);
|
||||||
da_x1=atoi(argv[3]);
|
da_x1=atoi(argv[3]);
|
||||||
da_y1=atoi(argv[4]);
|
da_y1=atoi(argv[4]);
|
||||||
input_file = argv[5];
|
strcpy(input_file,argv[5]);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -196,7 +196,7 @@ int main (int argc, char *argv[])
|
|||||||
da_y0=0;
|
da_y0=0;
|
||||||
da_x1=1000;
|
da_x1=1000;
|
||||||
da_y1=1000;
|
da_y1=1000;
|
||||||
input_file = "test.j2k";
|
strcpy(input_file,"test.j2k");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! l_data) {
|
if (! l_data) {
|
||||||
|
@ -69,7 +69,7 @@ int main (int argc, char *argv[])
|
|||||||
opj_stream_t * l_stream;
|
opj_stream_t * l_stream;
|
||||||
OPJ_UINT32 l_nb_tiles;
|
OPJ_UINT32 l_nb_tiles;
|
||||||
OPJ_UINT32 l_data_size;
|
OPJ_UINT32 l_data_size;
|
||||||
size_t len;
|
unsigned char len;
|
||||||
|
|
||||||
#ifdef USING_MCT
|
#ifdef USING_MCT
|
||||||
const OPJ_FLOAT32 l_mct [] =
|
const OPJ_FLOAT32 l_mct [] =
|
||||||
@ -96,7 +96,7 @@ int main (int argc, char *argv[])
|
|||||||
int tile_height;
|
int tile_height;
|
||||||
int comp_prec;
|
int comp_prec;
|
||||||
int irreversible;
|
int irreversible;
|
||||||
const char *output_file;
|
char output_file[64];
|
||||||
|
|
||||||
/* should be test_tile_encoder 3 2000 2000 1000 1000 8 tte1.j2k */
|
/* should be test_tile_encoder 3 2000 2000 1000 1000 8 tte1.j2k */
|
||||||
if( argc == 9 )
|
if( argc == 9 )
|
||||||
@ -108,7 +108,7 @@ int main (int argc, char *argv[])
|
|||||||
tile_height = atoi( argv[5] );
|
tile_height = atoi( argv[5] );
|
||||||
comp_prec = atoi( argv[6] );
|
comp_prec = atoi( argv[6] );
|
||||||
irreversible = atoi( argv[7] );
|
irreversible = atoi( argv[7] );
|
||||||
output_file = argv[8];
|
strcpy(output_file, argv[8] );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -119,7 +119,7 @@ int main (int argc, char *argv[])
|
|||||||
tile_height = 1000;
|
tile_height = 1000;
|
||||||
comp_prec = 8;
|
comp_prec = 8;
|
||||||
irreversible = 1;
|
irreversible = 1;
|
||||||
output_file = "test.j2k";
|
strcpy(output_file, "test.j2k" );
|
||||||
}
|
}
|
||||||
if( num_comps > NUM_COMPS_MAX )
|
if( num_comps > NUM_COMPS_MAX )
|
||||||
{
|
{
|
||||||
@ -228,7 +228,7 @@ int main (int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* should we do j2k or jp2 ?*/
|
/* should we do j2k or jp2 ?*/
|
||||||
len = strlen( output_file );
|
len = (unsigned char)strlen( output_file );
|
||||||
if( strcmp( output_file + len - 4, ".jp2" ) == 0 )
|
if( strcmp( output_file + len - 4, ".jp2" ) == 0 )
|
||||||
{
|
{
|
||||||
l_codec = opj_create_compress(OPJ_CODEC_JP2);
|
l_codec = opj_create_compress(OPJ_CODEC_JP2);
|
||||||
|
6
thirdparty/liblcms2/include/lcms2.h
vendored
6
thirdparty/liblcms2/include/lcms2.h
vendored
@ -23,7 +23,7 @@
|
|||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// Version 2.8
|
// Version 2.8beta0
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef _lcms2_H
|
#ifndef _lcms2_H
|
||||||
@ -656,7 +656,7 @@ typedef void* cmsHTRANSFORM;
|
|||||||
// T: Pixeltype
|
// T: Pixeltype
|
||||||
// F: Flavor 0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla)
|
// F: Flavor 0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla)
|
||||||
// P: Planar? 0=Chunky, 1=Planar
|
// P: Planar? 0=Chunky, 1=Planar
|
||||||
// X: swap 16 bps endianness?
|
// X: swap 16 bps endianess?
|
||||||
// S: Do swap? ie, BGR, KYMC
|
// S: Do swap? ie, BGR, KYMC
|
||||||
// E: Extra samples
|
// E: Extra samples
|
||||||
// C: Channels (Samples per pixel)
|
// C: Channels (Samples per pixel)
|
||||||
@ -1016,7 +1016,7 @@ CMSAPI long int CMSEXPORT cmsfilelength(FILE* f);
|
|||||||
// Context handling --------------------------------------------------------------------------------------------------------
|
// Context handling --------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Each context holds its owns globals and its own plug-ins. There is a global context with the id = 0 for lecacy compatibility
|
// Each context holds its owns globals and its own plug-ins. There is a global context with the id = 0 for lecacy compatibility
|
||||||
// though using the global context is not recommended. Proper context handling makes lcms more thread-safe.
|
// though using the global context is not recomended. Proper context handling makes lcms more thread-safe.
|
||||||
|
|
||||||
typedef struct _cmsContext_struct* cmsContext;
|
typedef struct _cmsContext_struct* cmsContext;
|
||||||
|
|
||||||
|
2
thirdparty/liblcms2/include/lcms2_plugin.h
vendored
2
thirdparty/liblcms2/include/lcms2_plugin.h
vendored
@ -128,7 +128,7 @@ struct _cms_io_handler {
|
|||||||
const void* Buffer);
|
const void* Buffer);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Endianness adjust functions
|
// Endianess adjust functions
|
||||||
CMSAPI cmsUInt16Number CMSEXPORT _cmsAdjustEndianess16(cmsUInt16Number Word);
|
CMSAPI cmsUInt16Number CMSEXPORT _cmsAdjustEndianess16(cmsUInt16Number Word);
|
||||||
CMSAPI cmsUInt32Number CMSEXPORT _cmsAdjustEndianess32(cmsUInt32Number Value);
|
CMSAPI cmsUInt32Number CMSEXPORT _cmsAdjustEndianess32(cmsUInt32Number Value);
|
||||||
CMSAPI void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord);
|
CMSAPI void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord);
|
||||||
|
143
thirdparty/liblcms2/src/cmsalpha.c
vendored
143
thirdparty/liblcms2/src/cmsalpha.c
vendored
@ -408,111 +408,74 @@ void ComputeComponentIncrements(cmsUInt32Number Format,
|
|||||||
|
|
||||||
// Handles extra channels copying alpha if requested by the flags
|
// Handles extra channels copying alpha if requested by the flags
|
||||||
void _cmsHandleExtraChannels(_cmsTRANSFORM* p, const void* in,
|
void _cmsHandleExtraChannels(_cmsTRANSFORM* p, const void* in,
|
||||||
void* out,
|
void* out,
|
||||||
cmsUInt32Number PixelsPerLine,
|
cmsUInt32Number PixelsPerLine,
|
||||||
cmsUInt32Number LineCount,
|
cmsUInt32Number LineCount,
|
||||||
const cmsStride* Stride)
|
const cmsStride* Stride)
|
||||||
{
|
{
|
||||||
cmsUInt32Number i, j, k;
|
size_t i, j, k;
|
||||||
cmsUInt32Number nExtra;
|
cmsUInt32Number nExtra;
|
||||||
cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS];
|
cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS];
|
||||||
cmsUInt32Number SourceIncrements[cmsMAXCHANNELS];
|
cmsUInt32Number SourceIncrements[cmsMAXCHANNELS];
|
||||||
cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS];
|
cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS];
|
||||||
cmsUInt32Number DestIncrements[cmsMAXCHANNELS];
|
cmsUInt32Number DestIncrements[cmsMAXCHANNELS];
|
||||||
|
cmsUInt32Number SourceStrideIncrements[cmsMAXCHANNELS];
|
||||||
|
cmsUInt32Number DestStrideIncrements[cmsMAXCHANNELS];
|
||||||
|
|
||||||
cmsFormatterAlphaFn copyValueFn;
|
cmsUInt8Number* SourcePtr[cmsMAXCHANNELS];
|
||||||
|
cmsUInt8Number* DestPtr[cmsMAXCHANNELS];
|
||||||
|
|
||||||
// Make sure we need some copy
|
cmsFormatterAlphaFn copyValueFn;
|
||||||
if (!(p->dwOriginalFlags & cmsFLAGS_COPY_ALPHA))
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Exit early if in-place color-management is occurring - no need to copy extra channels to themselves.
|
// Make sure we need some copy
|
||||||
if (p->InputFormat == p->OutputFormat && in == out)
|
if (!(p->dwOriginalFlags & cmsFLAGS_COPY_ALPHA))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Make sure we have same number of alpha channels. If not, just return as this should be checked at transform creation time.
|
// Make sure we have same number of alpha channels. If not, just return as this should be checked at transform creation time.
|
||||||
nExtra = T_EXTRA(p->InputFormat);
|
nExtra = T_EXTRA(p->InputFormat);
|
||||||
if (nExtra != T_EXTRA(p->OutputFormat))
|
if (nExtra != T_EXTRA(p->OutputFormat))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Anything to do?
|
||||||
|
if (nExtra == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
// Anything to do?
|
// Compute the increments
|
||||||
if (nExtra == 0)
|
ComputeComponentIncrements(p->InputFormat, Stride->BytesPerPlaneIn, SourceStartingOrder, SourceIncrements);
|
||||||
return;
|
ComputeComponentIncrements(p->OutputFormat, Stride->BytesPerPlaneOut, DestStartingOrder, DestIncrements);
|
||||||
|
|
||||||
|
// Check for conversions 8, 16, half, float, dbl
|
||||||
|
copyValueFn = _cmsGetFormatterAlpha(p->ContextID, p->InputFormat, p->OutputFormat);
|
||||||
|
|
||||||
// Compute the increments
|
memset(SourceStrideIncrements, 0, sizeof(SourceStrideIncrements));
|
||||||
ComputeComponentIncrements(p->InputFormat, Stride->BytesPerPlaneIn, SourceStartingOrder, SourceIncrements);
|
memset(DestStrideIncrements, 0, sizeof(DestStrideIncrements));
|
||||||
ComputeComponentIncrements(p->OutputFormat, Stride->BytesPerPlaneOut, DestStartingOrder, DestIncrements);
|
|
||||||
|
|
||||||
// Check for conversions 8, 16, half, float, dbl
|
// The loop itself
|
||||||
copyValueFn = _cmsGetFormatterAlpha(p->ContextID, p->InputFormat, p->OutputFormat);
|
for (i = 0; i < LineCount; i++) {
|
||||||
|
|
||||||
if (nExtra == 1) { // Optimized routine for copying a single extra channel quickly
|
// Prepare pointers for the loop
|
||||||
|
for (j = 0; j < nExtra; j++) {
|
||||||
|
|
||||||
cmsUInt8Number* SourcePtr;
|
SourcePtr[j] = (cmsUInt8Number*)in + SourceStartingOrder[j] + SourceStrideIncrements[j];
|
||||||
cmsUInt8Number* DestPtr;
|
DestPtr[j] = (cmsUInt8Number*)out + DestStartingOrder[j] + DestStrideIncrements[j];
|
||||||
|
}
|
||||||
|
|
||||||
cmsUInt32Number SourceStrideIncrement = 0;
|
for (j = 0; j < PixelsPerLine; j++) {
|
||||||
cmsUInt32Number DestStrideIncrement = 0;
|
|
||||||
|
|
||||||
// The loop itself
|
for (k = 0; k < nExtra; k++) {
|
||||||
for (i = 0; i < LineCount; i++) {
|
|
||||||
|
|
||||||
// Prepare pointers for the loop
|
copyValueFn(DestPtr[k], SourcePtr[k]);
|
||||||
SourcePtr = (cmsUInt8Number*)in + SourceStartingOrder[0] + SourceStrideIncrement;
|
|
||||||
DestPtr = (cmsUInt8Number*)out + DestStartingOrder[0] + DestStrideIncrement;
|
|
||||||
|
|
||||||
for (j = 0; j < PixelsPerLine; j++) {
|
SourcePtr[k] += SourceIncrements[k];
|
||||||
|
DestPtr[k] += DestIncrements[k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
copyValueFn(DestPtr, SourcePtr);
|
for (j = 0; j < nExtra; j++) {
|
||||||
|
|
||||||
SourcePtr += SourceIncrements[0];
|
SourceStrideIncrements[j] += Stride->BytesPerLineIn;
|
||||||
DestPtr += DestIncrements[0];
|
DestStrideIncrements[j] += Stride->BytesPerLineOut;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
SourceStrideIncrement += Stride->BytesPerLineIn;
|
|
||||||
DestStrideIncrement += Stride->BytesPerLineOut;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else { // General case with more than one extra channel
|
|
||||||
|
|
||||||
cmsUInt8Number* SourcePtr[cmsMAXCHANNELS];
|
|
||||||
cmsUInt8Number* DestPtr[cmsMAXCHANNELS];
|
|
||||||
|
|
||||||
cmsUInt32Number SourceStrideIncrements[cmsMAXCHANNELS];
|
|
||||||
cmsUInt32Number DestStrideIncrements[cmsMAXCHANNELS];
|
|
||||||
|
|
||||||
memset(SourceStrideIncrements, 0, sizeof(SourceStrideIncrements));
|
|
||||||
memset(DestStrideIncrements, 0, sizeof(DestStrideIncrements));
|
|
||||||
|
|
||||||
// The loop itself
|
|
||||||
for (i = 0; i < LineCount; i++) {
|
|
||||||
|
|
||||||
// Prepare pointers for the loop
|
|
||||||
for (j = 0; j < nExtra; j++) {
|
|
||||||
|
|
||||||
SourcePtr[j] = (cmsUInt8Number*)in + SourceStartingOrder[j] + SourceStrideIncrements[j];
|
|
||||||
DestPtr[j] = (cmsUInt8Number*)out + DestStartingOrder[j] + DestStrideIncrements[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 0; j < PixelsPerLine; j++) {
|
|
||||||
|
|
||||||
for (k = 0; k < nExtra; k++) {
|
|
||||||
|
|
||||||
copyValueFn(DestPtr[k], SourcePtr[k]);
|
|
||||||
|
|
||||||
SourcePtr[k] += SourceIncrements[k];
|
|
||||||
DestPtr[k] += DestIncrements[k];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 0; j < nExtra; j++) {
|
|
||||||
|
|
||||||
SourceStrideIncrements[j] += Stride->BytesPerLineIn;
|
|
||||||
DestStrideIncrements[j] += Stride->BytesPerLineOut;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
6
thirdparty/liblcms2/src/cmscgats.c
vendored
6
thirdparty/liblcms2/src/cmscgats.c
vendored
@ -596,7 +596,7 @@ void ReadReal(cmsIT8* it8, int inum)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parses a float number
|
// Parses a float number
|
||||||
// This can not call directly atof because it uses locale dependent
|
// This can not call directly atof because it uses locale dependant
|
||||||
// parsing, while CCMX files always use . as decimal separator
|
// parsing, while CCMX files always use . as decimal separator
|
||||||
static
|
static
|
||||||
cmsFloat64Number ParseFloatNumber(const char *Buffer)
|
cmsFloat64Number ParseFloatNumber(const char *Buffer)
|
||||||
@ -1817,7 +1817,7 @@ cmsBool CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number*
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------- Higher level parsing
|
// -------------------------------------------------------------- Higer level parsing
|
||||||
|
|
||||||
static
|
static
|
||||||
cmsBool DataFormatSection(cmsIT8* it8)
|
cmsBool DataFormatSection(cmsIT8* it8)
|
||||||
@ -2120,7 +2120,7 @@ cmsBool ParseIT8(cmsIT8* it8, cmsBool nosheet)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Init useful pointers
|
// Init usefull pointers
|
||||||
|
|
||||||
static
|
static
|
||||||
void CookPointers(cmsIT8* it8)
|
void CookPointers(cmsIT8* it8)
|
||||||
|
6
thirdparty/liblcms2/src/cmscnvrt.c
vendored
6
thirdparty/liblcms2/src/cmscnvrt.c
vendored
@ -107,7 +107,7 @@ static cmsIntentsList DefaultIntents[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// A pointer to the beginning of the list
|
// A pointer to the begining of the list
|
||||||
_cmsIntentsPluginChunkType _cmsIntentsPluginChunk = { NULL };
|
_cmsIntentsPluginChunkType _cmsIntentsPluginChunk = { NULL };
|
||||||
|
|
||||||
// Duplicates the zone of memory used by the plug-in in the new context
|
// Duplicates the zone of memory used by the plug-in in the new context
|
||||||
@ -889,7 +889,7 @@ int BlackPreservingSampler(register const cmsUInt16Number In[], register cmsUInt
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make sure to pass through K (which now is fixed)
|
// Make sure to pass thru K (which now is fixed)
|
||||||
Outf[3] = LabK[3];
|
Outf[3] = LabK[3];
|
||||||
|
|
||||||
// Apply TAC if needed
|
// Apply TAC if needed
|
||||||
@ -957,7 +957,7 @@ cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID,
|
|||||||
memset(&bp, 0, sizeof(bp));
|
memset(&bp, 0, sizeof(bp));
|
||||||
|
|
||||||
// We need the input LUT of the last profile, assuming this one is responsible of
|
// We need the input LUT of the last profile, assuming this one is responsible of
|
||||||
// black generation. This LUT will be searched in inverse order.
|
// black generation. This LUT will be seached in inverse order.
|
||||||
bp.LabK2cmyk = _cmsReadInputLUT(hProfiles[nProfiles-1], INTENT_RELATIVE_COLORIMETRIC);
|
bp.LabK2cmyk = _cmsReadInputLUT(hProfiles[nProfiles-1], INTENT_RELATIVE_COLORIMETRIC);
|
||||||
if (bp.LabK2cmyk == NULL) goto Cleanup;
|
if (bp.LabK2cmyk == NULL) goto Cleanup;
|
||||||
|
|
||||||
|
6
thirdparty/liblcms2/src/cmserr.c
vendored
6
thirdparty/liblcms2/src/cmserr.c
vendored
@ -198,7 +198,7 @@ void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsCo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Auxiliary to fill memory management functions from plugin (or context 0 defaults)
|
// Auxiliar to fill memory management functions from plugin (or context 0 defaults)
|
||||||
void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr)
|
void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr)
|
||||||
{
|
{
|
||||||
if (Plugin == NULL) {
|
if (Plugin == NULL) {
|
||||||
@ -430,14 +430,14 @@ void* _cmsSubAllocDup(_cmsSubAllocator* s, const void *ptr, cmsUInt32Number size
|
|||||||
|
|
||||||
// Error logging ******************************************************************
|
// Error logging ******************************************************************
|
||||||
|
|
||||||
// There is no error handling at all. When a function fails, it returns proper value.
|
// There is no error handling at all. When a funtion fails, it returns proper value.
|
||||||
// For example, all create functions does return NULL on failure. Other return FALSE
|
// For example, all create functions does return NULL on failure. Other return FALSE
|
||||||
// It may be interesting, for the developer, to know why the function is failing.
|
// It may be interesting, for the developer, to know why the function is failing.
|
||||||
// for that reason, lcms2 does offer a logging function. This function does recive
|
// for that reason, lcms2 does offer a logging function. This function does recive
|
||||||
// a ENGLISH string with some clues on what is going wrong. You can show this
|
// a ENGLISH string with some clues on what is going wrong. You can show this
|
||||||
// info to the end user, or just create some sort of log.
|
// info to the end user, or just create some sort of log.
|
||||||
// The logging function should NOT terminate the program, as this obviously can leave
|
// The logging function should NOT terminate the program, as this obviously can leave
|
||||||
// resources. It is the programmer's responsibility to check each function return code
|
// resources. It is the programmer's responsability to check each function return code
|
||||||
// to make sure it didn't fail.
|
// to make sure it didn't fail.
|
||||||
|
|
||||||
// Error messages are limited to MAX_ERROR_MESSAGE_LEN
|
// Error messages are limited to MAX_ERROR_MESSAGE_LEN
|
||||||
|
2
thirdparty/liblcms2/src/cmsgamma.c
vendored
2
thirdparty/liblcms2/src/cmsgamma.c
vendored
@ -567,7 +567,7 @@ cmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Nu
|
|||||||
return Val;
|
return Val;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Evaluate a segmented function for a single value. Return -1 if no valid segment found .
|
// Evaluate a segmented funtion for a single value. Return -1 if no valid segment found .
|
||||||
// If fn type is 0, perform an interpolation on the table
|
// If fn type is 0, perform an interpolation on the table
|
||||||
static
|
static
|
||||||
cmsFloat64Number EvalSegmentedFn(const cmsToneCurve *g, cmsFloat64Number R)
|
cmsFloat64Number EvalSegmentedFn(const cmsToneCurve *g, cmsFloat64Number R)
|
||||||
|
6
thirdparty/liblcms2/src/cmsgmt.c
vendored
6
thirdparty/liblcms2/src/cmsgmt.c
vendored
@ -27,7 +27,7 @@
|
|||||||
#include "lcms2_internal.h"
|
#include "lcms2_internal.h"
|
||||||
|
|
||||||
|
|
||||||
// Auxiliary: append a Lab identity after the given sequence of profiles
|
// Auxiliar: append a Lab identity after the given sequence of profiles
|
||||||
// and return the transform. Lab profile is closed, rest of profiles are kept open.
|
// and return the transform. Lab profile is closed, rest of profiles are kept open.
|
||||||
cmsHTRANSFORM _cmsChain2Lab(cmsContext ContextID,
|
cmsHTRANSFORM _cmsChain2Lab(cmsContext ContextID,
|
||||||
cmsUInt32Number nProfiles,
|
cmsUInt32Number nProfiles,
|
||||||
@ -172,7 +172,7 @@ cmsToneCurve* _cmsBuildKToneCurve(cmsContext ContextID,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Build the relationship. This effectively limits the maximum accuracy to 16 bits, but
|
// Build the relationship. This effectively limits the maximum accuracy to 16 bits, but
|
||||||
// since this is used on black-preserving LUTs, we are not losing accuracy in any case
|
// since this is used on black-preserving LUTs, we are not loosing accuracy in any case
|
||||||
KTone = cmsJoinToneCurve(ContextID, in, out, nPoints);
|
KTone = cmsJoinToneCurve(ContextID, in, out, nPoints);
|
||||||
|
|
||||||
// Get rid of components
|
// Get rid of components
|
||||||
@ -278,7 +278,7 @@ int GamutSampler(register const cmsUInt16Number In[], register cmsUInt16Number O
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Does compute a gamut LUT going back and forth across pcs -> relativ. colorimetric intent -> pcs
|
// Does compute a gamut LUT going back and forth across pcs -> relativ. colorimetric intent -> pcs
|
||||||
// the dE obtained is then annotated on the LUT. Values truly out of gamut are clipped to dE = 0xFFFE
|
// the dE obtained is then annotated on the LUT. Values truely out of gamut are clipped to dE = 0xFFFE
|
||||||
// and values changed are supposed to be handled by any gamut remapping, so, are out of gamut as well.
|
// and values changed are supposed to be handled by any gamut remapping, so, are out of gamut as well.
|
||||||
//
|
//
|
||||||
// **WARNING: This algorithm does assume that gamut remapping algorithms does NOT move in-gamut colors,
|
// **WARNING: This algorithm does assume that gamut remapping algorithms does NOT move in-gamut colors,
|
||||||
|
2
thirdparty/liblcms2/src/cmsintrp.c
vendored
2
thirdparty/liblcms2/src/cmsintrp.c
vendored
@ -156,7 +156,7 @@ cmsInterpParams* _cmsComputeInterpParams(cmsContext ContextID, int nSamples, int
|
|||||||
int i;
|
int i;
|
||||||
cmsUInt32Number Samples[MAX_INPUT_DIMENSIONS];
|
cmsUInt32Number Samples[MAX_INPUT_DIMENSIONS];
|
||||||
|
|
||||||
// Fill the auxiliary array
|
// Fill the auxiliar array
|
||||||
for (i=0; i < MAX_INPUT_DIMENSIONS; i++)
|
for (i=0; i < MAX_INPUT_DIMENSIONS; i++)
|
||||||
Samples[i] = nSamples;
|
Samples[i] = nSamples;
|
||||||
|
|
||||||
|
32
thirdparty/liblcms2/src/cmsio0.c
vendored
32
thirdparty/liblcms2/src/cmsio0.c
vendored
@ -324,7 +324,7 @@ cmsUInt32Number FileRead(cmsIOHANDLER* iohandler, void *Buffer, cmsUInt32Number
|
|||||||
return nReaded;
|
return nReaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Position file pointer in the file
|
// Postion file pointer in the file
|
||||||
static
|
static
|
||||||
cmsBool FileSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset)
|
cmsBool FileSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset)
|
||||||
{
|
{
|
||||||
@ -368,7 +368,6 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const cha
|
|||||||
{
|
{
|
||||||
cmsIOHANDLER* iohandler = NULL;
|
cmsIOHANDLER* iohandler = NULL;
|
||||||
FILE* fm = NULL;
|
FILE* fm = NULL;
|
||||||
cmsInt32Number fileLen;
|
|
||||||
|
|
||||||
_cmsAssert(FileName != NULL);
|
_cmsAssert(FileName != NULL);
|
||||||
_cmsAssert(AccessMode != NULL);
|
_cmsAssert(AccessMode != NULL);
|
||||||
@ -384,17 +383,8 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const cha
|
|||||||
_cmsFree(ContextID, iohandler);
|
_cmsFree(ContextID, iohandler);
|
||||||
cmsSignalError(ContextID, cmsERROR_FILE, "File '%s' not found", FileName);
|
cmsSignalError(ContextID, cmsERROR_FILE, "File '%s' not found", FileName);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
fileLen = cmsfilelength(fm);
|
|
||||||
if (fileLen < 0)
|
|
||||||
{
|
|
||||||
fclose(fm);
|
|
||||||
_cmsFree(ContextID, iohandler);
|
|
||||||
cmsSignalError(ContextID, cmsERROR_FILE, "Cannot get size of file '%s'", FileName);
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
iohandler -> ReportedSize = (cmsUInt32Number) cmsfilelength(fm);
|
||||||
iohandler -> ReportedSize = (cmsUInt32Number) fileLen;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'w':
|
case 'w':
|
||||||
@ -434,14 +424,6 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const cha
|
|||||||
cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream)
|
cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream)
|
||||||
{
|
{
|
||||||
cmsIOHANDLER* iohandler = NULL;
|
cmsIOHANDLER* iohandler = NULL;
|
||||||
cmsInt32Number fileSize;
|
|
||||||
|
|
||||||
fileSize = cmsfilelength(Stream);
|
|
||||||
if (fileSize < 0)
|
|
||||||
{
|
|
||||||
cmsSignalError(ContextID, cmsERROR_FILE, "Cannot get size of stream");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER));
|
iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER));
|
||||||
if (iohandler == NULL) return NULL;
|
if (iohandler == NULL) return NULL;
|
||||||
@ -449,7 +431,7 @@ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* S
|
|||||||
iohandler -> ContextID = ContextID;
|
iohandler -> ContextID = ContextID;
|
||||||
iohandler -> stream = (void*) Stream;
|
iohandler -> stream = (void*) Stream;
|
||||||
iohandler -> UsedSpace = 0;
|
iohandler -> UsedSpace = 0;
|
||||||
iohandler -> ReportedSize = (cmsUInt32Number) fileSize;
|
iohandler -> ReportedSize = (cmsUInt32Number) cmsfilelength(Stream);
|
||||||
iohandler -> PhysicalFile[0] = 0;
|
iohandler -> PhysicalFile[0] = 0;
|
||||||
|
|
||||||
iohandler ->Read = FileRead;
|
iohandler ->Read = FileRead;
|
||||||
@ -641,7 +623,7 @@ cmsBool _cmsNewTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, int* NewPos)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Check existence
|
// Check existance
|
||||||
cmsBool CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig)
|
cmsBool CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig)
|
||||||
{
|
{
|
||||||
_cmsICCPROFILE* Icc = (_cmsICCPROFILE*) (void*) hProfile;
|
_cmsICCPROFILE* Icc = (_cmsICCPROFILE*) (void*) hProfile;
|
||||||
@ -697,7 +679,7 @@ cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adjust endianness of the used parameters
|
// Adjust endianess of the used parameters
|
||||||
Icc -> DeviceClass = (cmsProfileClassSignature) _cmsAdjustEndianess32(Header.deviceClass);
|
Icc -> DeviceClass = (cmsProfileClassSignature) _cmsAdjustEndianess32(Header.deviceClass);
|
||||||
Icc -> ColorSpace = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.colorSpace);
|
Icc -> ColorSpace = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.colorSpace);
|
||||||
Icc -> PCS = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.pcs);
|
Icc -> PCS = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.pcs);
|
||||||
@ -815,7 +797,7 @@ cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace)
|
|||||||
|
|
||||||
memset(&Header.reserved, 0, sizeof(Header.reserved));
|
memset(&Header.reserved, 0, sizeof(Header.reserved));
|
||||||
|
|
||||||
// Set profile ID. Endianness is always big endian
|
// Set profile ID. Endianess is always big endian
|
||||||
memmove(&Header.profileID, &Icc ->ProfileID, 16);
|
memmove(&Header.profileID, &Icc ->ProfileID, 16);
|
||||||
|
|
||||||
// Dump the header
|
// Dump the header
|
||||||
@ -1562,7 +1544,7 @@ void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig)
|
|||||||
LocalTypeHandler.ICCVersion = Icc ->Version;
|
LocalTypeHandler.ICCVersion = Icc ->Version;
|
||||||
Icc -> TagPtrs[n] = LocalTypeHandler.ReadPtr(&LocalTypeHandler, io, &ElemCount, TagSize);
|
Icc -> TagPtrs[n] = LocalTypeHandler.ReadPtr(&LocalTypeHandler, io, &ElemCount, TagSize);
|
||||||
|
|
||||||
// The tag type is supported, but something wrong happened and we cannot read the tag.
|
// The tag type is supported, but something wrong happend and we cannot read the tag.
|
||||||
// let know the user about this (although it is just a warning)
|
// let know the user about this (although it is just a warning)
|
||||||
if (Icc -> TagPtrs[n] == NULL) {
|
if (Icc -> TagPtrs[n] == NULL) {
|
||||||
|
|
||||||
|
47
thirdparty/liblcms2/src/cmsio1.c
vendored
47
thirdparty/liblcms2/src/cmsio1.c
vendored
@ -128,7 +128,7 @@ cmsBool _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Auxiliary, read colorants as a MAT3 structure. Used by any function that needs a matrix-shaper
|
// Auxiliar, read colorants as a MAT3 structure. Used by any function that needs a matrix-shaper
|
||||||
static
|
static
|
||||||
cmsBool ReadICCMatrixRGB2XYZ(cmsMAT3* r, cmsHPROFILE hProfile)
|
cmsBool ReadICCMatrixRGB2XYZ(cmsMAT3* r, cmsHPROFILE hProfile)
|
||||||
{
|
{
|
||||||
@ -314,7 +314,7 @@ cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent)
|
|||||||
cmsTagSignature tagFloat;
|
cmsTagSignature tagFloat;
|
||||||
cmsContext ContextID = cmsGetProfileContextID(hProfile);
|
cmsContext ContextID = cmsGetProfileContextID(hProfile);
|
||||||
|
|
||||||
// On named color, take the appropriate tag
|
// On named color, take the appropiate tag
|
||||||
if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {
|
if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {
|
||||||
|
|
||||||
cmsPipeline* Lut;
|
cmsPipeline* Lut;
|
||||||
@ -336,9 +336,9 @@ cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent)
|
|||||||
return Lut;
|
return Lut;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is an attempt to reuse this function to retrieve the matrix-shaper as pipeline no
|
// This is an attempt to reuse this funtion to retrieve the matrix-shaper as pipeline no
|
||||||
// matter other LUT are present and have precedence. Intent = -1 means just this.
|
// matter other LUT are present and have precedence. Intent = -1 means just this.
|
||||||
if (Intent >= INTENT_PERCEPTUAL && Intent <= INTENT_ABSOLUTE_COLORIMETRIC) {
|
if (Intent != -1) {
|
||||||
|
|
||||||
tag16 = Device2PCS16[Intent];
|
tag16 = Device2PCS16[Intent];
|
||||||
tagFloat = Device2PCSFloat[Intent];
|
tagFloat = Device2PCSFloat[Intent];
|
||||||
@ -394,7 +394,7 @@ Error:
|
|||||||
// Check if this is a grayscale profile.
|
// Check if this is a grayscale profile.
|
||||||
if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {
|
if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {
|
||||||
|
|
||||||
// if so, build appropriate conversion tables.
|
// if so, build appropiate conversion tables.
|
||||||
// The tables are the PCS iluminant, scaled across GrayTRC
|
// The tables are the PCS iluminant, scaled across GrayTRC
|
||||||
return BuildGrayInputMatrixPipeline(hProfile);
|
return BuildGrayInputMatrixPipeline(hProfile);
|
||||||
}
|
}
|
||||||
@ -549,7 +549,7 @@ cmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFlo
|
|||||||
if (Lut == NULL) return NULL;
|
if (Lut == NULL) return NULL;
|
||||||
|
|
||||||
// If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding,
|
// If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding,
|
||||||
// and since the formatter has already accommodated to 0..1.0, we should undo this change
|
// and since the formatter has already accomodated to 0..1.0, we should undo this change
|
||||||
if ( PCS == cmsSigLabData)
|
if ( PCS == cmsSigLabData)
|
||||||
{
|
{
|
||||||
if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
|
if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
|
||||||
@ -590,7 +590,7 @@ cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent)
|
|||||||
cmsContext ContextID = cmsGetProfileContextID(hProfile);
|
cmsContext ContextID = cmsGetProfileContextID(hProfile);
|
||||||
|
|
||||||
|
|
||||||
if (Intent >= INTENT_PERCEPTUAL && Intent <= INTENT_ABSOLUTE_COLORIMETRIC) {
|
if (Intent != -1) {
|
||||||
|
|
||||||
tag16 = PCS2Device16[Intent];
|
tag16 = PCS2Device16[Intent];
|
||||||
tagFloat = PCS2DeviceFloat[Intent];
|
tagFloat = PCS2DeviceFloat[Intent];
|
||||||
@ -651,7 +651,7 @@ Error:
|
|||||||
// Check if this is a grayscale profile.
|
// Check if this is a grayscale profile.
|
||||||
if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {
|
if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {
|
||||||
|
|
||||||
// if so, build appropriate conversion tables.
|
// if so, build appropiate conversion tables.
|
||||||
// The tables are the PCS iluminant, scaled across GrayTRC
|
// The tables are the PCS iluminant, scaled across GrayTRC
|
||||||
return BuildGrayOutputPipeline(hProfile);
|
return BuildGrayOutputPipeline(hProfile);
|
||||||
}
|
}
|
||||||
@ -709,21 +709,15 @@ cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent)
|
|||||||
{
|
{
|
||||||
cmsPipeline* Lut;
|
cmsPipeline* Lut;
|
||||||
cmsTagTypeSignature OriginalType;
|
cmsTagTypeSignature OriginalType;
|
||||||
cmsTagSignature tag16;
|
cmsTagSignature tag16 = Device2PCS16[Intent];
|
||||||
cmsTagSignature tagFloat;
|
cmsTagSignature tagFloat = Device2PCSFloat[Intent];
|
||||||
cmsContext ContextID = cmsGetProfileContextID(hProfile);
|
cmsContext ContextID = cmsGetProfileContextID(hProfile);
|
||||||
|
|
||||||
|
|
||||||
if (Intent < INTENT_PERCEPTUAL || Intent > INTENT_ABSOLUTE_COLORIMETRIC)
|
// On named color, take the appropiate tag
|
||||||
return NULL;
|
|
||||||
|
|
||||||
tag16 = Device2PCS16[Intent];
|
|
||||||
tagFloat = Device2PCSFloat[Intent];
|
|
||||||
|
|
||||||
// On named color, take the appropriate tag
|
|
||||||
if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {
|
if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {
|
||||||
|
|
||||||
cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*)cmsReadTag(hProfile, cmsSigNamedColor2Tag);
|
cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) cmsReadTag(hProfile, cmsSigNamedColor2Tag);
|
||||||
|
|
||||||
if (nc == NULL) return NULL;
|
if (nc == NULL) return NULL;
|
||||||
|
|
||||||
@ -739,13 +733,12 @@ cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent)
|
|||||||
goto Error;
|
goto Error;
|
||||||
|
|
||||||
return Lut;
|
return Lut;
|
||||||
Error:
|
Error:
|
||||||
cmsPipelineFree(Lut);
|
cmsPipelineFree(Lut);
|
||||||
cmsFreeNamedColorList(nc);
|
cmsFreeNamedColorList(nc);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence
|
if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence
|
||||||
|
|
||||||
// Floating point LUT are always V
|
// Floating point LUT are always V
|
||||||
@ -755,19 +748,19 @@ cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent)
|
|||||||
tagFloat = Device2PCSFloat[0];
|
tagFloat = Device2PCSFloat[0];
|
||||||
if (cmsIsTag(hProfile, tagFloat)) {
|
if (cmsIsTag(hProfile, tagFloat)) {
|
||||||
|
|
||||||
return cmsPipelineDup((cmsPipeline*)cmsReadTag(hProfile, tagFloat));
|
return cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table?
|
if (!cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table?
|
||||||
|
|
||||||
tag16 = Device2PCS16[0];
|
tag16 = Device2PCS16[0];
|
||||||
if (!cmsIsTag(hProfile, tag16)) return NULL;
|
if (!cmsIsTag(hProfile, tag16)) return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check profile version and LUT type. Do the necessary adjustments if needed
|
// Check profile version and LUT type. Do the necessary adjustments if needed
|
||||||
|
|
||||||
// Read the tag
|
// Read the tag
|
||||||
Lut = (cmsPipeline*)cmsReadTag(hProfile, tag16);
|
Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16);
|
||||||
if (Lut == NULL) return NULL;
|
if (Lut == NULL) return NULL;
|
||||||
|
|
||||||
// The profile owns the Lut, so we need to copy it
|
// The profile owns the Lut, so we need to copy it
|
||||||
@ -780,7 +773,7 @@ cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent)
|
|||||||
ChangeInterpolationToTrilinear(Lut);
|
ChangeInterpolationToTrilinear(Lut);
|
||||||
|
|
||||||
// After reading it, we have info about the original type
|
// After reading it, we have info about the original type
|
||||||
OriginalType = _cmsGetTagTrueType(hProfile, tag16);
|
OriginalType = _cmsGetTagTrueType(hProfile, tag16);
|
||||||
|
|
||||||
// We need to adjust data for Lab16 on output
|
// We need to adjust data for Lab16 on output
|
||||||
if (OriginalType != cmsSigLut16Type) return Lut;
|
if (OriginalType != cmsSigLut16Type) return Lut;
|
||||||
@ -788,12 +781,12 @@ cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent)
|
|||||||
// Here it is possible to get Lab on both sides
|
// Here it is possible to get Lab on both sides
|
||||||
|
|
||||||
if (cmsGetColorSpace(hProfile) == cmsSigLabData) {
|
if (cmsGetColorSpace(hProfile) == cmsSigLabData) {
|
||||||
if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
|
if(!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
|
||||||
goto Error2;
|
goto Error2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmsGetPCS(hProfile) == cmsSigLabData) {
|
if (cmsGetPCS(hProfile) == cmsSigLabData) {
|
||||||
if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
|
if(!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
|
||||||
goto Error2;
|
goto Error2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -928,7 +921,7 @@ cmsBool _cmsWriteProfileSequence(cmsHPROFILE hProfile, const cmsSEQ* seq)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Auxiliary, read and duplicate a MLU if found.
|
// Auxiliar, read and duplicate a MLU if found.
|
||||||
static
|
static
|
||||||
cmsMLU* GetMLUFromProfile(cmsHPROFILE h, cmsTagSignature sig)
|
cmsMLU* GetMLUFromProfile(cmsHPROFILE h, cmsTagSignature sig)
|
||||||
{
|
{
|
||||||
|
2
thirdparty/liblcms2/src/cmsmtrx.c
vendored
2
thirdparty/liblcms2/src/cmsmtrx.c
vendored
@ -38,7 +38,7 @@ void CMSEXPORT _cmsVEC3init(cmsVEC3* r, cmsFloat64Number x, cmsFloat64Number y,
|
|||||||
r -> n[VZ] = z;
|
r -> n[VZ] = z;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Vector subtraction
|
// Vector substraction
|
||||||
void CMSEXPORT _cmsVEC3minus(cmsVEC3* r, const cmsVEC3* a, const cmsVEC3* b)
|
void CMSEXPORT _cmsVEC3minus(cmsVEC3* r, const cmsVEC3* a, const cmsVEC3* b)
|
||||||
{
|
{
|
||||||
r -> n[VX] = a -> n[VX] - b -> n[VX];
|
r -> n[VX] = a -> n[VX] - b -> n[VX];
|
||||||
|
9
thirdparty/liblcms2/src/cmsnamed.c
vendored
9
thirdparty/liblcms2/src/cmsnamed.c
vendored
@ -206,10 +206,10 @@ void strFrom16(char str[3], cmsUInt16Number n)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add an ASCII entry. Do not add any \0 termination (ICC1v43_2010-12.pdf page 61)
|
// Add an ASCII entry.
|
||||||
cmsBool CMSEXPORT cmsMLUsetASCII(cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], const char* ASCIIString)
|
cmsBool CMSEXPORT cmsMLUsetASCII(cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], const char* ASCIIString)
|
||||||
{
|
{
|
||||||
cmsUInt32Number i, len = (cmsUInt32Number) strlen(ASCIIString);
|
cmsUInt32Number i, len = (cmsUInt32Number) strlen(ASCIIString)+1;
|
||||||
wchar_t* WStr;
|
wchar_t* WStr;
|
||||||
cmsBool rc;
|
cmsBool rc;
|
||||||
cmsUInt16Number Lang = strTo16(LanguageCode);
|
cmsUInt16Number Lang = strTo16(LanguageCode);
|
||||||
@ -243,7 +243,8 @@ cmsUInt32Number mywcslen(const wchar_t *s)
|
|||||||
return (cmsUInt32Number)(p - s);
|
return (cmsUInt32Number)(p - s);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a wide entry. Do not add any \0 terminator (ICC1v43_2010-12.pdf page 61)
|
|
||||||
|
// Add a wide entry
|
||||||
cmsBool CMSEXPORT cmsMLUsetWide(cmsMLU* mlu, const char Language[3], const char Country[3], const wchar_t* WideString)
|
cmsBool CMSEXPORT cmsMLUsetWide(cmsMLU* mlu, const char Language[3], const char Country[3], const wchar_t* WideString)
|
||||||
{
|
{
|
||||||
cmsUInt16Number Lang = strTo16(Language);
|
cmsUInt16Number Lang = strTo16(Language);
|
||||||
@ -253,7 +254,7 @@ cmsBool CMSEXPORT cmsMLUsetWide(cmsMLU* mlu, const char Language[3], const char
|
|||||||
if (mlu == NULL) return FALSE;
|
if (mlu == NULL) return FALSE;
|
||||||
if (WideString == NULL) return FALSE;
|
if (WideString == NULL) return FALSE;
|
||||||
|
|
||||||
len = (cmsUInt32Number) (mywcslen(WideString)) * sizeof(wchar_t);
|
len = (cmsUInt32Number) (mywcslen(WideString) + 1) * sizeof(wchar_t);
|
||||||
return AddMLUBlock(mlu, len, WideString, Lang, Cntry);
|
return AddMLUBlock(mlu, len, WideString, Lang, Cntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
thirdparty/liblcms2/src/cmsopt.c
vendored
4
thirdparty/liblcms2/src/cmsopt.c
vendored
@ -529,7 +529,7 @@ cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[],
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Auxiliary, to see if two values are equal or very different
|
// Auxiliar, to see if two values are equal or very different
|
||||||
static
|
static
|
||||||
cmsBool WhitesAreEqual(int n, cmsUInt16Number White1[], cmsUInt16Number White2[] )
|
cmsBool WhitesAreEqual(int n, cmsUInt16Number White1[], cmsUInt16Number White2[] )
|
||||||
{
|
{
|
||||||
@ -537,7 +537,7 @@ cmsBool WhitesAreEqual(int n, cmsUInt16Number White1[], cmsUInt16Number White2[]
|
|||||||
|
|
||||||
for (i=0; i < n; i++) {
|
for (i=0; i < n; i++) {
|
||||||
|
|
||||||
if (abs(White1[i] - White2[i]) > 0xf000) return TRUE; // Values are so extremely different that the fixup should be avoided
|
if (abs(White1[i] - White2[i]) > 0xf000) return TRUE; // Values are so extremly different that the fixup should be avoided
|
||||||
if (White1[i] != White2[i]) return FALSE;
|
if (White1[i] != White2[i]) return FALSE;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
2
thirdparty/liblcms2/src/cmspack.c
vendored
2
thirdparty/liblcms2/src/cmspack.c
vendored
@ -81,7 +81,7 @@ typedef struct {
|
|||||||
#define ANYFLAVOR FLAVOR_SH(1)
|
#define ANYFLAVOR FLAVOR_SH(1)
|
||||||
|
|
||||||
|
|
||||||
// Suppress waning about info never being used
|
// Supress waning about info never being used
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma warning(disable : 4100)
|
#pragma warning(disable : 4100)
|
||||||
|
6
thirdparty/liblcms2/src/cmspcs.c
vendored
6
thirdparty/liblcms2/src/cmspcs.c
vendored
@ -308,7 +308,7 @@ void CMSEXPORT cmsFloat2LabEncoded(cmsUInt16Number wLab[3], const cmsCIELab* fLa
|
|||||||
wLab[2] = ab2Fix4(Lab.b);
|
wLab[2] = ab2Fix4(Lab.b);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Auxiliary: convert to Radians
|
// Auxiliar: convert to Radians
|
||||||
static
|
static
|
||||||
cmsFloat64Number RADIANS(cmsFloat64Number deg)
|
cmsFloat64Number RADIANS(cmsFloat64Number deg)
|
||||||
{
|
{
|
||||||
@ -316,7 +316,7 @@ cmsFloat64Number RADIANS(cmsFloat64Number deg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Auxiliary: atan2 but operating in degrees and returning 0 if a==b==0
|
// Auxiliar: atan2 but operating in degrees and returning 0 if a==b==0
|
||||||
static
|
static
|
||||||
cmsFloat64Number atan2deg(cmsFloat64Number a, cmsFloat64Number b)
|
cmsFloat64Number atan2deg(cmsFloat64Number a, cmsFloat64Number b)
|
||||||
{
|
{
|
||||||
@ -339,7 +339,7 @@ cmsFloat64Number atan2deg(cmsFloat64Number a, cmsFloat64Number b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Auxiliary: Square
|
// Auxiliar: Square
|
||||||
static
|
static
|
||||||
cmsFloat64Number Sqr(cmsFloat64Number v)
|
cmsFloat64Number Sqr(cmsFloat64Number v)
|
||||||
{
|
{
|
||||||
|
13
thirdparty/liblcms2/src/cmsplugin.c
vendored
13
thirdparty/liblcms2/src/cmsplugin.c
vendored
@ -107,7 +107,7 @@ void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number*
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Auxiliary -- read 8, 16 and 32-bit numbers
|
// Auxiliar -- read 8, 16 and 32-bit numbers
|
||||||
cmsBool CMSEXPORT _cmsReadUInt8Number(cmsIOHANDLER* io, cmsUInt8Number* n)
|
cmsBool CMSEXPORT _cmsReadUInt8Number(cmsIOHANDLER* io, cmsUInt8Number* n)
|
||||||
{
|
{
|
||||||
cmsUInt8Number tmp;
|
cmsUInt8Number tmp;
|
||||||
@ -172,13 +172,13 @@ cmsBool CMSEXPORT _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n)
|
|||||||
|
|
||||||
_cmsAssert(io != NULL);
|
_cmsAssert(io != NULL);
|
||||||
|
|
||||||
if (io -> Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1)
|
if (io -> Read(io, &tmp, sizeof(cmsFloat32Number), 1) != 1)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (n != NULL) {
|
if (n != NULL) {
|
||||||
|
|
||||||
tmp = _cmsAdjustEndianess32(tmp);
|
tmp = _cmsAdjustEndianess32(tmp);
|
||||||
*n = *(cmsFloat32Number*) (void*) &tmp;
|
*n = *(cmsFloat32Number*) &tmp;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -289,7 +289,7 @@ cmsBool CMSEXPORT _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n)
|
|||||||
|
|
||||||
_cmsAssert(io != NULL);
|
_cmsAssert(io != NULL);
|
||||||
|
|
||||||
tmp = *(cmsUInt32Number*) (void*) &n;
|
tmp = *(cmsUInt32Number*) &n;
|
||||||
tmp = _cmsAdjustEndianess32(tmp);
|
tmp = _cmsAdjustEndianess32(tmp);
|
||||||
if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1)
|
if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -485,10 +485,7 @@ cmsBool CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...)
|
|||||||
va_start(args, frm);
|
va_start(args, frm);
|
||||||
|
|
||||||
len = vsnprintf((char*) Buffer, 2047, frm, args);
|
len = vsnprintf((char*) Buffer, 2047, frm, args);
|
||||||
if (len < 0) {
|
if (len < 0) return FALSE; // Truncated, which is a fatal error for us
|
||||||
va_end(args);
|
|
||||||
return FALSE; // Truncated, which is a fatal error for us
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = io ->Write(io, len, Buffer);
|
rc = io ->Write(io, len, Buffer);
|
||||||
|
|
||||||
|
2
thirdparty/liblcms2/src/cmsps2.c
vendored
2
thirdparty/liblcms2/src/cmsps2.c
vendored
@ -579,7 +579,7 @@ void EmitNGamma(cmsIOHANDLER* m, int n, cmsToneCurve* g[])
|
|||||||
//
|
//
|
||||||
// Each row contains Pipeline values for all but first component. So, I
|
// Each row contains Pipeline values for all but first component. So, I
|
||||||
// detect row changing by keeping a copy of last value of first
|
// detect row changing by keeping a copy of last value of first
|
||||||
// component. -1 is used to mark beginning of whole block.
|
// component. -1 is used to mark begining of whole block.
|
||||||
|
|
||||||
static
|
static
|
||||||
int OutputValueSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
|
int OutputValueSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
|
||||||
|
4
thirdparty/liblcms2/src/cmssm.c
vendored
4
thirdparty/liblcms2/src/cmssm.c
vendored
@ -318,7 +318,7 @@ void CMSEXPORT cmsGBDFree(cmsHANDLE hGBD)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Auxiliary to retrieve a pointer to the segmentr containing the Lab value
|
// Auxiliar to retrieve a pointer to the segmentr containing the Lab value
|
||||||
static
|
static
|
||||||
cmsGDBPoint* GetPoint(cmsGDB* gbd, const cmsCIELab* Lab, cmsSpherical* sp)
|
cmsGDBPoint* GetPoint(cmsGDB* gbd, const cmsCIELab* Lab, cmsSpherical* sp)
|
||||||
{
|
{
|
||||||
@ -330,7 +330,7 @@ cmsGDBPoint* GetPoint(cmsGDB* gbd, const cmsCIELab* Lab, cmsSpherical* sp)
|
|||||||
_cmsAssert(Lab != NULL);
|
_cmsAssert(Lab != NULL);
|
||||||
_cmsAssert(sp != NULL);
|
_cmsAssert(sp != NULL);
|
||||||
|
|
||||||
// Center L* by subtracting half of its domain, that's 50
|
// Center L* by substracting half of its domain, that's 50
|
||||||
_cmsVEC3init(&v, Lab ->L - 50.0, Lab ->a, Lab ->b);
|
_cmsVEC3init(&v, Lab ->L - 50.0, Lab ->a, Lab ->b);
|
||||||
|
|
||||||
// Convert to spherical coordinates
|
// Convert to spherical coordinates
|
||||||
|
20
thirdparty/liblcms2/src/cmstypes.c
vendored
20
thirdparty/liblcms2/src/cmstypes.c
vendored
@ -30,7 +30,7 @@
|
|||||||
// This file implements every single tag and tag type as described in the ICC spec. Some types
|
// This file implements every single tag and tag type as described in the ICC spec. Some types
|
||||||
// have been deprecated, like ncl and Data. There is no implementation for those types as there
|
// have been deprecated, like ncl and Data. There is no implementation for those types as there
|
||||||
// are no profiles holding them. The programmer can also extend this list by defining his own types
|
// are no profiles holding them. The programmer can also extend this list by defining his own types
|
||||||
// by using the appropriate plug-in. There are three types of plug ins regarding that. First type
|
// by using the appropiate plug-in. There are three types of plug ins regarding that. First type
|
||||||
// allows to define new tags using any existing type. Next plug-in type allows to define new types
|
// allows to define new tags using any existing type. Next plug-in type allows to define new types
|
||||||
// and the third one is very specific: allows to extend the number of elements in the multiprocessing
|
// and the third one is very specific: allows to extend the number of elements in the multiprocessing
|
||||||
// elements special type.
|
// elements special type.
|
||||||
@ -113,7 +113,7 @@ cmsTagTypeHandler* GetHandler(cmsTagTypeSignature sig, _cmsTagTypeLinkedList* Pl
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Auxiliary to convert UTF-32 to UTF-16 in some cases
|
// Auxiliar to convert UTF-32 to UTF-16 in some cases
|
||||||
static
|
static
|
||||||
cmsBool _cmsWriteWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, const wchar_t* Array)
|
cmsBool _cmsWriteWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, const wchar_t* Array)
|
||||||
{
|
{
|
||||||
@ -129,7 +129,7 @@ cmsBool _cmsWriteWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, const wchar_t*
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Auxiliary to read an array of wchar_t
|
// Auxiliar to read an array of wchar_t
|
||||||
static
|
static
|
||||||
cmsBool _cmsReadWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, wchar_t* Array)
|
cmsBool _cmsReadWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, wchar_t* Array)
|
||||||
{
|
{
|
||||||
@ -160,7 +160,7 @@ typedef cmsBool (* PositionTableEntryFn)(struct _cms_typehandler_struct* self,
|
|||||||
cmsUInt32Number n,
|
cmsUInt32Number n,
|
||||||
cmsUInt32Number SizeOfTag);
|
cmsUInt32Number SizeOfTag);
|
||||||
|
|
||||||
// Helper function to deal with position tables as described in ICC spec 4.3
|
// Helper function to deal with position tables as decribed in ICC spec 4.3
|
||||||
// A table of n elements is readed, where first comes n records containing offsets and sizes and
|
// A table of n elements is readed, where first comes n records containing offsets and sizes and
|
||||||
// then a block containing the data itself. This allows to reuse same data in more than one entry
|
// then a block containing the data itself. This allows to reuse same data in more than one entry
|
||||||
static
|
static
|
||||||
@ -994,7 +994,7 @@ cmsBool Type_Text_Description_Write(struct _cms_typehandler_struct* self, cmsIO
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Tell the real text len including the null terminator and padding
|
// Tell the real text len including the null terminator and padding
|
||||||
len_text = (cmsUInt32Number) strlen(Text) + 1;
|
len_text = strlen(Text) + 1;
|
||||||
// Compute an total tag size requirement
|
// Compute an total tag size requirement
|
||||||
len_tag_requirement = (8+4+len_text+4+4+2*len_text+2+1+67);
|
len_tag_requirement = (8+4+len_text+4+4+2*len_text+2+1+67);
|
||||||
len_aligned = _cmsALIGNLONG(len_tag_requirement);
|
len_aligned = _cmsALIGNLONG(len_tag_requirement);
|
||||||
@ -1474,7 +1474,7 @@ void *Type_MLU_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsU
|
|||||||
LargestPosition = EndOfThisString;
|
LargestPosition = EndOfThisString;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now read the remaining of tag and fill all strings. Subtract the directory
|
// Now read the remaining of tag and fill all strings. Substract the directory
|
||||||
SizeOfTag = (LargestPosition * sizeof(wchar_t)) / sizeof(cmsUInt16Number);
|
SizeOfTag = (LargestPosition * sizeof(wchar_t)) / sizeof(cmsUInt16Number);
|
||||||
if (SizeOfTag == 0)
|
if (SizeOfTag == 0)
|
||||||
{
|
{
|
||||||
@ -3609,7 +3609,7 @@ country varies for each element:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Auxiliary, read an string specified as count + string
|
// Auxiliar, read an string specified as count + string
|
||||||
static
|
static
|
||||||
cmsBool ReadCountAndSting(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* mlu, cmsUInt32Number* SizeOfTag, const char* Section)
|
cmsBool ReadCountAndSting(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* mlu, cmsUInt32Number* SizeOfTag, const char* Section)
|
||||||
{
|
{
|
||||||
@ -4312,13 +4312,13 @@ Error:
|
|||||||
static
|
static
|
||||||
cmsBool Type_MPEclut_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
|
cmsBool Type_MPEclut_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
|
||||||
{
|
{
|
||||||
cmsUInt8Number Dimensions8[16]; // 16 because the spec says 16 and not max number of channels
|
cmsUInt8Number Dimensions8[16];
|
||||||
cmsUInt32Number i;
|
cmsUInt32Number i;
|
||||||
cmsStage* mpe = (cmsStage*) Ptr;
|
cmsStage* mpe = (cmsStage*) Ptr;
|
||||||
_cmsStageCLutData* clut = (_cmsStageCLutData*) mpe ->Data;
|
_cmsStageCLutData* clut = (_cmsStageCLutData*) mpe ->Data;
|
||||||
|
|
||||||
// Check for maximum number of channels supported by lcms
|
// Check for maximum number of channels
|
||||||
if (mpe -> InputChannels > MAX_INPUT_DIMENSIONS) return FALSE;
|
if (mpe -> InputChannels > 15) return FALSE;
|
||||||
|
|
||||||
// Only floats are supported in MPE
|
// Only floats are supported in MPE
|
||||||
if (clut ->HasFloatValues == FALSE) return FALSE;
|
if (clut ->HasFloatValues == FALSE) return FALSE;
|
||||||
|
9
thirdparty/liblcms2/src/cmsvirt.c
vendored
9
thirdparty/liblcms2/src/cmsvirt.c
vendored
@ -1138,20 +1138,15 @@ cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat
|
|||||||
// If no way, then force CLUT that for sure can be written
|
// If no way, then force CLUT that for sure can be written
|
||||||
if (AllowedLUT == NULL) {
|
if (AllowedLUT == NULL) {
|
||||||
|
|
||||||
cmsStage* FirstStage;
|
|
||||||
cmsStage* LastStage;
|
|
||||||
|
|
||||||
dwFlags |= cmsFLAGS_FORCE_CLUT;
|
dwFlags |= cmsFLAGS_FORCE_CLUT;
|
||||||
_cmsOptimizePipeline(ContextID, &LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags);
|
_cmsOptimizePipeline(ContextID, &LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags);
|
||||||
|
|
||||||
// Put identity curves if needed
|
// Put identity curves if needed
|
||||||
FirstStage = cmsPipelineGetPtrToFirstStage(LUT);
|
if (cmsPipelineGetPtrToFirstStage(LUT) ->Type != cmsSigCurveSetElemType)
|
||||||
if (FirstStage != NULL && FirstStage ->Type != cmsSigCurveSetElemType)
|
|
||||||
if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn)))
|
if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn)))
|
||||||
goto Error;
|
goto Error;
|
||||||
|
|
||||||
LastStage = cmsPipelineGetPtrToLastStage(LUT);
|
if (cmsPipelineGetPtrToLastStage(LUT) ->Type != cmsSigCurveSetElemType)
|
||||||
if (LastStage != NULL && LastStage ->Type != cmsSigCurveSetElemType)
|
|
||||||
if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, ChansOut)))
|
if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, ChansOut)))
|
||||||
goto Error;
|
goto Error;
|
||||||
|
|
||||||
|
2
thirdparty/liblcms2/src/cmsxform.c
vendored
2
thirdparty/liblcms2/src/cmsxform.c
vendored
@ -413,7 +413,7 @@ void PrecalculatedXFORM(_cmsTRANSFORM* p,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Auxiliary: Handle precalculated gamut check. The retrieval of context may be alittle bit slow, but this function is not critical.
|
// Auxiliar: Handle precalculated gamut check. The retrieval of context may be alittle bit slow, but this function is not critical.
|
||||||
static
|
static
|
||||||
void TransformOnePixelWithGamutCheck(_cmsTRANSFORM* p,
|
void TransformOnePixelWithGamutCheck(_cmsTRANSFORM* p,
|
||||||
const cmsUInt16Number wIn[],
|
const cmsUInt16Number wIn[],
|
||||||
|
2
thirdparty/liblcms2/src/lcms2_internal.h
vendored
2
thirdparty/liblcms2/src/lcms2_internal.h
vendored
@ -739,7 +739,7 @@ typedef struct _cms_iccprofile_struct {
|
|||||||
// Dictionary
|
// Dictionary
|
||||||
cmsUInt32Number TagCount;
|
cmsUInt32Number TagCount;
|
||||||
cmsTagSignature TagNames[MAX_TABLE_TAG];
|
cmsTagSignature TagNames[MAX_TABLE_TAG];
|
||||||
cmsTagSignature TagLinked[MAX_TABLE_TAG]; // The tag to which is linked (0=none)
|
cmsTagSignature TagLinked[MAX_TABLE_TAG]; // The tag to wich is linked (0=none)
|
||||||
cmsUInt32Number TagSizes[MAX_TABLE_TAG]; // Size on disk
|
cmsUInt32Number TagSizes[MAX_TABLE_TAG]; // Size on disk
|
||||||
cmsUInt32Number TagOffsets[MAX_TABLE_TAG];
|
cmsUInt32Number TagOffsets[MAX_TABLE_TAG];
|
||||||
cmsBool TagSaveAsRaw[MAX_TABLE_TAG]; // True to write uncooked
|
cmsBool TagSaveAsRaw[MAX_TABLE_TAG]; // True to write uncooked
|
||||||
|
32
thirdparty/libpng/LICENSE
vendored
32
thirdparty/libpng/LICENSE
vendored
@ -10,7 +10,7 @@ this sentence.
|
|||||||
|
|
||||||
This code is released under the libpng license.
|
This code is released under the libpng license.
|
||||||
|
|
||||||
libpng versions 1.0.7, July 1, 2000 through 1.6.25, September 1, 2016 are
|
libpng versions 1.0.7, July 1, 2000, through 1.6.21, January 15, 2016, are
|
||||||
Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are
|
Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are
|
||||||
derived from libpng-1.0.6, and are distributed according to the same
|
derived from libpng-1.0.6, and are distributed according to the same
|
||||||
disclaimer and license as libpng-1.0.6 with the following individuals
|
disclaimer and license as libpng-1.0.6 with the following individuals
|
||||||
@ -32,10 +32,6 @@ and with the following additions to the disclaimer:
|
|||||||
risk of satisfactory quality, performance, accuracy, and effort is with
|
risk of satisfactory quality, performance, accuracy, and effort is with
|
||||||
the user.
|
the user.
|
||||||
|
|
||||||
Some files in the "contrib" directory and some configure-generated
|
|
||||||
files that are distributed with libpng have other copyright owners and
|
|
||||||
are released under other open source licenses.
|
|
||||||
|
|
||||||
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
||||||
Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
|
Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
|
||||||
libpng-0.96, and are distributed according to the same disclaimer and
|
libpng-0.96, and are distributed according to the same disclaimer and
|
||||||
@ -59,9 +55,6 @@ Contributing Authors:
|
|||||||
Greg Roelofs
|
Greg Roelofs
|
||||||
Tom Tanner
|
Tom Tanner
|
||||||
|
|
||||||
Some files in the "scripts" directory have other copyright owners
|
|
||||||
but are released under this license.
|
|
||||||
|
|
||||||
libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
||||||
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
|
|
||||||
@ -102,29 +95,18 @@ appreciated.
|
|||||||
|
|
||||||
END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
|
END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
|
||||||
|
|
||||||
TRADEMARK:
|
A "png_get_copyright" function is available, for convenient use in "about"
|
||||||
|
boxes and the like:
|
||||||
|
|
||||||
The name "libpng" has not been registered by the Copyright owner
|
printf("%s", png_get_copyright(NULL));
|
||||||
as a trademark in any jurisdiction. However, because libpng has
|
|
||||||
been distributed and maintained world-wide, continually since 1995,
|
|
||||||
the Copyright owner claims "common-law trademark protection" in any
|
|
||||||
jurisdiction where common-law trademark is recognized.
|
|
||||||
|
|
||||||
OSI CERTIFICATION:
|
Also, the PNG logo (in PNG format, of course) is supplied in the
|
||||||
|
files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
||||||
|
|
||||||
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
|
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
|
||||||
a certification mark of the Open Source Initiative. OSI has not addressed
|
a certification mark of the Open Source Initiative. OSI has not addressed
|
||||||
the additional disclaimers inserted at version 1.0.7.
|
the additional disclaimers inserted at version 1.0.7.
|
||||||
|
|
||||||
EXPORT CONTROL:
|
|
||||||
|
|
||||||
The Copyright owner believes that the Export Control Classification
|
|
||||||
Number (ECCN) for libpng is EAR99, which means not subject to export
|
|
||||||
controls or International Traffic in Arms Regulations (ITAR) because
|
|
||||||
it is open source, publicly available software, that does not contain
|
|
||||||
any encryption software. See the EAR, paragraphs 734.3(b)(3) and
|
|
||||||
734.7(b).
|
|
||||||
|
|
||||||
Glenn Randers-Pehrson
|
Glenn Randers-Pehrson
|
||||||
glennrp at users.sourceforge.net
|
glennrp at users.sourceforge.net
|
||||||
September 1, 2016
|
January 15, 2016
|
||||||
|
466
thirdparty/libpng/png.c
vendored
466
thirdparty/libpng/png.c
vendored
@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
/* png.c - location for general purpose libpng functions
|
/* png.c - location for general purpose libpng functions
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.25 [September 1, 2016]
|
* Last changed in libpng 1.6.19 [November 12, 2015]
|
||||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
@ -14,7 +14,7 @@
|
|||||||
#include "pngpriv.h"
|
#include "pngpriv.h"
|
||||||
|
|
||||||
/* Generate a compiler error if there is an old png.h in the search path. */
|
/* Generate a compiler error if there is an old png.h in the search path. */
|
||||||
typedef png_libpng_version_1_6_25 Your_png_h_is_not_version_1_6_25;
|
typedef png_libpng_version_1_6_21 Your_png_h_is_not_version_1_6_21;
|
||||||
|
|
||||||
/* Tells libpng that we have already handled the first "num_bytes" bytes
|
/* Tells libpng that we have already handled the first "num_bytes" bytes
|
||||||
* of the PNG file signature. If the PNG data is embedded into another
|
* of the PNG file signature. If the PNG data is embedded into another
|
||||||
@ -85,7 +85,7 @@ png_zalloc,(voidpf png_ptr, uInt items, uInt size),PNG_ALLOCATED)
|
|||||||
if (items >= (~(png_alloc_size_t)0)/size)
|
if (items >= (~(png_alloc_size_t)0)/size)
|
||||||
{
|
{
|
||||||
png_warning (png_voidcast(png_structrp, png_ptr),
|
png_warning (png_voidcast(png_structrp, png_ptr),
|
||||||
"Potential overflow in png_zalloc()");
|
"Potential overflow in png_zalloc()");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,10 +172,10 @@ png_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, png_size_t length)
|
|||||||
int
|
int
|
||||||
png_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver)
|
png_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver)
|
||||||
{
|
{
|
||||||
/* Libpng versions 1.0.0 and later are binary compatible if the version
|
/* Libpng versions 1.0.0 and later are binary compatible if the version
|
||||||
* string matches through the second '.'; we must recompile any
|
* string matches through the second '.'; we must recompile any
|
||||||
* applications that use any older library version.
|
* applications that use any older library version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (user_png_ver != NULL)
|
if (user_png_ver != NULL)
|
||||||
{
|
{
|
||||||
@ -297,7 +297,7 @@ png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
|
|||||||
if (png_user_version_check(&create_struct, user_png_ver) != 0)
|
if (png_user_version_check(&create_struct, user_png_ver) != 0)
|
||||||
{
|
{
|
||||||
png_structrp png_ptr = png_voidcast(png_structrp,
|
png_structrp png_ptr = png_voidcast(png_structrp,
|
||||||
png_malloc_warn(&create_struct, (sizeof *png_ptr)));
|
png_malloc_warn(&create_struct, (sizeof *png_ptr)));
|
||||||
|
|
||||||
if (png_ptr != NULL)
|
if (png_ptr != NULL)
|
||||||
{
|
{
|
||||||
@ -346,7 +346,7 @@ png_create_info_struct,(png_const_structrp png_ptr),PNG_ALLOCATED)
|
|||||||
* has always been done in 'example.c'.
|
* has always been done in 'example.c'.
|
||||||
*/
|
*/
|
||||||
info_ptr = png_voidcast(png_inforp, png_malloc_base(png_ptr,
|
info_ptr = png_voidcast(png_inforp, png_malloc_base(png_ptr,
|
||||||
(sizeof *info_ptr)));
|
(sizeof *info_ptr)));
|
||||||
|
|
||||||
if (info_ptr != NULL)
|
if (info_ptr != NULL)
|
||||||
memset(info_ptr, 0, (sizeof *info_ptr));
|
memset(info_ptr, 0, (sizeof *info_ptr));
|
||||||
@ -402,7 +402,7 @@ png_destroy_info_struct(png_const_structrp png_ptr, png_infopp info_ptr_ptr)
|
|||||||
*/
|
*/
|
||||||
PNG_FUNCTION(void,PNGAPI
|
PNG_FUNCTION(void,PNGAPI
|
||||||
png_info_init_3,(png_infopp ptr_ptr, png_size_t png_info_struct_size),
|
png_info_init_3,(png_infopp ptr_ptr, png_size_t png_info_struct_size),
|
||||||
PNG_DEPRECATED)
|
PNG_DEPRECATED)
|
||||||
{
|
{
|
||||||
png_inforp info_ptr = *ptr_ptr;
|
png_inforp info_ptr = *ptr_ptr;
|
||||||
|
|
||||||
@ -417,7 +417,7 @@ png_info_init_3,(png_infopp ptr_ptr, png_size_t png_info_struct_size),
|
|||||||
/* The following line is why this API should not be used: */
|
/* The following line is why this API should not be used: */
|
||||||
free(info_ptr);
|
free(info_ptr);
|
||||||
info_ptr = png_voidcast(png_inforp, png_malloc_base(NULL,
|
info_ptr = png_voidcast(png_inforp, png_malloc_base(NULL,
|
||||||
(sizeof *info_ptr)));
|
(sizeof *info_ptr)));
|
||||||
if (info_ptr == NULL)
|
if (info_ptr == NULL)
|
||||||
return;
|
return;
|
||||||
*ptr_ptr = info_ptr;
|
*ptr_ptr = info_ptr;
|
||||||
@ -430,7 +430,7 @@ png_info_init_3,(png_infopp ptr_ptr, png_size_t png_info_struct_size),
|
|||||||
/* The following API is not called internally */
|
/* The following API is not called internally */
|
||||||
void PNGAPI
|
void PNGAPI
|
||||||
png_data_freer(png_const_structrp png_ptr, png_inforp info_ptr,
|
png_data_freer(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
int freer, png_uint_32 mask)
|
int freer, png_uint_32 mask)
|
||||||
{
|
{
|
||||||
png_debug(1, "in png_data_freer");
|
png_debug(1, "in png_data_freer");
|
||||||
|
|
||||||
@ -449,7 +449,7 @@ png_data_freer(png_const_structrp png_ptr, png_inforp info_ptr,
|
|||||||
|
|
||||||
void PNGAPI
|
void PNGAPI
|
||||||
png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask,
|
png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask,
|
||||||
int num)
|
int num)
|
||||||
{
|
{
|
||||||
png_debug(1, "in png_free_data");
|
png_debug(1, "in png_free_data");
|
||||||
|
|
||||||
@ -775,14 +775,14 @@ png_get_copyright(png_const_structrp png_ptr)
|
|||||||
#else
|
#else
|
||||||
# ifdef __STDC__
|
# ifdef __STDC__
|
||||||
return PNG_STRING_NEWLINE \
|
return PNG_STRING_NEWLINE \
|
||||||
"libpng version 1.6.25 - September 1, 2016" PNG_STRING_NEWLINE \
|
"libpng version 1.6.21 - January 15, 2016" PNG_STRING_NEWLINE \
|
||||||
"Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson" \
|
"Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson" \
|
||||||
PNG_STRING_NEWLINE \
|
PNG_STRING_NEWLINE \
|
||||||
"Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
|
"Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
|
||||||
"Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
|
"Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
|
||||||
PNG_STRING_NEWLINE;
|
PNG_STRING_NEWLINE;
|
||||||
# else
|
# else
|
||||||
return "libpng version 1.6.25 - September 1, 2016\
|
return "libpng version 1.6.21 - January 15, 2016\
|
||||||
Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson\
|
Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson\
|
||||||
Copyright (c) 1996-1997 Andreas Dilger\
|
Copyright (c) 1996-1997 Andreas Dilger\
|
||||||
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
|
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
|
||||||
@ -1033,7 +1033,7 @@ png_zstream_error(png_structrp png_ptr, int ret)
|
|||||||
#ifdef PNG_GAMMA_SUPPORTED /* always set if COLORSPACE */
|
#ifdef PNG_GAMMA_SUPPORTED /* always set if COLORSPACE */
|
||||||
static int
|
static int
|
||||||
png_colorspace_check_gamma(png_const_structrp png_ptr,
|
png_colorspace_check_gamma(png_const_structrp png_ptr,
|
||||||
png_colorspacerp colorspace, png_fixed_point gAMA, int from)
|
png_colorspacerp colorspace, png_fixed_point gAMA, int from)
|
||||||
/* This is called to check a new gamma value against an existing one. The
|
/* This is called to check a new gamma value against an existing one. The
|
||||||
* routine returns false if the new gamma value should not be written.
|
* routine returns false if the new gamma value should not be written.
|
||||||
*
|
*
|
||||||
@ -1047,7 +1047,7 @@ png_colorspace_check_gamma(png_const_structrp png_ptr,
|
|||||||
png_fixed_point gtest;
|
png_fixed_point gtest;
|
||||||
|
|
||||||
if ((colorspace->flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
|
if ((colorspace->flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
|
||||||
(png_muldiv(>est, colorspace->gamma, PNG_FP_1, gAMA) == 0 ||
|
(png_muldiv(>est, colorspace->gamma, PNG_FP_1, gAMA) == 0 ||
|
||||||
png_gamma_significant(gtest) != 0))
|
png_gamma_significant(gtest) != 0))
|
||||||
{
|
{
|
||||||
/* Either this is an sRGB image, in which case the calculated gamma
|
/* Either this is an sRGB image, in which case the calculated gamma
|
||||||
@ -1059,7 +1059,7 @@ png_colorspace_check_gamma(png_const_structrp png_ptr,
|
|||||||
if ((colorspace->flags & PNG_COLORSPACE_FROM_sRGB) != 0 || from == 2)
|
if ((colorspace->flags & PNG_COLORSPACE_FROM_sRGB) != 0 || from == 2)
|
||||||
{
|
{
|
||||||
png_chunk_report(png_ptr, "gamma value does not match sRGB",
|
png_chunk_report(png_ptr, "gamma value does not match sRGB",
|
||||||
PNG_CHUNK_ERROR);
|
PNG_CHUNK_ERROR);
|
||||||
/* Do not overwrite an sRGB value */
|
/* Do not overwrite an sRGB value */
|
||||||
return from == 2;
|
return from == 2;
|
||||||
}
|
}
|
||||||
@ -1067,7 +1067,7 @@ png_colorspace_check_gamma(png_const_structrp png_ptr,
|
|||||||
else /* sRGB tag not involved */
|
else /* sRGB tag not involved */
|
||||||
{
|
{
|
||||||
png_chunk_report(png_ptr, "gamma value does not match libpng estimate",
|
png_chunk_report(png_ptr, "gamma value does not match libpng estimate",
|
||||||
PNG_CHUNK_WARNING);
|
PNG_CHUNK_WARNING);
|
||||||
return from == 1;
|
return from == 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1077,7 +1077,7 @@ png_colorspace_check_gamma(png_const_structrp png_ptr,
|
|||||||
|
|
||||||
void /* PRIVATE */
|
void /* PRIVATE */
|
||||||
png_colorspace_set_gamma(png_const_structrp png_ptr,
|
png_colorspace_set_gamma(png_const_structrp png_ptr,
|
||||||
png_colorspacerp colorspace, png_fixed_point gAMA)
|
png_colorspacerp colorspace, png_fixed_point gAMA)
|
||||||
{
|
{
|
||||||
/* Changed in libpng-1.5.4 to limit the values to ensure overflow can't
|
/* Changed in libpng-1.5.4 to limit the values to ensure overflow can't
|
||||||
* occur. Since the fixed point representation is asymetrical it is
|
* occur. Since the fixed point representation is asymetrical it is
|
||||||
@ -1635,8 +1635,8 @@ static const png_xy sRGB_xy = /* From ITU-R BT.709-3 */
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
png_colorspace_set_xy_and_XYZ(png_const_structrp png_ptr,
|
png_colorspace_set_xy_and_XYZ(png_const_structrp png_ptr,
|
||||||
png_colorspacerp colorspace, const png_xy *xy, const png_XYZ *XYZ,
|
png_colorspacerp colorspace, const png_xy *xy, const png_XYZ *XYZ,
|
||||||
int preferred)
|
int preferred)
|
||||||
{
|
{
|
||||||
if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)
|
if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
@ -1683,7 +1683,7 @@ png_colorspace_set_xy_and_XYZ(png_const_structrp png_ptr,
|
|||||||
|
|
||||||
int /* PRIVATE */
|
int /* PRIVATE */
|
||||||
png_colorspace_set_chromaticities(png_const_structrp png_ptr,
|
png_colorspace_set_chromaticities(png_const_structrp png_ptr,
|
||||||
png_colorspacerp colorspace, const png_xy *xy, int preferred)
|
png_colorspacerp colorspace, const png_xy *xy, int preferred)
|
||||||
{
|
{
|
||||||
/* We must check the end points to ensure they are reasonable - in the past
|
/* We must check the end points to ensure they are reasonable - in the past
|
||||||
* color management systems have crashed as a result of getting bogus
|
* color management systems have crashed as a result of getting bogus
|
||||||
@ -1697,7 +1697,7 @@ png_colorspace_set_chromaticities(png_const_structrp png_ptr,
|
|||||||
{
|
{
|
||||||
case 0: /* success */
|
case 0: /* success */
|
||||||
return png_colorspace_set_xy_and_XYZ(png_ptr, colorspace, xy, &XYZ,
|
return png_colorspace_set_xy_and_XYZ(png_ptr, colorspace, xy, &XYZ,
|
||||||
preferred);
|
preferred);
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
/* We can't invert the chromaticities so we can't produce value XYZ
|
/* We can't invert the chromaticities so we can't produce value XYZ
|
||||||
@ -1720,7 +1720,7 @@ png_colorspace_set_chromaticities(png_const_structrp png_ptr,
|
|||||||
|
|
||||||
int /* PRIVATE */
|
int /* PRIVATE */
|
||||||
png_colorspace_set_endpoints(png_const_structrp png_ptr,
|
png_colorspace_set_endpoints(png_const_structrp png_ptr,
|
||||||
png_colorspacerp colorspace, const png_XYZ *XYZ_in, int preferred)
|
png_colorspacerp colorspace, const png_XYZ *XYZ_in, int preferred)
|
||||||
{
|
{
|
||||||
png_XYZ XYZ = *XYZ_in;
|
png_XYZ XYZ = *XYZ_in;
|
||||||
png_xy xy;
|
png_xy xy;
|
||||||
@ -1729,7 +1729,7 @@ png_colorspace_set_endpoints(png_const_structrp png_ptr,
|
|||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
return png_colorspace_set_xy_and_XYZ(png_ptr, colorspace, &xy, &XYZ,
|
return png_colorspace_set_xy_and_XYZ(png_ptr, colorspace, &xy, &XYZ,
|
||||||
preferred);
|
preferred);
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
/* End points are invalid. */
|
/* End points are invalid. */
|
||||||
@ -1786,7 +1786,7 @@ is_ICC_signature(png_alloc_size_t it)
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
png_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
png_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
||||||
png_const_charp name, png_alloc_size_t value, png_const_charp reason)
|
png_const_charp name, png_alloc_size_t value, png_const_charp reason)
|
||||||
{
|
{
|
||||||
size_t pos;
|
size_t pos;
|
||||||
char message[196]; /* see below for calculation */
|
char message[196]; /* see below for calculation */
|
||||||
@ -1811,8 +1811,8 @@ png_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
char number[PNG_NUMBER_BUFFER_SIZE]; /* +24 = 114*/
|
char number[PNG_NUMBER_BUFFER_SIZE]; /* +24 = 114*/
|
||||||
|
|
||||||
pos = png_safecat(message, (sizeof message), pos,
|
pos = png_safecat(message, (sizeof message), pos,
|
||||||
png_format_number(number, number+(sizeof number),
|
png_format_number(number, number+(sizeof number),
|
||||||
PNG_NUMBER_FORMAT_x, value));
|
PNG_NUMBER_FORMAT_x, value));
|
||||||
pos = png_safecat(message, (sizeof message), pos, "h: "); /*+2 = 116*/
|
pos = png_safecat(message, (sizeof message), pos, "h: "); /*+2 = 116*/
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
@ -1826,7 +1826,7 @@ png_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
* application errors the PNG won't be written.)
|
* application errors the PNG won't be written.)
|
||||||
*/
|
*/
|
||||||
png_chunk_report(png_ptr, message,
|
png_chunk_report(png_ptr, message,
|
||||||
(colorspace != NULL) ? PNG_CHUNK_ERROR : PNG_CHUNK_WRITE_ERROR);
|
(colorspace != NULL) ? PNG_CHUNK_ERROR : PNG_CHUNK_WRITE_ERROR);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1835,7 +1835,7 @@ png_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
#ifdef PNG_sRGB_SUPPORTED
|
#ifdef PNG_sRGB_SUPPORTED
|
||||||
int /* PRIVATE */
|
int /* PRIVATE */
|
||||||
png_colorspace_set_sRGB(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
png_colorspace_set_sRGB(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
||||||
int intent)
|
int intent)
|
||||||
{
|
{
|
||||||
/* sRGB sets known gamma, end points and (from the chunk) intent. */
|
/* sRGB sets known gamma, end points and (from the chunk) intent. */
|
||||||
/* IMPORTANT: these are not necessarily the values found in an ICC profile
|
/* IMPORTANT: these are not necessarily the values found in an ICC profile
|
||||||
@ -1872,10 +1872,10 @@ png_colorspace_set_sRGB(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
*/
|
*/
|
||||||
if (intent < 0 || intent >= PNG_sRGB_INTENT_LAST)
|
if (intent < 0 || intent >= PNG_sRGB_INTENT_LAST)
|
||||||
return png_icc_profile_error(png_ptr, colorspace, "sRGB",
|
return png_icc_profile_error(png_ptr, colorspace, "sRGB",
|
||||||
(unsigned)intent, "invalid sRGB rendering intent");
|
(unsigned)intent, "invalid sRGB rendering intent");
|
||||||
|
|
||||||
if ((colorspace->flags & PNG_COLORSPACE_HAVE_INTENT) != 0 &&
|
if ((colorspace->flags & PNG_COLORSPACE_HAVE_INTENT) != 0 &&
|
||||||
colorspace->rendering_intent != intent)
|
colorspace->rendering_intent != intent)
|
||||||
return png_icc_profile_error(png_ptr, colorspace, "sRGB",
|
return png_icc_profile_error(png_ptr, colorspace, "sRGB",
|
||||||
(unsigned)intent, "inconsistent rendering intents");
|
(unsigned)intent, "inconsistent rendering intents");
|
||||||
|
|
||||||
@ -1889,8 +1889,8 @@ png_colorspace_set_sRGB(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
* warn but overwrite the value with the correct one.
|
* warn but overwrite the value with the correct one.
|
||||||
*/
|
*/
|
||||||
if ((colorspace->flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0 &&
|
if ((colorspace->flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0 &&
|
||||||
!png_colorspace_endpoints_match(&sRGB_xy, &colorspace->end_points_xy,
|
!png_colorspace_endpoints_match(&sRGB_xy, &colorspace->end_points_xy,
|
||||||
100))
|
100))
|
||||||
png_chunk_report(png_ptr, "cHRM chunk does not match sRGB",
|
png_chunk_report(png_ptr, "cHRM chunk does not match sRGB",
|
||||||
PNG_CHUNK_ERROR);
|
PNG_CHUNK_ERROR);
|
||||||
|
|
||||||
@ -1898,7 +1898,7 @@ png_colorspace_set_sRGB(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
* returns true when the 'from' argument corresponds to sRGB (2).
|
* returns true when the 'from' argument corresponds to sRGB (2).
|
||||||
*/
|
*/
|
||||||
(void)png_colorspace_check_gamma(png_ptr, colorspace, PNG_GAMMA_sRGB_INVERSE,
|
(void)png_colorspace_check_gamma(png_ptr, colorspace, PNG_GAMMA_sRGB_INVERSE,
|
||||||
2/*from sRGB*/);
|
2/*from sRGB*/);
|
||||||
|
|
||||||
/* intent: bugs in GCC force 'int' to be used as the parameter type. */
|
/* intent: bugs in GCC force 'int' to be used as the parameter type. */
|
||||||
colorspace->rendering_intent = (png_uint_16)intent;
|
colorspace->rendering_intent = (png_uint_16)intent;
|
||||||
@ -1931,55 +1931,21 @@ png_colorspace_set_sRGB(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
static const png_byte D50_nCIEXYZ[12] =
|
static const png_byte D50_nCIEXYZ[12] =
|
||||||
{ 0x00, 0x00, 0xf6, 0xd6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x2d };
|
{ 0x00, 0x00, 0xf6, 0xd6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x2d };
|
||||||
|
|
||||||
static int /* bool */
|
int /* PRIVATE */
|
||||||
icc_check_length(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
png_icc_check_length(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
||||||
png_const_charp name, png_uint_32 profile_length)
|
png_const_charp name, png_uint_32 profile_length)
|
||||||
{
|
{
|
||||||
if (profile_length < 132)
|
if (profile_length < 132)
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
|
return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
|
||||||
"too short");
|
"too short");
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PNG_READ_iCCP_SUPPORTED
|
|
||||||
int /* PRIVATE */
|
|
||||||
png_icc_check_length(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|
||||||
png_const_charp name, png_uint_32 profile_length)
|
|
||||||
{
|
|
||||||
if (!icc_check_length(png_ptr, colorspace, name, profile_length))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* This needs to be here because the 'normal' check is in
|
|
||||||
* png_decompress_chunk, yet this happens after the attempt to
|
|
||||||
* png_malloc_base the required data. We only need this on read; on write
|
|
||||||
* the caller supplies the profile buffer so libpng doesn't allocate it. See
|
|
||||||
* the call to icc_check_length below (the write case).
|
|
||||||
*/
|
|
||||||
# ifdef PNG_SET_USER_LIMITS_SUPPORTED
|
|
||||||
else if (png_ptr->user_chunk_malloc_max > 0 &&
|
|
||||||
png_ptr->user_chunk_malloc_max < profile_length)
|
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
|
|
||||||
"exceeds application limits");
|
|
||||||
# elif PNG_USER_CHUNK_MALLOC_MAX > 0
|
|
||||||
else if (PNG_USER_CHUNK_MALLOC_MAX < profile_length)
|
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
|
|
||||||
"exceeds libpng limits");
|
|
||||||
# else /* !SET_USER_LIMITS */
|
|
||||||
/* This will get compiled out on all 32-bit and better systems. */
|
|
||||||
else if (PNG_SIZE_MAX < profile_length)
|
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
|
|
||||||
"exceeds system limits");
|
|
||||||
# endif /* !SET_USER_LIMITS */
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif /* READ_iCCP */
|
|
||||||
|
|
||||||
int /* PRIVATE */
|
int /* PRIVATE */
|
||||||
png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
||||||
png_const_charp name, png_uint_32 profile_length,
|
png_const_charp name, png_uint_32 profile_length,
|
||||||
png_const_bytep profile/* first 132 bytes only */, int color_type)
|
png_const_bytep profile/* first 132 bytes only */, int color_type)
|
||||||
{
|
{
|
||||||
png_uint_32 temp;
|
png_uint_32 temp;
|
||||||
|
|
||||||
@ -1991,18 +1957,18 @@ png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
temp = png_get_uint_32(profile);
|
temp = png_get_uint_32(profile);
|
||||||
if (temp != profile_length)
|
if (temp != profile_length)
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
||||||
"length does not match profile");
|
"length does not match profile");
|
||||||
|
|
||||||
temp = (png_uint_32) (*(profile+8));
|
temp = (png_uint_32) (*(profile+8));
|
||||||
if (temp > 3 && (profile_length & 3))
|
if (temp > 3 && (profile_length & 3))
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
|
return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
|
||||||
"invalid length");
|
"invalid length");
|
||||||
|
|
||||||
temp = png_get_uint_32(profile+128); /* tag count: 12 bytes/tag */
|
temp = png_get_uint_32(profile+128); /* tag count: 12 bytes/tag */
|
||||||
if (temp > 357913930 || /* (2^32-4-132)/12: maximum possible tag count */
|
if (temp > 357913930 || /* (2^32-4-132)/12: maximum possible tag count */
|
||||||
profile_length < 132+12*temp) /* truncated tag table */
|
profile_length < 132+12*temp) /* truncated tag table */
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
||||||
"tag count too large");
|
"tag count too large");
|
||||||
|
|
||||||
/* The 'intent' must be valid or we can't store it, ICC limits the intent to
|
/* The 'intent' must be valid or we can't store it, ICC limits the intent to
|
||||||
* 16 bits.
|
* 16 bits.
|
||||||
@ -2010,14 +1976,14 @@ png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
temp = png_get_uint_32(profile+64);
|
temp = png_get_uint_32(profile+64);
|
||||||
if (temp >= 0xffff) /* The ICC limit */
|
if (temp >= 0xffff) /* The ICC limit */
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
||||||
"invalid rendering intent");
|
"invalid rendering intent");
|
||||||
|
|
||||||
/* This is just a warning because the profile may be valid in future
|
/* This is just a warning because the profile may be valid in future
|
||||||
* versions.
|
* versions.
|
||||||
*/
|
*/
|
||||||
if (temp >= PNG_sRGB_INTENT_LAST)
|
if (temp >= PNG_sRGB_INTENT_LAST)
|
||||||
(void)png_icc_profile_error(png_ptr, NULL, name, temp,
|
(void)png_icc_profile_error(png_ptr, NULL, name, temp,
|
||||||
"intent outside defined range");
|
"intent outside defined range");
|
||||||
|
|
||||||
/* At this point the tag table can't be checked because it hasn't necessarily
|
/* At this point the tag table can't be checked because it hasn't necessarily
|
||||||
* been loaded; however, various header fields can be checked. These checks
|
* been loaded; however, various header fields can be checked. These checks
|
||||||
@ -2034,7 +2000,7 @@ png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
temp = png_get_uint_32(profile+36); /* signature 'ascp' */
|
temp = png_get_uint_32(profile+36); /* signature 'ascp' */
|
||||||
if (temp != 0x61637370)
|
if (temp != 0x61637370)
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
||||||
"invalid signature");
|
"invalid signature");
|
||||||
|
|
||||||
/* Currently the PCS illuminant/adopted white point (the computational
|
/* Currently the PCS illuminant/adopted white point (the computational
|
||||||
* white point) are required to be D50,
|
* white point) are required to be D50,
|
||||||
@ -2045,7 +2011,7 @@ png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
*/
|
*/
|
||||||
if (memcmp(profile+68, D50_nCIEXYZ, 12) != 0)
|
if (memcmp(profile+68, D50_nCIEXYZ, 12) != 0)
|
||||||
(void)png_icc_profile_error(png_ptr, NULL, name, 0/*no tag value*/,
|
(void)png_icc_profile_error(png_ptr, NULL, name, 0/*no tag value*/,
|
||||||
"PCS illuminant is not D50");
|
"PCS illuminant is not D50");
|
||||||
|
|
||||||
/* The PNG spec requires this:
|
/* The PNG spec requires this:
|
||||||
* "If the iCCP chunk is present, the image samples conform to the colour
|
* "If the iCCP chunk is present, the image samples conform to the colour
|
||||||
@ -2073,18 +2039,18 @@ png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
case 0x52474220: /* 'RGB ' */
|
case 0x52474220: /* 'RGB ' */
|
||||||
if ((color_type & PNG_COLOR_MASK_COLOR) == 0)
|
if ((color_type & PNG_COLOR_MASK_COLOR) == 0)
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
||||||
"RGB color space not permitted on grayscale PNG");
|
"RGB color space not permitted on grayscale PNG");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x47524159: /* 'GRAY' */
|
case 0x47524159: /* 'GRAY' */
|
||||||
if ((color_type & PNG_COLOR_MASK_COLOR) != 0)
|
if ((color_type & PNG_COLOR_MASK_COLOR) != 0)
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
||||||
"Gray color space not permitted on RGB PNG");
|
"Gray color space not permitted on RGB PNG");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
||||||
"invalid ICC profile color space");
|
"invalid ICC profile color space");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* It is up to the application to check that the profile class matches the
|
/* It is up to the application to check that the profile class matches the
|
||||||
@ -2109,7 +2075,7 @@ png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
case 0x61627374: /* 'abst' */
|
case 0x61627374: /* 'abst' */
|
||||||
/* May not be embedded in an image */
|
/* May not be embedded in an image */
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
||||||
"invalid embedded Abstract ICC profile");
|
"invalid embedded Abstract ICC profile");
|
||||||
|
|
||||||
case 0x6c696e6b: /* 'link' */
|
case 0x6c696e6b: /* 'link' */
|
||||||
/* DeviceLink profiles cannot be interpreted in a non-device specific
|
/* DeviceLink profiles cannot be interpreted in a non-device specific
|
||||||
@ -2119,7 +2085,7 @@ png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
* PNG.
|
* PNG.
|
||||||
*/
|
*/
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
||||||
"unexpected DeviceLink ICC profile class");
|
"unexpected DeviceLink ICC profile class");
|
||||||
|
|
||||||
case 0x6e6d636c: /* 'nmcl' */
|
case 0x6e6d636c: /* 'nmcl' */
|
||||||
/* A NamedColor profile is also device specific, however it doesn't
|
/* A NamedColor profile is also device specific, however it doesn't
|
||||||
@ -2127,7 +2093,7 @@ png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
* certainly it will fail the tests below.
|
* certainly it will fail the tests below.
|
||||||
*/
|
*/
|
||||||
(void)png_icc_profile_error(png_ptr, NULL, name, temp,
|
(void)png_icc_profile_error(png_ptr, NULL, name, temp,
|
||||||
"unexpected NamedColor ICC profile class");
|
"unexpected NamedColor ICC profile class");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -2137,7 +2103,7 @@ png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
* understood profiles.
|
* understood profiles.
|
||||||
*/
|
*/
|
||||||
(void)png_icc_profile_error(png_ptr, NULL, name, temp,
|
(void)png_icc_profile_error(png_ptr, NULL, name, temp,
|
||||||
"unrecognized ICC profile class");
|
"unrecognized ICC profile class");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2153,7 +2119,7 @@ png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
return png_icc_profile_error(png_ptr, colorspace, name, temp,
|
||||||
"unexpected ICC PCS encoding");
|
"unexpected ICC PCS encoding");
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -2161,8 +2127,8 @@ png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
|
|
||||||
int /* PRIVATE */
|
int /* PRIVATE */
|
||||||
png_icc_check_tag_table(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
png_icc_check_tag_table(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
||||||
png_const_charp name, png_uint_32 profile_length,
|
png_const_charp name, png_uint_32 profile_length,
|
||||||
png_const_bytep profile /* header plus whole tag table */)
|
png_const_bytep profile /* header plus whole tag table */)
|
||||||
{
|
{
|
||||||
png_uint_32 tag_count = png_get_uint_32(profile+128);
|
png_uint_32 tag_count = png_get_uint_32(profile+128);
|
||||||
png_uint_32 itag;
|
png_uint_32 itag;
|
||||||
@ -2190,7 +2156,7 @@ png_icc_check_tag_table(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
* alignment.
|
* alignment.
|
||||||
*/
|
*/
|
||||||
(void)png_icc_profile_error(png_ptr, NULL, name, tag_id,
|
(void)png_icc_profile_error(png_ptr, NULL, name, tag_id,
|
||||||
"ICC profile tag start not a multiple of 4");
|
"ICC profile tag start not a multiple of 4");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is a hard error; potentially it can cause read outside the
|
/* This is a hard error; potentially it can cause read outside the
|
||||||
@ -2198,7 +2164,7 @@ png_icc_check_tag_table(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
|||||||
*/
|
*/
|
||||||
if (tag_start > profile_length || tag_length > profile_length - tag_start)
|
if (tag_start > profile_length || tag_length > profile_length - tag_start)
|
||||||
return png_icc_profile_error(png_ptr, colorspace, name, tag_id,
|
return png_icc_profile_error(png_ptr, colorspace, name, tag_id,
|
||||||
"ICC profile tag outside profile");
|
"ICC profile tag outside profile");
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1; /* success, maybe with warnings */
|
return 1; /* success, maybe with warnings */
|
||||||
@ -2226,22 +2192,22 @@ static const struct
|
|||||||
*/
|
*/
|
||||||
/* adler32, crc32, MD5[4], intent, date, length, file-name */
|
/* adler32, crc32, MD5[4], intent, date, length, file-name */
|
||||||
PNG_ICC_CHECKSUM(0x0a3fd9f6, 0x3b8772b9,
|
PNG_ICC_CHECKSUM(0x0a3fd9f6, 0x3b8772b9,
|
||||||
PNG_MD5(0x29f83dde, 0xaff255ae, 0x7842fae4, 0xca83390d), 0, 0,
|
PNG_MD5(0x29f83dde, 0xaff255ae, 0x7842fae4, 0xca83390d), 0, 0,
|
||||||
"2009/03/27 21:36:31", 3048, "sRGB_IEC61966-2-1_black_scaled.icc")
|
"2009/03/27 21:36:31", 3048, "sRGB_IEC61966-2-1_black_scaled.icc")
|
||||||
|
|
||||||
/* ICC sRGB v2 perceptual no black-compensation: */
|
/* ICC sRGB v2 perceptual no black-compensation: */
|
||||||
PNG_ICC_CHECKSUM(0x4909e5e1, 0x427ebb21,
|
PNG_ICC_CHECKSUM(0x4909e5e1, 0x427ebb21,
|
||||||
PNG_MD5(0xc95bd637, 0xe95d8a3b, 0x0df38f99, 0xc1320389), 1, 0,
|
PNG_MD5(0xc95bd637, 0xe95d8a3b, 0x0df38f99, 0xc1320389), 1, 0,
|
||||||
"2009/03/27 21:37:45", 3052, "sRGB_IEC61966-2-1_no_black_scaling.icc")
|
"2009/03/27 21:37:45", 3052, "sRGB_IEC61966-2-1_no_black_scaling.icc")
|
||||||
|
|
||||||
PNG_ICC_CHECKSUM(0xfd2144a1, 0x306fd8ae,
|
PNG_ICC_CHECKSUM(0xfd2144a1, 0x306fd8ae,
|
||||||
PNG_MD5(0xfc663378, 0x37e2886b, 0xfd72e983, 0x8228f1b8), 0, 0,
|
PNG_MD5(0xfc663378, 0x37e2886b, 0xfd72e983, 0x8228f1b8), 0, 0,
|
||||||
"2009/08/10 17:28:01", 60988, "sRGB_v4_ICC_preference_displayclass.icc")
|
"2009/08/10 17:28:01", 60988, "sRGB_v4_ICC_preference_displayclass.icc")
|
||||||
|
|
||||||
/* ICC sRGB v4 perceptual */
|
/* ICC sRGB v4 perceptual */
|
||||||
PNG_ICC_CHECKSUM(0x209c35d2, 0xbbef7812,
|
PNG_ICC_CHECKSUM(0x209c35d2, 0xbbef7812,
|
||||||
PNG_MD5(0x34562abf, 0x994ccd06, 0x6d2c5721, 0xd0d68c5d), 0, 0,
|
PNG_MD5(0x34562abf, 0x994ccd06, 0x6d2c5721, 0xd0d68c5d), 0, 0,
|
||||||
"2007/07/25 00:05:37", 60960, "sRGB_v4_ICC_preference.icc")
|
"2007/07/25 00:05:37", 60960, "sRGB_v4_ICC_preference.icc")
|
||||||
|
|
||||||
/* The following profiles have no known MD5 checksum. If there is a match
|
/* The following profiles have no known MD5 checksum. If there is a match
|
||||||
* on the (empty) MD5 the other fields are used to attempt a match and
|
* on the (empty) MD5 the other fields are used to attempt a match and
|
||||||
@ -2249,8 +2215,8 @@ static const struct
|
|||||||
* which suggests that they were also made by Hewlett Packard.
|
* which suggests that they were also made by Hewlett Packard.
|
||||||
*/
|
*/
|
||||||
PNG_ICC_CHECKSUM(0xa054d762, 0x5d5129ce,
|
PNG_ICC_CHECKSUM(0xa054d762, 0x5d5129ce,
|
||||||
PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 1, 0,
|
PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 1, 0,
|
||||||
"2004/07/21 18:57:42", 3024, "sRGB_IEC61966-2-1_noBPC.icc")
|
"2004/07/21 18:57:42", 3024, "sRGB_IEC61966-2-1_noBPC.icc")
|
||||||
|
|
||||||
/* This is a 'mntr' (display) profile with a mediaWhitePointTag that does not
|
/* This is a 'mntr' (display) profile with a mediaWhitePointTag that does not
|
||||||
* match the D50 PCS illuminant in the header (it is in fact the D65 values,
|
* match the D50 PCS illuminant in the header (it is in fact the D65 values,
|
||||||
@ -2260,17 +2226,17 @@ static const struct
|
|||||||
* chromaticAdaptationTag.
|
* chromaticAdaptationTag.
|
||||||
*/
|
*/
|
||||||
PNG_ICC_CHECKSUM(0xf784f3fb, 0x182ea552,
|
PNG_ICC_CHECKSUM(0xf784f3fb, 0x182ea552,
|
||||||
PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 0, 1/*broken*/,
|
PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 0, 1/*broken*/,
|
||||||
"1998/02/09 06:49:00", 3144, "HP-Microsoft sRGB v2 perceptual")
|
"1998/02/09 06:49:00", 3144, "HP-Microsoft sRGB v2 perceptual")
|
||||||
|
|
||||||
PNG_ICC_CHECKSUM(0x0398f3fc, 0xf29e526d,
|
PNG_ICC_CHECKSUM(0x0398f3fc, 0xf29e526d,
|
||||||
PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 1, 1/*broken*/,
|
PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 1, 1/*broken*/,
|
||||||
"1998/02/09 06:49:00", 3144, "HP-Microsoft sRGB v2 media-relative")
|
"1998/02/09 06:49:00", 3144, "HP-Microsoft sRGB v2 media-relative")
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr,
|
png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr,
|
||||||
png_const_bytep profile, uLong adler)
|
png_const_bytep profile, uLong adler)
|
||||||
{
|
{
|
||||||
/* The quick check is to verify just the MD5 signature and trust the
|
/* The quick check is to verify just the MD5 signature and trust the
|
||||||
* rest of the data. Because the profile has already been verified for
|
* rest of the data. Because the profile has already been verified for
|
||||||
@ -2354,7 +2320,7 @@ png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr,
|
|||||||
* which is made irrelevant by this error.
|
* which is made irrelevant by this error.
|
||||||
*/
|
*/
|
||||||
png_chunk_report(png_ptr, "known incorrect sRGB profile",
|
png_chunk_report(png_ptr, "known incorrect sRGB profile",
|
||||||
PNG_CHUNK_ERROR);
|
PNG_CHUNK_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Warn that this being done; this isn't even an error since
|
/* Warn that this being done; this isn't even an error since
|
||||||
@ -2364,8 +2330,8 @@ png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr,
|
|||||||
else if (png_sRGB_checks[i].have_md5 == 0)
|
else if (png_sRGB_checks[i].have_md5 == 0)
|
||||||
{
|
{
|
||||||
png_chunk_report(png_ptr,
|
png_chunk_report(png_ptr,
|
||||||
"out-of-date sRGB profile with no signature",
|
"out-of-date sRGB profile with no signature",
|
||||||
PNG_CHUNK_WARNING);
|
PNG_CHUNK_WARNING);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1+png_sRGB_checks[i].is_broken;
|
return 1+png_sRGB_checks[i].is_broken;
|
||||||
@ -2388,36 +2354,38 @@ png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr,
|
|||||||
|
|
||||||
return 0; /* no match */
|
return 0; /* no match */
|
||||||
}
|
}
|
||||||
|
#endif /* PNG_sRGB_PROFILE_CHECKS >= 0 */
|
||||||
|
|
||||||
void /* PRIVATE */
|
void /* PRIVATE */
|
||||||
png_icc_set_sRGB(png_const_structrp png_ptr,
|
png_icc_set_sRGB(png_const_structrp png_ptr,
|
||||||
png_colorspacerp colorspace, png_const_bytep profile, uLong adler)
|
png_colorspacerp colorspace, png_const_bytep profile, uLong adler)
|
||||||
{
|
{
|
||||||
/* Is this profile one of the known ICC sRGB profiles? If it is, just set
|
/* Is this profile one of the known ICC sRGB profiles? If it is, just set
|
||||||
* the sRGB information.
|
* the sRGB information.
|
||||||
*/
|
*/
|
||||||
|
#if PNG_sRGB_PROFILE_CHECKS >= 0
|
||||||
if (png_compare_ICC_profile_with_sRGB(png_ptr, profile, adler) != 0)
|
if (png_compare_ICC_profile_with_sRGB(png_ptr, profile, adler) != 0)
|
||||||
|
#endif
|
||||||
(void)png_colorspace_set_sRGB(png_ptr, colorspace,
|
(void)png_colorspace_set_sRGB(png_ptr, colorspace,
|
||||||
(int)/*already checked*/png_get_uint_32(profile+64));
|
(int)/*already checked*/png_get_uint_32(profile+64));
|
||||||
}
|
}
|
||||||
#endif /* PNG_sRGB_PROFILE_CHECKS >= 0 */
|
|
||||||
#endif /* sRGB */
|
#endif /* sRGB */
|
||||||
|
|
||||||
int /* PRIVATE */
|
int /* PRIVATE */
|
||||||
png_colorspace_set_ICC(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
png_colorspace_set_ICC(png_const_structrp png_ptr, png_colorspacerp colorspace,
|
||||||
png_const_charp name, png_uint_32 profile_length, png_const_bytep profile,
|
png_const_charp name, png_uint_32 profile_length, png_const_bytep profile,
|
||||||
int color_type)
|
int color_type)
|
||||||
{
|
{
|
||||||
if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)
|
if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (icc_check_length(png_ptr, colorspace, name, profile_length) != 0 &&
|
if (png_icc_check_length(png_ptr, colorspace, name, profile_length) != 0 &&
|
||||||
png_icc_check_header(png_ptr, colorspace, name, profile_length, profile,
|
png_icc_check_header(png_ptr, colorspace, name, profile_length, profile,
|
||||||
color_type) != 0 &&
|
color_type) != 0 &&
|
||||||
png_icc_check_tag_table(png_ptr, colorspace, name, profile_length,
|
png_icc_check_tag_table(png_ptr, colorspace, name, profile_length,
|
||||||
profile) != 0)
|
profile) != 0)
|
||||||
{
|
{
|
||||||
# if defined(PNG_sRGB_SUPPORTED) && PNG_sRGB_PROFILE_CHECKS >= 0
|
# ifdef PNG_sRGB_SUPPORTED
|
||||||
/* If no sRGB support, don't try storing sRGB information */
|
/* If no sRGB support, don't try storing sRGB information */
|
||||||
png_icc_set_sRGB(png_ptr, colorspace, profile, 0);
|
png_icc_set_sRGB(png_ptr, colorspace, profile, 0);
|
||||||
# endif
|
# endif
|
||||||
@ -2476,7 +2444,7 @@ png_colorspace_set_rgb_coefficients(png_structrp png_ptr)
|
|||||||
/* Check for an internal error. */
|
/* Check for an internal error. */
|
||||||
if (r+g+b != 32768)
|
if (r+g+b != 32768)
|
||||||
png_error(png_ptr,
|
png_error(png_ptr,
|
||||||
"internal error handling cHRM coefficients");
|
"internal error handling cHRM coefficients");
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2502,7 +2470,7 @@ png_colorspace_set_rgb_coefficients(png_structrp png_ptr)
|
|||||||
static int /* PRIVATE */
|
static int /* PRIVATE */
|
||||||
png_gt(size_t a, size_t b)
|
png_gt(size_t a, size_t b)
|
||||||
{
|
{
|
||||||
return a > b;
|
return a > b;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
# define png_gt(a,b) ((a) > (b))
|
# define png_gt(a,b) ((a) > (b))
|
||||||
@ -2510,9 +2478,9 @@ png_gt(size_t a, size_t b)
|
|||||||
|
|
||||||
void /* PRIVATE */
|
void /* PRIVATE */
|
||||||
png_check_IHDR(png_const_structrp png_ptr,
|
png_check_IHDR(png_const_structrp png_ptr,
|
||||||
png_uint_32 width, png_uint_32 height, int bit_depth,
|
png_uint_32 width, png_uint_32 height, int bit_depth,
|
||||||
int color_type, int interlace_type, int compression_type,
|
int color_type, int interlace_type, int compression_type,
|
||||||
int filter_type)
|
int filter_type)
|
||||||
{
|
{
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
@ -2675,7 +2643,7 @@ png_check_IHDR(png_const_structrp png_ptr,
|
|||||||
|
|
||||||
int /* PRIVATE */
|
int /* PRIVATE */
|
||||||
png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
|
png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
|
||||||
png_size_tp whereami)
|
png_size_tp whereami)
|
||||||
{
|
{
|
||||||
int state = *statep;
|
int state = *statep;
|
||||||
png_size_t i = *whereami;
|
png_size_t i = *whereami;
|
||||||
@ -3838,25 +3806,25 @@ png_gamma_16bit_correct(unsigned int value, png_fixed_point gamma_val)
|
|||||||
{
|
{
|
||||||
if (value > 0 && value < 65535)
|
if (value > 0 && value < 65535)
|
||||||
{
|
{
|
||||||
# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
|
# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
|
||||||
/* The same (unsigned int)->(double) constraints apply here as above,
|
/* The same (unsigned int)->(double) constraints apply here as above,
|
||||||
* however in this case the (unsigned int) to (int) conversion can
|
* however in this case the (unsigned int) to (int) conversion can
|
||||||
* overflow on an ANSI-C90 compliant system so the cast needs to ensure
|
* overflow on an ANSI-C90 compliant system so the cast needs to ensure
|
||||||
* that this is not possible.
|
* that this is not possible.
|
||||||
*/
|
*/
|
||||||
double r = floor(65535*pow((png_int_32)value/65535.,
|
double r = floor(65535*pow((png_int_32)value/65535.,
|
||||||
gamma_val*.00001)+.5);
|
gamma_val*.00001)+.5);
|
||||||
return (png_uint_16)r;
|
return (png_uint_16)r;
|
||||||
# else
|
# else
|
||||||
png_int_32 lg2 = png_log16bit(value);
|
png_int_32 lg2 = png_log16bit(value);
|
||||||
png_fixed_point res;
|
png_fixed_point res;
|
||||||
|
|
||||||
if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1) != 0)
|
if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1) != 0)
|
||||||
return png_exp16bit(res);
|
return png_exp16bit(res);
|
||||||
|
|
||||||
/* Overflow. */
|
/* Overflow. */
|
||||||
value = 0;
|
value = 0;
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return (png_uint_16)value;
|
return (png_uint_16)value;
|
||||||
@ -3895,7 +3863,7 @@ png_gamma_correct(png_structrp png_ptr, unsigned int value,
|
|||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
png_build_16bit_table(png_structrp png_ptr, png_uint_16pp *ptable,
|
png_build_16bit_table(png_structrp png_ptr, png_uint_16pp *ptable,
|
||||||
PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val)
|
PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val)
|
||||||
{
|
{
|
||||||
/* Various values derived from 'shift': */
|
/* Various values derived from 'shift': */
|
||||||
PNG_CONST unsigned int num = 1U << (8U - shift);
|
PNG_CONST unsigned int num = 1U << (8U - shift);
|
||||||
@ -3972,7 +3940,7 @@ png_build_16bit_table(png_structrp png_ptr, png_uint_16pp *ptable,
|
|||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
png_build_16to8_table(png_structrp png_ptr, png_uint_16pp *ptable,
|
png_build_16to8_table(png_structrp png_ptr, png_uint_16pp *ptable,
|
||||||
PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val)
|
PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val)
|
||||||
{
|
{
|
||||||
PNG_CONST unsigned int num = 1U << (8U - shift);
|
PNG_CONST unsigned int num = 1U << (8U - shift);
|
||||||
PNG_CONST unsigned int max = (1U << (16U - shift))-1U;
|
PNG_CONST unsigned int max = (1U << (16U - shift))-1U;
|
||||||
@ -4040,7 +4008,7 @@ png_build_16to8_table(png_structrp png_ptr, png_uint_16pp *ptable,
|
|||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
png_build_8bit_table(png_structrp png_ptr, png_bytepp ptable,
|
png_build_8bit_table(png_structrp png_ptr, png_bytepp ptable,
|
||||||
PNG_CONST png_fixed_point gamma_val)
|
PNG_CONST png_fixed_point gamma_val)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
png_bytep table = *ptable = (png_bytep)png_malloc(png_ptr, 256);
|
png_bytep table = *ptable = (png_bytep)png_malloc(png_ptr, 256);
|
||||||
@ -4120,133 +4088,131 @@ png_destroy_gamma_table(png_structrp png_ptr)
|
|||||||
void /* PRIVATE */
|
void /* PRIVATE */
|
||||||
png_build_gamma_table(png_structrp png_ptr, int bit_depth)
|
png_build_gamma_table(png_structrp png_ptr, int bit_depth)
|
||||||
{
|
{
|
||||||
png_debug(1, "in png_build_gamma_table");
|
png_debug(1, "in png_build_gamma_table");
|
||||||
|
|
||||||
/* Remove any existing table; this copes with multiple calls to
|
/* Remove any existing table; this copes with multiple calls to
|
||||||
* png_read_update_info. The warning is because building the gamma tables
|
* png_read_update_info. The warning is because building the gamma tables
|
||||||
* multiple times is a performance hit - it's harmless but the ability to
|
* multiple times is a performance hit - it's harmless but the ability to call
|
||||||
* call png_read_update_info() multiple times is new in 1.5.6 so it seems
|
* png_read_update_info() multiple times is new in 1.5.6 so it seems sensible
|
||||||
* sensible to warn if the app introduces such a hit.
|
* to warn if the app introduces such a hit.
|
||||||
*/
|
*/
|
||||||
if (png_ptr->gamma_table != NULL || png_ptr->gamma_16_table != NULL)
|
if (png_ptr->gamma_table != NULL || png_ptr->gamma_16_table != NULL)
|
||||||
{
|
{
|
||||||
png_warning(png_ptr, "gamma table being rebuilt");
|
png_warning(png_ptr, "gamma table being rebuilt");
|
||||||
png_destroy_gamma_table(png_ptr);
|
png_destroy_gamma_table(png_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bit_depth <= 8)
|
if (bit_depth <= 8)
|
||||||
{
|
{
|
||||||
png_build_8bit_table(png_ptr, &png_ptr->gamma_table,
|
png_build_8bit_table(png_ptr, &png_ptr->gamma_table,
|
||||||
png_ptr->screen_gamma > 0 ?
|
png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->colorspace.gamma,
|
||||||
png_reciprocal2(png_ptr->colorspace.gamma,
|
png_ptr->screen_gamma) : PNG_FP_1);
|
||||||
png_ptr->screen_gamma) : PNG_FP_1);
|
|
||||||
|
|
||||||
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
|
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
|
||||||
defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
|
defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
|
||||||
defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
|
defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
|
||||||
if ((png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) != 0)
|
if ((png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) != 0)
|
||||||
{
|
{
|
||||||
png_build_8bit_table(png_ptr, &png_ptr->gamma_to_1,
|
png_build_8bit_table(png_ptr, &png_ptr->gamma_to_1,
|
||||||
png_reciprocal(png_ptr->colorspace.gamma));
|
png_reciprocal(png_ptr->colorspace.gamma));
|
||||||
|
|
||||||
png_build_8bit_table(png_ptr, &png_ptr->gamma_from_1,
|
png_build_8bit_table(png_ptr, &png_ptr->gamma_from_1,
|
||||||
png_ptr->screen_gamma > 0 ?
|
png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) :
|
||||||
png_reciprocal(png_ptr->screen_gamma) :
|
png_ptr->colorspace.gamma/* Probably doing rgb_to_gray */);
|
||||||
png_ptr->colorspace.gamma/* Probably doing rgb_to_gray */);
|
}
|
||||||
}
|
|
||||||
#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
|
#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
|
||||||
}
|
}
|
||||||
#ifdef PNG_16BIT_SUPPORTED
|
#ifdef PNG_16BIT_SUPPORTED
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
png_byte shift, sig_bit;
|
png_byte shift, sig_bit;
|
||||||
|
|
||||||
if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
|
if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
|
||||||
{
|
{
|
||||||
sig_bit = png_ptr->sig_bit.red;
|
sig_bit = png_ptr->sig_bit.red;
|
||||||
|
|
||||||
if (png_ptr->sig_bit.green > sig_bit)
|
if (png_ptr->sig_bit.green > sig_bit)
|
||||||
sig_bit = png_ptr->sig_bit.green;
|
sig_bit = png_ptr->sig_bit.green;
|
||||||
|
|
||||||
if (png_ptr->sig_bit.blue > sig_bit)
|
if (png_ptr->sig_bit.blue > sig_bit)
|
||||||
sig_bit = png_ptr->sig_bit.blue;
|
sig_bit = png_ptr->sig_bit.blue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
sig_bit = png_ptr->sig_bit.gray;
|
sig_bit = png_ptr->sig_bit.gray;
|
||||||
|
|
||||||
/* 16-bit gamma code uses this equation:
|
/* 16-bit gamma code uses this equation:
|
||||||
*
|
*
|
||||||
* ov = table[(iv & 0xff) >> gamma_shift][iv >> 8]
|
* ov = table[(iv & 0xff) >> gamma_shift][iv >> 8]
|
||||||
*
|
*
|
||||||
* Where 'iv' is the input color value and 'ov' is the output value -
|
* Where 'iv' is the input color value and 'ov' is the output value -
|
||||||
* pow(iv, gamma).
|
* pow(iv, gamma).
|
||||||
*
|
*
|
||||||
* Thus the gamma table consists of up to 256 256-entry tables. The table
|
* Thus the gamma table consists of up to 256 256-entry tables. The table
|
||||||
* is selected by the (8-gamma_shift) most significant of the low 8 bits
|
* is selected by the (8-gamma_shift) most significant of the low 8 bits of
|
||||||
* of the color value then indexed by the upper 8 bits:
|
* the color value then indexed by the upper 8 bits:
|
||||||
*
|
*
|
||||||
* table[low bits][high 8 bits]
|
* table[low bits][high 8 bits]
|
||||||
*
|
*
|
||||||
* So the table 'n' corresponds to all those 'iv' of:
|
* So the table 'n' corresponds to all those 'iv' of:
|
||||||
*
|
*
|
||||||
* <all high 8-bit values><n << gamma_shift>..<(n+1 << gamma_shift)-1>
|
* <all high 8-bit values><n << gamma_shift>..<(n+1 << gamma_shift)-1>
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
if (sig_bit > 0 && sig_bit < 16U)
|
if (sig_bit > 0 && sig_bit < 16U)
|
||||||
/* shift == insignificant bits */
|
/* shift == insignificant bits */
|
||||||
shift = (png_byte)((16U - sig_bit) & 0xff);
|
shift = (png_byte)((16U - sig_bit) & 0xff);
|
||||||
|
|
||||||
else
|
else
|
||||||
shift = 0; /* keep all 16 bits */
|
shift = 0; /* keep all 16 bits */
|
||||||
|
|
||||||
if ((png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) != 0)
|
if ((png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) != 0)
|
||||||
{
|
{
|
||||||
/* PNG_MAX_GAMMA_8 is the number of bits to keep - effectively
|
/* PNG_MAX_GAMMA_8 is the number of bits to keep - effectively
|
||||||
* the significant bits in the *input* when the output will
|
* the significant bits in the *input* when the output will
|
||||||
* eventually be 8 bits. By default it is 11.
|
* eventually be 8 bits. By default it is 11.
|
||||||
*/
|
*/
|
||||||
if (shift < (16U - PNG_MAX_GAMMA_8))
|
if (shift < (16U - PNG_MAX_GAMMA_8))
|
||||||
shift = (16U - PNG_MAX_GAMMA_8);
|
shift = (16U - PNG_MAX_GAMMA_8);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shift > 8U)
|
if (shift > 8U)
|
||||||
shift = 8U; /* Guarantees at least one table! */
|
shift = 8U; /* Guarantees at least one table! */
|
||||||
|
|
||||||
png_ptr->gamma_shift = shift;
|
png_ptr->gamma_shift = shift;
|
||||||
|
|
||||||
/* NOTE: prior to 1.5.4 this test used to include PNG_BACKGROUND (now
|
/* NOTE: prior to 1.5.4 this test used to include PNG_BACKGROUND (now
|
||||||
* PNG_COMPOSE). This effectively smashed the background calculation for
|
* PNG_COMPOSE). This effectively smashed the background calculation for
|
||||||
* 16-bit output because the 8-bit table assumes the result will be
|
* 16-bit output because the 8-bit table assumes the result will be reduced
|
||||||
* reduced to 8 bits.
|
* to 8 bits.
|
||||||
*/
|
*/
|
||||||
if ((png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) != 0)
|
if ((png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) != 0)
|
||||||
png_build_16to8_table(png_ptr, &png_ptr->gamma_16_table, shift,
|
png_build_16to8_table(png_ptr, &png_ptr->gamma_16_table, shift,
|
||||||
png_ptr->screen_gamma > 0 ? png_product2(png_ptr->colorspace.gamma,
|
png_ptr->screen_gamma > 0 ? png_product2(png_ptr->colorspace.gamma,
|
||||||
png_ptr->screen_gamma) : PNG_FP_1);
|
png_ptr->screen_gamma) : PNG_FP_1);
|
||||||
|
|
||||||
else
|
else
|
||||||
png_build_16bit_table(png_ptr, &png_ptr->gamma_16_table, shift,
|
png_build_16bit_table(png_ptr, &png_ptr->gamma_16_table, shift,
|
||||||
png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->colorspace.gamma,
|
png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->colorspace.gamma,
|
||||||
png_ptr->screen_gamma) : PNG_FP_1);
|
png_ptr->screen_gamma) : PNG_FP_1);
|
||||||
|
|
||||||
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
|
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
|
||||||
defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
|
defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
|
||||||
defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
|
defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
|
||||||
if ((png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) != 0)
|
if ((png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) != 0)
|
||||||
{
|
{
|
||||||
png_build_16bit_table(png_ptr, &png_ptr->gamma_16_to_1, shift,
|
png_build_16bit_table(png_ptr, &png_ptr->gamma_16_to_1, shift,
|
||||||
png_reciprocal(png_ptr->colorspace.gamma));
|
png_reciprocal(png_ptr->colorspace.gamma));
|
||||||
|
|
||||||
/* Notice that the '16 from 1' table should be full precision, however
|
/* Notice that the '16 from 1' table should be full precision, however
|
||||||
* the lookup on this table still uses gamma_shift, so it can't be.
|
* the lookup on this table still uses gamma_shift, so it can't be.
|
||||||
* TODO: fix this.
|
* TODO: fix this.
|
||||||
*/
|
*/
|
||||||
png_build_16bit_table(png_ptr, &png_ptr->gamma_16_from_1, shift,
|
png_build_16bit_table(png_ptr, &png_ptr->gamma_16_from_1, shift,
|
||||||
png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) :
|
png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) :
|
||||||
png_ptr->colorspace.gamma/* Probably doing rgb_to_gray */);
|
png_ptr->colorspace.gamma/* Probably doing rgb_to_gray */);
|
||||||
}
|
}
|
||||||
#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
|
#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
|
||||||
}
|
}
|
||||||
#endif /* 16BIT */
|
#endif /* 16BIT */
|
||||||
}
|
}
|
||||||
#endif /* READ_GAMMA */
|
#endif /* READ_GAMMA */
|
||||||
|
376
thirdparty/libpng/png.h
vendored
376
thirdparty/libpng/png.h
vendored
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* png.h - header file for PNG reference library
|
/* png.h - header file for PNG reference library
|
||||||
*
|
*
|
||||||
* libpng version 1.6.25, September 1, 2016
|
* libpng version 1.6.21, January 15, 2016
|
||||||
*
|
*
|
||||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
@ -12,7 +12,7 @@
|
|||||||
* Authors and maintainers:
|
* Authors and maintainers:
|
||||||
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
|
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
|
||||||
* libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger
|
* libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger
|
||||||
* libpng versions 0.97, January 1998, through 1.6.25, September 1, 2016:
|
* libpng versions 0.97, January 1998, through 1.6.21, January 15, 2016:
|
||||||
* Glenn Randers-Pehrson.
|
* Glenn Randers-Pehrson.
|
||||||
* See also "Contributing Authors", below.
|
* See also "Contributing Authors", below.
|
||||||
*/
|
*/
|
||||||
@ -25,11 +25,7 @@
|
|||||||
*
|
*
|
||||||
* This code is released under the libpng license.
|
* This code is released under the libpng license.
|
||||||
*
|
*
|
||||||
* Some files in the "contrib" directory and some configure-generated
|
* libpng versions 1.0.7, July 1, 2000, through 1.6.21, January 15, 2016, are
|
||||||
* files that are distributed with libpng have other copyright owners and
|
|
||||||
* are released under other open source licenses.
|
|
||||||
*
|
|
||||||
* libpng versions 1.0.7, July 1, 2000 through 1.6.25, September 1, 2016 are
|
|
||||||
* Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are
|
* Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are
|
||||||
* derived from libpng-1.0.6, and are distributed according to the same
|
* derived from libpng-1.0.6, and are distributed according to the same
|
||||||
* disclaimer and license as libpng-1.0.6 with the following individuals
|
* disclaimer and license as libpng-1.0.6 with the following individuals
|
||||||
@ -41,7 +37,6 @@
|
|||||||
* Cosmin Truta
|
* Cosmin Truta
|
||||||
* Gilles Vollant
|
* Gilles Vollant
|
||||||
* James Yu
|
* James Yu
|
||||||
* Mandar Sahastrabuddhe
|
|
||||||
*
|
*
|
||||||
* and with the following additions to the disclaimer:
|
* and with the following additions to the disclaimer:
|
||||||
*
|
*
|
||||||
@ -52,10 +47,6 @@
|
|||||||
* risk of satisfactory quality, performance, accuracy, and effort is with
|
* risk of satisfactory quality, performance, accuracy, and effort is with
|
||||||
* the user.
|
* the user.
|
||||||
*
|
*
|
||||||
* Some files in the "contrib" directory have other copyright owners and
|
|
||||||
* are released under other open source licenses.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
* libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
|
||||||
* Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
|
* Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
|
||||||
* libpng-0.96, and are distributed according to the same disclaimer and
|
* libpng-0.96, and are distributed according to the same disclaimer and
|
||||||
@ -66,9 +57,6 @@
|
|||||||
* Glenn Randers-Pehrson
|
* Glenn Randers-Pehrson
|
||||||
* Willem van Schaik
|
* Willem van Schaik
|
||||||
*
|
*
|
||||||
* Some files in the "scripts" directory have different copyright owners
|
|
||||||
* but are also released under this license.
|
|
||||||
*
|
|
||||||
* libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
* libpng versions 0.89, June 1996, through 0.96, May 1997, are
|
||||||
* Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
|
* Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
|
||||||
* and are distributed according to the same disclaimer and license as
|
* and are distributed according to the same disclaimer and license as
|
||||||
@ -82,9 +70,6 @@
|
|||||||
* Greg Roelofs
|
* Greg Roelofs
|
||||||
* Tom Tanner
|
* Tom Tanner
|
||||||
*
|
*
|
||||||
* Some files in the "scripts" directory have other copyright owners
|
|
||||||
* but are released under this license.
|
|
||||||
*
|
|
||||||
* libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
* libpng versions 0.5, May 1995, through 0.88, January 1996, are
|
||||||
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||||
*
|
*
|
||||||
@ -124,29 +109,6 @@
|
|||||||
* appreciated.
|
* appreciated.
|
||||||
*
|
*
|
||||||
* END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
|
* END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
|
||||||
*
|
|
||||||
* TRADEMARK:
|
|
||||||
*
|
|
||||||
* The name "libpng" has not been registered by the Copyright owner
|
|
||||||
* as a trademark in any jurisdiction. However, because libpng has
|
|
||||||
* been distributed and maintained world-wide, continually since 1995,
|
|
||||||
* the Copyright owner claims "common-law trademark protection" in any
|
|
||||||
* jurisdiction where common-law trademark is recognized.
|
|
||||||
*
|
|
||||||
* OSI CERTIFICATION:
|
|
||||||
*
|
|
||||||
* Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
|
|
||||||
* a certification mark of the Open Source Initiative. OSI has not addressed
|
|
||||||
* the additional disclaimers inserted at version 1.0.7.
|
|
||||||
*
|
|
||||||
* EXPORT CONTROL:
|
|
||||||
*
|
|
||||||
* The Copyright owner believes that the Export Control Classification
|
|
||||||
* Number (ECCN) for libpng is EAR99, which means not subject to export
|
|
||||||
* controls or International Traffic in Arms Regulations (ITAR) because
|
|
||||||
* it is open source, publicly available software, that does not contain
|
|
||||||
* any encryption software. See the EAR, paragraphs 734.3(b)(3) and
|
|
||||||
* 734.7(b).
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -159,6 +121,12 @@
|
|||||||
* files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
* files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
|
||||||
|
* a certification mark of the Open Source Initiative. OSI has not addressed
|
||||||
|
* the additional disclaimers inserted at version 1.0.7.
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The contributing authors would like to thank all those who helped
|
* The contributing authors would like to thank all those who helped
|
||||||
* with testing, bug fixes, and patience. This wouldn't have been
|
* with testing, bug fixes, and patience. This wouldn't have been
|
||||||
@ -214,11 +182,11 @@
|
|||||||
* ...
|
* ...
|
||||||
* 1.0.19 10 10019 10.so.0.19[.0]
|
* 1.0.19 10 10019 10.so.0.19[.0]
|
||||||
* ...
|
* ...
|
||||||
* 1.2.56 13 10256 12.so.0.56[.0]
|
* 1.2.53 13 10253 12.so.0.53[.0]
|
||||||
* ...
|
* ...
|
||||||
* 1.5.27 15 10527 15.so.15.27[.0]
|
* 1.5.23 15 10523 15.so.15.23[.0]
|
||||||
* ...
|
* ...
|
||||||
* 1.6.25 16 10625 16.so.16.25[.0]
|
* 1.6.21 16 10621 16.so.16.21[.0]
|
||||||
*
|
*
|
||||||
* Henceforth the source version will match the shared-library major
|
* Henceforth the source version will match the shared-library major
|
||||||
* and minor numbers; the shared-library major version number will be
|
* and minor numbers; the shared-library major version number will be
|
||||||
@ -246,13 +214,13 @@
|
|||||||
* Y2K compliance in libpng:
|
* Y2K compliance in libpng:
|
||||||
* =========================
|
* =========================
|
||||||
*
|
*
|
||||||
* September 1, 2016
|
* January 15, 2016
|
||||||
*
|
*
|
||||||
* Since the PNG Development group is an ad-hoc body, we can't make
|
* Since the PNG Development group is an ad-hoc body, we can't make
|
||||||
* an official declaration.
|
* an official declaration.
|
||||||
*
|
*
|
||||||
* This is your unofficial assurance that libpng from version 0.71 and
|
* This is your unofficial assurance that libpng from version 0.71 and
|
||||||
* upward through 1.6.25 are Y2K compliant. It is my belief that
|
* upward through 1.6.21 are Y2K compliant. It is my belief that
|
||||||
* earlier versions were also Y2K compliant.
|
* earlier versions were also Y2K compliant.
|
||||||
*
|
*
|
||||||
* Libpng only has two year fields. One is a 2-byte unsigned integer
|
* Libpng only has two year fields. One is a 2-byte unsigned integer
|
||||||
@ -314,8 +282,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Version information for png.h - this should match the version in png.c */
|
/* Version information for png.h - this should match the version in png.c */
|
||||||
#define PNG_LIBPNG_VER_STRING "1.6.25"
|
#define PNG_LIBPNG_VER_STRING "1.6.21"
|
||||||
#define PNG_HEADER_VERSION_STRING " libpng version 1.6.25 - September 1, 2016\n"
|
#define PNG_HEADER_VERSION_STRING \
|
||||||
|
" libpng version 1.6.21 - January 15, 2016\n"
|
||||||
|
|
||||||
#define PNG_LIBPNG_VER_SONUM 16
|
#define PNG_LIBPNG_VER_SONUM 16
|
||||||
#define PNG_LIBPNG_VER_DLLNUM 16
|
#define PNG_LIBPNG_VER_DLLNUM 16
|
||||||
@ -323,7 +292,7 @@
|
|||||||
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
|
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
|
||||||
#define PNG_LIBPNG_VER_MAJOR 1
|
#define PNG_LIBPNG_VER_MAJOR 1
|
||||||
#define PNG_LIBPNG_VER_MINOR 6
|
#define PNG_LIBPNG_VER_MINOR 6
|
||||||
#define PNG_LIBPNG_VER_RELEASE 25
|
#define PNG_LIBPNG_VER_RELEASE 21
|
||||||
|
|
||||||
/* This should match the numeric part of the final component of
|
/* This should match the numeric part of the final component of
|
||||||
* PNG_LIBPNG_VER_STRING, omitting any leading zero:
|
* PNG_LIBPNG_VER_STRING, omitting any leading zero:
|
||||||
@ -354,20 +323,20 @@
|
|||||||
* version 1.0.0 was mis-numbered 100 instead of 10000). From
|
* version 1.0.0 was mis-numbered 100 instead of 10000). From
|
||||||
* version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release
|
* version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release
|
||||||
*/
|
*/
|
||||||
#define PNG_LIBPNG_VER 10625 /* 1.6.25 */
|
#define PNG_LIBPNG_VER 10621 /* 1.6.21 */
|
||||||
|
|
||||||
/* Library configuration: these options cannot be changed after
|
/* Library configuration: these options cannot be changed after
|
||||||
* the library has been built.
|
* the library has been built.
|
||||||
*/
|
*/
|
||||||
#ifndef PNGLCONF_H
|
#ifndef PNGLCONF_H
|
||||||
/* If pnglibconf.h is missing, you can
|
/* If pnglibconf.h is missing, you can
|
||||||
* copy scripts/pnglibconf.h.prebuilt to pnglibconf.h
|
* copy scripts/pnglibconf.h.prebuilt to pnglibconf.h
|
||||||
*/
|
*/
|
||||||
# include "pnglibconf.h"
|
# include "pnglibconf.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef PNG_VERSION_INFO_ONLY
|
#ifndef PNG_VERSION_INFO_ONLY
|
||||||
/* Machine specific configuration. */
|
/* Machine specific configuration. */
|
||||||
# include "pngconf.h"
|
# include "pngconf.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -464,7 +433,7 @@ extern "C" {
|
|||||||
/* This triggers a compiler error in png.c, if png.c and png.h
|
/* This triggers a compiler error in png.c, if png.c and png.h
|
||||||
* do not agree upon the version number.
|
* do not agree upon the version number.
|
||||||
*/
|
*/
|
||||||
typedef char* png_libpng_version_1_6_25;
|
typedef char* png_libpng_version_1_6_21;
|
||||||
|
|
||||||
/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info.
|
/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info.
|
||||||
*
|
*
|
||||||
@ -657,17 +626,17 @@ typedef png_time * * png_timepp;
|
|||||||
*/
|
*/
|
||||||
typedef struct png_unknown_chunk_t
|
typedef struct png_unknown_chunk_t
|
||||||
{
|
{
|
||||||
png_byte name[5]; /* Textual chunk name with '\0' terminator */
|
png_byte name[5]; /* Textual chunk name with '\0' terminator */
|
||||||
png_byte *data; /* Data, should not be modified on read! */
|
png_byte *data; /* Data, should not be modified on read! */
|
||||||
png_size_t size;
|
png_size_t size;
|
||||||
|
|
||||||
/* On write 'location' must be set using the flag values listed below.
|
/* On write 'location' must be set using the flag values listed below.
|
||||||
* Notice that on read it is set by libpng however the values stored have
|
* Notice that on read it is set by libpng however the values stored have
|
||||||
* more bits set than are listed below. Always treat the value as a
|
* more bits set than are listed below. Always treat the value as a
|
||||||
* bitmask. On write set only one bit - setting multiple bits may cause the
|
* bitmask. On write set only one bit - setting multiple bits may cause the
|
||||||
* chunk to be written in multiple places.
|
* chunk to be written in multiple places.
|
||||||
*/
|
*/
|
||||||
png_byte location; /* mode of operation at read time */
|
png_byte location; /* mode of operation at read time */
|
||||||
}
|
}
|
||||||
png_unknown_chunk;
|
png_unknown_chunk;
|
||||||
|
|
||||||
@ -765,22 +734,24 @@ typedef png_unknown_chunk * * png_unknown_chunkpp;
|
|||||||
* data in the info_struct to be written into the output file. The values
|
* data in the info_struct to be written into the output file. The values
|
||||||
* of the PNG_INFO_<chunk> defines should NOT be changed.
|
* of the PNG_INFO_<chunk> defines should NOT be changed.
|
||||||
*/
|
*/
|
||||||
#define PNG_INFO_gAMA 0x0001U
|
#define PNG_INFO_gAMA 0x0001
|
||||||
#define PNG_INFO_sBIT 0x0002U
|
#define PNG_INFO_sBIT 0x0002
|
||||||
#define PNG_INFO_cHRM 0x0004U
|
#define PNG_INFO_cHRM 0x0004
|
||||||
#define PNG_INFO_PLTE 0x0008U
|
#define PNG_INFO_PLTE 0x0008
|
||||||
#define PNG_INFO_tRNS 0x0010U
|
#define PNG_INFO_tRNS 0x0010
|
||||||
#define PNG_INFO_bKGD 0x0020U
|
#define PNG_INFO_bKGD 0x0020
|
||||||
#define PNG_INFO_hIST 0x0040U
|
#define PNG_INFO_hIST 0x0040
|
||||||
#define PNG_INFO_pHYs 0x0080U
|
#define PNG_INFO_pHYs 0x0080
|
||||||
#define PNG_INFO_oFFs 0x0100U
|
#define PNG_INFO_oFFs 0x0100
|
||||||
#define PNG_INFO_tIME 0x0200U
|
#define PNG_INFO_tIME 0x0200
|
||||||
#define PNG_INFO_pCAL 0x0400U
|
#define PNG_INFO_pCAL 0x0400
|
||||||
#define PNG_INFO_sRGB 0x0800U /* GR-P, 0.96a */
|
#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */
|
||||||
#define PNG_INFO_iCCP 0x1000U /* ESR, 1.0.6 */
|
#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */
|
||||||
#define PNG_INFO_sPLT 0x2000U /* ESR, 1.0.6 */
|
#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */
|
||||||
#define PNG_INFO_sCAL 0x4000U /* ESR, 1.0.6 */
|
#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */
|
||||||
#define PNG_INFO_IDAT 0x8000U /* ESR, 1.0.6 */
|
#if INT_MAX >= 0x8000 /* else this might break */
|
||||||
|
#define PNG_INFO_IDAT 0x8000 /* ESR, 1.0.6 */
|
||||||
|
#endif
|
||||||
|
|
||||||
/* This is used for the transformation routines, as some of them
|
/* This is used for the transformation routines, as some of them
|
||||||
* change these values for the row. It also should enable using
|
* change these values for the row. It also should enable using
|
||||||
@ -1351,7 +1322,7 @@ PNG_EXPORT(229, void, png_set_scale_16, (png_structrp png_ptr));
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
|
#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
|
||||||
#define PNG_READ_16_TO_8_SUPPORTED /* Name prior to 1.5.4 */
|
#define PNG_READ_16_TO_8 SUPPORTED /* Name prior to 1.5.4 */
|
||||||
/* Strip the second byte of information from a 16-bit depth file. */
|
/* Strip the second byte of information from a 16-bit depth file. */
|
||||||
PNG_EXPORT(48, void, png_set_strip_16, (png_structrp png_ptr));
|
PNG_EXPORT(48, void, png_set_strip_16, (png_structrp png_ptr));
|
||||||
#endif
|
#endif
|
||||||
@ -1502,8 +1473,8 @@ PNG_EXPORT(67, void, png_set_filter, (png_structrp png_ptr, int method,
|
|||||||
#define PNG_FILTER_UP 0x20
|
#define PNG_FILTER_UP 0x20
|
||||||
#define PNG_FILTER_AVG 0x40
|
#define PNG_FILTER_AVG 0x40
|
||||||
#define PNG_FILTER_PAETH 0x80
|
#define PNG_FILTER_PAETH 0x80
|
||||||
#define PNG_FAST_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP)
|
#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \
|
||||||
#define PNG_ALL_FILTERS (PNG_FAST_FILTERS | PNG_FILTER_AVG | PNG_FILTER_PAETH)
|
PNG_FILTER_AVG | PNG_FILTER_PAETH)
|
||||||
|
|
||||||
/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now.
|
/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now.
|
||||||
* These defines should NOT be changed.
|
* These defines should NOT be changed.
|
||||||
@ -1780,21 +1751,21 @@ PNG_EXPORT(99, void, png_data_freer, (png_const_structrp png_ptr,
|
|||||||
#define PNG_SET_WILL_FREE_DATA 1
|
#define PNG_SET_WILL_FREE_DATA 1
|
||||||
#define PNG_USER_WILL_FREE_DATA 2
|
#define PNG_USER_WILL_FREE_DATA 2
|
||||||
/* Flags for png_ptr->free_me and info_ptr->free_me */
|
/* Flags for png_ptr->free_me and info_ptr->free_me */
|
||||||
#define PNG_FREE_HIST 0x0008U
|
#define PNG_FREE_HIST 0x0008
|
||||||
#define PNG_FREE_ICCP 0x0010U
|
#define PNG_FREE_ICCP 0x0010
|
||||||
#define PNG_FREE_SPLT 0x0020U
|
#define PNG_FREE_SPLT 0x0020
|
||||||
#define PNG_FREE_ROWS 0x0040U
|
#define PNG_FREE_ROWS 0x0040
|
||||||
#define PNG_FREE_PCAL 0x0080U
|
#define PNG_FREE_PCAL 0x0080
|
||||||
#define PNG_FREE_SCAL 0x0100U
|
#define PNG_FREE_SCAL 0x0100
|
||||||
#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
|
#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
# define PNG_FREE_UNKN 0x0200U
|
# define PNG_FREE_UNKN 0x0200
|
||||||
#endif
|
#endif
|
||||||
/* PNG_FREE_LIST 0x0400U removed in 1.6.0 because it is ignored */
|
/* PNG_FREE_LIST 0x0400 removed in 1.6.0 because it is ignored */
|
||||||
#define PNG_FREE_PLTE 0x1000U
|
#define PNG_FREE_PLTE 0x1000
|
||||||
#define PNG_FREE_TRNS 0x2000U
|
#define PNG_FREE_TRNS 0x2000
|
||||||
#define PNG_FREE_TEXT 0x4000U
|
#define PNG_FREE_TEXT 0x4000
|
||||||
#define PNG_FREE_ALL 0x7fffU
|
#define PNG_FREE_ALL 0x7fff
|
||||||
#define PNG_FREE_MUL 0x4220U /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */
|
#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */
|
||||||
|
|
||||||
#ifdef PNG_USER_MEM_SUPPORTED
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_const_structrp png_ptr,
|
PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_const_structrp png_ptr,
|
||||||
@ -2300,10 +2271,8 @@ PNG_EXPORT(171, void, png_set_sCAL_s, (png_const_structrp png_ptr,
|
|||||||
* except for the IHDR, PLTE, tRNS, IDAT, and IEND chunks (which continue to
|
* except for the IHDR, PLTE, tRNS, IDAT, and IEND chunks (which continue to
|
||||||
* be processed by libpng.
|
* be processed by libpng.
|
||||||
*/
|
*/
|
||||||
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
|
||||||
PNG_EXPORT(172, void, png_set_keep_unknown_chunks, (png_structrp png_ptr,
|
PNG_EXPORT(172, void, png_set_keep_unknown_chunks, (png_structrp png_ptr,
|
||||||
int keep, png_const_bytep chunk_list, int num_chunks));
|
int keep, png_const_bytep chunk_list, int num_chunks));
|
||||||
#endif /* HANDLE_AS_UNKNOWN */
|
|
||||||
|
|
||||||
/* The "keep" PNG_HANDLE_CHUNK_ parameter for the specified chunk is returned;
|
/* The "keep" PNG_HANDLE_CHUNK_ parameter for the specified chunk is returned;
|
||||||
* the result is therefore true (non-zero) if special handling is required,
|
* the result is therefore true (non-zero) if special handling is required,
|
||||||
@ -2311,7 +2280,7 @@ PNG_EXPORT(172, void, png_set_keep_unknown_chunks, (png_structrp png_ptr,
|
|||||||
*/
|
*/
|
||||||
PNG_EXPORT(173, int, png_handle_as_unknown, (png_const_structrp png_ptr,
|
PNG_EXPORT(173, int, png_handle_as_unknown, (png_const_structrp png_ptr,
|
||||||
png_const_bytep chunk_name));
|
png_const_bytep chunk_name));
|
||||||
#endif /* SET_UNKNOWN_CHUNKS */
|
#endif
|
||||||
|
|
||||||
#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
|
#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
PNG_EXPORT(174, void, png_set_unknown_chunks, (png_const_structrp png_ptr,
|
PNG_EXPORT(174, void, png_set_unknown_chunks, (png_const_structrp png_ptr,
|
||||||
@ -2532,37 +2501,33 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
|
|||||||
|
|
||||||
/* fg and bg should be in `gamma 1.0' space; alpha is the opacity */
|
/* fg and bg should be in `gamma 1.0' space; alpha is the opacity */
|
||||||
|
|
||||||
# define png_composite(composite, fg, alpha, bg) \
|
# define png_composite(composite, fg, alpha, bg) \
|
||||||
{ \
|
{ png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \
|
||||||
png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \
|
* (png_uint_16)(alpha) \
|
||||||
* (png_uint_16)(alpha) \
|
+ (png_uint_16)(bg)*(png_uint_16)(255 \
|
||||||
+ (png_uint_16)(bg)*(png_uint_16)(255 \
|
- (png_uint_16)(alpha)) + 128); \
|
||||||
- (png_uint_16)(alpha)) + 128); \
|
(composite) = (png_byte)(((temp + (temp >> 8)) >> 8) & 0xff); }
|
||||||
(composite) = (png_byte)(((temp + (temp >> 8)) >> 8) & 0xff); \
|
|
||||||
}
|
|
||||||
|
|
||||||
# define png_composite_16(composite, fg, alpha, bg) \
|
# define png_composite_16(composite, fg, alpha, bg) \
|
||||||
{ \
|
{ png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \
|
||||||
png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \
|
* (png_uint_32)(alpha) \
|
||||||
* (png_uint_32)(alpha) \
|
+ (png_uint_32)(bg)*(65535 \
|
||||||
+ (png_uint_32)(bg)*(65535 \
|
- (png_uint_32)(alpha)) + 32768); \
|
||||||
- (png_uint_32)(alpha)) + 32768); \
|
(composite) = (png_uint_16)(0xffff & ((temp + (temp >> 16)) >> 16)); }
|
||||||
(composite) = (png_uint_16)(0xffff & ((temp + (temp >> 16)) >> 16)); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* Standard method using integer division */
|
#else /* Standard method using integer division */
|
||||||
|
|
||||||
# define png_composite(composite, fg, alpha, bg) \
|
# define png_composite(composite, fg, alpha, bg) \
|
||||||
(composite) = \
|
(composite) = \
|
||||||
(png_byte)(0xff & (((png_uint_16)(fg) * (png_uint_16)(alpha) + \
|
(png_byte)(0xff & (((png_uint_16)(fg) * (png_uint_16)(alpha) + \
|
||||||
(png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \
|
(png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \
|
||||||
127) / 255))
|
127) / 255))
|
||||||
|
|
||||||
# define png_composite_16(composite, fg, alpha, bg) \
|
# define png_composite_16(composite, fg, alpha, bg) \
|
||||||
(composite) = \
|
(composite) = \
|
||||||
(png_uint_16)(0xffff & (((png_uint_32)(fg) * (png_uint_32)(alpha) + \
|
(png_uint_16)(0xffff & (((png_uint_32)(fg) * (png_uint_32)(alpha) + \
|
||||||
(png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \
|
(png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \
|
||||||
32767) / 65535))
|
32767) / 65535))
|
||||||
#endif /* READ_COMPOSITE_NODIV */
|
#endif /* READ_COMPOSITE_NODIV */
|
||||||
|
|
||||||
#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED
|
#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED
|
||||||
@ -2598,38 +2563,38 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i));
|
|||||||
* format for negative values, which is almost certainly true.
|
* format for negative values, which is almost certainly true.
|
||||||
*/
|
*/
|
||||||
# define PNG_get_uint_32(buf) \
|
# define PNG_get_uint_32(buf) \
|
||||||
(((png_uint_32)(*(buf)) << 24) + \
|
(((png_uint_32)(*(buf)) << 24) + \
|
||||||
((png_uint_32)(*((buf) + 1)) << 16) + \
|
((png_uint_32)(*((buf) + 1)) << 16) + \
|
||||||
((png_uint_32)(*((buf) + 2)) << 8) + \
|
((png_uint_32)(*((buf) + 2)) << 8) + \
|
||||||
((png_uint_32)(*((buf) + 3))))
|
((png_uint_32)(*((buf) + 3))))
|
||||||
|
|
||||||
/* From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
|
/* From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
|
||||||
* function) incorrectly returned a value of type png_uint_32.
|
* function) incorrectly returned a value of type png_uint_32.
|
||||||
*/
|
*/
|
||||||
# define PNG_get_uint_16(buf) \
|
# define PNG_get_uint_16(buf) \
|
||||||
((png_uint_16) \
|
((png_uint_16) \
|
||||||
(((unsigned int)(*(buf)) << 8) + \
|
(((unsigned int)(*(buf)) << 8) + \
|
||||||
((unsigned int)(*((buf) + 1)))))
|
((unsigned int)(*((buf) + 1)))))
|
||||||
|
|
||||||
# define PNG_get_int_32(buf) \
|
# define PNG_get_int_32(buf) \
|
||||||
((png_int_32)((*(buf) & 0x80) \
|
((png_int_32)((*(buf) & 0x80) \
|
||||||
? -((png_int_32)(((png_get_uint_32(buf)^0xffffffffU)+1U)&0x7fffffffU)) \
|
? -((png_int_32)(((png_get_uint_32(buf)^0xffffffffU)+1U)&0x7fffffffU)) \
|
||||||
: (png_int_32)png_get_uint_32(buf)))
|
: (png_int_32)png_get_uint_32(buf)))
|
||||||
|
|
||||||
/* If PNG_PREFIX is defined the same thing as below happens in pnglibconf.h,
|
/* If PNG_PREFIX is defined the same thing as below happens in pnglibconf.h,
|
||||||
* but defining a macro name prefixed with PNG_PREFIX.
|
* but defining a macro name prefixed with PNG_PREFIX.
|
||||||
*/
|
*/
|
||||||
# ifndef PNG_PREFIX
|
# ifndef PNG_PREFIX
|
||||||
# define png_get_uint_32(buf) PNG_get_uint_32(buf)
|
# define png_get_uint_32(buf) PNG_get_uint_32(buf)
|
||||||
# define png_get_uint_16(buf) PNG_get_uint_16(buf)
|
# define png_get_uint_16(buf) PNG_get_uint_16(buf)
|
||||||
# define png_get_int_32(buf) PNG_get_int_32(buf)
|
# define png_get_int_32(buf) PNG_get_int_32(buf)
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
# ifdef PNG_PREFIX
|
# ifdef PNG_PREFIX
|
||||||
/* No macros; revert to the (redefined) function */
|
/* No macros; revert to the (redefined) function */
|
||||||
# define PNG_get_uint_32 (png_get_uint_32)
|
# define PNG_get_uint_32 (png_get_uint_32)
|
||||||
# define PNG_get_uint_16 (png_get_uint_16)
|
# define PNG_get_uint_16 (png_get_uint_16)
|
||||||
# define PNG_get_int_32 (png_get_int_32)
|
# define PNG_get_int_32 (png_get_int_32)
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -2924,19 +2889,12 @@ typedef struct
|
|||||||
* is the minimum 'row stride', the minimum count of components between each
|
* is the minimum 'row stride', the minimum count of components between each
|
||||||
* row. For a color-mapped image this is the minimum number of bytes in a
|
* row. For a color-mapped image this is the minimum number of bytes in a
|
||||||
* row.
|
* row.
|
||||||
*
|
|
||||||
* WARNING: this macro overflows for some images with more than one component
|
|
||||||
* and very large image widths. libpng will refuse to process an image where
|
|
||||||
* this macro would overflow.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PNG_IMAGE_BUFFER_SIZE(image, row_stride)\
|
#define PNG_IMAGE_BUFFER_SIZE(image, row_stride)\
|
||||||
(PNG_IMAGE_PIXEL_COMPONENT_SIZE((image).format)*(image).height*(row_stride))
|
(PNG_IMAGE_PIXEL_COMPONENT_SIZE((image).format)*(image).height*(row_stride))
|
||||||
/* Return the size, in bytes, of an image buffer given a png_image and a row
|
/* Return the size, in bytes, of an image buffer given a png_image and a row
|
||||||
* stride - the number of components to leave space for in each row.
|
* stride - the number of components to leave space for in each row.
|
||||||
*
|
|
||||||
* WARNING: this macro overflows a 32-bit integer for some large PNG images,
|
|
||||||
* libpng will refuse to process an image where such an overflow would occur.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PNG_IMAGE_SIZE(image)\
|
#define PNG_IMAGE_SIZE(image)\
|
||||||
@ -3057,6 +3015,7 @@ PNG_EXPORT(238, void, png_image_free, (png_imagep image));
|
|||||||
#endif /* SIMPLIFIED_READ */
|
#endif /* SIMPLIFIED_READ */
|
||||||
|
|
||||||
#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
|
#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
|
||||||
|
#ifdef PNG_STDIO_SUPPORTED
|
||||||
/* WRITE APIS
|
/* WRITE APIS
|
||||||
* ----------
|
* ----------
|
||||||
* For write you must initialize a png_image structure to describe the image to
|
* For write you must initialize a png_image structure to describe the image to
|
||||||
@ -3073,7 +3032,6 @@ PNG_EXPORT(238, void, png_image_free, (png_imagep image));
|
|||||||
* values do not correspond to the colors in sRGB.
|
* values do not correspond to the colors in sRGB.
|
||||||
* colormap_entries: set to the number of entries in the color-map (0 to 256)
|
* colormap_entries: set to the number of entries in the color-map (0 to 256)
|
||||||
*/
|
*/
|
||||||
#ifdef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED
|
|
||||||
PNG_EXPORT(239, int, png_image_write_to_file, (png_imagep image,
|
PNG_EXPORT(239, int, png_image_write_to_file, (png_imagep image,
|
||||||
const char *file, int convert_to_8bit, const void *buffer,
|
const char *file, int convert_to_8bit, const void *buffer,
|
||||||
png_int_32 row_stride, const void *colormap));
|
png_int_32 row_stride, const void *colormap));
|
||||||
@ -3083,9 +3041,8 @@ PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file,
|
|||||||
int convert_to_8_bit, const void *buffer, png_int_32 row_stride,
|
int convert_to_8_bit, const void *buffer, png_int_32 row_stride,
|
||||||
const void *colormap));
|
const void *colormap));
|
||||||
/* Write the image to the given (FILE*). */
|
/* Write the image to the given (FILE*). */
|
||||||
#endif /* SIMPLIFIED_WRITE_STDIO */
|
|
||||||
|
|
||||||
/* With all write APIs if image is in one of the linear formats with 16-bit
|
/* With both write APIs if image is in one of the linear formats with 16-bit
|
||||||
* data then setting convert_to_8_bit will cause the output to be an 8-bit PNG
|
* data then setting convert_to_8_bit will cause the output to be an 8-bit PNG
|
||||||
* gamma encoded according to the sRGB specification, otherwise a 16-bit linear
|
* gamma encoded according to the sRGB specification, otherwise a 16-bit linear
|
||||||
* encoded PNG file is written.
|
* encoded PNG file is written.
|
||||||
@ -3097,103 +3054,13 @@ PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file,
|
|||||||
*
|
*
|
||||||
* With all APIs row_stride is handled as in the read APIs - it is the spacing
|
* With all APIs row_stride is handled as in the read APIs - it is the spacing
|
||||||
* from one row to the next in component sized units (1 or 2 bytes) and if
|
* from one row to the next in component sized units (1 or 2 bytes) and if
|
||||||
* negative indicates a bottom-up row layout in the buffer. If row_stride is
|
* negative indicates a bottom-up row layout in the buffer. If row_stride is zero,
|
||||||
* zero, libpng will calculate it for you from the image width and number of
|
* libpng will calculate it for you from the image width and number of channels.
|
||||||
* channels.
|
|
||||||
*
|
*
|
||||||
* Note that the write API does not support interlacing, sub-8-bit pixels or
|
* Note that the write API does not support interlacing, sub-8-bit pixels, indexed
|
||||||
* most ancillary chunks. If you need to write text chunks (e.g. for copyright
|
* PNG (color_type 3) or most ancillary chunks.
|
||||||
* notices) you need to use one of the other APIs.
|
|
||||||
*/
|
*/
|
||||||
|
#endif /* STDIO */
|
||||||
PNG_EXPORT(245, int, png_image_write_to_memory, (png_imagep image, void *memory,
|
|
||||||
png_alloc_size_t * PNG_RESTRICT memory_bytes, int convert_to_8_bit,
|
|
||||||
const void *buffer, png_int_32 row_stride, const void *colormap));
|
|
||||||
/* Write the image to the given memory buffer. The function both writes the
|
|
||||||
* whole PNG data stream to *memory and updates *memory_bytes with the count
|
|
||||||
* of bytes written.
|
|
||||||
*
|
|
||||||
* 'memory' may be NULL. In this case *memory_bytes is not read however on
|
|
||||||
* success the number of bytes which would have been written will still be
|
|
||||||
* stored in *memory_bytes. On failure *memory_bytes will contain 0.
|
|
||||||
*
|
|
||||||
* If 'memory' is not NULL it must point to memory[*memory_bytes] of
|
|
||||||
* writeable memory.
|
|
||||||
*
|
|
||||||
* If the function returns success memory[*memory_bytes] (if 'memory' is not
|
|
||||||
* NULL) contains the written PNG data. *memory_bytes will always be less
|
|
||||||
* than or equal to the original value.
|
|
||||||
*
|
|
||||||
* If the function returns false and *memory_bytes was not changed an error
|
|
||||||
* occured during write. If *memory_bytes was changed, or is not 0 if
|
|
||||||
* 'memory' was NULL, the write would have succeeded but for the memory
|
|
||||||
* buffer being too small. *memory_bytes contains the required number of
|
|
||||||
* bytes and will be bigger that the original value.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define png_image_write_get_memory_size(image, size, convert_to_8_bit, buffer,\
|
|
||||||
row_stride, colormap)\
|
|
||||||
png_image_write_to_memory(&(image), 0, &(size), convert_to_8_bit, buffer,\
|
|
||||||
row_stride, colormap)
|
|
||||||
/* Return the amount of memory in 'size' required to compress this image.
|
|
||||||
* The png_image structure 'image' must be filled in as in the above
|
|
||||||
* function and must not be changed before the actual write call, the buffer
|
|
||||||
* and all other parameters must also be identical to that in the final
|
|
||||||
* write call. The 'size' variable need not be initialized.
|
|
||||||
*
|
|
||||||
* NOTE: the macro returns true/false, if false is returned 'size' will be
|
|
||||||
* set to zero and the write failed and probably will fail if tried again.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* You can pre-allocate the buffer by making sure it is of sufficient size
|
|
||||||
* regardless of the amount of compression achieved. The buffer size will
|
|
||||||
* always be bigger than the original image and it will never be filled. The
|
|
||||||
* following macros are provided to assist in allocating the buffer.
|
|
||||||
*/
|
|
||||||
#define PNG_IMAGE_DATA_SIZE(image) (PNG_IMAGE_SIZE(image)+(image).height)
|
|
||||||
/* The number of uncompressed bytes in the PNG byte encoding of the image;
|
|
||||||
* uncompressing the PNG IDAT data will give this number of bytes.
|
|
||||||
*
|
|
||||||
* NOTE: while PNG_IMAGE_SIZE cannot overflow for an image in memory this
|
|
||||||
* macro can because of the extra bytes used in the PNG byte encoding. You
|
|
||||||
* need to avoid this macro if your image size approaches 2^30 in width or
|
|
||||||
* height. The same goes for the remainder of these macros; they all produce
|
|
||||||
* bigger numbers than the actual in-memory image size.
|
|
||||||
*/
|
|
||||||
#ifndef PNG_ZLIB_MAX_SIZE
|
|
||||||
# define PNG_ZLIB_MAX_SIZE(b) ((b)+(((b)+7U)>>3)+(((b)+63U)>>6)+11U)
|
|
||||||
/* An upper bound on the number of compressed bytes given 'b' uncompressed
|
|
||||||
* bytes. This is based on deflateBounds() in zlib; different
|
|
||||||
* implementations of zlib compression may conceivably produce more data so
|
|
||||||
* if your zlib implementation is not zlib itself redefine this macro
|
|
||||||
* appropriately.
|
|
||||||
*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define PNG_IMAGE_COMPRESSED_SIZE_MAX(image)\
|
|
||||||
PNG_ZLIB_MAX_SIZE((png_alloc_size_t)PNG_IMAGE_DATA_SIZE(image))
|
|
||||||
/* An upper bound on the size of the data in the PNG IDAT chunks. */
|
|
||||||
|
|
||||||
#define PNG_IMAGE_PNG_SIZE_MAX_(image, image_size)\
|
|
||||||
((8U/*sig*/+25U/*IHDR*/+16U/*gAMA*/+44U/*cHRM*/+12U/*IEND*/+\
|
|
||||||
(((image).format&PNG_FORMAT_FLAG_COLORMAP)?/*colormap: PLTE, tRNS*/\
|
|
||||||
12U+3U*(image).colormap_entries/*PLTE data*/+\
|
|
||||||
(((image).format&PNG_FORMAT_FLAG_ALPHA)?\
|
|
||||||
12U/*tRNS*/+(image).colormap_entries:0U):0U)+\
|
|
||||||
12U)+(12U*((image_size)/PNG_ZBUF_SIZE))/*IDAT*/+(image_size))
|
|
||||||
/* A helper for the following macro; if your compiler cannot handle the
|
|
||||||
* following macro use this one with the result of
|
|
||||||
* PNG_IMAGE_COMPRESSED_SIZE_MAX(image) as the second argument (most
|
|
||||||
* compilers should handle this just fine.)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define PNG_IMAGE_PNG_SIZE_MAX(image)\
|
|
||||||
PNG_IMAGE_PNG_SIZE_MAX_(image, PNG_IMAGE_COMPRESSED_SIZE_MAX(image))
|
|
||||||
/* An upper bound on the total length of the PNG data stream for 'image'.
|
|
||||||
* The result is of type png_alloc_size_t, on 32-bit systems this may
|
|
||||||
* overflow even though PNG_IMAGE_DATA_SIZE does not overflow; the write will
|
|
||||||
* run out of buffer space but return a corrected size which should work.
|
|
||||||
*/
|
|
||||||
#endif /* SIMPLIFIED_WRITE */
|
#endif /* SIMPLIFIED_WRITE */
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* END OF SIMPLIFIED API
|
* END OF SIMPLIFIED API
|
||||||
@ -3227,10 +3094,7 @@ PNG_EXPORT(245, int, png_image_write_to_memory, (png_imagep image, void *memory,
|
|||||||
#endif
|
#endif
|
||||||
#define PNG_MAXIMUM_INFLATE_WINDOW 2 /* SOFTWARE: force maximum window */
|
#define PNG_MAXIMUM_INFLATE_WINDOW 2 /* SOFTWARE: force maximum window */
|
||||||
#define PNG_SKIP_sRGB_CHECK_PROFILE 4 /* SOFTWARE: Check ICC profile for sRGB */
|
#define PNG_SKIP_sRGB_CHECK_PROFILE 4 /* SOFTWARE: Check ICC profile for sRGB */
|
||||||
#ifdef PNG_MIPS_MSA_API_SUPPORTED
|
#define PNG_OPTION_NEXT 6 /* Next option - numbers must be even */
|
||||||
# define PNG_MIPS_MSA 6 /* HARDWARE: MIPS Msa SIMD instructions supported */
|
|
||||||
#endif
|
|
||||||
#define PNG_OPTION_NEXT 8 /* Next option - numbers must be even */
|
|
||||||
|
|
||||||
/* Return values: NOTE: there are four values and 'off' is *not* zero */
|
/* Return values: NOTE: there are four values and 'off' is *not* zero */
|
||||||
#define PNG_OPTION_UNSET 0 /* Unset - defaults to off */
|
#define PNG_OPTION_UNSET 0 /* Unset - defaults to off */
|
||||||
@ -3254,7 +3118,7 @@ PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option,
|
|||||||
* one to use is one more than this.)
|
* one to use is one more than this.)
|
||||||
*/
|
*/
|
||||||
#ifdef PNG_EXPORT_LAST_ORDINAL
|
#ifdef PNG_EXPORT_LAST_ORDINAL
|
||||||
PNG_EXPORT_LAST_ORDINAL(245);
|
PNG_EXPORT_LAST_ORDINAL(244);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
46
thirdparty/libpng/pngconf.h
vendored
46
thirdparty/libpng/pngconf.h
vendored
@ -1,9 +1,9 @@
|
|||||||
|
|
||||||
/* pngconf.h - machine configurable file for libpng
|
/* pngconf.h - machine configurable file for libpng
|
||||||
*
|
*
|
||||||
* libpng version 1.6.25, September 1, 2016
|
* libpng version 1.6.21, January 15, 2016
|
||||||
*
|
*
|
||||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
@ -188,27 +188,27 @@
|
|||||||
* compatible with GCC or Visual C because of different calling conventions.
|
* compatible with GCC or Visual C because of different calling conventions.
|
||||||
*/
|
*/
|
||||||
# if PNG_API_RULE == 2
|
# if PNG_API_RULE == 2
|
||||||
/* If this line results in an error, either because __watcall is not
|
/* If this line results in an error, either because __watcall is not
|
||||||
* understood or because of a redefine just below you cannot use *this*
|
* understood or because of a redefine just below you cannot use *this*
|
||||||
* build of the library with the compiler you are using. *This* build was
|
* build of the library with the compiler you are using. *This* build was
|
||||||
* build using Watcom and applications must also be built using Watcom!
|
* build using Watcom and applications must also be built using Watcom!
|
||||||
*/
|
*/
|
||||||
# define PNGCAPI __watcall
|
# define PNGCAPI __watcall
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 800))
|
# if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 800))
|
||||||
# define PNGCAPI __cdecl
|
# define PNGCAPI __cdecl
|
||||||
# if PNG_API_RULE == 1
|
# if PNG_API_RULE == 1
|
||||||
/* If this line results in an error __stdcall is not understood and
|
/* If this line results in an error __stdcall is not understood and
|
||||||
* PNG_API_RULE should not have been set to '1'.
|
* PNG_API_RULE should not have been set to '1'.
|
||||||
*/
|
*/
|
||||||
# define PNGAPI __stdcall
|
# define PNGAPI __stdcall
|
||||||
# endif
|
# endif
|
||||||
# else
|
# else
|
||||||
/* An older compiler, or one not detected (erroneously) above,
|
/* An older compiler, or one not detected (erroneously) above,
|
||||||
* if necessary override on the command line to get the correct
|
* if necessary override on the command line to get the correct
|
||||||
* variants for the compiler.
|
* variants for the compiler.
|
||||||
*/
|
*/
|
||||||
# ifndef PNGCAPI
|
# ifndef PNGCAPI
|
||||||
# define PNGCAPI _cdecl
|
# define PNGCAPI _cdecl
|
||||||
# endif
|
# endif
|
||||||
@ -225,10 +225,10 @@
|
|||||||
|
|
||||||
# if (defined(_MSC_VER) && _MSC_VER < 800) ||\
|
# if (defined(_MSC_VER) && _MSC_VER < 800) ||\
|
||||||
(defined(__BORLANDC__) && __BORLANDC__ < 0x500)
|
(defined(__BORLANDC__) && __BORLANDC__ < 0x500)
|
||||||
/* older Borland and MSC
|
/* older Borland and MSC
|
||||||
* compilers used '__export' and required this to be after
|
* compilers used '__export' and required this to be after
|
||||||
* the type.
|
* the type.
|
||||||
*/
|
*/
|
||||||
# ifndef PNG_EXPORT_TYPE
|
# ifndef PNG_EXPORT_TYPE
|
||||||
# define PNG_EXPORT_TYPE(type) type PNG_IMPEXP
|
# define PNG_EXPORT_TYPE(type) type PNG_IMPEXP
|
||||||
# endif
|
# endif
|
||||||
@ -244,9 +244,9 @@
|
|||||||
# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__)
|
# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__)
|
||||||
# define PNGAPI _System
|
# define PNGAPI _System
|
||||||
# else /* !Windows/x86 && !OS/2 */
|
# else /* !Windows/x86 && !OS/2 */
|
||||||
/* Use the defaults, or define PNG*API on the command line (but
|
/* Use the defaults, or define PNG*API on the command line (but
|
||||||
* this will have to be done for every compile!)
|
* this will have to be done for every compile!)
|
||||||
*/
|
*/
|
||||||
# endif /* other system, !OS/2 */
|
# endif /* other system, !OS/2 */
|
||||||
#endif /* !Windows/x86 */
|
#endif /* !Windows/x86 */
|
||||||
|
|
||||||
@ -267,7 +267,7 @@
|
|||||||
*/
|
*/
|
||||||
#ifndef PNG_IMPEXP
|
#ifndef PNG_IMPEXP
|
||||||
# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT)
|
# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT)
|
||||||
/* This forces use of a DLL, disallowing static linking */
|
/* This forces use of a DLL, disallowing static linking */
|
||||||
# define PNG_IMPEXP PNG_DLL_IMPORT
|
# define PNG_IMPEXP PNG_DLL_IMPORT
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
@ -340,7 +340,7 @@
|
|||||||
* less efficient code.
|
* less efficient code.
|
||||||
*/
|
*/
|
||||||
# if defined(__clang__) && defined(__has_attribute)
|
# if defined(__clang__) && defined(__has_attribute)
|
||||||
/* Clang defines both __clang__ and __GNUC__. Check __clang__ first. */
|
/* Clang defines both __clang__ and __GNUC__. Check __clang__ first. */
|
||||||
# if !defined(PNG_USE_RESULT) && __has_attribute(__warn_unused_result__)
|
# if !defined(PNG_USE_RESULT) && __has_attribute(__warn_unused_result__)
|
||||||
# define PNG_USE_RESULT __attribute__((__warn_unused_result__))
|
# define PNG_USE_RESULT __attribute__((__warn_unused_result__))
|
||||||
# endif
|
# endif
|
||||||
|
72
thirdparty/libpng/pngerror.c
vendored
72
thirdparty/libpng/pngerror.c
vendored
@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
/* pngerror.c - stub functions for i/o and memory allocation
|
/* pngerror.c - stub functions for i/o and memory allocation
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.24 [August 4, 2016]
|
* Last changed in libpng 1.6.15 [November 20, 2014]
|
||||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
@ -26,7 +26,7 @@ static PNG_FUNCTION(void, png_default_error,PNGARG((png_const_structrp png_ptr,
|
|||||||
#ifdef PNG_WARNINGS_SUPPORTED
|
#ifdef PNG_WARNINGS_SUPPORTED
|
||||||
static void /* PRIVATE */
|
static void /* PRIVATE */
|
||||||
png_default_warning PNGARG((png_const_structrp png_ptr,
|
png_default_warning PNGARG((png_const_structrp png_ptr,
|
||||||
png_const_charp warning_message));
|
png_const_charp warning_message));
|
||||||
#endif /* WARNINGS */
|
#endif /* WARNINGS */
|
||||||
|
|
||||||
/* This function is called whenever there is a fatal error. This function
|
/* This function is called whenever there is a fatal error. This function
|
||||||
@ -37,14 +37,14 @@ png_default_warning PNGARG((png_const_structrp png_ptr,
|
|||||||
#ifdef PNG_ERROR_TEXT_SUPPORTED
|
#ifdef PNG_ERROR_TEXT_SUPPORTED
|
||||||
PNG_FUNCTION(void,PNGAPI
|
PNG_FUNCTION(void,PNGAPI
|
||||||
png_error,(png_const_structrp png_ptr, png_const_charp error_message),
|
png_error,(png_const_structrp png_ptr, png_const_charp error_message),
|
||||||
PNG_NORETURN)
|
PNG_NORETURN)
|
||||||
{
|
{
|
||||||
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
||||||
char msg[16];
|
char msg[16];
|
||||||
if (png_ptr != NULL)
|
if (png_ptr != NULL)
|
||||||
{
|
{
|
||||||
if ((png_ptr->flags &
|
if ((png_ptr->flags &
|
||||||
(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0)
|
(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0
|
||||||
{
|
{
|
||||||
if (*error_message == PNG_LITERAL_SHARP)
|
if (*error_message == PNG_LITERAL_SHARP)
|
||||||
{
|
{
|
||||||
@ -65,18 +65,18 @@ png_error,(png_const_structrp png_ptr, png_const_charp error_message),
|
|||||||
|
|
||||||
else
|
else
|
||||||
error_message += offset;
|
error_message += offset;
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((png_ptr->flags & PNG_FLAG_STRIP_ERROR_TEXT) != 0)
|
|
||||||
{
|
|
||||||
msg[0] = '0';
|
|
||||||
msg[1] = '\0';
|
|
||||||
error_message = msg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((png_ptr->flags & PNG_FLAG_STRIP_ERROR_TEXT) != 0)
|
||||||
|
{
|
||||||
|
msg[0] = '0';
|
||||||
|
msg[1] = '\0';
|
||||||
|
error_message = msg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (png_ptr != NULL && png_ptr->error_fn != NULL)
|
if (png_ptr != NULL && png_ptr->error_fn != NULL)
|
||||||
@ -110,7 +110,7 @@ png_err,(png_const_structrp png_ptr),PNG_NORETURN)
|
|||||||
*/
|
*/
|
||||||
size_t
|
size_t
|
||||||
png_safecat(png_charp buffer, size_t bufsize, size_t pos,
|
png_safecat(png_charp buffer, size_t bufsize, size_t pos,
|
||||||
png_const_charp string)
|
png_const_charp string)
|
||||||
{
|
{
|
||||||
if (buffer != NULL && pos < bufsize)
|
if (buffer != NULL && pos < bufsize)
|
||||||
{
|
{
|
||||||
@ -131,7 +131,7 @@ png_safecat(png_charp buffer, size_t bufsize, size_t pos,
|
|||||||
*/
|
*/
|
||||||
png_charp
|
png_charp
|
||||||
png_format_number(png_const_charp start, png_charp end, int format,
|
png_format_number(png_const_charp start, png_charp end, int format,
|
||||||
png_alloc_size_t number)
|
png_alloc_size_t number)
|
||||||
{
|
{
|
||||||
int count = 0; /* number of digits output */
|
int count = 0; /* number of digits output */
|
||||||
int mincount = 1; /* minimum number required */
|
int mincount = 1; /* minimum number required */
|
||||||
@ -233,7 +233,7 @@ png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
|
|||||||
}
|
}
|
||||||
if (png_ptr != NULL && png_ptr->warning_fn != NULL)
|
if (png_ptr != NULL && png_ptr->warning_fn != NULL)
|
||||||
(*(png_ptr->warning_fn))(png_constcast(png_structrp,png_ptr),
|
(*(png_ptr->warning_fn))(png_constcast(png_structrp,png_ptr),
|
||||||
warning_message + offset);
|
warning_message + offset);
|
||||||
else
|
else
|
||||||
png_default_warning(png_ptr, warning_message + offset);
|
png_default_warning(png_ptr, warning_message + offset);
|
||||||
}
|
}
|
||||||
@ -245,7 +245,7 @@ png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
|
|||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
png_warning_parameter(png_warning_parameters p, int number,
|
png_warning_parameter(png_warning_parameters p, int number,
|
||||||
png_const_charp string)
|
png_const_charp string)
|
||||||
{
|
{
|
||||||
if (number > 0 && number <= PNG_WARNING_PARAMETER_COUNT)
|
if (number > 0 && number <= PNG_WARNING_PARAMETER_COUNT)
|
||||||
(void)png_safecat(p[number-1], (sizeof p[number-1]), 0, string);
|
(void)png_safecat(p[number-1], (sizeof p[number-1]), 0, string);
|
||||||
@ -253,7 +253,7 @@ png_warning_parameter(png_warning_parameters p, int number,
|
|||||||
|
|
||||||
void
|
void
|
||||||
png_warning_parameter_unsigned(png_warning_parameters p, int number, int format,
|
png_warning_parameter_unsigned(png_warning_parameters p, int number, int format,
|
||||||
png_alloc_size_t value)
|
png_alloc_size_t value)
|
||||||
{
|
{
|
||||||
char buffer[PNG_NUMBER_BUFFER_SIZE];
|
char buffer[PNG_NUMBER_BUFFER_SIZE];
|
||||||
png_warning_parameter(p, number, PNG_FORMAT_NUMBER(buffer, format, value));
|
png_warning_parameter(p, number, PNG_FORMAT_NUMBER(buffer, format, value));
|
||||||
@ -261,7 +261,7 @@ png_warning_parameter_unsigned(png_warning_parameters p, int number, int format,
|
|||||||
|
|
||||||
void
|
void
|
||||||
png_warning_parameter_signed(png_warning_parameters p, int number, int format,
|
png_warning_parameter_signed(png_warning_parameters p, int number, int format,
|
||||||
png_int_32 value)
|
png_int_32 value)
|
||||||
{
|
{
|
||||||
png_alloc_size_t u;
|
png_alloc_size_t u;
|
||||||
png_charp str;
|
png_charp str;
|
||||||
@ -282,7 +282,7 @@ png_warning_parameter_signed(png_warning_parameters p, int number, int format,
|
|||||||
|
|
||||||
void
|
void
|
||||||
png_formatted_warning(png_const_structrp png_ptr, png_warning_parameters p,
|
png_formatted_warning(png_const_structrp png_ptr, png_warning_parameters p,
|
||||||
png_const_charp message)
|
png_const_charp message)
|
||||||
{
|
{
|
||||||
/* The internal buffer is just 192 bytes - enough for all our messages,
|
/* The internal buffer is just 192 bytes - enough for all our messages,
|
||||||
* overflow doesn't happen because this code checks! If someone figures
|
* overflow doesn't happen because this code checks! If someone figures
|
||||||
@ -391,10 +391,10 @@ png_benign_error(png_const_structrp png_ptr, png_const_charp error_message)
|
|||||||
void /* PRIVATE */
|
void /* PRIVATE */
|
||||||
png_app_warning(png_const_structrp png_ptr, png_const_charp error_message)
|
png_app_warning(png_const_structrp png_ptr, png_const_charp error_message)
|
||||||
{
|
{
|
||||||
if ((png_ptr->flags & PNG_FLAG_APP_WARNINGS_WARN) != 0)
|
if ((png_ptr->flags & PNG_FLAG_APP_WARNINGS_WARN) != 0)
|
||||||
png_warning(png_ptr, error_message);
|
png_warning(png_ptr, error_message);
|
||||||
else
|
else
|
||||||
png_error(png_ptr, error_message);
|
png_error(png_ptr, error_message);
|
||||||
|
|
||||||
# ifndef PNG_ERROR_TEXT_SUPPORTED
|
# ifndef PNG_ERROR_TEXT_SUPPORTED
|
||||||
PNG_UNUSED(error_message)
|
PNG_UNUSED(error_message)
|
||||||
@ -404,10 +404,10 @@ png_app_warning(png_const_structrp png_ptr, png_const_charp error_message)
|
|||||||
void /* PRIVATE */
|
void /* PRIVATE */
|
||||||
png_app_error(png_const_structrp png_ptr, png_const_charp error_message)
|
png_app_error(png_const_structrp png_ptr, png_const_charp error_message)
|
||||||
{
|
{
|
||||||
if ((png_ptr->flags & PNG_FLAG_APP_ERRORS_WARN) != 0)
|
if ((png_ptr->flags & PNG_FLAG_APP_ERRORS_WARN) != 0)
|
||||||
png_warning(png_ptr, error_message);
|
png_warning(png_ptr, error_message);
|
||||||
else
|
else
|
||||||
png_error(png_ptr, error_message);
|
png_error(png_ptr, error_message);
|
||||||
|
|
||||||
# ifndef PNG_ERROR_TEXT_SUPPORTED
|
# ifndef PNG_ERROR_TEXT_SUPPORTED
|
||||||
PNG_UNUSED(error_message)
|
PNG_UNUSED(error_message)
|
||||||
@ -478,7 +478,7 @@ png_format_buffer(png_const_structrp png_ptr, png_charp buffer, png_const_charp
|
|||||||
#if defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED)
|
#if defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED)
|
||||||
PNG_FUNCTION(void,PNGAPI
|
PNG_FUNCTION(void,PNGAPI
|
||||||
png_chunk_error,(png_const_structrp png_ptr, png_const_charp error_message),
|
png_chunk_error,(png_const_structrp png_ptr, png_const_charp error_message),
|
||||||
PNG_NORETURN)
|
PNG_NORETURN)
|
||||||
{
|
{
|
||||||
char msg[18+PNG_MAX_ERROR_TEXT];
|
char msg[18+PNG_MAX_ERROR_TEXT];
|
||||||
if (png_ptr == NULL)
|
if (png_ptr == NULL)
|
||||||
@ -620,7 +620,7 @@ png_set_longjmp_fn(png_structrp png_ptr, png_longjmp_ptr longjmp_fn,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
png_ptr->jmp_buf_ptr = png_voidcast(jmp_buf *,
|
png_ptr->jmp_buf_ptr = png_voidcast(jmp_buf *,
|
||||||
png_malloc_warn(png_ptr, jmp_buf_size));
|
png_malloc_warn(png_ptr, jmp_buf_size));
|
||||||
|
|
||||||
if (png_ptr->jmp_buf_ptr == NULL)
|
if (png_ptr->jmp_buf_ptr == NULL)
|
||||||
return NULL; /* new NULL return on OOM */
|
return NULL; /* new NULL return on OOM */
|
||||||
@ -709,7 +709,7 @@ png_free_jmpbuf(png_structrp png_ptr)
|
|||||||
*/
|
*/
|
||||||
static PNG_FUNCTION(void /* PRIVATE */,
|
static PNG_FUNCTION(void /* PRIVATE */,
|
||||||
png_default_error,(png_const_structrp png_ptr, png_const_charp error_message),
|
png_default_error,(png_const_structrp png_ptr, png_const_charp error_message),
|
||||||
PNG_NORETURN)
|
PNG_NORETURN)
|
||||||
{
|
{
|
||||||
#ifdef PNG_CONSOLE_IO_SUPPORTED
|
#ifdef PNG_CONSOLE_IO_SUPPORTED
|
||||||
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
|
||||||
@ -883,7 +883,7 @@ png_set_strip_error_numbers(png_structrp png_ptr, png_uint_32 strip_mode)
|
|||||||
*/
|
*/
|
||||||
PNG_FUNCTION(void /* PRIVATE */, (PNGCBAPI
|
PNG_FUNCTION(void /* PRIVATE */, (PNGCBAPI
|
||||||
png_safe_error),(png_structp png_nonconst_ptr, png_const_charp error_message),
|
png_safe_error),(png_structp png_nonconst_ptr, png_const_charp error_message),
|
||||||
PNG_NORETURN)
|
PNG_NORETURN)
|
||||||
{
|
{
|
||||||
const png_const_structrp png_ptr = png_nonconst_ptr;
|
const png_const_structrp png_ptr = png_nonconst_ptr;
|
||||||
png_imagep image = png_voidcast(png_imagep, png_ptr->error_ptr);
|
png_imagep image = png_voidcast(png_imagep, png_ptr->error_ptr);
|
||||||
@ -906,7 +906,7 @@ png_safe_error),(png_structp png_nonconst_ptr, png_const_charp error_message),
|
|||||||
/* Missing longjmp buffer, the following is to help debugging: */
|
/* Missing longjmp buffer, the following is to help debugging: */
|
||||||
{
|
{
|
||||||
size_t pos = png_safecat(image->message, (sizeof image->message), 0,
|
size_t pos = png_safecat(image->message, (sizeof image->message), 0,
|
||||||
"bad longjmp: ");
|
"bad longjmp: ");
|
||||||
png_safecat(image->message, (sizeof image->message), pos,
|
png_safecat(image->message, (sizeof image->message), pos,
|
||||||
error_message);
|
error_message);
|
||||||
}
|
}
|
||||||
|
70
thirdparty/libpng/pngget.c
vendored
70
thirdparty/libpng/pngget.c
vendored
@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
/* pngget.c - retrieval of values from info struct
|
/* pngget.c - retrieval of values from info struct
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.24 [August 4, 2016]
|
* Last changed in libpng 1.6.17 [March 26, 2015]
|
||||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
@ -456,11 +456,11 @@ png_get_pHYs_dpi(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
|||||||
return (retval);
|
return (retval);
|
||||||
}
|
}
|
||||||
#endif /* pHYs */
|
#endif /* pHYs */
|
||||||
#endif /* INCH_CONVERSIONS */
|
#endif /* INCH_CONVERSIONS */
|
||||||
|
|
||||||
/* png_get_channels really belongs in here, too, but it's been around longer */
|
/* png_get_channels really belongs in here, too, but it's been around longer */
|
||||||
|
|
||||||
#endif /* EASY_ACCESS */
|
#endif /* EASY_ACCESS */
|
||||||
|
|
||||||
|
|
||||||
png_byte PNGAPI
|
png_byte PNGAPI
|
||||||
@ -486,7 +486,7 @@ png_get_signature(png_const_structrp png_ptr, png_const_inforp info_ptr)
|
|||||||
#ifdef PNG_bKGD_SUPPORTED
|
#ifdef PNG_bKGD_SUPPORTED
|
||||||
png_uint_32 PNGAPI
|
png_uint_32 PNGAPI
|
||||||
png_get_bKGD(png_const_structrp png_ptr, png_inforp info_ptr,
|
png_get_bKGD(png_const_structrp png_ptr, png_inforp info_ptr,
|
||||||
png_color_16p *background)
|
png_color_16p *background)
|
||||||
{
|
{
|
||||||
if (png_ptr != NULL && info_ptr != NULL &&
|
if (png_ptr != NULL && info_ptr != NULL &&
|
||||||
(info_ptr->valid & PNG_INFO_bKGD) != 0 &&
|
(info_ptr->valid & PNG_INFO_bKGD) != 0 &&
|
||||||
@ -526,28 +526,28 @@ png_get_cHRM(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
|||||||
|
|
||||||
if (white_x != NULL)
|
if (white_x != NULL)
|
||||||
*white_x = png_float(png_ptr,
|
*white_x = png_float(png_ptr,
|
||||||
info_ptr->colorspace.end_points_xy.whitex, "cHRM white X");
|
info_ptr->colorspace.end_points_xy.whitex, "cHRM white X");
|
||||||
if (white_y != NULL)
|
if (white_y != NULL)
|
||||||
*white_y = png_float(png_ptr,
|
*white_y = png_float(png_ptr,
|
||||||
info_ptr->colorspace.end_points_xy.whitey, "cHRM white Y");
|
info_ptr->colorspace.end_points_xy.whitey, "cHRM white Y");
|
||||||
if (red_x != NULL)
|
if (red_x != NULL)
|
||||||
*red_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redx,
|
*red_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redx,
|
||||||
"cHRM red X");
|
"cHRM red X");
|
||||||
if (red_y != NULL)
|
if (red_y != NULL)
|
||||||
*red_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redy,
|
*red_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redy,
|
||||||
"cHRM red Y");
|
"cHRM red Y");
|
||||||
if (green_x != NULL)
|
if (green_x != NULL)
|
||||||
*green_x = png_float(png_ptr,
|
*green_x = png_float(png_ptr,
|
||||||
info_ptr->colorspace.end_points_xy.greenx, "cHRM green X");
|
info_ptr->colorspace.end_points_xy.greenx, "cHRM green X");
|
||||||
if (green_y != NULL)
|
if (green_y != NULL)
|
||||||
*green_y = png_float(png_ptr,
|
*green_y = png_float(png_ptr,
|
||||||
info_ptr->colorspace.end_points_xy.greeny, "cHRM green Y");
|
info_ptr->colorspace.end_points_xy.greeny, "cHRM green Y");
|
||||||
if (blue_x != NULL)
|
if (blue_x != NULL)
|
||||||
*blue_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluex,
|
*blue_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluex,
|
||||||
"cHRM blue X");
|
"cHRM blue X");
|
||||||
if (blue_y != NULL)
|
if (blue_y != NULL)
|
||||||
*blue_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluey,
|
*blue_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluey,
|
||||||
"cHRM blue Y");
|
"cHRM blue Y");
|
||||||
return (PNG_INFO_cHRM);
|
return (PNG_INFO_cHRM);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -556,42 +556,42 @@ png_get_cHRM(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
|||||||
|
|
||||||
png_uint_32 PNGAPI
|
png_uint_32 PNGAPI
|
||||||
png_get_cHRM_XYZ(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
png_get_cHRM_XYZ(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
||||||
double *red_X, double *red_Y, double *red_Z, double *green_X,
|
double *red_X, double *red_Y, double *red_Z, double *green_X,
|
||||||
double *green_Y, double *green_Z, double *blue_X, double *blue_Y,
|
double *green_Y, double *green_Z, double *blue_X, double *blue_Y,
|
||||||
double *blue_Z)
|
double *blue_Z)
|
||||||
{
|
{
|
||||||
if (png_ptr != NULL && info_ptr != NULL &&
|
if (png_ptr != NULL && info_ptr != NULL &&
|
||||||
(info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
|
(info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
|
||||||
{
|
{
|
||||||
png_debug1(1, "in %s retrieval function", "cHRM_XYZ(float)");
|
png_debug1(1, "in %s retrieval function", "cHRM_XYZ(float)");
|
||||||
|
|
||||||
if (red_X != NULL)
|
if (red_X != NULL)
|
||||||
*red_X = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_X,
|
*red_X = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_X,
|
||||||
"cHRM red X");
|
"cHRM red X");
|
||||||
if (red_Y != NULL)
|
if (red_Y != NULL)
|
||||||
*red_Y = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Y,
|
*red_Y = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Y,
|
||||||
"cHRM red Y");
|
"cHRM red Y");
|
||||||
if (red_Z != NULL)
|
if (red_Z != NULL)
|
||||||
*red_Z = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Z,
|
*red_Z = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Z,
|
||||||
"cHRM red Z");
|
"cHRM red Z");
|
||||||
if (green_X != NULL)
|
if (green_X != NULL)
|
||||||
*green_X = png_float(png_ptr,
|
*green_X = png_float(png_ptr,
|
||||||
info_ptr->colorspace.end_points_XYZ.green_X, "cHRM green X");
|
info_ptr->colorspace.end_points_XYZ.green_X, "cHRM green X");
|
||||||
if (green_Y != NULL)
|
if (green_Y != NULL)
|
||||||
*green_Y = png_float(png_ptr,
|
*green_Y = png_float(png_ptr,
|
||||||
info_ptr->colorspace.end_points_XYZ.green_Y, "cHRM green Y");
|
info_ptr->colorspace.end_points_XYZ.green_Y, "cHRM green Y");
|
||||||
if (green_Z != NULL)
|
if (green_Z != NULL)
|
||||||
*green_Z = png_float(png_ptr,
|
*green_Z = png_float(png_ptr,
|
||||||
info_ptr->colorspace.end_points_XYZ.green_Z, "cHRM green Z");
|
info_ptr->colorspace.end_points_XYZ.green_Z, "cHRM green Z");
|
||||||
if (blue_X != NULL)
|
if (blue_X != NULL)
|
||||||
*blue_X = png_float(png_ptr,
|
*blue_X = png_float(png_ptr,
|
||||||
info_ptr->colorspace.end_points_XYZ.blue_X, "cHRM blue X");
|
info_ptr->colorspace.end_points_XYZ.blue_X, "cHRM blue X");
|
||||||
if (blue_Y != NULL)
|
if (blue_Y != NULL)
|
||||||
*blue_Y = png_float(png_ptr,
|
*blue_Y = png_float(png_ptr,
|
||||||
info_ptr->colorspace.end_points_XYZ.blue_Y, "cHRM blue Y");
|
info_ptr->colorspace.end_points_XYZ.blue_Y, "cHRM blue Y");
|
||||||
if (blue_Z != NULL)
|
if (blue_Z != NULL)
|
||||||
*blue_Z = png_float(png_ptr,
|
*blue_Z = png_float(png_ptr,
|
||||||
info_ptr->colorspace.end_points_XYZ.blue_Z, "cHRM blue Z");
|
info_ptr->colorspace.end_points_XYZ.blue_Z, "cHRM blue Z");
|
||||||
return (PNG_INFO_cHRM);
|
return (PNG_INFO_cHRM);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -681,8 +681,8 @@ png_get_gAMA_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
|||||||
png_debug1(1, "in %s retrieval function", "gAMA");
|
png_debug1(1, "in %s retrieval function", "gAMA");
|
||||||
|
|
||||||
if (png_ptr != NULL && info_ptr != NULL &&
|
if (png_ptr != NULL && info_ptr != NULL &&
|
||||||
(info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
|
(info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
|
||||||
file_gamma != NULL)
|
file_gamma != NULL)
|
||||||
{
|
{
|
||||||
*file_gamma = info_ptr->colorspace.gamma;
|
*file_gamma = info_ptr->colorspace.gamma;
|
||||||
return (PNG_INFO_gAMA);
|
return (PNG_INFO_gAMA);
|
||||||
@ -704,7 +704,7 @@ png_get_gAMA(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
|||||||
file_gamma != NULL)
|
file_gamma != NULL)
|
||||||
{
|
{
|
||||||
*file_gamma = png_float(png_ptr, info_ptr->colorspace.gamma,
|
*file_gamma = png_float(png_ptr, info_ptr->colorspace.gamma,
|
||||||
"png_get_gAMA");
|
"png_get_gAMA");
|
||||||
return (PNG_INFO_gAMA);
|
return (PNG_INFO_gAMA);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -901,7 +901,7 @@ png_get_sCAL_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
|
|||||||
*/
|
*/
|
||||||
*width = png_fixed(png_ptr, atof(info_ptr->scal_s_width), "sCAL width");
|
*width = png_fixed(png_ptr, atof(info_ptr->scal_s_width), "sCAL width");
|
||||||
*height = png_fixed(png_ptr, atof(info_ptr->scal_s_height),
|
*height = png_fixed(png_ptr, atof(info_ptr->scal_s_height),
|
||||||
"sCAL height");
|
"sCAL height");
|
||||||
return (PNG_INFO_sCAL);
|
return (PNG_INFO_sCAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1142,19 +1142,19 @@ png_get_compression_buffer_size(png_const_structrp png_ptr)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#ifdef PNG_WRITE_SUPPORTED
|
#ifdef PNG_WRITE_SUPPORTED
|
||||||
if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
|
if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
|
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
|
||||||
return png_ptr->IDAT_read_size;
|
return png_ptr->IDAT_read_size;
|
||||||
#else
|
#else
|
||||||
return PNG_IDAT_READ_SIZE;
|
return PNG_IDAT_READ_SIZE;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PNG_WRITE_SUPPORTED
|
#ifdef PNG_WRITE_SUPPORTED
|
||||||
else
|
else
|
||||||
return png_ptr->zbuffer_size;
|
return png_ptr->zbuffer_size;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
5
thirdparty/libpng/pnglibconf.h
vendored
5
thirdparty/libpng/pnglibconf.h
vendored
@ -1,8 +1,8 @@
|
|||||||
/* libpng 1.6.25 STANDARD API DEFINITION */
|
/* libpng 1.6.21 STANDARD API DEFINITION */
|
||||||
|
|
||||||
/* pnglibconf.h - library build configuration */
|
/* pnglibconf.h - library build configuration */
|
||||||
|
|
||||||
/* Libpng version 1.6.25 - September 1, 2016 */
|
/* Libpng version 1.6.21 - January 15, 2016 */
|
||||||
|
|
||||||
/* Copyright (c) 1998-2015 Glenn Randers-Pehrson */
|
/* Copyright (c) 1998-2015 Glenn Randers-Pehrson */
|
||||||
|
|
||||||
@ -109,7 +109,6 @@
|
|||||||
#define PNG_SIMPLIFIED_READ_SUPPORTED
|
#define PNG_SIMPLIFIED_READ_SUPPORTED
|
||||||
#define PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
|
#define PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
|
||||||
#define PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED
|
#define PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED
|
||||||
#define PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED
|
|
||||||
#define PNG_SIMPLIFIED_WRITE_SUPPORTED
|
#define PNG_SIMPLIFIED_WRITE_SUPPORTED
|
||||||
#define PNG_STDIO_SUPPORTED
|
#define PNG_STDIO_SUPPORTED
|
||||||
#define PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
|
#define PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
|
||||||
|
20
thirdparty/libpng/pngmem.c
vendored
20
thirdparty/libpng/pngmem.c
vendored
@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
/* pngmem.c - stub functions for memory allocation
|
/* pngmem.c - stub functions for memory allocation
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.24 [August 4, 2016%]
|
* Last changed in libpng 1.6.15 [November 20, 2014]
|
||||||
* Copyright (c) 1998-2002,2004,2006-2014,2016 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
@ -66,7 +66,7 @@ png_calloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
|
|||||||
*/
|
*/
|
||||||
PNG_FUNCTION(png_voidp /* PRIVATE */,
|
PNG_FUNCTION(png_voidp /* PRIVATE */,
|
||||||
png_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size),
|
png_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size),
|
||||||
PNG_ALLOCATED)
|
PNG_ALLOCATED)
|
||||||
{
|
{
|
||||||
/* Moved to png_malloc_base from png_malloc_default in 1.6.0; the DOS
|
/* Moved to png_malloc_base from png_malloc_default in 1.6.0; the DOS
|
||||||
* allocators have also been removed in 1.6.0, so any 16-bit system now has
|
* allocators have also been removed in 1.6.0, so any 16-bit system now has
|
||||||
@ -107,7 +107,7 @@ png_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size),
|
|||||||
*/
|
*/
|
||||||
static png_voidp
|
static png_voidp
|
||||||
png_malloc_array_checked(png_const_structrp png_ptr, int nelements,
|
png_malloc_array_checked(png_const_structrp png_ptr, int nelements,
|
||||||
size_t element_size)
|
size_t element_size)
|
||||||
{
|
{
|
||||||
png_alloc_size_t req = nelements; /* known to be > 0 */
|
png_alloc_size_t req = nelements; /* known to be > 0 */
|
||||||
|
|
||||||
@ -120,7 +120,7 @@ png_malloc_array_checked(png_const_structrp png_ptr, int nelements,
|
|||||||
|
|
||||||
PNG_FUNCTION(png_voidp /* PRIVATE */,
|
PNG_FUNCTION(png_voidp /* PRIVATE */,
|
||||||
png_malloc_array,(png_const_structrp png_ptr, int nelements,
|
png_malloc_array,(png_const_structrp png_ptr, int nelements,
|
||||||
size_t element_size),PNG_ALLOCATED)
|
size_t element_size),PNG_ALLOCATED)
|
||||||
{
|
{
|
||||||
if (nelements <= 0 || element_size == 0)
|
if (nelements <= 0 || element_size == 0)
|
||||||
png_error(png_ptr, "internal error: array alloc");
|
png_error(png_ptr, "internal error: array alloc");
|
||||||
@ -130,7 +130,7 @@ png_malloc_array,(png_const_structrp png_ptr, int nelements,
|
|||||||
|
|
||||||
PNG_FUNCTION(png_voidp /* PRIVATE */,
|
PNG_FUNCTION(png_voidp /* PRIVATE */,
|
||||||
png_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array,
|
png_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array,
|
||||||
int old_elements, int add_elements, size_t element_size),PNG_ALLOCATED)
|
int old_elements, int add_elements, size_t element_size),PNG_ALLOCATED)
|
||||||
{
|
{
|
||||||
/* These are internal errors: */
|
/* These are internal errors: */
|
||||||
if (add_elements <= 0 || element_size == 0 || old_elements < 0 ||
|
if (add_elements <= 0 || element_size == 0 || old_elements < 0 ||
|
||||||
@ -143,7 +143,7 @@ png_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array,
|
|||||||
if (add_elements <= INT_MAX - old_elements)
|
if (add_elements <= INT_MAX - old_elements)
|
||||||
{
|
{
|
||||||
png_voidp new_array = png_malloc_array_checked(png_ptr,
|
png_voidp new_array = png_malloc_array_checked(png_ptr,
|
||||||
old_elements+add_elements, element_size);
|
old_elements+add_elements, element_size);
|
||||||
|
|
||||||
if (new_array != NULL)
|
if (new_array != NULL)
|
||||||
{
|
{
|
||||||
@ -154,7 +154,7 @@ png_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array,
|
|||||||
memcpy(new_array, old_array, element_size*(unsigned)old_elements);
|
memcpy(new_array, old_array, element_size*(unsigned)old_elements);
|
||||||
|
|
||||||
memset((char*)new_array + element_size*(unsigned)old_elements, 0,
|
memset((char*)new_array + element_size*(unsigned)old_elements, 0,
|
||||||
element_size*(unsigned)add_elements);
|
element_size*(unsigned)add_elements);
|
||||||
|
|
||||||
return new_array;
|
return new_array;
|
||||||
}
|
}
|
||||||
@ -187,7 +187,7 @@ png_malloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
|
|||||||
#ifdef PNG_USER_MEM_SUPPORTED
|
#ifdef PNG_USER_MEM_SUPPORTED
|
||||||
PNG_FUNCTION(png_voidp,PNGAPI
|
PNG_FUNCTION(png_voidp,PNGAPI
|
||||||
png_malloc_default,(png_const_structrp png_ptr, png_alloc_size_t size),
|
png_malloc_default,(png_const_structrp png_ptr, png_alloc_size_t size),
|
||||||
PNG_ALLOCATED PNG_DEPRECATED)
|
PNG_ALLOCATED PNG_DEPRECATED)
|
||||||
{
|
{
|
||||||
png_voidp ret;
|
png_voidp ret;
|
||||||
|
|
||||||
@ -210,7 +210,7 @@ png_malloc_default,(png_const_structrp png_ptr, png_alloc_size_t size),
|
|||||||
*/
|
*/
|
||||||
PNG_FUNCTION(png_voidp,PNGAPI
|
PNG_FUNCTION(png_voidp,PNGAPI
|
||||||
png_malloc_warn,(png_const_structrp png_ptr, png_alloc_size_t size),
|
png_malloc_warn,(png_const_structrp png_ptr, png_alloc_size_t size),
|
||||||
PNG_ALLOCATED)
|
PNG_ALLOCATED)
|
||||||
{
|
{
|
||||||
if (png_ptr != NULL)
|
if (png_ptr != NULL)
|
||||||
{
|
{
|
||||||
|
39
thirdparty/libpng/pngpread.c
vendored
39
thirdparty/libpng/pngpread.c
vendored
@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
/* pngpread.c - read a png file in push mode
|
/* pngpread.c - read a png file in push mode
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.24 [August 4, 2016]
|
* Last changed in libpng 1.6.18 [July 23, 2015]
|
||||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
@ -77,11 +77,11 @@ png_process_data_pause(png_structrp png_ptr, int save)
|
|||||||
png_uint_32 PNGAPI
|
png_uint_32 PNGAPI
|
||||||
png_process_data_skip(png_structrp png_ptr)
|
png_process_data_skip(png_structrp png_ptr)
|
||||||
{
|
{
|
||||||
/* TODO: Deprecate and remove this API.
|
/* TODO: Deprecate and remove this API.
|
||||||
* Somewhere the implementation of this seems to have been lost,
|
* Somewhere the implementation of this seems to have been lost,
|
||||||
* or abandoned. It was only to support some internal back-door access
|
* or abandoned. It was only to support some internal back-door access
|
||||||
* to png_struct) in libpng-1.4.x.
|
* to png_struct) in libpng-1.4.x.
|
||||||
*/
|
*/
|
||||||
png_app_warning(png_ptr,
|
png_app_warning(png_ptr,
|
||||||
"png_process_data_skip is not implemented in any current version of libpng");
|
"png_process_data_skip is not implemented in any current version of libpng");
|
||||||
return 0;
|
return 0;
|
||||||
@ -210,14 +210,12 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr)
|
|||||||
(png_ptr->mode & PNG_HAVE_PLTE) == 0)
|
(png_ptr->mode & PNG_HAVE_PLTE) == 0)
|
||||||
png_error(png_ptr, "Missing PLTE before IDAT");
|
png_error(png_ptr, "Missing PLTE before IDAT");
|
||||||
|
|
||||||
|
png_ptr->mode |= PNG_HAVE_IDAT;
|
||||||
png_ptr->process_mode = PNG_READ_IDAT_MODE;
|
png_ptr->process_mode = PNG_READ_IDAT_MODE;
|
||||||
|
|
||||||
if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
|
if ((png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) == 0)
|
||||||
if ((png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) == 0)
|
if (png_ptr->push_length == 0)
|
||||||
if (png_ptr->push_length == 0)
|
return;
|
||||||
return;
|
|
||||||
|
|
||||||
png_ptr->mode |= PNG_HAVE_IDAT;
|
|
||||||
|
|
||||||
if ((png_ptr->mode & PNG_AFTER_IDAT) != 0)
|
if ((png_ptr->mode & PNG_AFTER_IDAT) != 0)
|
||||||
png_benign_error(png_ptr, "Too many IDATs found");
|
png_benign_error(png_ptr, "Too many IDATs found");
|
||||||
@ -410,7 +408,7 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr)
|
|||||||
{
|
{
|
||||||
PNG_PUSH_SAVE_BUFFER_IF_FULL
|
PNG_PUSH_SAVE_BUFFER_IF_FULL
|
||||||
png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length,
|
png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length,
|
||||||
PNG_HANDLE_CHUNK_AS_DEFAULT);
|
PNG_HANDLE_CHUNK_AS_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
|
png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
|
||||||
@ -501,10 +499,7 @@ png_push_save_buffer(png_structrp png_ptr)
|
|||||||
png_error(png_ptr, "Insufficient memory for save_buffer");
|
png_error(png_ptr, "Insufficient memory for save_buffer");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (old_buffer)
|
memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
|
||||||
memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
|
|
||||||
else if (png_ptr->save_buffer_size)
|
|
||||||
png_error(png_ptr, "save_buffer error");
|
|
||||||
png_free(png_ptr, old_buffer);
|
png_free(png_ptr, old_buffer);
|
||||||
png_ptr->save_buffer_max = new_max;
|
png_ptr->save_buffer_max = new_max;
|
||||||
}
|
}
|
||||||
@ -521,7 +516,7 @@ png_push_save_buffer(png_structrp png_ptr)
|
|||||||
|
|
||||||
void /* PRIVATE */
|
void /* PRIVATE */
|
||||||
png_push_restore_buffer(png_structrp png_ptr, png_bytep buffer,
|
png_push_restore_buffer(png_structrp png_ptr, png_bytep buffer,
|
||||||
png_size_t buffer_length)
|
png_size_t buffer_length)
|
||||||
{
|
{
|
||||||
png_ptr->current_buffer = buffer;
|
png_ptr->current_buffer = buffer;
|
||||||
png_ptr->current_buffer_size = buffer_length;
|
png_ptr->current_buffer_size = buffer_length;
|
||||||
@ -624,7 +619,7 @@ png_push_read_IDAT(png_structrp png_ptr)
|
|||||||
|
|
||||||
void /* PRIVATE */
|
void /* PRIVATE */
|
||||||
png_process_IDAT_data(png_structrp png_ptr, png_bytep buffer,
|
png_process_IDAT_data(png_structrp png_ptr, png_bytep buffer,
|
||||||
png_size_t buffer_length)
|
png_size_t buffer_length)
|
||||||
{
|
{
|
||||||
/* The caller checks for a non-zero buffer length. */
|
/* The caller checks for a non-zero buffer length. */
|
||||||
if (!(buffer_length > 0) || buffer == NULL)
|
if (!(buffer_length > 0) || buffer == NULL)
|
||||||
@ -782,7 +777,7 @@ png_push_process_row(png_structrp png_ptr)
|
|||||||
{
|
{
|
||||||
if (png_ptr->pass < 6)
|
if (png_ptr->pass < 6)
|
||||||
png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,
|
png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,
|
||||||
png_ptr->transformations);
|
png_ptr->transformations);
|
||||||
|
|
||||||
switch (png_ptr->pass)
|
switch (png_ptr->pass)
|
||||||
{
|
{
|
||||||
@ -1044,7 +1039,7 @@ png_push_have_row(png_structrp png_ptr, png_bytep row)
|
|||||||
{
|
{
|
||||||
if (png_ptr->row_fn != NULL)
|
if (png_ptr->row_fn != NULL)
|
||||||
(*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number,
|
(*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number,
|
||||||
(int)png_ptr->pass);
|
(int)png_ptr->pass);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
#ifdef PNG_READ_INTERLACING_SUPPORTED
|
||||||
|
87
thirdparty/libpng/pngpriv.h
vendored
87
thirdparty/libpng/pngpriv.h
vendored
@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
/* pngpriv.h - private declarations for use inside libpng
|
/* pngpriv.h - private declarations for use inside libpng
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.25 [September 1, 2016]
|
* Last changed in libpng 1.6.21 [January 15, 2016]
|
||||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
@ -182,35 +182,6 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif /* PNG_ARM_NEON_OPT > 0 */
|
#endif /* PNG_ARM_NEON_OPT > 0 */
|
||||||
|
|
||||||
#ifndef PNG_MIPS_MSA_OPT
|
|
||||||
# if defined(__mips_msa) && (__mips_isa_rev >= 5) && defined(PNG_ALIGNED_MEMORY_SUPPORTED)
|
|
||||||
# define PNG_MIPS_MSA_OPT 2
|
|
||||||
# else
|
|
||||||
# define PNG_MIPS_MSA_OPT 0
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if PNG_MIPS_MSA_OPT > 0
|
|
||||||
# define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_msa
|
|
||||||
# ifndef PNG_MIPS_MSA_IMPLEMENTATION
|
|
||||||
# if defined(__mips_msa)
|
|
||||||
# if defined(__clang__)
|
|
||||||
# elif defined(__GNUC__)
|
|
||||||
# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 7)
|
|
||||||
# define PNG_MIPS_MSA_IMPLEMENTATION 2
|
|
||||||
# endif /* no GNUC support */
|
|
||||||
# endif /* __GNUC__ */
|
|
||||||
# else /* !defined __mips_msa */
|
|
||||||
# define PNG_MIPS_MSA_IMPLEMENTATION 2
|
|
||||||
# endif /* __mips_msa */
|
|
||||||
# endif /* !PNG_MIPS_MSA_IMPLEMENTATION */
|
|
||||||
|
|
||||||
# ifndef PNG_MIPS_MSA_IMPLEMENTATION
|
|
||||||
# define PNG_MIPS_MSA_IMPLEMENTATION 1
|
|
||||||
# endif
|
|
||||||
#endif /* PNG_MIPS_MSA_OPT > 0 */
|
|
||||||
|
|
||||||
|
|
||||||
/* Is this a build of a DLL where compilation of the object modules requires
|
/* Is this a build of a DLL where compilation of the object modules requires
|
||||||
* different preprocessor settings to those required for a simple library? If
|
* different preprocessor settings to those required for a simple library? If
|
||||||
* so PNG_BUILD_DLL must be set.
|
* so PNG_BUILD_DLL must be set.
|
||||||
@ -449,10 +420,10 @@
|
|||||||
|
|
||||||
# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \
|
# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \
|
||||||
defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC)
|
defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC)
|
||||||
/* We need to check that <math.h> hasn't already been included earlier
|
/* We need to check that <math.h> hasn't already been included earlier
|
||||||
* as it seems it doesn't agree with <fp.h>, yet we should really use
|
* as it seems it doesn't agree with <fp.h>, yet we should really use
|
||||||
* <fp.h> if possible.
|
* <fp.h> if possible.
|
||||||
*/
|
*/
|
||||||
# if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__)
|
# if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__)
|
||||||
# include <fp.h>
|
# include <fp.h>
|
||||||
# endif
|
# endif
|
||||||
@ -460,9 +431,9 @@
|
|||||||
# include <math.h>
|
# include <math.h>
|
||||||
# endif
|
# endif
|
||||||
# if defined(_AMIGA) && defined(__SASC) && defined(_M68881)
|
# if defined(_AMIGA) && defined(__SASC) && defined(_M68881)
|
||||||
/* Amiga SAS/C: We must include builtin FPU functions when compiling using
|
/* Amiga SAS/C: We must include builtin FPU functions when compiling using
|
||||||
* MATH=68881
|
* MATH=68881
|
||||||
*/
|
*/
|
||||||
# include <m68881.h>
|
# include <m68881.h>
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
@ -1054,7 +1025,7 @@ PNG_INTERNAL_FUNCTION(void,png_write_sBIT,(png_structrp png_ptr,
|
|||||||
#ifdef PNG_WRITE_cHRM_SUPPORTED
|
#ifdef PNG_WRITE_cHRM_SUPPORTED
|
||||||
PNG_INTERNAL_FUNCTION(void,png_write_cHRM_fixed,(png_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(void,png_write_cHRM_fixed,(png_structrp png_ptr,
|
||||||
const png_xy *xy), PNG_EMPTY);
|
const png_xy *xy), PNG_EMPTY);
|
||||||
/* The xy value must have been previously validated */
|
/* The xy value must have been previously validated */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PNG_WRITE_sRGB_SUPPORTED
|
#ifdef PNG_WRITE_sRGB_SUPPORTED
|
||||||
@ -1203,7 +1174,6 @@ PNG_INTERNAL_FUNCTION(void,png_do_write_interlace,(png_row_infop row_info,
|
|||||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row,(png_structrp pp, png_row_infop
|
PNG_INTERNAL_FUNCTION(void,png_read_filter_row,(png_structrp pp, png_row_infop
|
||||||
row_info, png_bytep row, png_const_bytep prev_row, int filter),PNG_EMPTY);
|
row_info, png_bytep row, png_const_bytep prev_row, int filter),PNG_EMPTY);
|
||||||
|
|
||||||
#if PNG_ARM_NEON_OPT > 0
|
|
||||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_neon,(png_row_infop row_info,
|
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_neon,(png_row_infop row_info,
|
||||||
png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
||||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_neon,(png_row_infop
|
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_neon,(png_row_infop
|
||||||
@ -1218,24 +1188,6 @@ PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth3_neon,(png_row_infop
|
|||||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
||||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_neon,(png_row_infop
|
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_neon,(png_row_infop
|
||||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
||||||
#endif
|
|
||||||
|
|
||||||
#if PNG_MIPS_MSA_OPT > 0
|
|
||||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_msa,(png_row_infop row_info,
|
|
||||||
png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
|
||||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_msa,(png_row_infop
|
|
||||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
|
||||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub4_msa,(png_row_infop
|
|
||||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
|
||||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg3_msa,(png_row_infop
|
|
||||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
|
||||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg4_msa,(png_row_infop
|
|
||||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
|
||||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth3_msa,(png_row_infop
|
|
||||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
|
||||||
PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_msa,(png_row_infop
|
|
||||||
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Choose the best filter to use and filter the row data */
|
/* Choose the best filter to use and filter the row data */
|
||||||
PNG_INTERNAL_FUNCTION(void,png_write_find_filter,(png_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(void,png_write_find_filter,(png_structrp png_ptr,
|
||||||
@ -1461,7 +1413,7 @@ PNG_INTERNAL_FUNCTION(void,png_push_have_info,(png_structrp png_ptr,
|
|||||||
PNG_INTERNAL_FUNCTION(void,png_push_have_end,(png_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(void,png_push_have_end,(png_structrp png_ptr,
|
||||||
png_inforp info_ptr),PNG_EMPTY);
|
png_inforp info_ptr),PNG_EMPTY);
|
||||||
PNG_INTERNAL_FUNCTION(void,png_push_have_row,(png_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(void,png_push_have_row,(png_structrp png_ptr,
|
||||||
png_bytep row),PNG_EMPTY);
|
png_bytep row),PNG_EMPTY);
|
||||||
PNG_INTERNAL_FUNCTION(void,png_push_read_end,(png_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(void,png_push_read_end,(png_structrp png_ptr,
|
||||||
png_inforp info_ptr),PNG_EMPTY);
|
png_inforp info_ptr),PNG_EMPTY);
|
||||||
PNG_INTERNAL_FUNCTION(void,png_process_some_data,(png_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(void,png_process_some_data,(png_structrp png_ptr,
|
||||||
@ -1500,13 +1452,13 @@ PNG_INTERNAL_FUNCTION(void,png_colorspace_set_gamma,(png_const_structrp png_ptr,
|
|||||||
|
|
||||||
PNG_INTERNAL_FUNCTION(void,png_colorspace_sync_info,(png_const_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(void,png_colorspace_sync_info,(png_const_structrp png_ptr,
|
||||||
png_inforp info_ptr), PNG_EMPTY);
|
png_inforp info_ptr), PNG_EMPTY);
|
||||||
/* Synchronize the info 'valid' flags with the colorspace */
|
/* Synchronize the info 'valid' flags with the colorspace */
|
||||||
|
|
||||||
PNG_INTERNAL_FUNCTION(void,png_colorspace_sync,(png_const_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(void,png_colorspace_sync,(png_const_structrp png_ptr,
|
||||||
png_inforp info_ptr), PNG_EMPTY);
|
png_inforp info_ptr), PNG_EMPTY);
|
||||||
/* Copy the png_struct colorspace to the info_struct and call the above to
|
/* Copy the png_struct colorspace to the info_struct and call the above to
|
||||||
* synchronize the flags. Checks for NULL info_ptr and does nothing.
|
* synchronize the flags. Checks for NULL info_ptr and does nothing.
|
||||||
*/
|
*/
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Added at libpng version 1.4.0 */
|
/* Added at libpng version 1.4.0 */
|
||||||
@ -1540,11 +1492,9 @@ PNG_INTERNAL_FUNCTION(int,png_colorspace_set_ICC,(png_const_structrp png_ptr,
|
|||||||
/* The 'name' is used for information only */
|
/* The 'name' is used for information only */
|
||||||
|
|
||||||
/* Routines for checking parts of an ICC profile. */
|
/* Routines for checking parts of an ICC profile. */
|
||||||
#ifdef PNG_READ_iCCP_SUPPORTED
|
|
||||||
PNG_INTERNAL_FUNCTION(int,png_icc_check_length,(png_const_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(int,png_icc_check_length,(png_const_structrp png_ptr,
|
||||||
png_colorspacerp colorspace, png_const_charp name,
|
png_colorspacerp colorspace, png_const_charp name,
|
||||||
png_uint_32 profile_length), PNG_EMPTY);
|
png_uint_32 profile_length), PNG_EMPTY);
|
||||||
#endif /* READ_iCCP */
|
|
||||||
PNG_INTERNAL_FUNCTION(int,png_icc_check_header,(png_const_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(int,png_icc_check_header,(png_const_structrp png_ptr,
|
||||||
png_colorspacerp colorspace, png_const_charp name,
|
png_colorspacerp colorspace, png_const_charp name,
|
||||||
png_uint_32 profile_length,
|
png_uint_32 profile_length,
|
||||||
@ -1963,17 +1913,10 @@ PNG_INTERNAL_FUNCTION(void, PNG_FILTER_OPTIMIZATIONS, (png_structp png_ptr,
|
|||||||
* the builder of libpng passes the definition of PNG_FILTER_OPTIMIZATIONS in
|
* the builder of libpng passes the definition of PNG_FILTER_OPTIMIZATIONS in
|
||||||
* CFLAGS in place of CPPFLAGS *and* uses symbol prefixing.
|
* CFLAGS in place of CPPFLAGS *and* uses symbol prefixing.
|
||||||
*/
|
*/
|
||||||
# if PNG_ARM_NEON_OPT > 0
|
|
||||||
PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_neon,
|
PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_neon,
|
||||||
(png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
|
(png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if PNG_MIPS_MSA_OPT > 0
|
|
||||||
PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_msa,
|
|
||||||
(png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PNG_INTERNAL_FUNCTION(png_uint_32, png_check_keyword, (png_structrp png_ptr,
|
PNG_INTERNAL_FUNCTION(png_uint_32, png_check_keyword, (png_structrp png_ptr,
|
||||||
png_const_charp key, png_bytep new_key), PNG_EMPTY);
|
png_const_charp key, png_bytep new_key), PNG_EMPTY);
|
||||||
|
|
||||||
|
384
thirdparty/libpng/pngread.c
vendored
384
thirdparty/libpng/pngread.c
vendored
@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
/* pngread.c - read a PNG file
|
/* pngread.c - read a PNG file
|
||||||
*
|
*
|
||||||
* Last changed in libpng 1.6.24 [August 4, 2016]
|
* Last changed in libpng 1.6.17 [March 26, 2015]
|
||||||
* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
|
* Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
*
|
*
|
||||||
@ -28,10 +28,10 @@ png_create_read_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
|
|||||||
{
|
{
|
||||||
#ifndef PNG_USER_MEM_SUPPORTED
|
#ifndef PNG_USER_MEM_SUPPORTED
|
||||||
png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
|
png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
|
||||||
error_fn, warn_fn, NULL, NULL, NULL);
|
error_fn, warn_fn, NULL, NULL, NULL);
|
||||||
#else
|
#else
|
||||||
return png_create_read_struct_2(user_png_ver, error_ptr, error_fn,
|
return png_create_read_struct_2(user_png_ver, error_ptr, error_fn,
|
||||||
warn_fn, NULL, NULL, NULL);
|
warn_fn, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Alternate create PNG structure for reading, and allocate any memory
|
/* Alternate create PNG structure for reading, and allocate any memory
|
||||||
@ -43,7 +43,7 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
|
|||||||
png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED)
|
png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED)
|
||||||
{
|
{
|
||||||
png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
|
png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
|
||||||
error_fn, warn_fn, mem_ptr, malloc_fn, free_fn);
|
error_fn, warn_fn, mem_ptr, malloc_fn, free_fn);
|
||||||
#endif /* USER_MEM */
|
#endif /* USER_MEM */
|
||||||
|
|
||||||
if (png_ptr != NULL)
|
if (png_ptr != NULL)
|
||||||
@ -127,10 +127,7 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
|
else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
|
||||||
{
|
|
||||||
png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
|
|
||||||
png_ptr->mode |= PNG_AFTER_IDAT;
|
png_ptr->mode |= PNG_AFTER_IDAT;
|
||||||
}
|
|
||||||
|
|
||||||
/* This should be a binary subdivision search or a hash for
|
/* This should be a binary subdivision search or a hash for
|
||||||
* matching the chunk name rather than a linear search.
|
* matching the chunk name rather than a linear search.
|
||||||
@ -252,7 +249,7 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr)
|
|||||||
|
|
||||||
else
|
else
|
||||||
png_handle_unknown(png_ptr, info_ptr, length,
|
png_handle_unknown(png_ptr, info_ptr, length,
|
||||||
PNG_HANDLE_CHUNK_AS_DEFAULT);
|
PNG_HANDLE_CHUNK_AS_DEFAULT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* SEQUENTIAL_READ */
|
#endif /* SEQUENTIAL_READ */
|
||||||
@ -279,7 +276,7 @@ png_read_update_info(png_structrp png_ptr, png_inforp info_ptr)
|
|||||||
/* New in 1.6.0 this avoids the bug of doing the initializations twice */
|
/* New in 1.6.0 this avoids the bug of doing the initializations twice */
|
||||||
else
|
else
|
||||||
png_app_error(png_ptr,
|
png_app_error(png_ptr,
|
||||||
"png_read_update_info/png_start_read_image: duplicate call");
|
"png_read_update_info/png_start_read_image: duplicate call");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -302,7 +299,7 @@ png_start_read_image(png_structrp png_ptr)
|
|||||||
/* New in 1.6.0 this avoids the bug of doing the initializations twice */
|
/* New in 1.6.0 this avoids the bug of doing the initializations twice */
|
||||||
else
|
else
|
||||||
png_app_error(png_ptr,
|
png_app_error(png_ptr,
|
||||||
"png_start_read_image/png_read_update_info: duplicate call");
|
"png_start_read_image/png_read_update_info: duplicate call");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* SEQUENTIAL_READ */
|
#endif /* SEQUENTIAL_READ */
|
||||||
@ -540,7 +537,7 @@ png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row)
|
|||||||
{
|
{
|
||||||
if (png_ptr->row_buf[0] < PNG_FILTER_VALUE_LAST)
|
if (png_ptr->row_buf[0] < PNG_FILTER_VALUE_LAST)
|
||||||
png_read_filter_row(png_ptr, &row_info, png_ptr->row_buf + 1,
|
png_read_filter_row(png_ptr, &row_info, png_ptr->row_buf + 1,
|
||||||
png_ptr->prev_row + 1, png_ptr->row_buf[0]);
|
png_ptr->prev_row + 1, png_ptr->row_buf[0]);
|
||||||
else
|
else
|
||||||
png_error(png_ptr, "bad adaptive filter value");
|
png_error(png_ptr, "bad adaptive filter value");
|
||||||
}
|
}
|
||||||
@ -584,7 +581,7 @@ png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row)
|
|||||||
{
|
{
|
||||||
if (png_ptr->pass < 6)
|
if (png_ptr->pass < 6)
|
||||||
png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,
|
png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,
|
||||||
png_ptr->transformations);
|
png_ptr->transformations);
|
||||||
|
|
||||||
if (dsp_row != NULL)
|
if (dsp_row != NULL)
|
||||||
png_combine_row(png_ptr, dsp_row, 1/*display*/);
|
png_combine_row(png_ptr, dsp_row, 1/*display*/);
|
||||||
@ -719,7 +716,7 @@ png_read_image(png_structrp png_ptr, png_bytepp image)
|
|||||||
* but the caller should do it!
|
* but the caller should do it!
|
||||||
*/
|
*/
|
||||||
png_warning(png_ptr, "Interlace handling should be turned on when "
|
png_warning(png_ptr, "Interlace handling should be turned on when "
|
||||||
"using png_read_image");
|
"using png_read_image");
|
||||||
/* Make sure this is set correctly */
|
/* Make sure this is set correctly */
|
||||||
png_ptr->num_rows = png_ptr->height;
|
png_ptr->num_rows = png_ptr->height;
|
||||||
}
|
}
|
||||||
@ -779,8 +776,8 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
|
|||||||
#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
|
#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
|
||||||
/* Report invalid palette index; added at libng-1.5.10 */
|
/* Report invalid palette index; added at libng-1.5.10 */
|
||||||
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
|
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
|
||||||
png_ptr->num_palette_max > png_ptr->num_palette)
|
png_ptr->num_palette_max > png_ptr->num_palette)
|
||||||
png_benign_error(png_ptr, "Read palette index exceeding num_palette");
|
png_benign_error(png_ptr, "Read palette index exceeding num_palette");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
do
|
do
|
||||||
@ -788,9 +785,6 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
|
|||||||
png_uint_32 length = png_read_chunk_header(png_ptr);
|
png_uint_32 length = png_read_chunk_header(png_ptr);
|
||||||
png_uint_32 chunk_name = png_ptr->chunk_name;
|
png_uint_32 chunk_name = png_ptr->chunk_name;
|
||||||
|
|
||||||
if (chunk_name != png_IDAT)
|
|
||||||
png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
|
|
||||||
|
|
||||||
if (chunk_name == png_IEND)
|
if (chunk_name == png_IEND)
|
||||||
png_handle_IEND(png_ptr, info_ptr, length);
|
png_handle_IEND(png_ptr, info_ptr, length);
|
||||||
|
|
||||||
@ -805,9 +799,9 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
|
|||||||
{
|
{
|
||||||
if (chunk_name == png_IDAT)
|
if (chunk_name == png_IDAT)
|
||||||
{
|
{
|
||||||
if ((length > 0 && !(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED))
|
if ((length > 0) ||
|
||||||
|| (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
|
(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
|
||||||
png_benign_error(png_ptr, ".Too many IDATs found");
|
png_benign_error(png_ptr, "Too many IDATs found");
|
||||||
}
|
}
|
||||||
png_handle_unknown(png_ptr, info_ptr, length, keep);
|
png_handle_unknown(png_ptr, info_ptr, length, keep);
|
||||||
if (chunk_name == png_PLTE)
|
if (chunk_name == png_PLTE)
|
||||||
@ -818,14 +812,10 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
|
|||||||
else if (chunk_name == png_IDAT)
|
else if (chunk_name == png_IDAT)
|
||||||
{
|
{
|
||||||
/* Zero length IDATs are legal after the last IDAT has been
|
/* Zero length IDATs are legal after the last IDAT has been
|
||||||
* read, but not after other chunks have been read. 1.6 does not
|
* read, but not after other chunks have been read.
|
||||||
* always read all the deflate data; specifically it cannot be relied
|
|
||||||
* upon to read the Adler32 at the end. If it doesn't ignore IDAT
|
|
||||||
* chunks which are longer than zero as well:
|
|
||||||
*/
|
*/
|
||||||
if ((length > 0 && !(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED))
|
if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
|
||||||
|| (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
|
png_benign_error(png_ptr, "Too many IDATs found");
|
||||||
png_benign_error(png_ptr, "..Too many IDATs found");
|
|
||||||
|
|
||||||
png_crc_finish(png_ptr, length);
|
png_crc_finish(png_ptr, length);
|
||||||
}
|
}
|
||||||
@ -919,7 +909,7 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
|
|||||||
|
|
||||||
else
|
else
|
||||||
png_handle_unknown(png_ptr, info_ptr, length,
|
png_handle_unknown(png_ptr, info_ptr, length,
|
||||||
PNG_HANDLE_CHUNK_AS_DEFAULT);
|
PNG_HANDLE_CHUNK_AS_DEFAULT);
|
||||||
} while ((png_ptr->mode & PNG_HAVE_IEND) == 0);
|
} while ((png_ptr->mode & PNG_HAVE_IEND) == 0);
|
||||||
}
|
}
|
||||||
#endif /* SEQUENTIAL_READ */
|
#endif /* SEQUENTIAL_READ */
|
||||||
@ -1030,7 +1020,8 @@ png_set_read_status_fn(png_structrp png_ptr, png_read_status_ptr read_row_fn)
|
|||||||
#ifdef PNG_INFO_IMAGE_SUPPORTED
|
#ifdef PNG_INFO_IMAGE_SUPPORTED
|
||||||
void PNGAPI
|
void PNGAPI
|
||||||
png_read_png(png_structrp png_ptr, png_inforp info_ptr,
|
png_read_png(png_structrp png_ptr, png_inforp info_ptr,
|
||||||
int transforms, voidp params)
|
int transforms,
|
||||||
|
voidp params)
|
||||||
{
|
{
|
||||||
if (png_ptr == NULL || info_ptr == NULL)
|
if (png_ptr == NULL || info_ptr == NULL)
|
||||||
return;
|
return;
|
||||||
@ -1306,7 +1297,7 @@ png_image_read_init(png_imagep image)
|
|||||||
if (info_ptr != NULL)
|
if (info_ptr != NULL)
|
||||||
{
|
{
|
||||||
png_controlp control = png_voidcast(png_controlp,
|
png_controlp control = png_voidcast(png_controlp,
|
||||||
png_malloc_warn(png_ptr, (sizeof *control)));
|
png_malloc_warn(png_ptr, (sizeof *control)));
|
||||||
|
|
||||||
if (control != NULL)
|
if (control != NULL)
|
||||||
{
|
{
|
||||||
@ -1469,12 +1460,12 @@ png_image_begin_read_from_stdio(png_imagep image, FILE* file)
|
|||||||
|
|
||||||
else
|
else
|
||||||
return png_image_error(image,
|
return png_image_error(image,
|
||||||
"png_image_begin_read_from_stdio: invalid argument");
|
"png_image_begin_read_from_stdio: invalid argument");
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (image != NULL)
|
else if (image != NULL)
|
||||||
return png_image_error(image,
|
return png_image_error(image,
|
||||||
"png_image_begin_read_from_stdio: incorrect PNG_IMAGE_VERSION");
|
"png_image_begin_read_from_stdio: incorrect PNG_IMAGE_VERSION");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1507,12 +1498,12 @@ png_image_begin_read_from_file(png_imagep image, const char *file_name)
|
|||||||
|
|
||||||
else
|
else
|
||||||
return png_image_error(image,
|
return png_image_error(image,
|
||||||
"png_image_begin_read_from_file: invalid argument");
|
"png_image_begin_read_from_file: invalid argument");
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (image != NULL)
|
else if (image != NULL)
|
||||||
return png_image_error(image,
|
return png_image_error(image,
|
||||||
"png_image_begin_read_from_file: incorrect PNG_IMAGE_VERSION");
|
"png_image_begin_read_from_file: incorrect PNG_IMAGE_VERSION");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1549,7 +1540,7 @@ png_image_memory_read(png_structp png_ptr, png_bytep out, png_size_t need)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int PNGAPI png_image_begin_read_from_memory(png_imagep image,
|
int PNGAPI png_image_begin_read_from_memory(png_imagep image,
|
||||||
png_const_voidp memory, png_size_t size)
|
png_const_voidp memory, png_size_t size)
|
||||||
{
|
{
|
||||||
if (image != NULL && image->version == PNG_IMAGE_VERSION)
|
if (image != NULL && image->version == PNG_IMAGE_VERSION)
|
||||||
{
|
{
|
||||||
@ -1572,12 +1563,12 @@ int PNGAPI png_image_begin_read_from_memory(png_imagep image,
|
|||||||
|
|
||||||
else
|
else
|
||||||
return png_image_error(image,
|
return png_image_error(image,
|
||||||
"png_image_begin_read_from_memory: invalid argument");
|
"png_image_begin_read_from_memory: invalid argument");
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (image != NULL)
|
else if (image != NULL)
|
||||||
return png_image_error(image,
|
return png_image_error(image,
|
||||||
"png_image_begin_read_from_memory: incorrect PNG_IMAGE_VERSION");
|
"png_image_begin_read_from_memory: incorrect PNG_IMAGE_VERSION");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1623,12 +1614,12 @@ png_image_skip_unused_chunks(png_structrp png_ptr)
|
|||||||
* IHDR, PLTE, tRNS, IDAT, and IEND chunks.
|
* IHDR, PLTE, tRNS, IDAT, and IEND chunks.
|
||||||
*/
|
*/
|
||||||
png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_NEVER,
|
png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_NEVER,
|
||||||
NULL, -1);
|
NULL, -1);
|
||||||
|
|
||||||
/* But do not ignore image data handling chunks */
|
/* But do not ignore image data handling chunks */
|
||||||
png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_AS_DEFAULT,
|
png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_AS_DEFAULT,
|
||||||
chunks_to_process, (int)/*SAFE*/(sizeof chunks_to_process)/5);
|
chunks_to_process, (int)/*SAFE*/(sizeof chunks_to_process)/5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# define PNG_SKIP_CHUNKS(p) png_image_skip_unused_chunks(p)
|
# define PNG_SKIP_CHUNKS(p) png_image_skip_unused_chunks(p)
|
||||||
@ -1695,7 +1686,7 @@ decode_gamma(png_image_read_control *display, png_uint_32 value, int encoding)
|
|||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
default:
|
default:
|
||||||
png_error(display->image->opaque->png_ptr,
|
png_error(display->image->opaque->png_ptr,
|
||||||
"unexpected encoding (internal error)");
|
"unexpected encoding (internal error)");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1704,8 +1695,8 @@ decode_gamma(png_image_read_control *display, png_uint_32 value, int encoding)
|
|||||||
|
|
||||||
static png_uint_32
|
static png_uint_32
|
||||||
png_colormap_compose(png_image_read_control *display,
|
png_colormap_compose(png_image_read_control *display,
|
||||||
png_uint_32 foreground, int foreground_encoding, png_uint_32 alpha,
|
png_uint_32 foreground, int foreground_encoding, png_uint_32 alpha,
|
||||||
png_uint_32 background, int encoding)
|
png_uint_32 background, int encoding)
|
||||||
{
|
{
|
||||||
/* The file value is composed on the background, the background has the given
|
/* The file value is composed on the background, the background has the given
|
||||||
* encoding and so does the result, the file is encoded with P_FILE and the
|
* encoding and so does the result, the file is encoded with P_FILE and the
|
||||||
@ -1741,14 +1732,14 @@ png_colormap_compose(png_image_read_control *display,
|
|||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
png_create_colormap_entry(png_image_read_control *display,
|
png_create_colormap_entry(png_image_read_control *display,
|
||||||
png_uint_32 ip, png_uint_32 red, png_uint_32 green, png_uint_32 blue,
|
png_uint_32 ip, png_uint_32 red, png_uint_32 green, png_uint_32 blue,
|
||||||
png_uint_32 alpha, int encoding)
|
png_uint_32 alpha, int encoding)
|
||||||
{
|
{
|
||||||
png_imagep image = display->image;
|
png_imagep image = display->image;
|
||||||
const int output_encoding = (image->format & PNG_FORMAT_FLAG_LINEAR) != 0 ?
|
const int output_encoding = (image->format & PNG_FORMAT_FLAG_LINEAR) != 0 ?
|
||||||
P_LINEAR : P_sRGB;
|
P_LINEAR : P_sRGB;
|
||||||
const int convert_to_Y = (image->format & PNG_FORMAT_FLAG_COLOR) == 0 &&
|
const int convert_to_Y = (image->format & PNG_FORMAT_FLAG_COLOR) == 0 &&
|
||||||
(red != green || green != blue);
|
(red != green || green != blue);
|
||||||
|
|
||||||
if (ip > 255)
|
if (ip > 255)
|
||||||
png_error(image->opaque->png_ptr, "color-map index out of range");
|
png_error(image->opaque->png_ptr, "color-map index out of range");
|
||||||
@ -2028,7 +2019,7 @@ make_ga_colormap(png_image_read_control *display)
|
|||||||
|
|
||||||
for (g=0; g<6; ++g)
|
for (g=0; g<6; ++g)
|
||||||
png_create_colormap_entry(display, i++, g*51, g*51, g*51, a*51,
|
png_create_colormap_entry(display, i++, g*51, g*51, g*51, a*51,
|
||||||
P_sRGB);
|
P_sRGB);
|
||||||
}
|
}
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
@ -2052,7 +2043,7 @@ make_rgb_colormap(png_image_read_control *display)
|
|||||||
|
|
||||||
for (b=0; b<6; ++b)
|
for (b=0; b<6; ++b)
|
||||||
png_create_colormap_entry(display, i++, r*51, g*51, b*51, 255,
|
png_create_colormap_entry(display, i++, r*51, g*51, b*51, 255,
|
||||||
P_sRGB);
|
P_sRGB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2104,7 +2095,7 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
|
|
||||||
else if (display->background == NULL /* no way to remove it */)
|
else if (display->background == NULL /* no way to remove it */)
|
||||||
png_error(png_ptr,
|
png_error(png_ptr,
|
||||||
"background color must be supplied to remove alpha/transparency");
|
"a background color must be supplied to remove alpha/transparency");
|
||||||
|
|
||||||
/* Get a copy of the background color (this avoids repeating the checks
|
/* Get a copy of the background color (this avoids repeating the checks
|
||||||
* below.) The encoding is 8-bit sRGB or 16-bit linear, depending on the
|
* below.) The encoding is 8-bit sRGB or 16-bit linear, depending on the
|
||||||
@ -2199,7 +2190,7 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
*/
|
*/
|
||||||
if (i != trans)
|
if (i != trans)
|
||||||
png_create_colormap_entry(display, i, val, val, val, 255,
|
png_create_colormap_entry(display, i, val, val, val, 255,
|
||||||
P_FILE/*8-bit with file gamma*/);
|
P_FILE/*8-bit with file gamma*/);
|
||||||
|
|
||||||
/* Else this entry is transparent. The colors don't matter if
|
/* Else this entry is transparent. The colors don't matter if
|
||||||
* there is an alpha channel (back_alpha == 0), but it does no
|
* there is an alpha channel (back_alpha == 0), but it does no
|
||||||
@ -2211,7 +2202,7 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
*/
|
*/
|
||||||
else
|
else
|
||||||
png_create_colormap_entry(display, i, back_r, back_g, back_b,
|
png_create_colormap_entry(display, i, back_r, back_g, back_b,
|
||||||
back_alpha, output_encoding);
|
back_alpha, output_encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We need libpng to preserve the original encoding. */
|
/* We need libpng to preserve the original encoding. */
|
||||||
@ -2276,7 +2267,7 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
* matches.
|
* matches.
|
||||||
*/
|
*/
|
||||||
png_create_colormap_entry(display, gray, back_g, back_g,
|
png_create_colormap_entry(display, gray, back_g, back_g,
|
||||||
back_g, 65535, P_LINEAR);
|
back_g, 65535, P_LINEAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The background passed to libpng, however, must be the
|
/* The background passed to libpng, however, must be the
|
||||||
@ -2290,8 +2281,8 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
* doesn't.
|
* doesn't.
|
||||||
*/
|
*/
|
||||||
png_set_background_fixed(png_ptr, &c,
|
png_set_background_fixed(png_ptr, &c,
|
||||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
||||||
0/*gamma: not used*/);
|
0/*gamma: not used*/);
|
||||||
|
|
||||||
output_processing = PNG_CMAP_NONE;
|
output_processing = PNG_CMAP_NONE;
|
||||||
break;
|
break;
|
||||||
@ -2321,7 +2312,7 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
* background color at full precision.
|
* background color at full precision.
|
||||||
*/
|
*/
|
||||||
png_create_colormap_entry(display, 254, back_r, back_g, back_b,
|
png_create_colormap_entry(display, 254, back_r, back_g, back_b,
|
||||||
back_alpha, output_encoding);
|
back_alpha, output_encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
@ -2389,7 +2380,7 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
|
|
||||||
/* And make sure the corresponding palette entry matches. */
|
/* And make sure the corresponding palette entry matches. */
|
||||||
png_create_colormap_entry(display, gray, back_g, back_g,
|
png_create_colormap_entry(display, gray, back_g, back_g,
|
||||||
back_g, 65535, P_LINEAR);
|
back_g, 65535, P_LINEAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The background passed to libpng, however, must be the sRGB
|
/* The background passed to libpng, however, must be the sRGB
|
||||||
@ -2399,8 +2390,8 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
c.gray = c.red = c.green = c.blue = (png_uint_16)gray;
|
c.gray = c.red = c.green = c.blue = (png_uint_16)gray;
|
||||||
|
|
||||||
png_set_background_fixed(png_ptr, &c,
|
png_set_background_fixed(png_ptr, &c,
|
||||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
||||||
0/*gamma: not used*/);
|
0/*gamma: not used*/);
|
||||||
|
|
||||||
output_processing = PNG_CMAP_NONE;
|
output_processing = PNG_CMAP_NONE;
|
||||||
}
|
}
|
||||||
@ -2420,7 +2411,7 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
{
|
{
|
||||||
png_uint_32 gray = (i * 256 + 115) / 231;
|
png_uint_32 gray = (i * 256 + 115) / 231;
|
||||||
png_create_colormap_entry(display, i++, gray, gray, gray,
|
png_create_colormap_entry(display, i++, gray, gray, gray,
|
||||||
255, P_sRGB);
|
255, P_sRGB);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NOTE: this preserves the full precision of the application
|
/* NOTE: this preserves the full precision of the application
|
||||||
@ -2429,13 +2420,13 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
background_index = i;
|
background_index = i;
|
||||||
png_create_colormap_entry(display, i++, back_r, back_g, back_b,
|
png_create_colormap_entry(display, i++, back_r, back_g, back_b,
|
||||||
#ifdef __COVERITY__
|
#ifdef __COVERITY__
|
||||||
/* Coverity claims that output_encoding
|
/* Coverity claims that output_encoding cannot be 2 (P_LINEAR)
|
||||||
* cannot be 2 (P_LINEAR) here.
|
* here.
|
||||||
*/ 255U,
|
*/ 255U,
|
||||||
#else
|
#else
|
||||||
output_encoding == P_LINEAR ? 65535U : 255U,
|
output_encoding == P_LINEAR ? 65535U : 255U,
|
||||||
#endif
|
#endif
|
||||||
output_encoding);
|
output_encoding);
|
||||||
|
|
||||||
/* For non-opaque input composite on the sRGB background - this
|
/* For non-opaque input composite on the sRGB background - this
|
||||||
* requires inverting the encoding for each component. The input
|
* requires inverting the encoding for each component. The input
|
||||||
@ -2473,9 +2464,9 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
png_uint_32 gray = png_sRGB_table[g*51] * alpha;
|
png_uint_32 gray = png_sRGB_table[g*51] * alpha;
|
||||||
|
|
||||||
png_create_colormap_entry(display, i++,
|
png_create_colormap_entry(display, i++,
|
||||||
PNG_sRGB_FROM_LINEAR(gray + back_rx),
|
PNG_sRGB_FROM_LINEAR(gray + back_rx),
|
||||||
PNG_sRGB_FROM_LINEAR(gray + back_gx),
|
PNG_sRGB_FROM_LINEAR(gray + back_gx),
|
||||||
PNG_sRGB_FROM_LINEAR(gray + back_bx), 255, P_sRGB);
|
PNG_sRGB_FROM_LINEAR(gray + back_bx), 255, P_sRGB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2501,7 +2492,7 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
* png_set_tRNS_to_alpha before png_set_background_fixed.
|
* png_set_tRNS_to_alpha before png_set_background_fixed.
|
||||||
*/
|
*/
|
||||||
png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE, -1,
|
png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE, -1,
|
||||||
-1);
|
-1);
|
||||||
data_encoding = P_sRGB;
|
data_encoding = P_sRGB;
|
||||||
|
|
||||||
/* The output will now be one or two 8-bit gray or gray+alpha
|
/* The output will now be one or two 8-bit gray or gray+alpha
|
||||||
@ -2577,13 +2568,13 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
gray = png_sRGB_table[gray]; /* now P_LINEAR */
|
gray = png_sRGB_table[gray]; /* now P_LINEAR */
|
||||||
|
|
||||||
gray = PNG_DIV257(png_gamma_16bit_correct(gray,
|
gray = PNG_DIV257(png_gamma_16bit_correct(gray,
|
||||||
png_ptr->colorspace.gamma)); /* now P_FILE */
|
png_ptr->colorspace.gamma)); /* now P_FILE */
|
||||||
|
|
||||||
/* And make sure the corresponding palette entry contains
|
/* And make sure the corresponding palette entry contains
|
||||||
* exactly the required sRGB value.
|
* exactly the required sRGB value.
|
||||||
*/
|
*/
|
||||||
png_create_colormap_entry(display, gray, back_g, back_g,
|
png_create_colormap_entry(display, gray, back_g, back_g,
|
||||||
back_g, 0/*unused*/, output_encoding);
|
back_g, 0/*unused*/, output_encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (output_encoding == P_LINEAR)
|
else if (output_encoding == P_LINEAR)
|
||||||
@ -2608,8 +2599,8 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
*/
|
*/
|
||||||
expand_tRNS = 1;
|
expand_tRNS = 1;
|
||||||
png_set_background_fixed(png_ptr, &c,
|
png_set_background_fixed(png_ptr, &c,
|
||||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
||||||
0/*gamma: not used*/);
|
0/*gamma: not used*/);
|
||||||
}
|
}
|
||||||
|
|
||||||
output_processing = PNG_CMAP_NONE;
|
output_processing = PNG_CMAP_NONE;
|
||||||
@ -2643,7 +2634,7 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
|
|
||||||
/* Add a transparent entry. */
|
/* Add a transparent entry. */
|
||||||
png_create_colormap_entry(display, cmap_entries, 255, 255,
|
png_create_colormap_entry(display, cmap_entries, 255, 255,
|
||||||
255, 0, P_sRGB);
|
255, 0, P_sRGB);
|
||||||
|
|
||||||
/* This is stored as the background index for the processing
|
/* This is stored as the background index for the processing
|
||||||
* algorithm.
|
* algorithm.
|
||||||
@ -2664,7 +2655,7 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
*/
|
*/
|
||||||
for (b=0; b<256; b = (b << 1) | 0x7f)
|
for (b=0; b<256; b = (b << 1) | 0x7f)
|
||||||
png_create_colormap_entry(display, cmap_entries++,
|
png_create_colormap_entry(display, cmap_entries++,
|
||||||
r, g, b, 128, P_sRGB);
|
r, g, b, 128, P_sRGB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2691,7 +2682,7 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
cmap_entries = make_rgb_colormap(display);
|
cmap_entries = make_rgb_colormap(display);
|
||||||
|
|
||||||
png_create_colormap_entry(display, cmap_entries, back_r,
|
png_create_colormap_entry(display, cmap_entries, back_r,
|
||||||
back_g, back_b, 0/*unused*/, output_encoding);
|
back_g, back_b, 0/*unused*/, output_encoding);
|
||||||
|
|
||||||
if (output_encoding == P_LINEAR)
|
if (output_encoding == P_LINEAR)
|
||||||
{
|
{
|
||||||
@ -2713,9 +2704,9 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
* index.
|
* index.
|
||||||
*/
|
*/
|
||||||
if (memcmp((png_const_bytep)display->colormap +
|
if (memcmp((png_const_bytep)display->colormap +
|
||||||
sample_size * cmap_entries,
|
sample_size * cmap_entries,
|
||||||
(png_const_bytep)display->colormap +
|
(png_const_bytep)display->colormap +
|
||||||
sample_size * PNG_RGB_INDEX(r,g,b),
|
sample_size * PNG_RGB_INDEX(r,g,b),
|
||||||
sample_size) != 0)
|
sample_size) != 0)
|
||||||
{
|
{
|
||||||
/* The background color must be added. */
|
/* The background color must be added. */
|
||||||
@ -2733,13 +2724,13 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
*/
|
*/
|
||||||
for (b=0; b<256; b = (b << 1) | 0x7f)
|
for (b=0; b<256; b = (b << 1) | 0x7f)
|
||||||
png_create_colormap_entry(display, cmap_entries++,
|
png_create_colormap_entry(display, cmap_entries++,
|
||||||
png_colormap_compose(display, r, P_sRGB, 128,
|
png_colormap_compose(display, r, P_sRGB, 128,
|
||||||
back_r, output_encoding),
|
back_r, output_encoding),
|
||||||
png_colormap_compose(display, g, P_sRGB, 128,
|
png_colormap_compose(display, g, P_sRGB, 128,
|
||||||
back_g, output_encoding),
|
back_g, output_encoding),
|
||||||
png_colormap_compose(display, b, P_sRGB, 128,
|
png_colormap_compose(display, b, P_sRGB, 128,
|
||||||
back_b, output_encoding),
|
back_b, output_encoding),
|
||||||
0/*unused*/, output_encoding);
|
0/*unused*/, output_encoding);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2757,8 +2748,8 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
c.blue = (png_uint_16)back_b;
|
c.blue = (png_uint_16)back_b;
|
||||||
|
|
||||||
png_set_background_fixed(png_ptr, &c,
|
png_set_background_fixed(png_ptr, &c,
|
||||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
||||||
0/*gamma: not used*/);
|
0/*gamma: not used*/);
|
||||||
|
|
||||||
output_processing = PNG_CMAP_RGB;
|
output_processing = PNG_CMAP_RGB;
|
||||||
}
|
}
|
||||||
@ -2810,7 +2801,7 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
{
|
{
|
||||||
if (trans[i] == 0)
|
if (trans[i] == 0)
|
||||||
png_create_colormap_entry(display, i, back_r, back_g,
|
png_create_colormap_entry(display, i, back_r, back_g,
|
||||||
back_b, 0, output_encoding);
|
back_b, 0, output_encoding);
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2818,22 +2809,22 @@ png_image_read_colormap(png_voidp argument)
|
|||||||
* on the sRGB color in 'back'.
|
* on the sRGB color in 'back'.
|
||||||
*/
|
*/
|
||||||
png_create_colormap_entry(display, i,
|
png_create_colormap_entry(display, i,
|
||||||
png_colormap_compose(display, colormap[i].red,
|
png_colormap_compose(display, colormap[i].red, P_FILE,
|
||||||
P_FILE, trans[i], back_r, output_encoding),
|
trans[i], back_r, output_encoding),
|
||||||
png_colormap_compose(display, colormap[i].green,
|
png_colormap_compose(display, colormap[i].green, P_FILE,
|
||||||
P_FILE, trans[i], back_g, output_encoding),
|
trans[i], back_g, output_encoding),
|
||||||
png_colormap_compose(display, colormap[i].blue,
|
png_colormap_compose(display, colormap[i].blue, P_FILE,
|
||||||
P_FILE, trans[i], back_b, output_encoding),
|
trans[i], back_b, output_encoding),
|
||||||
output_encoding == P_LINEAR ? trans[i] * 257U :
|
output_encoding == P_LINEAR ? trans[i] * 257U :
|
||||||
trans[i],
|
trans[i],
|
||||||
output_encoding);
|
output_encoding);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
png_create_colormap_entry(display, i, colormap[i].red,
|
png_create_colormap_entry(display, i, colormap[i].red,
|
||||||
colormap[i].green, colormap[i].blue,
|
colormap[i].green, colormap[i].blue,
|
||||||
i < num_trans ? trans[i] : 255U, P_FILE/*8-bit*/);
|
i < num_trans ? trans[i] : 255U, P_FILE/*8-bit*/);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The PNG data may have indices packed in fewer than 8 bits, it
|
/* The PNG data may have indices packed in fewer than 8 bits, it
|
||||||
@ -2923,7 +2914,7 @@ static int
|
|||||||
png_image_read_and_map(png_voidp argument)
|
png_image_read_and_map(png_voidp argument)
|
||||||
{
|
{
|
||||||
png_image_read_control *display = png_voidcast(png_image_read_control*,
|
png_image_read_control *display = png_voidcast(png_image_read_control*,
|
||||||
argument);
|
argument);
|
||||||
png_imagep image = display->image;
|
png_imagep image = display->image;
|
||||||
png_structrp png_ptr = image->opaque->png_ptr;
|
png_structrp png_ptr = image->opaque->png_ptr;
|
||||||
int passes;
|
int passes;
|
||||||
@ -3060,7 +3051,7 @@ png_image_read_and_map(png_voidp argument)
|
|||||||
|
|
||||||
if (alpha >= 196)
|
if (alpha >= 196)
|
||||||
*outrow = PNG_RGB_INDEX(inrow[0], inrow[1],
|
*outrow = PNG_RGB_INDEX(inrow[0], inrow[1],
|
||||||
inrow[2]);
|
inrow[2]);
|
||||||
|
|
||||||
else if (alpha < 64)
|
else if (alpha < 64)
|
||||||
*outrow = PNG_CMAP_RGB_ALPHA_BACKGROUND;
|
*outrow = PNG_CMAP_RGB_ALPHA_BACKGROUND;
|
||||||
@ -3112,7 +3103,7 @@ static int
|
|||||||
png_image_read_colormapped(png_voidp argument)
|
png_image_read_colormapped(png_voidp argument)
|
||||||
{
|
{
|
||||||
png_image_read_control *display = png_voidcast(png_image_read_control*,
|
png_image_read_control *display = png_voidcast(png_image_read_control*,
|
||||||
argument);
|
argument);
|
||||||
png_imagep image = display->image;
|
png_imagep image = display->image;
|
||||||
png_controlp control = image->opaque;
|
png_controlp control = image->opaque;
|
||||||
png_structrp png_ptr = control->png_ptr;
|
png_structrp png_ptr = control->png_ptr;
|
||||||
@ -3245,7 +3236,7 @@ static int
|
|||||||
png_image_read_composite(png_voidp argument)
|
png_image_read_composite(png_voidp argument)
|
||||||
{
|
{
|
||||||
png_image_read_control *display = png_voidcast(png_image_read_control*,
|
png_image_read_control *display = png_voidcast(png_image_read_control*,
|
||||||
argument);
|
argument);
|
||||||
png_imagep image = display->image;
|
png_imagep image = display->image;
|
||||||
png_structrp png_ptr = image->opaque->png_ptr;
|
png_structrp png_ptr = image->opaque->png_ptr;
|
||||||
int passes;
|
int passes;
|
||||||
@ -3372,7 +3363,7 @@ static int
|
|||||||
png_image_read_background(png_voidp argument)
|
png_image_read_background(png_voidp argument)
|
||||||
{
|
{
|
||||||
png_image_read_control *display = png_voidcast(png_image_read_control*,
|
png_image_read_control *display = png_voidcast(png_image_read_control*,
|
||||||
argument);
|
argument);
|
||||||
png_imagep image = display->image;
|
png_imagep image = display->image;
|
||||||
png_structrp png_ptr = image->opaque->png_ptr;
|
png_structrp png_ptr = image->opaque->png_ptr;
|
||||||
png_inforp info_ptr = image->opaque->info_ptr;
|
png_inforp info_ptr = image->opaque->info_ptr;
|
||||||
@ -3432,7 +3423,8 @@ png_image_read_background(png_voidp argument)
|
|||||||
|
|
||||||
for (pass = 0; pass < passes; ++pass)
|
for (pass = 0; pass < passes; ++pass)
|
||||||
{
|
{
|
||||||
png_bytep row = png_voidcast(png_bytep, display->first_row);
|
png_bytep row = png_voidcast(png_bytep,
|
||||||
|
display->first_row);
|
||||||
unsigned int startx, stepx, stepy;
|
unsigned int startx, stepx, stepy;
|
||||||
png_uint_32 y;
|
png_uint_32 y;
|
||||||
|
|
||||||
@ -3460,7 +3452,7 @@ png_image_read_background(png_voidp argument)
|
|||||||
for (; y<height; y += stepy)
|
for (; y<height; y += stepy)
|
||||||
{
|
{
|
||||||
png_bytep inrow = png_voidcast(png_bytep,
|
png_bytep inrow = png_voidcast(png_bytep,
|
||||||
display->local_row);
|
display->local_row);
|
||||||
png_bytep outrow = first_row + y * step_row;
|
png_bytep outrow = first_row + y * step_row;
|
||||||
png_const_bytep end_row = outrow + width;
|
png_const_bytep end_row = outrow + width;
|
||||||
|
|
||||||
@ -3505,7 +3497,7 @@ png_image_read_background(png_voidp argument)
|
|||||||
for (; y<height; y += stepy)
|
for (; y<height; y += stepy)
|
||||||
{
|
{
|
||||||
png_bytep inrow = png_voidcast(png_bytep,
|
png_bytep inrow = png_voidcast(png_bytep,
|
||||||
display->local_row);
|
display->local_row);
|
||||||
png_bytep outrow = first_row + y * step_row;
|
png_bytep outrow = first_row + y * step_row;
|
||||||
png_const_bytep end_row = outrow + width;
|
png_const_bytep end_row = outrow + width;
|
||||||
|
|
||||||
@ -3552,7 +3544,7 @@ png_image_read_background(png_voidp argument)
|
|||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
png_uint_16p first_row = png_voidcast(png_uint_16p,
|
png_uint_16p first_row = png_voidcast(png_uint_16p,
|
||||||
display->first_row);
|
display->first_row);
|
||||||
/* The division by two is safe because the caller passed in a
|
/* The division by two is safe because the caller passed in a
|
||||||
* stride which was multiplied by 2 (below) to get row_bytes.
|
* stride which was multiplied by 2 (below) to get row_bytes.
|
||||||
*/
|
*/
|
||||||
@ -3602,7 +3594,7 @@ png_image_read_background(png_voidp argument)
|
|||||||
|
|
||||||
/* Read the row, which is packed: */
|
/* Read the row, which is packed: */
|
||||||
png_read_row(png_ptr, png_voidcast(png_bytep,
|
png_read_row(png_ptr, png_voidcast(png_bytep,
|
||||||
display->local_row), NULL);
|
display->local_row), NULL);
|
||||||
inrow = png_voidcast(png_const_uint_16p, display->local_row);
|
inrow = png_voidcast(png_const_uint_16p, display->local_row);
|
||||||
|
|
||||||
/* Now do the pre-multiplication on each pixel in this row.
|
/* Now do the pre-multiplication on each pixel in this row.
|
||||||
@ -3651,7 +3643,7 @@ static int
|
|||||||
png_image_read_direct(png_voidp argument)
|
png_image_read_direct(png_voidp argument)
|
||||||
{
|
{
|
||||||
png_image_read_control *display = png_voidcast(png_image_read_control*,
|
png_image_read_control *display = png_voidcast(png_image_read_control*,
|
||||||
argument);
|
argument);
|
||||||
png_imagep image = display->image;
|
png_imagep image = display->image;
|
||||||
png_structrp png_ptr = image->opaque->png_ptr;
|
png_structrp png_ptr = image->opaque->png_ptr;
|
||||||
png_inforp info_ptr = image->opaque->info_ptr;
|
png_inforp info_ptr = image->opaque->info_ptr;
|
||||||
@ -3702,7 +3694,7 @@ png_image_read_direct(png_voidp argument)
|
|||||||
do_local_background = 1/*maybe*/;
|
do_local_background = 1/*maybe*/;
|
||||||
|
|
||||||
png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE,
|
png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE,
|
||||||
PNG_RGB_TO_GRAY_DEFAULT, PNG_RGB_TO_GRAY_DEFAULT);
|
PNG_RGB_TO_GRAY_DEFAULT, PNG_RGB_TO_GRAY_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
change &= ~PNG_FORMAT_FLAG_COLOR;
|
change &= ~PNG_FORMAT_FLAG_COLOR;
|
||||||
@ -3761,7 +3753,7 @@ png_image_read_direct(png_voidp argument)
|
|||||||
* final value.
|
* final value.
|
||||||
*/
|
*/
|
||||||
if (png_muldiv(>est, output_gamma, png_ptr->colorspace.gamma,
|
if (png_muldiv(>est, output_gamma, png_ptr->colorspace.gamma,
|
||||||
PNG_FP_1) != 0 && png_gamma_significant(gtest) == 0)
|
PNG_FP_1) != 0 && png_gamma_significant(gtest) == 0)
|
||||||
do_local_background = 0;
|
do_local_background = 0;
|
||||||
|
|
||||||
else if (mode == PNG_ALPHA_STANDARD)
|
else if (mode == PNG_ALPHA_STANDARD)
|
||||||
@ -3824,8 +3816,8 @@ png_image_read_direct(png_voidp argument)
|
|||||||
* pixels.
|
* pixels.
|
||||||
*/
|
*/
|
||||||
png_set_background_fixed(png_ptr, &c,
|
png_set_background_fixed(png_ptr, &c,
|
||||||
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
|
||||||
0/*gamma: not used*/);
|
0/*gamma: not used*/);
|
||||||
}
|
}
|
||||||
|
|
||||||
else /* compose on row: implemented below. */
|
else /* compose on row: implemented below. */
|
||||||
@ -3856,16 +3848,16 @@ png_image_read_direct(png_voidp argument)
|
|||||||
else
|
else
|
||||||
filler = 255;
|
filler = 255;
|
||||||
|
|
||||||
#ifdef PNG_FORMAT_AFIRST_SUPPORTED
|
# ifdef PNG_FORMAT_AFIRST_SUPPORTED
|
||||||
if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
||||||
{
|
{
|
||||||
where = PNG_FILLER_BEFORE;
|
where = PNG_FILLER_BEFORE;
|
||||||
change &= ~PNG_FORMAT_FLAG_AFIRST;
|
change &= ~PNG_FORMAT_FLAG_AFIRST;
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
#endif
|
# endif
|
||||||
where = PNG_FILLER_AFTER;
|
where = PNG_FILLER_AFTER;
|
||||||
|
|
||||||
png_set_add_alpha(png_ptr, filler, where);
|
png_set_add_alpha(png_ptr, filler, where);
|
||||||
}
|
}
|
||||||
@ -3973,12 +3965,12 @@ png_image_read_direct(png_voidp argument)
|
|||||||
if (info_ptr->bit_depth == 16)
|
if (info_ptr->bit_depth == 16)
|
||||||
info_format |= PNG_FORMAT_FLAG_LINEAR;
|
info_format |= PNG_FORMAT_FLAG_LINEAR;
|
||||||
|
|
||||||
#ifdef PNG_FORMAT_BGR_SUPPORTED
|
# ifdef PNG_FORMAT_BGR_SUPPORTED
|
||||||
if ((png_ptr->transformations & PNG_BGR) != 0)
|
if ((png_ptr->transformations & PNG_BGR) != 0)
|
||||||
info_format |= PNG_FORMAT_FLAG_BGR;
|
info_format |= PNG_FORMAT_FLAG_BGR;
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#ifdef PNG_FORMAT_AFIRST_SUPPORTED
|
# ifdef PNG_FORMAT_AFIRST_SUPPORTED
|
||||||
if (do_local_background == 2)
|
if (do_local_background == 2)
|
||||||
{
|
{
|
||||||
if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
|
||||||
@ -4075,117 +4067,67 @@ png_image_read_direct(png_voidp argument)
|
|||||||
|
|
||||||
int PNGAPI
|
int PNGAPI
|
||||||
png_image_finish_read(png_imagep image, png_const_colorp background,
|
png_image_finish_read(png_imagep image, png_const_colorp background,
|
||||||
void *buffer, png_int_32 row_stride, void *colormap)
|
void *buffer, png_int_32 row_stride, void *colormap)
|
||||||
{
|
{
|
||||||
if (image != NULL && image->version == PNG_IMAGE_VERSION)
|
if (image != NULL && image->version == PNG_IMAGE_VERSION)
|
||||||
{
|
{
|
||||||
/* Check for row_stride overflow. This check is not performed on the
|
png_uint_32 check;
|
||||||
* original PNG format because it may not occur in the output PNG format
|
|
||||||
* and libpng deals with the issues of reading the original.
|
|
||||||
*/
|
|
||||||
const unsigned int channels = PNG_IMAGE_PIXEL_CHANNELS(image->format);
|
|
||||||
|
|
||||||
/* The following checks just the 'row_stride' calculation to ensure it
|
if (row_stride == 0)
|
||||||
* fits in a signed 32-bit value. Because channels/components can be
|
row_stride = PNG_IMAGE_ROW_STRIDE(*image);
|
||||||
* either 1 or 2 bytes in size the length of a row can still overflow 32
|
|
||||||
* bits; this is just to verify that the 'row_stride' argument can be
|
if (row_stride < 0)
|
||||||
* represented.
|
check = -row_stride;
|
||||||
*/
|
|
||||||
if (image->width <= 0x7FFFFFFFU/channels) /* no overflow */
|
else
|
||||||
|
check = row_stride;
|
||||||
|
|
||||||
|
if (image->opaque != NULL && buffer != NULL &&
|
||||||
|
check >= PNG_IMAGE_ROW_STRIDE(*image))
|
||||||
{
|
{
|
||||||
png_uint_32 check;
|
if ((image->format & PNG_FORMAT_FLAG_COLORMAP) == 0 ||
|
||||||
const png_uint_32 png_row_stride = image->width * channels;
|
(image->colormap_entries > 0 && colormap != NULL))
|
||||||
|
|
||||||
if (row_stride == 0)
|
|
||||||
row_stride = (png_int_32)/*SAFE*/png_row_stride;
|
|
||||||
|
|
||||||
if (row_stride < 0)
|
|
||||||
check = -row_stride;
|
|
||||||
|
|
||||||
else
|
|
||||||
check = row_stride;
|
|
||||||
|
|
||||||
/* This verifies 'check', the absolute value of the actual stride
|
|
||||||
* passed in and detects overflow in the application calculation (i.e.
|
|
||||||
* if the app did actually pass in a non-zero 'row_stride'.
|
|
||||||
*/
|
|
||||||
if (image->opaque != NULL && buffer != NULL && check >= png_row_stride)
|
|
||||||
{
|
{
|
||||||
/* Now check for overflow of the image buffer calculation; this
|
int result;
|
||||||
* limits the whole image size to 32 bits for API compatibility with
|
png_image_read_control display;
|
||||||
* the current, 32-bit, PNG_IMAGE_BUFFER_SIZE macro.
|
|
||||||
*
|
memset(&display, 0, (sizeof display));
|
||||||
* The PNG_IMAGE_BUFFER_SIZE macro is:
|
display.image = image;
|
||||||
*
|
display.buffer = buffer;
|
||||||
* (PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)*height*(row_stride))
|
display.row_stride = row_stride;
|
||||||
*
|
display.colormap = colormap;
|
||||||
* And the component size is always 1 or 2, so make sure that the
|
display.background = background;
|
||||||
* number of *bytes* that the application is saying are available
|
display.local_row = NULL;
|
||||||
* does actually fit into a 32-bit number.
|
|
||||||
*
|
/* Choose the correct 'end' routine; for the color-map case all the
|
||||||
* NOTE: this will be changed in 1.7 because PNG_IMAGE_BUFFER_SIZE
|
* setup has already been done.
|
||||||
* will be changed to use png_alloc_size_t; bigger images can be
|
|
||||||
* accomodated on 64-bit systems.
|
|
||||||
*/
|
*/
|
||||||
if (image->height <=
|
if ((image->format & PNG_FORMAT_FLAG_COLORMAP) != 0)
|
||||||
0xFFFFFFFFU/PNG_IMAGE_PIXEL_COMPONENT_SIZE(image->format)/check)
|
result =
|
||||||
{
|
png_safe_execute(image, png_image_read_colormap, &display) &&
|
||||||
if ((image->format & PNG_FORMAT_FLAG_COLORMAP) == 0 ||
|
png_safe_execute(image, png_image_read_colormapped, &display);
|
||||||
(image->colormap_entries > 0 && colormap != NULL))
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
png_image_read_control display;
|
|
||||||
|
|
||||||
memset(&display, 0, (sizeof display));
|
|
||||||
display.image = image;
|
|
||||||
display.buffer = buffer;
|
|
||||||
display.row_stride = row_stride;
|
|
||||||
display.colormap = colormap;
|
|
||||||
display.background = background;
|
|
||||||
display.local_row = NULL;
|
|
||||||
|
|
||||||
/* Choose the correct 'end' routine; for the color-map case
|
|
||||||
* all the setup has already been done.
|
|
||||||
*/
|
|
||||||
if ((image->format & PNG_FORMAT_FLAG_COLORMAP) != 0)
|
|
||||||
result =
|
|
||||||
png_safe_execute(image,
|
|
||||||
png_image_read_colormap, &display) &&
|
|
||||||
png_safe_execute(image,
|
|
||||||
png_image_read_colormapped, &display);
|
|
||||||
|
|
||||||
else
|
|
||||||
result =
|
|
||||||
png_safe_execute(image,
|
|
||||||
png_image_read_direct, &display);
|
|
||||||
|
|
||||||
png_image_free(image);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
return png_image_error(image,
|
|
||||||
"png_image_finish_read[color-map]: no color-map");
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
else
|
||||||
return png_image_error(image,
|
result =
|
||||||
"png_image_finish_read: image too large");
|
png_safe_execute(image, png_image_read_direct, &display);
|
||||||
|
|
||||||
|
png_image_free(image);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
return png_image_error(image,
|
return png_image_error(image,
|
||||||
"png_image_finish_read: invalid argument");
|
"png_image_finish_read[color-map]: no color-map");
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
return png_image_error(image,
|
return png_image_error(image,
|
||||||
"png_image_finish_read: row_stride too large");
|
"png_image_finish_read: invalid argument");
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (image != NULL)
|
else if (image != NULL)
|
||||||
return png_image_error(image,
|
return png_image_error(image,
|
||||||
"png_image_finish_read: damaged PNG_IMAGE_VERSION");
|
"png_image_finish_read: damaged PNG_IMAGE_VERSION");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user